module Shrine::Plugins::DataUri::ClassMethods
Public Instance Methods
data_uri(uri, filename: nil)
click to toggle source
Parses the given data URI and creates an IO object from it.
io = Shrine.data_uri("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA") io #=> #<Shrine::Plugins::DataUri::DataFile> io.content_type #=> "image/png" io.size #=> 21 io.read # decoded content
# File lib/shrine/plugins/data_uri.rb, line 61 def data_uri(uri, filename: nil) instrument_data_uri(uri) do info = parse_data_uri(uri) create_data_file(info, filename: filename) end end
Private Instance Methods
create_data_file(info, filename: nil)
click to toggle source
Creates an IO-like object from parsed data URI.
# File lib/shrine/plugins/data_uri.rb, line 71 def create_data_file(info, filename: nil) content_type = info[:content_type] || DEFAULT_CONTENT_TYPE content = info[:base64] ? Base64.decode64(info[:data]) : CGI.unescape(info[:data]) data_file = Shrine::DataFile.new(content, content_type: content_type, filename: filename) info[:data].clear data_file end
instrument_data_uri(uri) { || ... }
click to toggle source
Sends a ‘data_uri.shrine` event for instrumentation plugin.
# File lib/shrine/plugins/data_uri.rb, line 94 def instrument_data_uri(uri, &block) return yield unless respond_to?(:instrument) instrument(:data_uri, data_uri: uri, &block) end
parse_data_uri(uri)
click to toggle source
Parses the data URI string and returns parts.
# File lib/shrine/plugins/data_uri.rb, line 82 def parse_data_uri(uri) scanner = StringScanner.new(uri) scanner.scan(DATA_REGEXP) or raise ParseError, "data URI has invalid format" media_type = scanner.scan(MEDIA_TYPE_REGEXP) base64 = scanner.scan(BASE64_REGEXP) scanner.scan(CONTENT_SEPARATOR) or raise ParseError, "data URI has invalid format" content = scanner.post_match { content_type: media_type, base64: !!base64, data: content } end