reverse_adoc 0.2.3 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/macos.yml +8 -4
  3. data/.github/workflows/ubuntu.yml +10 -4
  4. data/.github/workflows/windows.yml +12 -5
  5. data/Gemfile +3 -1
  6. data/Gemfile.lock +84 -0
  7. data/README.adoc +36 -3
  8. data/bin/reverse_adoc +7 -0
  9. data/bin/w2a +5 -17
  10. data/lib/reverse_asciidoctor.rb +7 -47
  11. data/lib/reverse_asciidoctor/cleaner.rb +23 -0
  12. data/lib/reverse_asciidoctor/config.rb +2 -1
  13. data/lib/reverse_asciidoctor/converters/a.rb +6 -2
  14. data/lib/reverse_asciidoctor/converters/example.rb +17 -0
  15. data/lib/reverse_asciidoctor/converters/express_ref.rb +12 -0
  16. data/lib/reverse_asciidoctor/converters/ext_description.rb +16 -0
  17. data/lib/reverse_asciidoctor/converters/ext_descriptions.rb +12 -0
  18. data/lib/reverse_asciidoctor/converters/h.rb +17 -2
  19. data/lib/reverse_asciidoctor/converters/img.rb +23 -20
  20. data/lib/reverse_asciidoctor/converters/note.rb +17 -0
  21. data/lib/reverse_asciidoctor/html_converter.rb +56 -0
  22. data/lib/reverse_asciidoctor/smrl_description_converter.rb +45 -0
  23. data/lib/reverse_asciidoctor/version.rb +1 -1
  24. data/reverse_adoc.gemspec +1 -0
  25. data/spec/assets/anchors.html +8 -0
  26. data/spec/assets/external_images.docx +0 -0
  27. data/spec/assets/external_images.html +35 -0
  28. data/spec/bin/reverse_adoc_spec.rb +32 -0
  29. data/spec/bin/w2a_spec.rb +35 -0
  30. data/spec/components/anchors_spec.rb +5 -0
  31. data/spec/lib/reverse_asciidoctor/cleaner_spec.rb +24 -0
  32. data/spec/lib/reverse_asciidoctor/converters/example_spec.rb +22 -0
  33. data/spec/lib/reverse_asciidoctor/converters/express_ref_spec.rb +14 -0
  34. data/spec/lib/reverse_asciidoctor/converters/ext_description_spec.rb +20 -0
  35. data/spec/lib/reverse_asciidoctor/converters/ext_descriptions_spec.rb +13 -0
  36. data/spec/lib/reverse_asciidoctor/converters/note_spec.rb +22 -0
  37. data/spec/lib/reverse_asciidoctor_spec.rb +58 -5
  38. data/spec/spec_helper.rb +5 -0
  39. data/spec/support/shell_helpers.rb +15 -0
  40. metadata +45 -3
@@ -3,10 +3,11 @@ require 'tmpdir'
3
3
  module ReverseAsciidoctor
4
4
  class Config
5
5
  attr_accessor :unknown_tags, :tag_border, :mathml2asciimath, :external_images,
6
- :destination, :sourcedir, :image_counter, :image_counter_pattern
6
+ :destination, :sourcedir, :image_counter, :image_counter_pattern, :input_format
7
7
 
8
8
  def initialize
9
9
  @unknown_tags = :pass_through
10
+ @input_format = :html
10
11
  @mathml2asciimath = false
11
12
  @external_images = false
12
13
 
@@ -9,10 +9,14 @@ module ReverseAsciidoctor
9
9
  title = extract_title(node)
10
10
  id = node['id'] || node['name']
11
11
 
12
- if !id.nil? && !id.empty?
12
+ id = id&.gsub(/\s/, "")&.gsub(/__+/, "_")
13
+
14
+ if /^_Toc\d+$|^_GoBack$/.match id
15
+ ""
16
+ elsif !id.nil? && !id.empty?
13
17
  "[[#{id}]]"
14
18
  elsif href.to_s.start_with?('#')
15
- href = href.sub(/^#/, "")
19
+ href = href.sub(/^#/, "").gsub(/\s/, "").gsub(/__+/, "_")
16
20
  if name.empty?
17
21
  "<<#{href}>>"
18
22
  else
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ReverseAsciidoctor
4
+ module Converters
5
+ class Example < Base
6
+ def convert(node, state = {})
7
+ <<~TEMPLATE
8
+ [example]
9
+ ====
10
+ #{treat_children(node, state)}
11
+ ====
12
+ TEMPLATE
13
+ end
14
+ end
15
+ register :example, Example.new
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ReverseAsciidoctor
4
+ module Converters
5
+ class ExpressRef < Base
6
+ def convert(node, _state = {})
7
+ "express_ref:[#{node['linkend']}]"
8
+ end
9
+ end
10
+ register :express_ref, ExpressRef.new
11
+ end
12
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ReverseAsciidoctor
4
+ module Converters
5
+ class ExtDescription < Base
6
+ def convert(node, state = {})
7
+ <<~TEMPLATE
8
+ (*"#{node['linkend']}"
9
+ #{treat_children(node, state)}
10
+ *)
11
+ TEMPLATE
12
+ end
13
+ end
14
+ register :ext_description, ExtDescription.new
15
+ end
16
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ReverseAsciidoctor
4
+ module Converters
5
+ class ExtDescriptions < Base
6
+ def convert(node, state = {})
7
+ treat_children(node, state)
8
+ end
9
+ end
10
+ register :ext_descriptions, ExtDescriptions.new
11
+ end
12
+ end
@@ -3,9 +3,24 @@ module ReverseAsciidoctor
3
3
  class H < Base
4
4
  def convert(node, state = {})
5
5
  id = node['id']
6
- anchor = id ? "[[#{id}]]\n" : ""
6
+ anchor = id ? "[[#{id}]]" : ""
7
+ internal_anchor = treat_children_anchors(node, state) || ""
8
+ anchor.empty? and anchor = internal_anchor
9
+ anchor.empty? or anchor += "\n"
7
10
  prefix = '=' * (node.name[/\d/].to_i + 1)
8
- ["\n", anchor, prefix, ' ', treat_children(node, state), "\n"].join
11
+ ["\n", anchor, prefix, ' ', treat_children_no_anchors(node, state), "\n"].join
12
+ end
13
+
14
+ def treat_children_no_anchors(node, state)
15
+ node.children.reject { |a| a.name == "a" }.inject('') do |memo, child|
16
+ memo << treat(child, state)
17
+ end
18
+ end
19
+
20
+ def treat_children_anchors(node, state)
21
+ node.children.select { |a| a.name == "a" }.inject('') do |memo, child|
22
+ memo << treat(child, state)
23
+ end
9
24
  end
10
25
  end
11
26
 
@@ -1,4 +1,8 @@
1
- require 'fileutils'
1
+ require "fileutils"
2
+ require "pathname"
3
+ require "tempfile"
4
+ require "base64"
5
+ require "mimemagic"
2
6
 
3
7
  module ReverseAsciidoctor
4
8
  module Converters
@@ -22,25 +26,7 @@ module ReverseAsciidoctor
22
26
  images_dir = dest_dir + 'images'
23
27
  FileUtils.mkdir_p(images_dir)
24
28
 
25
- ext = ""
26
-
27
- if imgdata
28
- file = Tempfile.new(["radoc", ".jpg"]) do |f|
29
- f.binmode
30
- f.write(Base64.strict_decode64(imgdata))
31
- f.rewind
32
- ext = MimeMagic.by_magic(f)
33
- end
34
-
35
- image_src_path = file.path
36
- # puts "tempfile: #{file}"
37
-
38
- else
39
- ext = File.extname(src).strip.downcase[1..-1]
40
- image_src_path = Pathname.new(ReverseAsciidoctor.config.sourcedir) + src
41
-
42
- end
43
-
29
+ ext, image_src_path = determine_image_src_path(src, imgdata)
44
30
  image_dest_path = images_dir + "#{image_number}.#{ext}"
45
31
 
46
32
  # puts "image_dest_path: #{image_dest_path.to_s}"
@@ -52,6 +38,23 @@ module ReverseAsciidoctor
52
38
  image_dest_path.relative_path_from(dest_dir)
53
39
  end
54
40
 
41
+ def determine_image_src_path(src, imgdata)
42
+ return copy_temp_file(imgdata) if imgdata
43
+
44
+ ext = File.extname(src).strip.downcase[1..-1]
45
+ [ext, Pathname.new(ReverseAsciidoctor.config.sourcedir) + src]
46
+ end
47
+
48
+ def copy_temp_file(imgdata)
49
+ Tempfile.open(['radoc', '.jpg']) do |f|
50
+ f.binmode
51
+ f.write(Base64.strict_decode64(imgdata))
52
+ f.rewind
53
+ ext = MimeMagic.by_magic(f).subtype
54
+ [ext, f.path]
55
+ end
56
+ end
57
+
55
58
  def convert(node, state = {})
56
59
  alt = node['alt']
57
60
  src = node['src']
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ReverseAsciidoctor
4
+ module Converters
5
+ class Note < Base
6
+ def convert(node, state = {})
7
+ <<~TEMPLATE
8
+ [NOTE]
9
+ --
10
+ #{treat_children(node, state)}
11
+ --
12
+ TEMPLATE
13
+ end
14
+ end
15
+ register :note, Note.new
16
+ end
17
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'reverse_asciidoctor/converters/a'
4
+ require 'reverse_asciidoctor/converters/aside'
5
+ require 'reverse_asciidoctor/converters/audio'
6
+ require 'reverse_asciidoctor/converters/blockquote'
7
+ require 'reverse_asciidoctor/converters/br'
8
+ require 'reverse_asciidoctor/converters/bypass'
9
+ require 'reverse_asciidoctor/converters/code'
10
+ require 'reverse_asciidoctor/converters/div'
11
+ require 'reverse_asciidoctor/converters/drop'
12
+ require 'reverse_asciidoctor/converters/em'
13
+ require 'reverse_asciidoctor/converters/figure'
14
+ require 'reverse_asciidoctor/converters/h'
15
+ require 'reverse_asciidoctor/converters/head'
16
+ require 'reverse_asciidoctor/converters/hr'
17
+ require 'reverse_asciidoctor/converters/ignore'
18
+ require 'reverse_asciidoctor/converters/img'
19
+ require 'reverse_asciidoctor/converters/mark'
20
+ require 'reverse_asciidoctor/converters/li'
21
+ require 'reverse_asciidoctor/converters/ol'
22
+ require 'reverse_asciidoctor/converters/p'
23
+ require 'reverse_asciidoctor/converters/pass_through'
24
+ require 'reverse_asciidoctor/converters/pre'
25
+ require 'reverse_asciidoctor/converters/q'
26
+ require 'reverse_asciidoctor/converters/strong'
27
+ require 'reverse_asciidoctor/converters/sup'
28
+ require 'reverse_asciidoctor/converters/sub'
29
+ require 'reverse_asciidoctor/converters/table'
30
+ require 'reverse_asciidoctor/converters/td'
31
+ require 'reverse_asciidoctor/converters/th'
32
+ require 'reverse_asciidoctor/converters/text'
33
+ require 'reverse_asciidoctor/converters/tr'
34
+ require 'reverse_asciidoctor/converters/video'
35
+ require 'reverse_asciidoctor/converters/math'
36
+
37
+ module ReverseAsciidoctor
38
+ class HtmlConverter
39
+ def self.convert(input, options = {})
40
+ root = if input.is_a?(String)
41
+ then Nokogiri::HTML(input).root
42
+ elsif input.is_a?(Nokogiri::XML::Document)
43
+ then input.root
44
+ elsif input.is_a?(Nokogiri::XML::Node)
45
+ then input
46
+ end
47
+
48
+ root || (return '')
49
+
50
+ ReverseAsciidoctor.config.with(options) do
51
+ result = ReverseAsciidoctor::Converters.lookup(root.name).convert(root)
52
+ ReverseAsciidoctor.cleaner.tidy(result)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'reverse_asciidoctor/converters/a'
4
+ require 'reverse_asciidoctor/converters/blockquote'
5
+ require 'reverse_asciidoctor/converters/bypass'
6
+ require 'reverse_asciidoctor/converters/br'
7
+ require 'reverse_asciidoctor/converters/code'
8
+ require 'reverse_asciidoctor/converters/drop'
9
+ require 'reverse_asciidoctor/converters/em'
10
+ require 'reverse_asciidoctor/converters/example'
11
+ require 'reverse_asciidoctor/converters/ext_descriptions'
12
+ require 'reverse_asciidoctor/converters/ext_description'
13
+ require 'reverse_asciidoctor/converters/express_ref'
14
+ require 'reverse_asciidoctor/converters/head'
15
+ require 'reverse_asciidoctor/converters/hr'
16
+ require 'reverse_asciidoctor/converters/ignore'
17
+ require 'reverse_asciidoctor/converters/note'
18
+ require 'reverse_asciidoctor/converters/p'
19
+ require 'reverse_asciidoctor/converters/pass_through'
20
+ require 'reverse_asciidoctor/converters/q'
21
+ require 'reverse_asciidoctor/converters/strong'
22
+ require 'reverse_asciidoctor/converters/sup'
23
+ require 'reverse_asciidoctor/converters/sub'
24
+ require 'reverse_asciidoctor/converters/text'
25
+
26
+ module ReverseAsciidoctor
27
+ class SmrlDescriptionConverter
28
+ def self.convert(input, options = {})
29
+ root = if input.is_a?(String)
30
+ then Nokogiri::XML(input).root
31
+ elsif input.is_a?(Nokogiri::XML::Document)
32
+ then input.root
33
+ elsif input.is_a?(Nokogiri::XML::Node)
34
+ then input
35
+ end
36
+
37
+ root || (return '')
38
+
39
+ ReverseAsciidoctor.config.with(options) do
40
+ result = ReverseAsciidoctor::Converters.lookup(root.name).convert(root)
41
+ ReverseAsciidoctor.cleaner.tidy(result)
42
+ end
43
+ end
44
+ end
45
+ end
@@ -1,3 +1,3 @@
1
1
  module ReverseAsciidoctor
2
- VERSION = '0.2.3'
2
+ VERSION = '0.2.8'
3
3
  end
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
22
22
  # specify any dependencies here; for example:
23
23
  s.add_dependency 'nokogiri', ">= 1.10.4"
24
24
  s.add_dependency 'mathml2asciimath'
25
+ s.add_dependency 'mimemagic'
25
26
  s.add_development_dependency 'rspec'
26
27
  s.add_development_dependency 'simplecov'
27
28
  s.add_development_dependency 'rake'
@@ -14,9 +14,17 @@
14
14
 
15
15
  some text...
16
16
 
17
+ <a href="#a__b spaced">Double __ anchor with space</a>
18
+
19
+ Double __ anchor with space <a id="a__b spaced"/>
20
+
21
+ <a id="_Toc12345"/>
22
+
17
23
  <img src="http://foobar.com/logo.png">
18
24
  <img alt="foobar image" src="http://foobar.com/foobar.png">
19
25
  <img alt="foobar image 2" title="this is the foobar image 2" src="http://foobar.com/foobar2.png">
20
26
  some text...
27
+
28
+ <h1><a id="a__Foreword"></a>Text</h1>
21
29
  </body>
22
30
  </html>
@@ -0,0 +1,35 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
2
+ <?xml version="1.0" encoding="UTF-8"??><html xmlns="http://www.w3.org/1999/xhtml" style="margin: 0;">
3
+ <!--This file was converted to xhtml by LibreOffice - see http://cgit.freedesktop.org/libreoffice/core/tree/filter/source/xslt for the code.--><head profile="http://dublincore.org/documents/dcmi-terms/">
4
+ <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8">
5
+ <meta name="DCTERMS.title" content="" xml:lang="en-US">
6
+ <meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646">
7
+ <meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml">
8
+ <meta name="DCTERMS.creator" content="Nick Nicholas">
9
+ <meta name="DCTERMS.issued" content="2019-11-21T08:48:00" scheme="DCTERMS.W3CDTF">
10
+ <meta name="DCTERMS.contributor" content="Nick Nicholas">
11
+ <meta name="DCTERMS.modified" content="2019-11-21T10:01:00" scheme="DCTERMS.W3CDTF">
12
+ <meta name="DCTERMS.provenance" content="" xml:lang="en-US">
13
+ <meta name="DCTERMS.subject" content="," xml:lang="en-US">
14
+ <link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en">
15
+ <link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en">
16
+ <link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en">
17
+ <link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en">
18
+ </head>
19
+ <body dir="ltr" style="max-width: 21.001cm; margin: 2.54cm 3.175cm;">
20
+ <h1 class="P3" style="clear: both; color: #2f5496; font-size: 16pt; font-family: Calibri Light; writing-mode: lr-tb; margin: 0.423cm 0 0cm;" align="left ! important">
21
+ <a id="a__Hello" style="margin: 0;"><span style="margin: 0;"></span></a><span class="T1" style="margin: 0;">Hello</span>
22
+ </h1>
23
+ <p class="P1" style="font-size: 12pt; font-family: Calibri; writing-mode: lr-tb; margin: 0;" align="left ! important"> </p>
24
+ <p class="Standard" style="font-size: 12pt; font-family: Calibri; writing-mode: lr-tb; margin: 0;" align="left ! important"><span class="T1" style="margin: 0;">H</span><h1 class="T3" style="vertical-align: super; font-size: 58%; margin: 0;">2</h1><span class="T1" style="margin: 0;">0</span></p>
25
+ <p class="P1" style="font-size: 12pt; font-family: Calibri; writing-mode: lr-tb; margin: 0;" align="left ! important"> </p>
26
+ <!--Next 'div' was a 'text:p'.--><div class="Standard" style="font-size: 12pt; font-family: Calibri; writing-mode: lr-tb; margin: 0;" align="left ! important">
27
+ <!--Next ' span' is a draw:frame. --><span style="margin: 0;"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block" style="margin: 0;"><mrow style="margin: 0;"><mrow style="margin: 0;"><mrow style="margin: 0;"></mrow><mrow style="margin: 0;"><mi style="margin: 0;">i</mi><mo stretchy="false" style="margin: 0;">=</mo><mn style="margin: 0;">1</mn></mrow></mrow><mrow style="margin: 0;"><mrow style="margin: 0;"></mrow><mi style="margin: 0;">n</mi><msubsup style="margin: 0;"><mi style="margin: 0;">β</mi><mn style="margin: 0;">2</mn><mi style="margin: 0;">i</mi></msubsup></mrow></mrow></math></span>
28
+ </div>
29
+ <div style="clear: both; line-height: 0; width: 0; height: 0; margin: 0; padding: 0;"> </div>
30
+ <!--Next 'div' was a 'text:p'.--><div class="Standard" style="font-size: 12pt; font-family: Calibri; writing-mode: lr-tb; margin: 0;" align="left ! important">
31
+ <a id="_GoBack" style="margin: 0;"></a><!--Next ' span' is a draw:frame. --><span style="height: 1.764cm; margin: 0cm; padding: 0; border: none; width: 1.764cm; font-size: 12pt; font-family: Calibri; text-align: center; vertical-align: top; background-color: transparent;" class="fr1" id="Εικόνα_2"><img style="height: 1.764cm; width: 1.764cm; margin: 0;" alt="" src="data:image/gif;base64,R0lGODlhZABkAIAAAAAAAP///ywAAAAAZABkAEAC+4yPqcvtD6OctNqLs968XwCGokd24kidYckuKri9cFvKQCzTdG7x+u+y+YDECqqIzByTzKbzCY1Kp9Sq9eoQKrTY1Ev57TJsuLA4Meylz8HTxMz2LOPFOR1ov+v3/L7/DxgoOEj4IcRVeLA2Bue3CEHGF2nYyDaJcWn5+LZ5lamm0tf5MHpWilYJ6INymmiQ52q0EqsBSythews5qwt60wscLDxMXGx8jJysvMzc7PwM7XmYWzh9SPuJmuq43Raq2ooQbpUdMT5Vbn4ela7+fdfu/h4Xv9stfS/vBr+uPa+Zz94/gPvADCRY0FdCfgdxBezSr1+Vh+Iaclu4KoSiKGsSL9YTRu1YSGMji5UkdnJYSpC8nq0M9hJYzF4zo9m8iTOnzigFAAAh/tNUaGlzIGZpbGUgd2FzIGNyZWF0ZWQgYnkNDUdyYXBoaWMgV29ya3Nob3CZIFByb2Zlc3Npb25hbCAyLjBhDQ1mcm9tIEFsY2hlbXkgTWluZHdvcmtzIEluYy4NaHR0cDovL3d3dy5taW5kd29ya3Nob3AuY29tDQ1UaGlzIGltYWdlIG1heSBoYXZlIGJlZW4gY3JlYXRlZCBieQ1hIHBhcnR5IG90aGVyIHRoYW4gQWxjaGVteSBNaW5kd29ya3MgSW5jLg0NVXNlIG5vIGhvb2tzADs="></span>
32
+ </div>
33
+ <div style="clear: both; line-height: 0; width: 0; height: 0; margin: 0; padding: 0;"> </div>
34
+ </body>
35
+ </html>
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe 'bin/revrse_adoc' do
6
+ subject(:convert) do
7
+ ShellUtils.execute!("./bin/reverse_adoc -e -o test1 #{input_file_path}")
8
+ end
9
+ unless Gem.win_platform?
10
+ context 'when external images present' do
11
+ let(:input_file_path) { 'spec/assets/external_images.html' }
12
+ let(:images_folder) { 'images' }
13
+
14
+ after do
15
+ FileUtils.rm_rf(images_folder) if File.directory?(images_folder)
16
+ end
17
+
18
+ it 'Does not raise error' do
19
+ expect { convert }.to_not raise_error
20
+ end
21
+
22
+ it 'exatracts images from source html' do
23
+ expect { convert }
24
+ .to(change do
25
+ Dir["#{images_folder}/*gif"]
26
+ .map { |entry| File.basename(entry) }
27
+ .sort
28
+ end.from([]).to(['001.gif']))
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe 'bin/w2a' do
6
+ subject(:convert) do
7
+ ShellUtils.execute!("./bin/w2a -e -o test1 #{input_file_path}")
8
+ end
9
+ # TODO: fix github actions integration with libreoffice, currently it hangs
10
+ # when trying to use soffice binary
11
+ unless Gem.win_platform? ||
12
+ (Gem::Platform.local.os == 'darwin' && !ENV['GITHUB_ACTION'].nil?)
13
+ context 'when external images present' do
14
+ let(:input_file_path) { 'spec/assets/external_images.docx' }
15
+ let(:images_folder) { 'images' }
16
+
17
+ after do
18
+ FileUtils.rm_rf(images_folder) if File.directory?(images_folder)
19
+ end
20
+
21
+ it 'Does not raise error' do
22
+ expect { convert }.to_not raise_error
23
+ end
24
+
25
+ it 'exatracts images from source html' do
26
+ expect { convert }
27
+ .to(change do
28
+ Dir["#{images_folder}/*gif"]
29
+ .map { |entry| File.basename(entry) }
30
+ .sort
31
+ end.from([]).to(['001.gif', '002.gif']))
32
+ end
33
+ end
34
+ end
35
+ end