Class: Slippery::Processors::SelfContained

Inherits:
Object
  • Object
show all
Defined in:
lib/slippery/processors/self_contained.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.call(doc) ⇒ Object



7
8
9
# File 'lib/slippery/processors/self_contained.rb', line 7

def self.call(doc)
  self.new.call(doc)
end

Instance Method Details

#call(doc) ⇒ Object



11
12
13
14
15
16
17
# File 'lib/slippery/processors/self_contained.rb', line 11

def call(doc)
  doc
    .rewrite('link[rel=stylesheet]', &convert_stylesheet_to_inline)
    .rewrite('script[src]',          &convert_script_to_inline)
    .rewrite('img',                  &convert_image_to_data_uri)
    #.rewrite('style',                &convert_style_uri_to_data_uri)
end

#convert_image_to_data_uriObject



30
31
32
# File 'lib/slippery/processors/self_contained.rb', line 30

def convert_image_to_data_uri
  ->(img) { H[:img, img.attributes.merge(src: data_uri(img[:src]))] }
end

#convert_script_to_inlineObject



23
24
25
26
27
28
# File 'lib/slippery/processors/self_contained.rb', line 23

def convert_script_to_inline
  ->(script) do
    attrs = script.attributes.reject { |k,v| k=='src' }
    H[:script, attrs, read_uri(script[:src])]
  end
end

#convert_stylesheet_to_inlineObject



19
20
21
# File 'lib/slippery/processors/self_contained.rb', line 19

def convert_stylesheet_to_inline
  ->(link) { H[:style, { type: 'text/css' }, read_uri(link[:href])] }
end

#data_uri(uri) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/slippery/processors/self_contained.rb', line 48

def data_uri(uri)
  base64 = Base64.encode64(read_uri uri)
  ext    = File.extname(uri)
  type   = {
    '.jpg'  => 'image/jpeg',
    '.jpeg' => 'image/jpeg',
    '.png'  => 'image/png',
    '.gif'  => 'image/gif',
  }[ext.downcase]

  "data:#{type};base64,#{base64}"
end

#read_uri(uri) ⇒ Object

def convert_style_uri_to_data_uri

->(style) {
  H[:style, style.attributes, style.children.first.gsub(/url\(['"]?[^'"\)]+['"]?\)/) {|url| "url('#{data_uri url[/url\(['"]?([^'"\)]+)/,1] }')"} ] }

end



39
40
41
42
43
44
45
46
# File 'lib/slippery/processors/self_contained.rb', line 39

def read_uri(uri)
  @@download_cache ||= {}
  if uri =~ /http/
    @@download_cache[uri] ||= open(uri.sub('file://', '')).read
  else
    open(uri.sub('file://', '')).read
  end
end