Module: DataUri
- Defined in:
- lib/datauris.rb,
lib/datauris/version.rb
Constant Summary collapse
- REGEX =
make parameters key/value more strict - why? why not?
e.g. MIME_PARAM_RE = /^;([-\w.+]+)=([^;,]+)/.freeze allow +(plus) or .(dot) in param key - possible?? why? why not? %r{ \A data: (?<mediatype> (?: (?<type> [\w-]+? ) / (?<subtype> [\w.+-]+? ) )? (?<parameters> (?: ; [\w-]+? = .+? )* ) )? (?:; (?<extension>base64|utf8) )? , (?<data> (?:.|[\n\r])* ) \z }x
- NOT_SAFECHARS_RX =
/([^a-zA-Z0-9\-_.~]+)/- MAJOR =
todo: namespace inside version or something - why? why not??
1- MINOR =
2- PATCH =
0- VERSION =
[MAJOR,MINOR,PATCH].join('.')
Class Method Summary collapse
- ._parse(str) ⇒ Object
- .banner ⇒ Object
-
.build(data, type = nil, base64: nil, utf8: nil, uri: nil) ⇒ Object
(also: encode)
base64 - force base64 encoding instead of “automagic” (base64: true) utf8 - or force utf8 encoding (utf8: true) uri - or force STOPPING uri encoding (uri: false).
- .encode_uri(str) ⇒ Object
-
.parse(str, utf8: false) ⇒ Object
(also: decode)
allow force utf8 with utf8: true.
- .root ⇒ Object
- .valid?(str, utf8: false) ⇒ Boolean (also: is_valid?)
- .version ⇒ Object
Class Method Details
._parse(str) ⇒ Object
69 |
# File 'lib/datauris.rb', line 69 def self._parse( str ) REGEX.match( str ); end |
.banner ⇒ Object
12 13 14 |
# File 'lib/datauris/version.rb', line 12 def self. "datauris/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}] in (#{root})" end |
.build(data, type = nil, base64: nil, utf8: nil, uri: nil) ⇒ Object Also known as: encode
base64 - force base64 encoding instead of “automagic” (base64: true) utf8 - or force utf8 encoding (utf8: true) uri - or force STOPPING uri encoding (uri: false)
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 |
# File 'lib/datauris.rb', line 178 def self.build( data, type=nil, base64: nil, utf8: nil, uri: nil ) str = "data:" str += type if type ## note: allow optional / no type ## puts " type: #{type.inspect}, base64: #{base64.inspect}" ## add more (binary) media types here - why? why not? ## note svg is text AND an image => image/svg+xml if base64.nil? base64 = if type if type.start_with?( 'image/svg+xml' ) false elsif type.start_with?( 'image/') || type.start_with?( 'application/octet-stream' ) true else false end else # no type (assume text) false end end if base64 str += ";base64," + Base64.strict_encode64( data ) elsif utf8 str += ";utf8," + data else ## use encode_uri_component by default - why? why not? ## space becomes %20 ## : becomes %3A ## , becomes %2C and so on ## ## note: use uri: false to turn of uri encode!!! str += "," + (uri == false ? data : encode_uri( data )) end end |
.encode_uri(str) ⇒ Object
167 168 169 170 171 172 |
# File 'lib/datauris.rb', line 167 def self.encode_uri( str ) encoding = str.encoding str.b.gsub( NOT_SAFECHARS_RX ) do |m| '%' + m.unpack('H2' * m.bytesize).join('%').upcase end.force_encoding(encoding) end |
.parse(str, utf8: false) ⇒ Object Also known as: decode
allow force utf8 with utf8: true
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# File 'lib/datauris.rb', line 71 def self.parse( str, utf8: false ) ## allow force utf8 with utf8: true m = _parse( str ) if m ## 1) return mediatype (mimetype PLUS optional parameters) ## 2) return data (base64 decoded or not) ## todo/check: ## add force_encoding( 'UTF-8' ) to returned data (if not base64) - why? why not? mediatype = m[:mediatype] data = if m[:extension] && m[:extension] == 'base64' ## assume base64 encoded Base64.strict_decode64(m[:data]) elsif utf8 || (m[:extension] && m[:extension] == 'utf8') m[:data] ## note: no decode; assume "plain" utf8 string else ## e.g. %20 => space(20) ## etc. ## todo/double check - use a different URI decoder - why? why not? URI.decode_uri_component(m[:data]) end ## returns data first!!! ## and mediatype second (to follow the order in build) ## - also mediatype is optional - arguable more intuitive - yes,no? [data, mediatype] else raise ArgumentError, "invalid datauri - cannot match regex; sorry" end end |
.root ⇒ Object
16 17 18 |
# File 'lib/datauris/version.rb', line 16 def self.root File.( File.dirname(File.dirname(File.dirname(__FILE__))) ) end |
.valid?(str, utf8: false) ⇒ Boolean Also known as: is_valid?
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/datauris.rb', line 103 def self.valid?( str, utf8: false ) m = _parse( str ) if m if m[:extension] && m[:extension] == 'base64' ## assume base64 begin Base64.strict_decode64(m[:data]) true rescue ArgumentError false end elsif utf8 || (m[:extension] && m[:extension] == 'utf8') true ## pass through as is; assume always true (check valid utf8 encoding - why? why not?) else begin URI.decode_uri_component(m[:data]) true rescue ArgumentError ## check if decode errors are argument errors?? false end end else false end end |
.version ⇒ Object
8 9 10 |
# File 'lib/datauris/version.rb', line 8 def self.version VERSION end |