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