sablon 0.0.21 → 0.0.22
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.
- checksums.yaml +4 -4
- data/.travis.yml +4 -3
- data/Gemfile.lock +9 -9
- data/README.md +120 -11
- data/lib/sablon.rb +7 -1
- data/lib/sablon/configuration/configuration.rb +165 -0
- data/lib/sablon/configuration/html_tag.rb +99 -0
- data/lib/sablon/content.rb +12 -9
- data/lib/sablon/context.rb +27 -20
- data/lib/sablon/environment.rb +31 -0
- data/lib/sablon/html/ast.rb +290 -75
- data/lib/sablon/html/ast_builder.rb +90 -0
- data/lib/sablon/html/converter.rb +3 -123
- data/lib/sablon/numbering.rb +0 -5
- data/lib/sablon/operations.rb +11 -11
- data/lib/sablon/parser/mail_merge.rb +7 -6
- data/lib/sablon/processor/document.rb +9 -9
- data/lib/sablon/processor/numbering.rb +4 -4
- data/lib/sablon/template.rb +5 -4
- data/lib/sablon/version.rb +1 -1
- data/sablon.gemspec +3 -3
- data/test/configuration_test.rb +122 -0
- data/test/content_test.rb +7 -6
- data/test/context_test.rb +11 -11
- data/test/environment_test.rb +27 -0
- data/test/expression_test.rb +2 -2
- data/test/fixtures/html/html_test_content.html +174 -0
- data/test/fixtures/html_sample.docx +0 -0
- data/test/fixtures/xml/comment_block_and_comment_as_key.xml +31 -0
- data/test/html/ast_builder_test.rb +65 -0
- data/test/html/ast_test.rb +117 -0
- data/test/html/converter_test.rb +386 -87
- data/test/html/node_properties_test.rb +113 -0
- data/test/html_test.rb +10 -10
- data/test/mail_merge_parser_test.rb +3 -2
- data/test/processor/document_test.rb +20 -2
- data/test/section_properties_test.rb +1 -1
- data/test/support/html_snippets.rb +9 -0
- data/test/test_helper.rb +0 -1
- metadata +27 -7
| @@ -0,0 +1,113 @@ | |
| 1 | 
            +
            # -*- coding: utf-8 -*-
         | 
| 2 | 
            +
            require "test_helper"
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            class NodePropertiesTest < Sablon::TestCase
         | 
| 5 | 
            +
              def setup
         | 
| 6 | 
            +
                # struct to simplify prop whitelisting during tests
         | 
| 7 | 
            +
                @inc_props = Struct.new(:props) do
         | 
| 8 | 
            +
                  def include?(*)
         | 
| 9 | 
            +
                    true
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              def test_empty_node_properties_converison
         | 
| 15 | 
            +
                # test empty properties
         | 
| 16 | 
            +
                props = Sablon::HTMLConverter::NodeProperties.new('w:pPr', {}, @inc_props.new)
         | 
| 17 | 
            +
                assert_equal props.inspect, ''
         | 
| 18 | 
            +
                assert_nil props.to_docx
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              def test_simple_node_property_converison
         | 
| 22 | 
            +
                props = { 'pStyle' => 'Paragraph' }
         | 
| 23 | 
            +
                props = Sablon::HTMLConverter::NodeProperties.new('w:pPr', props, @inc_props.new)
         | 
| 24 | 
            +
                assert_equal props.inspect, 'pStyle=Paragraph'
         | 
| 25 | 
            +
                assert_equal props.to_docx, '<w:pPr><w:pStyle w:val="Paragraph" /></w:pPr>'
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              def test_node_property_with_nil_value_converison
         | 
| 29 | 
            +
                props = { 'b' => nil }
         | 
| 30 | 
            +
                props = Sablon::HTMLConverter::NodeProperties.new('w:rPr', props, @inc_props.new)
         | 
| 31 | 
            +
                assert_equal props.inspect, 'b'
         | 
| 32 | 
            +
                assert_equal props.to_docx, '<w:rPr><w:b /></w:rPr>'
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
              def test_node_property_with_hash_value_converison
         | 
| 36 | 
            +
                props = { 'shd' => { color: 'clear', fill: '123456', test: nil } }
         | 
| 37 | 
            +
                props = Sablon::HTMLConverter::NodeProperties.new('w:rPr', props, @inc_props.new)
         | 
| 38 | 
            +
                assert_equal props.inspect, 'shd={:color=>"clear", :fill=>"123456", :test=>nil}'
         | 
| 39 | 
            +
                assert_equal props.to_docx, '<w:rPr><w:shd w:color="clear" w:fill="123456" /></w:rPr>'
         | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
              def test_node_property_with_array_value_converison
         | 
| 43 | 
            +
                props = { 'numPr' => [{ 'ilvl' => 1 }, { 'numId' => 34 }] }
         | 
| 44 | 
            +
                props = Sablon::HTMLConverter::NodeProperties.new('w:pPr', props, @inc_props.new)
         | 
| 45 | 
            +
                assert_equal props.inspect, 'numPr=[{"ilvl"=>1}, {"numId"=>34}]'
         | 
| 46 | 
            +
                assert_equal props.to_docx, '<w:pPr><w:numPr><w:ilvl w:val="1" /><w:numId w:val="34" /></w:numPr></w:pPr>'
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
              def test_complex_node_properties_conversion
         | 
| 50 | 
            +
                props = {
         | 
| 51 | 
            +
                  'top1' => 'val1',
         | 
| 52 | 
            +
                  'top2' => [
         | 
| 53 | 
            +
                    { 'mid0' => nil },
         | 
| 54 | 
            +
                    { 'mid1' => [
         | 
| 55 | 
            +
                      { 'bottom1' => { key1: 'abc' } },
         | 
| 56 | 
            +
                      { 'bottom2' => 'xyz' }
         | 
| 57 | 
            +
                    ] },
         | 
| 58 | 
            +
                    { 'mid2' => 'val2' }
         | 
| 59 | 
            +
                  ],
         | 
| 60 | 
            +
                  'top3' => { key1: 1, key2: '2', key3: nil, key4: true, key5: false }
         | 
| 61 | 
            +
                }
         | 
| 62 | 
            +
                output = <<-DOCX.gsub(/^\s*/, '').delete("\n")
         | 
| 63 | 
            +
                  <w:pPr>
         | 
| 64 | 
            +
                    <w:top1 w:val="val1" />
         | 
| 65 | 
            +
                    <w:top2>
         | 
| 66 | 
            +
                      <w:mid0 />
         | 
| 67 | 
            +
                      <w:mid1>
         | 
| 68 | 
            +
                        <w:bottom1 w:key1="abc" />
         | 
| 69 | 
            +
                        <w:bottom2 w:val="xyz" />
         | 
| 70 | 
            +
                      </w:mid1>
         | 
| 71 | 
            +
                      <w:mid2 w:val="val2" />
         | 
| 72 | 
            +
                    </w:top2>
         | 
| 73 | 
            +
                    <w:top3 w:key1="1" w:key2="2" w:key4="true" />
         | 
| 74 | 
            +
                  </w:pPr>
         | 
| 75 | 
            +
                DOCX
         | 
| 76 | 
            +
                props = Sablon::HTMLConverter::NodeProperties.new('w:pPr', props, @inc_props.new)
         | 
| 77 | 
            +
                assert_equal props.to_docx, output
         | 
| 78 | 
            +
              end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
              def test_setting_property_value
         | 
| 81 | 
            +
                props = {}
         | 
| 82 | 
            +
                props = Sablon::HTMLConverter::NodeProperties.new('w:pPr', props, @inc_props.new)
         | 
| 83 | 
            +
                props['rStyle'] = 'FootnoteText'
         | 
| 84 | 
            +
                assert_equal({ 'rStyle' => 'FootnoteText' }, props.instance_variable_get(:@properties))
         | 
| 85 | 
            +
              end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
              def test_properties_filtered_on_init
         | 
| 88 | 
            +
                props = { 'pStyle' => 'Paragraph', 'rStyle' => 'EndnoteText' }
         | 
| 89 | 
            +
                props = Sablon::HTMLConverter::NodeProperties.new('w:rPr', props, %w[rStyle])
         | 
| 90 | 
            +
                assert_equal({ 'rStyle' => 'EndnoteText' }, props.instance_variable_get(:@properties))
         | 
| 91 | 
            +
              end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
              def test_transferred_properties
         | 
| 94 | 
            +
                props = { 'pStyle' => 'Paragraph', 'rStyle' => 'EndnoteText' }
         | 
| 95 | 
            +
                props = Sablon::HTMLConverter::NodeProperties.new(nil, props, %w[pStyle])
         | 
| 96 | 
            +
                trans = props.transferred_properties
         | 
| 97 | 
            +
                assert_equal({ 'rStyle' => 'EndnoteText' }, trans)
         | 
| 98 | 
            +
              end
         | 
| 99 | 
            +
             | 
| 100 | 
            +
              def test_node_properties_paragraph_factory
         | 
| 101 | 
            +
                props = { 'pStyle' => 'Paragraph' }
         | 
| 102 | 
            +
                props = Sablon::HTMLConverter::NodeProperties.paragraph(props)
         | 
| 103 | 
            +
                assert_equal 'pStyle=Paragraph', props.inspect
         | 
| 104 | 
            +
                assert_equal props.to_docx, '<w:pPr><w:pStyle w:val="Paragraph" /></w:pPr>'
         | 
| 105 | 
            +
              end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
              def test_node_properties_run_factory
         | 
| 108 | 
            +
                props = { 'color' => 'FF00FF' }
         | 
| 109 | 
            +
                props = Sablon::HTMLConverter::NodeProperties.run(props)
         | 
| 110 | 
            +
                assert_equal 'color=FF00FF', props.inspect
         | 
| 111 | 
            +
                assert_equal '<w:rPr><w:color w:val="FF00FF" /></w:rPr>', props.to_docx
         | 
| 112 | 
            +
              end
         | 
| 113 | 
            +
            end
         | 
    
        data/test/html_test.rb
    CHANGED
    
    | @@ -1,9 +1,10 @@ | |
| 1 1 | 
             
            # -*- coding: utf-8 -*-
         | 
| 2 2 | 
             
            require "test_helper"
         | 
| 3 | 
            -
            require "support/ | 
| 3 | 
            +
            require "support/html_snippets"
         | 
| 4 4 |  | 
| 5 5 | 
             
            class SablonHTMLTest < Sablon::TestCase
         | 
| 6 6 | 
             
              include Sablon::Test::Assertions
         | 
| 7 | 
            +
              include HTMLSnippets
         | 
| 7 8 |  | 
| 8 9 | 
             
              def setup
         | 
| 9 10 | 
             
                super
         | 
| @@ -16,7 +17,7 @@ class SablonHTMLTest < Sablon::TestCase | |
| 16 17 | 
             
                template_path = @base_path + "fixtures/insertion_template.docx"
         | 
| 17 18 | 
             
                output_path = @base_path + "sandbox/html.docx"
         | 
| 18 19 | 
             
                template = Sablon.template template_path
         | 
| 19 | 
            -
                context = {'html:content' => content}
         | 
| 20 | 
            +
                context = { 'html:content' => content }
         | 
| 20 21 | 
             
                template.render_to_file output_path, context
         | 
| 21 22 |  | 
| 22 23 | 
             
                assert_docx_equal @sample_path, output_path
         | 
| @@ -26,7 +27,7 @@ class SablonHTMLTest < Sablon::TestCase | |
| 26 27 | 
             
                template_path = @base_path + "fixtures/insertion_template_no_styles.docx"
         | 
| 27 28 | 
             
                output_path = @base_path + "sandbox/html_no_styles.docx"
         | 
| 28 29 | 
             
                template = Sablon.template template_path
         | 
| 29 | 
            -
                context = {'html:content' => content}
         | 
| 30 | 
            +
                context = { 'html:content' => content }
         | 
| 30 31 |  | 
| 31 32 | 
             
                e = assert_raises(ArgumentError) do
         | 
| 32 33 | 
             
                  template.render_to_file output_path, context
         | 
| @@ -37,13 +38,12 @@ class SablonHTMLTest < Sablon::TestCase | |
| 37 38 | 
             
              end
         | 
| 38 39 |  | 
| 39 40 | 
             
              private
         | 
| 41 | 
            +
             | 
| 40 42 | 
             
              def content
         | 
| 41 | 
            -
                 | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
            <ol><li>Vestibulum <ol><li>ante ipsum primis </li></ol></li><li>in faucibus orci luctus <ol><li>et ultrices posuere cubilia Curae; <ol><li>Aliquam vel dolor </li><li>sed sem maximus </li></ol></li><li>fermentum in non odio. <ol><li>Fusce hendrerit ornare mollis. </li></ol></li><li>Nunc scelerisque nibh nec turpis tempor pulvinar. </li></ol></li><li>Donec eros turpis, </li><li>aliquet vel volutpat sit amet, <ol><li>semper eu purus. </li><li>Proin ac erat nec urna efficitur vulputate. <ol><li>Quisque varius convallis ultricies. </li><li>Nullam vel fermentum eros. </li></ol></li></ol></li></ol><div>Pellentesque nulla leo, auctor ornare erat sed, rhoncus congue diam. Duis non porttitor nulla, ut eleifend enim. Pellentesque non tempor sem.</div><div>Mauris auctor egestas arcu, </div><ol><li>id venenatis nibh dignissim id. </li><li>In non placerat metus. </li></ol><ul><li>Nunc sed consequat metus. </li><li>Nulla consectetur lorem consequat, </li><li>malesuada dui at, lacinia lectus. </li></ul><ol><li>Aliquam efficitur </li><li>lorem a mauris feugiat, </li><li>at semper eros pellentesque. </li></ol><div>Nunc lacus diam, consectetur ut odio sit amet, placerat pharetra erat. Sed commodo ut sem id congue. Sed eget neque elit. Curabitur at erat tortor. Maecenas eget sapien vitae est sagittis accumsan et nec orci. Integer luctus at nisl eget venenatis. Nunc nunc eros, consectetur at tortor et, tristique ultrices elit. Nulla in turpis nibh.</div><ul><li>Nam consectetur <ul><li>venenatis tempor. </li></ul></li><li>Aenean <ul><li>blandit<ul><li>porttitor massa, <ul><li>non efficitur <ul><li>metus. </li></ul></li></ul></li></ul></li></ul></li><li>Duis faucibus nunc nec venenatis faucibus. </li><li>Aliquam erat volutpat. </li></ul><div><strong>Quisque non neque ut lacus eleifend volutpat quis sed lacus.<br />Praesent ultrices purus eu quam elementum, sit amet faucibus elit interdum. In lectus orci,<br /> elementum quis dictum ac, porta ac ante. Fusce tempus ac mauris id cursus. Phasellus a erat nulla. <em>Mauris dolor orci</em>, malesuada auctor dignissim non, <u>posuere nec odio</u>. Etiam hendrerit justo nec diam ullamcorper, nec blandit elit sodales.</strong></div>
         | 
| 47 | 
            -
            HTML
         | 
| 43 | 
            +
                html_str = snippet('html_test_content')
         | 
| 44 | 
            +
                # combine all white space
         | 
| 45 | 
            +
                html_str = html_str.gsub(/\s+/, ' ')
         | 
| 46 | 
            +
                # clear any white space between block level tags and other content
         | 
| 47 | 
            +
                html_str.gsub(%r{\s*<(/?(?:h\d|div|p|br|ul|ol|li).*?)>\s*}, '<\1>')
         | 
| 48 48 | 
             
              end
         | 
| 49 49 | 
             
            end
         | 
| @@ -7,6 +7,7 @@ module MailMergeParser | |
| 7 7 | 
             
                include DocumentXMLHelper
         | 
| 8 8 | 
             
                def setup
         | 
| 9 9 | 
             
                  super
         | 
| 10 | 
            +
                  @env = Sablon::Environment.new(nil)
         | 
| 10 11 | 
             
                  @parser = Sablon::Parser::MailMerge.new
         | 
| 11 12 | 
             
                end
         | 
| 12 13 |  | 
| @@ -35,7 +36,7 @@ module MailMergeParser | |
| 35 36 | 
             
                end
         | 
| 36 37 |  | 
| 37 38 | 
             
                def test_replace
         | 
| 38 | 
            -
                  field.replace(Sablon.content(:string, "Hello"))
         | 
| 39 | 
            +
                  field.replace(Sablon.content(:string, "Hello"), @env)
         | 
| 39 40 | 
             
                  xml = <<-xml.strip
         | 
| 40 41 | 
             
            <w:p>
         | 
| 41 42 | 
             
            <w:r w:rsidR=\"004B49F0\">
         | 
| @@ -70,7 +71,7 @@ xml | |
| 70 71 | 
             
                end
         | 
| 71 72 |  | 
| 72 73 | 
             
                def test_replace
         | 
| 73 | 
            -
                  field.replace(Sablon.content(:string, "Hello"))
         | 
| 74 | 
            +
                  field.replace(Sablon.content(:string, "Hello"), @env)
         | 
| 74 75 | 
             
                  xml = <<-xml.strip
         | 
| 75 76 | 
             
            <w:p>
         | 
| 76 77 |  | 
| @@ -59,7 +59,8 @@ class ProcessorDocumentTest < Sablon::TestCase | |
| 59 59 | 
             
              end
         | 
| 60 60 |  | 
| 61 61 | 
             
              def test_context_can_contain_string_and_symbol_keys
         | 
| 62 | 
            -
                 | 
| 62 | 
            +
                context = {"first_name" => "Jack", last_name: "Davis"}
         | 
| 63 | 
            +
                result = process(snippet("simple_fields"), context)
         | 
| 63 64 | 
             
                assert_equal "Jack Davis", text(result)
         | 
| 64 65 | 
             
              end
         | 
| 65 66 |  | 
| @@ -439,8 +440,25 @@ class ProcessorDocumentTest < Sablon::TestCase | |
| 439 440 | 
             
                assert_equal "Before After", text(result)
         | 
| 440 441 | 
             
              end
         | 
| 441 442 |  | 
| 443 | 
            +
              def test_comment_block_and_comment_as_key
         | 
| 444 | 
            +
                result = process(snippet("comment_block_and_comment_as_key"), {comment: 'Contents of comment key'})
         | 
| 445 | 
            +
             | 
| 446 | 
            +
                assert_xml_equal <<-document, result
         | 
| 447 | 
            +
                <w:r><w:t xml:space="preserve">Before </w:t></w:r>
         | 
| 448 | 
            +
                <w:r><w:t xml:space="preserve">After </w:t></w:r>
         | 
| 449 | 
            +
                <w:p>           
         | 
| 450 | 
            +
                  <w:r w:rsidR="004B49F0">
         | 
| 451 | 
            +
                    <w:rPr><w:noProof/></w:rPr>
         | 
| 452 | 
            +
                    <w:t>Contents of comment key</w:t>
         | 
| 453 | 
            +
                  </w:r>
         | 
| 454 | 
            +
                </w:p>
         | 
| 455 | 
            +
                document
         | 
| 456 | 
            +
              end
         | 
| 457 | 
            +
             | 
| 442 458 | 
             
              private
         | 
| 459 | 
            +
             | 
| 443 460 | 
             
              def process(document, context)
         | 
| 444 | 
            -
                 | 
| 461 | 
            +
                env = Sablon::Environment.new(nil, context)
         | 
| 462 | 
            +
                @processor.process(wrap(document), env).to_xml
         | 
| 445 463 | 
             
              end
         | 
| 446 464 | 
             
            end
         | 
| @@ -34,7 +34,7 @@ class SectionPropertiesTest < Sablon::TestCase | |
| 34 34 | 
             
            </w:body>
         | 
| 35 35 | 
             
                documentxml
         | 
| 36 36 | 
             
                properties = Sablon::Processor::SectionProperties.from_document(xml)
         | 
| 37 | 
            -
                 | 
| 37 | 
            +
                assert_nil properties.start_page_number
         | 
| 38 38 | 
             
                properties.start_page_number = "16"
         | 
| 39 39 | 
             
                assert_equal "16", properties.start_page_number
         | 
| 40 40 | 
             
              end
         | 
    
        data/test/test_helper.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: sablon
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.22
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Yves Senn
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2017- | 
| 11 | 
            +
            date: 2017-12-12 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: nokogiri
         | 
| @@ -30,14 +30,14 @@ dependencies: | |
| 30 30 | 
             
                requirements:
         | 
| 31 31 | 
             
                - - ">="
         | 
| 32 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            -
                    version:  | 
| 33 | 
            +
                    version: 1.1.1
         | 
| 34 34 | 
             
              type: :runtime
         | 
| 35 35 | 
             
              prerelease: false
         | 
| 36 36 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 37 | 
             
                requirements:
         | 
| 38 38 | 
             
                - - ">="
         | 
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            -
                    version:  | 
| 40 | 
            +
                    version: 1.1.1
         | 
| 41 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 42 | 
             
              name: bundler
         | 
| 43 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -58,14 +58,14 @@ dependencies: | |
| 58 58 | 
             
                requirements:
         | 
| 59 59 | 
             
                - - "~>"
         | 
| 60 60 | 
             
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            -
                    version: ' | 
| 61 | 
            +
                    version: '12.0'
         | 
| 62 62 | 
             
              type: :development
         | 
| 63 63 | 
             
              prerelease: false
         | 
| 64 64 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 65 | 
             
                requirements:
         | 
| 66 66 | 
             
                - - "~>"
         | 
| 67 67 | 
             
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            -
                    version: ' | 
| 68 | 
            +
                    version: '12.0'
         | 
| 69 69 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 70 70 | 
             
              name: minitest
         | 
| 71 71 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -113,9 +113,13 @@ files: | |
| 113 113 | 
             
            - bin/rake
         | 
| 114 114 | 
             
            - exe/sablon
         | 
| 115 115 | 
             
            - lib/sablon.rb
         | 
| 116 | 
            +
            - lib/sablon/configuration/configuration.rb
         | 
| 117 | 
            +
            - lib/sablon/configuration/html_tag.rb
         | 
| 116 118 | 
             
            - lib/sablon/content.rb
         | 
| 117 119 | 
             
            - lib/sablon/context.rb
         | 
| 120 | 
            +
            - lib/sablon/environment.rb
         | 
| 118 121 | 
             
            - lib/sablon/html/ast.rb
         | 
| 122 | 
            +
            - lib/sablon/html/ast_builder.rb
         | 
| 119 123 | 
             
            - lib/sablon/html/converter.rb
         | 
| 120 124 | 
             
            - lib/sablon/html/visitor.rb
         | 
| 121 125 | 
             
            - lib/sablon/numbering.rb
         | 
| @@ -144,14 +148,17 @@ files: | |
| 144 148 | 
             
            - misc/step_6.png
         | 
| 145 149 | 
             
            - misc/step_7.png
         | 
| 146 150 | 
             
            - sablon.gemspec
         | 
| 151 | 
            +
            - test/configuration_test.rb
         | 
| 147 152 | 
             
            - test/content_test.rb
         | 
| 148 153 | 
             
            - test/context_test.rb
         | 
| 154 | 
            +
            - test/environment_test.rb
         | 
| 149 155 | 
             
            - test/executable_test.rb
         | 
| 150 156 | 
             
            - test/expression_test.rb
         | 
| 151 157 | 
             
            - test/fixtures/conditionals_sample.docx
         | 
| 152 158 | 
             
            - test/fixtures/conditionals_template.docx
         | 
| 153 159 | 
             
            - test/fixtures/cv_sample.docx
         | 
| 154 160 | 
             
            - test/fixtures/cv_template.docx
         | 
| 161 | 
            +
            - test/fixtures/html/html_test_content.html
         | 
| 155 162 | 
             
            - test/fixtures/html_sample.docx
         | 
| 156 163 | 
             
            - test/fixtures/insertion_template.docx
         | 
| 157 164 | 
             
            - test/fixtures/insertion_template_no_styles.docx
         | 
| @@ -160,6 +167,7 @@ files: | |
| 160 167 | 
             
            - test/fixtures/recipe_sample.docx
         | 
| 161 168 | 
             
            - test/fixtures/recipe_template.docx
         | 
| 162 169 | 
             
            - test/fixtures/xml/comment.xml
         | 
| 170 | 
            +
            - test/fixtures/xml/comment_block_and_comment_as_key.xml
         | 
| 163 171 | 
             
            - test/fixtures/xml/complex_field.xml
         | 
| 164 172 | 
             
            - test/fixtures/xml/complex_field_inline_conditional.xml
         | 
| 165 173 | 
             
            - test/fixtures/xml/conditional.xml
         | 
| @@ -177,7 +185,10 @@ files: | |
| 177 185 | 
             
            - test/fixtures/xml/table_multi_row_loop.xml
         | 
| 178 186 | 
             
            - test/fixtures/xml/table_row_loop.xml
         | 
| 179 187 | 
             
            - test/fixtures/xml/test_ignore_complex_field_spanning_multiple_paragraphs.xml
         | 
| 188 | 
            +
            - test/html/ast_builder_test.rb
         | 
| 189 | 
            +
            - test/html/ast_test.rb
         | 
| 180 190 | 
             
            - test/html/converter_test.rb
         | 
| 191 | 
            +
            - test/html/node_properties_test.rb
         | 
| 181 192 | 
             
            - test/html_test.rb
         | 
| 182 193 | 
             
            - test/mail_merge_parser_test.rb
         | 
| 183 194 | 
             
            - test/processor/document_test.rb
         | 
| @@ -185,6 +196,7 @@ files: | |
| 185 196 | 
             
            - test/sandbox/.gitkeep
         | 
| 186 197 | 
             
            - test/section_properties_test.rb
         | 
| 187 198 | 
             
            - test/support/document_xml_helper.rb
         | 
| 199 | 
            +
            - test/support/html_snippets.rb
         | 
| 188 200 | 
             
            - test/support/xml_snippets.rb
         | 
| 189 201 | 
             
            - test/test_helper.rb
         | 
| 190 202 | 
             
            homepage: http://github.com/senny/sablon
         | 
| @@ -210,16 +222,19 @@ rubyforge_project: | |
| 210 222 | 
             
            rubygems_version: 2.6.11
         | 
| 211 223 | 
             
            signing_key: 
         | 
| 212 224 | 
             
            specification_version: 4
         | 
| 213 | 
            -
            summary: docx  | 
| 225 | 
            +
            summary: docx template processor
         | 
| 214 226 | 
             
            test_files:
         | 
| 227 | 
            +
            - test/configuration_test.rb
         | 
| 215 228 | 
             
            - test/content_test.rb
         | 
| 216 229 | 
             
            - test/context_test.rb
         | 
| 230 | 
            +
            - test/environment_test.rb
         | 
| 217 231 | 
             
            - test/executable_test.rb
         | 
| 218 232 | 
             
            - test/expression_test.rb
         | 
| 219 233 | 
             
            - test/fixtures/conditionals_sample.docx
         | 
| 220 234 | 
             
            - test/fixtures/conditionals_template.docx
         | 
| 221 235 | 
             
            - test/fixtures/cv_sample.docx
         | 
| 222 236 | 
             
            - test/fixtures/cv_template.docx
         | 
| 237 | 
            +
            - test/fixtures/html/html_test_content.html
         | 
| 223 238 | 
             
            - test/fixtures/html_sample.docx
         | 
| 224 239 | 
             
            - test/fixtures/insertion_template.docx
         | 
| 225 240 | 
             
            - test/fixtures/insertion_template_no_styles.docx
         | 
| @@ -228,6 +243,7 @@ test_files: | |
| 228 243 | 
             
            - test/fixtures/recipe_sample.docx
         | 
| 229 244 | 
             
            - test/fixtures/recipe_template.docx
         | 
| 230 245 | 
             
            - test/fixtures/xml/comment.xml
         | 
| 246 | 
            +
            - test/fixtures/xml/comment_block_and_comment_as_key.xml
         | 
| 231 247 | 
             
            - test/fixtures/xml/complex_field.xml
         | 
| 232 248 | 
             
            - test/fixtures/xml/complex_field_inline_conditional.xml
         | 
| 233 249 | 
             
            - test/fixtures/xml/conditional.xml
         | 
| @@ -245,7 +261,10 @@ test_files: | |
| 245 261 | 
             
            - test/fixtures/xml/table_multi_row_loop.xml
         | 
| 246 262 | 
             
            - test/fixtures/xml/table_row_loop.xml
         | 
| 247 263 | 
             
            - test/fixtures/xml/test_ignore_complex_field_spanning_multiple_paragraphs.xml
         | 
| 264 | 
            +
            - test/html/ast_builder_test.rb
         | 
| 265 | 
            +
            - test/html/ast_test.rb
         | 
| 248 266 | 
             
            - test/html/converter_test.rb
         | 
| 267 | 
            +
            - test/html/node_properties_test.rb
         | 
| 249 268 | 
             
            - test/html_test.rb
         | 
| 250 269 | 
             
            - test/mail_merge_parser_test.rb
         | 
| 251 270 | 
             
            - test/processor/document_test.rb
         | 
| @@ -253,5 +272,6 @@ test_files: | |
| 253 272 | 
             
            - test/sandbox/.gitkeep
         | 
| 254 273 | 
             
            - test/section_properties_test.rb
         | 
| 255 274 | 
             
            - test/support/document_xml_helper.rb
         | 
| 275 | 
            +
            - test/support/html_snippets.rb
         | 
| 256 276 | 
             
            - test/support/xml_snippets.rb
         | 
| 257 277 | 
             
            - test/test_helper.rb
         |