svg-inline-file-extractor 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0feae27fb66bafc1a0c95732d827ddf71b77de1b
4
- data.tar.gz: 3baa5d724f218bf1306b0233eed38f92b0db94c2
3
+ metadata.gz: 9d00a790a3ec3da8c4479e4fe41d6dbc671dd8c4
4
+ data.tar.gz: 8c847625e736043a775a29d36eca99c0cfd598c7
5
5
  SHA512:
6
- metadata.gz: bc98bbe216a2720b9ada047d1e55453933399668bd0c8e8dbba26d15c07b1a494d3d8d4417afda4a339da9bdc20e6c0d95cb19aa139d538339ffb7bc899cd800
7
- data.tar.gz: 540f23bdea3008b93b15f9e03e497343296250f34b046a876d3183bfc188816e3b54f8eb5f3662609ad05dd610441766be42f65198e9eb67981716420f2fa4b0
6
+ metadata.gz: 9f7f7dd525f41ad3851b229a1fdb0c1ba98e84b4faa8a63214116daf24502ba26d2441e75a74974a298b1db0213e5bc4ee3c6ce5fbec81b79611c9481eaad7dc
7
+ data.tar.gz: ffd6c4b4ff0aa005f59224788266e2d6f6d50c75564d91a96735d7223a404f5655a45de055298a1362f65567e1d0192d281c0c1322972d5159a5aea312203974
@@ -3,6 +3,7 @@ require "svg_inline_file_extractor/svg_file"
3
3
  require "svg_inline_file_extractor/inline_image"
4
4
 
5
5
  module SvgInlineFileExtractor
6
+ class MiniMagickMissing < StandardError; end
6
7
 
7
8
  # @param [ String ] xml_string should be a full raw SVG file
8
9
  # @return [ Array<String> ] an array of binary strings containing the images in the SVG file
@@ -16,5 +17,34 @@ module SvgInlineFileExtractor
16
17
  def self.inline_images(xml_string)
17
18
  SvgFile.inline_images(xml_string)
18
19
  end
19
-
20
+
21
+ # @param [ String ] uri a URI to open and identify.
22
+ # @return [ String | Nil ] image type determined by MiniMagick.
23
+ # @note will return nil if MiniMagick is not present
24
+ def self.identify_image(uri)
25
+ if use_mini_magick?
26
+ return with_temp_image(uri) do |temp_image|
27
+ MiniMagick::Image.open(temp_image).type.downcase
28
+ end
29
+ end
30
+ end
31
+
32
+ # @return [ Boolean ] true if MiniMagick is found, false if not.
33
+ def self.use_mini_magick?
34
+ Object.const_defined?('MiniMagick::Image')
35
+ end
36
+
37
+ # do something with a temporary copy of uri in a block.
38
+ # @param [ String ] uri - the location of the file to open into a temp file.
39
+ def self.with_temp_image(uri)
40
+ temp = Tempfile.new
41
+ temp.binmode
42
+ puts "opening #{uri}"
43
+ temp.write open(uri).binmode.read
44
+ temp.close
45
+ results = yield temp.path
46
+ temp.delete
47
+ results
48
+ end
49
+
20
50
  end
@@ -1,8 +1,8 @@
1
1
  require 'base64'
2
+ require 'open-uri'
2
3
 
3
4
  module SvgInlineFileExtractor
4
5
  class InlineImage
5
- class UnableToDetermineImageTypeError < StandardError; end
6
6
 
7
7
  # Regex pattern to match against the beginning of the href string. the type, if found, will be the raw string, eg: jpeg, jpg, png, etc.
8
8
  DATA_IMAGE_HEADER_PATTERN = /data:image\/(?<type>.+);base64\,/.freeze
@@ -17,8 +17,7 @@ module SvgInlineFileExtractor
17
17
  self.href_contents = nokogiri_element.value
18
18
  end
19
19
 
20
- # @return [ String ] The image type according to the DATA_IMAGE_HEADER_PATTERN
21
- # @raise [ UnableToDetermineImageTypeError ] will raise if regex doesn't match.
20
+ # @return [ String|Nil ] The image type according to the DATA_IMAGE_HEADER_PATTERN, nil if pattern not matched.
22
21
  def declared_image_type
23
22
  @declared_image_type ||= begin
24
23
  if (match = href_contents.match(DATA_IMAGE_HEADER_PATTERN))
@@ -27,6 +26,7 @@ module SvgInlineFileExtractor
27
26
  end
28
27
  end
29
28
 
29
+ # @return [ Boolean ] true if declared_image_type is not nil
30
30
  def inline_image?
31
31
  !!declared_image_type
32
32
  end
@@ -48,9 +48,11 @@ module SvgInlineFileExtractor
48
48
  attribute.value if attribute
49
49
  end
50
50
 
51
- # Updates the contents of the href that this inline image came from
51
+ # Updates the contents of the href that this inline image came from,
52
+ # and #href_contents
52
53
  # @param [ String ] value the value to set the href contents to
53
- def svg_href_contents=(value)
54
+ def href_contents=(value)
55
+ @href_contents = value
54
56
  nokogiri_element.value = value
55
57
  end
56
58
 
@@ -60,8 +62,28 @@ module SvgInlineFileExtractor
60
62
  @binary_image ||= Base64.decode64(without_header)
61
63
  end
62
64
 
65
+ # If the image href is set to a URI, attempt to download/open and convert to an
66
+ # base64 encoded inline image
67
+ # @return [ Boolean ] true
68
+ # @raise [ SvgInlineFileExtractor::MiniMagickMissing ] if MiniMagick is not installed/required.
69
+ def set_binary_image_from_uri!
70
+ unless SvgInlineFileExtractor.use_mini_magick?
71
+ raise MiniMagickMissing, '#set_binary_image_from_uri! requires the MiniMagick gem to be installed.'
72
+ end
73
+ SvgInlineFileExtractor.with_temp_image(nokogiri_element.value) do |temp_image|
74
+ format = SvgInlineFileExtractor.identify_image(temp_image).to_s.downcase
75
+ nokogiri_element.value = "data:image/#{format};base64,#{encode(temp_image)}"
76
+ nokogiri_element.name = 'xlink:href'
77
+ end
78
+ true
79
+ end
80
+
63
81
  private
64
82
 
83
+ def encode(image_path)
84
+ Base64.encode64(File.open(image_path.to_s).binmode.read)
85
+ end
86
+
65
87
  def without_header
66
88
  @without_header ||= href_contents.gsub(DATA_IMAGE_HEADER_PATTERN, '')
67
89
  end
@@ -37,16 +37,25 @@ module SvgInlineFileExtractor
37
37
  end
38
38
  end
39
39
 
40
+ # @param [ Boolean ] false returns only inline base64 encoded images, true returns all image tags
40
41
  # @return [ Array<InlineImage> ] an array of the inline images found in the document
41
42
  # @see InlineImage
42
- def inline_images
43
+ def inline_images(all = false)
43
44
  image_elements.map do |element|
44
- if (image = InlineImage.new(element)).inline_image?
45
+ image = InlineImage.new(element)
46
+ if all || image.inline_image?
45
47
  image
46
48
  end
47
49
  end.compact
48
50
  end
49
51
 
52
+ # @return the rendered nokogiri_document.
53
+ # @note text "&#10;" will be replaced with newlines to allow newlines in Base64
54
+ # encoded strings.
55
+ def rendered_svg
56
+ nokogiri_document.to_s.gsub('&#10;', "\n")
57
+ end
58
+
50
59
  private
51
60
 
52
61
  def image_elements
@@ -1,3 +1,3 @@
1
1
  module SvgInlineFileExtractor
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: svg-inline-file-extractor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nic Boie
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-30 00:00:00.000000000 Z
11
+ date: 2016-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri