isodoc 0.7.0 → 0.7.1
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/Gemfile.lock +5 -5
- data/README.adoc +34 -22
- data/isodoc.gemspec +1 -1
- data/lib/isodoc.rb +3 -1
- data/lib/isodoc/blocks.rb +1 -1
- data/lib/isodoc/cleanup.rb +1 -1
- data/lib/isodoc/convert.rb +9 -8
- data/lib/isodoc/{comments.rb → htmlconvert/comments.rb} +1 -1
- data/lib/isodoc/htmlconvert/convert.rb +13 -0
- data/lib/isodoc/{footnotes.rb → htmlconvert/footnotes.rb} +1 -1
- data/lib/isodoc/{html.rb → htmlconvert/html.rb} +29 -4
- data/lib/isodoc/i18n-en.yaml +5 -5
- data/lib/isodoc/i18n.rb +6 -2
- data/lib/isodoc/inline.rb +8 -8
- data/lib/isodoc/iso/convert.rb +4 -0
- data/lib/isodoc/iso/html/style-human.scss +3 -3
- data/lib/isodoc/iso/html/style-iso.scss +2 -2
- data/lib/isodoc/iso/html/wordstyle.scss +27 -0
- data/lib/isodoc/iso/wordconvert.rb +5 -2
- data/lib/isodoc/iso2wordhtml.rb +15 -16
- data/lib/isodoc/lists.rb +1 -1
- data/lib/isodoc/metadata.rb +66 -49
- data/lib/isodoc/references.rb +21 -11
- data/lib/isodoc/section.rb +3 -3
- data/lib/isodoc/table.rb +1 -1
- data/lib/isodoc/terms.rb +1 -1
- data/lib/isodoc/utils.rb +20 -21
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/wordconvert/comments.rb +122 -117
- data/lib/isodoc/wordconvert/convert.rb +5 -2
- data/lib/isodoc/wordconvert/footnotes.rb +14 -1
- data/lib/isodoc/wordconvert/postprocess.rb +7 -2
- data/lib/isodoc/wordconvert/wordconvertmodule.rb +12 -1
- data/lib/isodoc/xref_gen.rb +12 -2
- data/lib/isodoc/xref_sect_gen.rb +5 -4
- data/spec/isodoc/blocks_spec.rb +1 -1
- data/spec/isodoc/footnotes_spec.rb +3 -3
- data/spec/isodoc/i18n_spec.rb +10 -10
- data/spec/isodoc/inline_spec.rb +2 -2
- data/spec/isodoc/iso_spec.rb +79 -0
- data/spec/isodoc/metadata_spec.rb +12 -4
- data/spec/isodoc/postproc_spec.rb +7 -7
- data/spec/isodoc/ref_spec.rb +7 -19
- data/spec/isodoc/section_spec.rb +19 -84
- data/spec/isodoc/terms_spec.rb +1 -1
- data/spec/isodoc/xref_spec.rb +14 -14
- data/spec/spec_helper.rb +3 -3
- metadata +9 -8
    
        data/lib/isodoc/table.rb
    CHANGED
    
    
    
        data/lib/isodoc/terms.rb
    CHANGED
    
    
    
        data/lib/isodoc/utils.rb
    CHANGED
    
    | @@ -1,33 +1,32 @@ | |
| 1 1 | 
             
            module IsoDoc
         | 
| 2 | 
            -
              class  | 
| 3 | 
            -
                def ns(xpath)
         | 
| 2 | 
            +
              class Common
         | 
| 3 | 
            +
                def self.ns(xpath)
         | 
| 4 4 | 
             
                  xpath.gsub(%r{/([a-zA-z])}, "/xmlns:\\1").
         | 
| 5 5 | 
             
                    gsub(%r{::([a-zA-z])}, "::xmlns:\\1").
         | 
| 6 6 | 
             
                    gsub(%r{\[([a-zA-z][a-z0-9A-Z@/]* ?=)}, "[xmlns:\\1").
         | 
| 7 7 | 
             
                    gsub(%r{\[([a-zA-z][a-z0-9A-Z@/]*\])}, "[xmlns:\\1")
         | 
| 8 8 | 
             
                end
         | 
| 9 9 |  | 
| 10 | 
            -
                def  | 
| 11 | 
            -
                   | 
| 10 | 
            +
                def ns(xpath)
         | 
| 11 | 
            +
                  Common::ns(xpath)
         | 
| 12 12 | 
             
                end
         | 
| 13 13 |  | 
| 14 | 
            -
                 | 
| 15 | 
            -
                   | 
| 16 | 
            -
                   | 
| 17 | 
            -
                   | 
| 18 | 
            -
                   | 
| 19 | 
            -
                   | 
| 20 | 
            -
                   | 
| 21 | 
            -
                   | 
| 22 | 
            -
             | 
| 23 | 
            -
                  "95": "(Withdrawal)",
         | 
| 24 | 
            -
                }.freeze
         | 
| 14 | 
            +
                def self.date_range(date)
         | 
| 15 | 
            +
                  from = date.at(ns("./from"))
         | 
| 16 | 
            +
                  to = date.at(ns("./to"))
         | 
| 17 | 
            +
                  on = date.at(ns("./on"))
         | 
| 18 | 
            +
                  return on.text if on
         | 
| 19 | 
            +
                  ret = "#{from.text}–"
         | 
| 20 | 
            +
                  ret += to.text if to
         | 
| 21 | 
            +
                  ret
         | 
| 22 | 
            +
                end
         | 
| 25 23 |  | 
| 26 | 
            -
                def  | 
| 27 | 
            -
                   | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 24 | 
            +
                def date_range(date)
         | 
| 25 | 
            +
                  Common::date_range(date)
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                def insert_tab(out, n)
         | 
| 29 | 
            +
                  [1..n].each { out << "  " }
         | 
| 31 30 | 
             
                end
         | 
| 32 31 |  | 
| 33 32 | 
             
                NOKOHEAD = <<~HERE.freeze
         | 
| @@ -133,7 +132,7 @@ module IsoDoc | |
| 133 132 | 
             
                end
         | 
| 134 133 |  | 
| 135 134 | 
             
                def populate_template(docxml, _format)
         | 
| 136 | 
            -
                  meta =  | 
| 135 | 
            +
                  meta = @meta.get.merge(@labels)
         | 
| 137 136 | 
             
                  docxml = docxml.
         | 
| 138 137 | 
             
                    gsub(/\[TERMREF\]\s*/, l10n("[#{@source_lbl}: ")).
         | 
| 139 138 | 
             
                    gsub(/\s*\[\/TERMREF\]\s*/, l10n("]")).
         | 
    
        data/lib/isodoc/version.rb
    CHANGED
    
    
| @@ -1,140 +1,145 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
               | 
| 3 | 
            -
            end
         | 
| 1 | 
            +
            module IsoDoc
         | 
| 2 | 
            +
              class WordConvert < Common
         | 
| 4 3 |  | 
| 5 | 
            -
            def  | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
                @comments.each { |fn| div1.parent << fn }
         | 
| 9 | 
            -
              end
         | 
| 10 | 
            -
            end
         | 
| 11 | 
            -
             | 
| 12 | 
            -
            def review_note_parse(node, out)
         | 
| 13 | 
            -
              fn = @comments.length + 1
         | 
| 14 | 
            -
              make_comment_link(out, fn, node)
         | 
| 15 | 
            -
              @in_comment = true
         | 
| 16 | 
            -
              @comments << make_comment_text(node, fn)
         | 
| 17 | 
            -
              @in_comment = false
         | 
| 18 | 
            -
            end
         | 
| 4 | 
            +
                def in_comment
         | 
| 5 | 
            +
                  @in_comment
         | 
| 6 | 
            +
                end
         | 
| 19 7 |  | 
| 20 | 
            -
            def  | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
            end
         | 
| 8 | 
            +
                def comments(div)
         | 
| 9 | 
            +
                  return if @comments.empty?
         | 
| 10 | 
            +
                  div.div **{ style: "mso-element:comment-list" } do |div1|
         | 
| 11 | 
            +
                    @comments.each { |fn| div1.parent << fn }
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
                end
         | 
| 25 14 |  | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
                   | 
| 31 | 
            -
             | 
| 32 | 
            -
                  s2.span **{ style: "mso-special-character:comment",
         | 
| 33 | 
            -
                              target: fn } # do |s|
         | 
| 15 | 
            +
                def review_note_parse(node, out)
         | 
| 16 | 
            +
                  fn = @comments.length + 1
         | 
| 17 | 
            +
                  make_comment_link(out, fn, node)
         | 
| 18 | 
            +
                  @in_comment = true
         | 
| 19 | 
            +
                  @comments << make_comment_text(node, fn)
         | 
| 20 | 
            +
                  @in_comment = false
         | 
| 34 21 | 
             
                end
         | 
| 35 | 
            -
              end
         | 
| 36 | 
            -
            end
         | 
| 37 22 |  | 
| 38 | 
            -
            def  | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 23 | 
            +
                def comment_link_attrs(fn, node)
         | 
| 24 | 
            +
                  { style: "MsoCommentReference", target: fn,
         | 
| 25 | 
            +
                    class: "commentLink", from: node["from"],
         | 
| 26 | 
            +
                    to: node["to"] }
         | 
| 42 27 | 
             
                end
         | 
| 43 | 
            -
              end
         | 
| 44 | 
            -
            end
         | 
| 45 28 |  | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 29 | 
            +
                # add in from and to links to move the comment into place
         | 
| 30 | 
            +
                def make_comment_link(out, fn, node)
         | 
| 31 | 
            +
                  out.span(**comment_link_attrs(fn, node)) do |s1|
         | 
| 32 | 
            +
                    s1.span **{ lang: "EN-GB", style: "font-size:9.0pt" } do |s2|
         | 
| 33 | 
            +
                      s2.a **{ style: "mso-comment-reference:SMC_#{fn};"\
         | 
| 34 | 
            +
                               "mso-comment-date:#{node['date'].gsub(/[:-]+/, '')}" }
         | 
| 35 | 
            +
                      s2.span **{ style: "mso-special-character:comment",
         | 
| 36 | 
            +
                                  target: fn } # do |s|
         | 
| 37 | 
            +
                    end
         | 
| 38 | 
            +
                  end
         | 
| 52 39 | 
             
                end
         | 
| 53 | 
            -
              end.join("\n")
         | 
| 54 | 
            -
            end
         | 
| 55 40 |  | 
| 56 | 
            -
            def  | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 60 | 
            -
            end
         | 
| 41 | 
            +
                def make_comment_target(out)
         | 
| 42 | 
            +
                  out.span **{ style: "MsoCommentReference" } do |s1|
         | 
| 43 | 
            +
                    s1.span **{ lang: "EN-GB", style: "font-size:9.0pt" } do |s2|
         | 
| 44 | 
            +
                      s2.span **{ style: "mso-special-character:comment" }
         | 
| 45 | 
            +
                    end
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
                end
         | 
| 61 48 |  | 
| 62 | 
            -
             | 
| 63 | 
            -
             | 
| 64 | 
            -
             | 
| 49 | 
            +
                def make_comment_text(node, fn)
         | 
| 50 | 
            +
                  noko do |xml|
         | 
| 51 | 
            +
                    xml.div **{ style: "mso-element:comment", id: fn } do |div|
         | 
| 52 | 
            +
                      div.span **{ style: %{mso-comment-author:"#{node['reviewer']}"} }
         | 
| 53 | 
            +
                      make_comment_target(div)
         | 
| 54 | 
            +
                      node.children.each { |n| parse(n, div) }
         | 
| 55 | 
            +
                    end
         | 
| 56 | 
            +
                  end.join("\n")
         | 
| 57 | 
            +
                end
         | 
| 65 58 |  | 
| 66 | 
            -
            def  | 
| 67 | 
            -
             | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 70 | 
            -
                 | 
| 71 | 
            -
              end
         | 
| 72 | 
            -
              docxml
         | 
| 73 | 
            -
            end
         | 
| 59 | 
            +
                def comment_cleanup(docxml)
         | 
| 60 | 
            +
                  move_comment_link_to_from(docxml)
         | 
| 61 | 
            +
                  reorder_comments_by_comment_link(docxml)
         | 
| 62 | 
            +
                  embed_comment_in_comment_list(docxml)
         | 
| 63 | 
            +
                end
         | 
| 74 64 |  | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
             | 
| 80 | 
            -
             | 
| 65 | 
            +
                COMMENT_IN_COMMENT_LIST1 =
         | 
| 66 | 
            +
                  '//div[@style="mso-element:comment-list"]//'\
         | 
| 67 | 
            +
                  'span[@style="MsoCommentReference"]'.freeze
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                def embed_comment_in_comment_list(docxml)
         | 
| 70 | 
            +
                  #docxml.xpath(COMMENT_IN_COMMENT_LIST).each do |x|
         | 
| 71 | 
            +
                  docxml.xpath(COMMENT_IN_COMMENT_LIST1).each do |x|
         | 
| 72 | 
            +
                    n = x.next_element
         | 
| 73 | 
            +
                    n&.children&.first&.add_previous_sibling(x.remove)
         | 
| 74 | 
            +
                  end
         | 
| 75 | 
            +
                  docxml
         | 
| 76 | 
            +
                end
         | 
| 81 77 |  | 
| 82 | 
            -
            def  | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
             | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 88 | 
            -
            end
         | 
| 78 | 
            +
                def move_comment_link_to_from1(x, fromlink)
         | 
| 79 | 
            +
                  x.remove
         | 
| 80 | 
            +
                  link = x.at(".//a")
         | 
| 81 | 
            +
                  fromlink.replace(x)
         | 
| 82 | 
            +
                  link.children = fromlink
         | 
| 83 | 
            +
                end
         | 
| 89 84 |  | 
| 90 | 
            -
            def  | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            -
             | 
| 85 | 
            +
                def comment_attributes(docxml, x)
         | 
| 86 | 
            +
                  fromlink = docxml.at("//*[@id='#{x['from']}']")
         | 
| 87 | 
            +
                  return(nil) if fromlink.nil?
         | 
| 88 | 
            +
                  tolink = docxml.at("//*[@id='#{x['to']}']") || fromlink
         | 
| 89 | 
            +
                  target = docxml.at("//*[@id='#{x['target']}']")
         | 
| 90 | 
            +
                  { from: fromlink, to: tolink, target: target }
         | 
| 91 | 
            +
                end
         | 
| 94 92 |  | 
| 95 | 
            -
            def  | 
| 96 | 
            -
             | 
| 97 | 
            -
             | 
| 93 | 
            +
                def wrap_comment_cont(from, target)
         | 
| 94 | 
            +
                  s = from.replace("<span style='mso-comment-continuation:#{target}'>")
         | 
| 95 | 
            +
                  s.first.children = from
         | 
| 96 | 
            +
                end
         | 
| 98 97 |  | 
| 99 | 
            -
            def  | 
| 100 | 
            -
             | 
| 101 | 
            -
              while !from.nil? && from["id"] != to
         | 
| 102 | 
            -
                following = from.xpath("./following::*")
         | 
| 103 | 
            -
                (from = following.shift) && incl_to = from.at(".//*[@id='#{to}']")
         | 
| 104 | 
            -
                while !incl_to.nil? && !from.nil? && skip_comment_wrap(from)
         | 
| 105 | 
            -
                  (from = following.shift) && incl_to = from.at(".//*[@id='#{to}']")
         | 
| 98 | 
            +
                def skip_comment_wrap(from)
         | 
| 99 | 
            +
                  from["style"] != "mso-special-character:comment"
         | 
| 106 100 | 
             
                end
         | 
| 107 | 
            -
                wrap_comment_cont(from, target) if !from.nil?
         | 
| 108 | 
            -
              end
         | 
| 109 | 
            -
            end
         | 
| 110 101 |  | 
| 111 | 
            -
            def  | 
| 112 | 
            -
             | 
| 113 | 
            -
             | 
| 114 | 
            -
             | 
| 115 | 
            -
             | 
| 116 | 
            -
             | 
| 117 | 
            -
             | 
| 102 | 
            +
                def insert_comment_cont(from, to, target)
         | 
| 103 | 
            +
                  # includes_to = from.at(".//*[@id='#{to}']")
         | 
| 104 | 
            +
                  while !from.nil? && from["id"] != to
         | 
| 105 | 
            +
                    following = from.xpath("./following::*")
         | 
| 106 | 
            +
                    (from = following.shift) && incl_to = from.at(".//*[@id='#{to}']")
         | 
| 107 | 
            +
                    while !incl_to.nil? && !from.nil? && skip_comment_wrap(from)
         | 
| 108 | 
            +
                      (from = following.shift) && incl_to = from.at(".//*[@id='#{to}']")
         | 
| 109 | 
            +
                    end
         | 
| 110 | 
            +
                    wrap_comment_cont(from, target) if !from.nil?
         | 
| 111 | 
            +
                  end
         | 
| 112 | 
            +
                end
         | 
| 118 113 |  | 
| 119 | 
            -
            def  | 
| 120 | 
            -
             | 
| 121 | 
            -
             | 
| 122 | 
            -
             | 
| 123 | 
            -
             | 
| 124 | 
            -
             | 
| 125 | 
            -
             | 
| 126 | 
            -
              # comments
         | 
| 127 | 
            -
            end
         | 
| 114 | 
            +
                def move_comment_link_to_from(docxml)
         | 
| 115 | 
            +
                  docxml.xpath('//span[@style="MsoCommentReference"][@from]').each do |x|
         | 
| 116 | 
            +
                    attrs = comment_attributes(docxml, x) || next
         | 
| 117 | 
            +
                    move_comment_link_to_from1(x, attrs[:from])
         | 
| 118 | 
            +
                    insert_comment_cont(attrs[:from], x["to"], x["target"])
         | 
| 119 | 
            +
                  end
         | 
| 120 | 
            +
                end
         | 
| 128 121 |  | 
| 129 | 
            -
             | 
| 130 | 
            -
             | 
| 122 | 
            +
                def get_comments_from_text(docxml, link_order)
         | 
| 123 | 
            +
                  comments = []
         | 
| 124 | 
            +
                  docxml.xpath("//div[@style='mso-element:comment']").each do |c|
         | 
| 125 | 
            +
                    next unless c["id"] && !link_order[c["id"]].nil?
         | 
| 126 | 
            +
                    comments << { text: c.remove.to_s, id: c["id"] }
         | 
| 127 | 
            +
                  end
         | 
| 128 | 
            +
                  comments.sort! { |a, b| link_order[a[:id]] <=> link_order[b[:id]] }
         | 
| 129 | 
            +
                  # comments
         | 
| 130 | 
            +
                end
         | 
| 131 131 |  | 
| 132 | 
            -
             | 
| 133 | 
            -
             | 
| 134 | 
            -
             | 
| 135 | 
            -
                 | 
| 132 | 
            +
                COMMENT_TARGET_XREFS1 =
         | 
| 133 | 
            +
                  "//span[@style='mso-special-character:comment']/@target".freeze
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                def reorder_comments_by_comment_link(docxml)
         | 
| 136 | 
            +
                  link_order = {}
         | 
| 137 | 
            +
                  docxml.xpath(COMMENT_TARGET_XREFS1).each_with_index do |target, i|
         | 
| 138 | 
            +
                    link_order[target.value] = i
         | 
| 139 | 
            +
                  end
         | 
| 140 | 
            +
                  comments = get_comments_from_text(docxml, link_order)
         | 
| 141 | 
            +
                  list = docxml.at("//*[@style='mso-element:comment-list']") || return
         | 
| 142 | 
            +
                  list.children = comments.map { |c| c[:text] }.join("\n")
         | 
| 143 | 
            +
                end
         | 
| 136 144 | 
             
              end
         | 
| 137 | 
            -
              comments = get_comments_from_text(docxml, link_order)
         | 
| 138 | 
            -
              list = docxml.at("//*[@style='mso-element:comment-list']") || return
         | 
| 139 | 
            -
              list.children = comments.map { |c| c[:text] }.join("\n")
         | 
| 140 145 | 
             
            end
         | 
| @@ -5,9 +5,11 @@ require "liquid" | |
| 5 5 | 
             
            require_relative "wordconvertmodule"
         | 
| 6 6 | 
             
            require_relative "comments"
         | 
| 7 7 | 
             
            require_relative "footnotes"
         | 
| 8 | 
            +
            require_relative "postprocess"
         | 
| 8 9 |  | 
| 9 10 | 
             
            module IsoDoc
         | 
| 10 11 |  | 
| 12 | 
            +
            =begin
         | 
| 11 13 | 
             
              module WordConvertModule
         | 
| 12 14 | 
             
                # http://tech.tulentsev.com/2012/02/ruby-how-to-override-class-method-with-a-module/
         | 
| 13 15 | 
             
                # https://www.ruby-forum.com/topic/148303
         | 
| @@ -24,9 +26,10 @@ module IsoDoc | |
| 24 26 | 
             
                  end
         | 
| 25 27 | 
             
                end
         | 
| 26 28 | 
             
              end
         | 
| 29 | 
            +
            =end
         | 
| 27 30 |  | 
| 28 | 
            -
              class WordConvert <  | 
| 29 | 
            -
                include WordConvertModule
         | 
| 31 | 
            +
              class WordConvert < Common
         | 
| 32 | 
            +
                #include WordConvertModule
         | 
| 30 33 | 
             
              end
         | 
| 31 34 | 
             
            end
         | 
| 32 35 |  | 
| @@ -1,4 +1,7 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            module IsoDoc
         | 
| 2 | 
            +
              class WordConvert < Common
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                def footnotes(div)
         | 
| 2 5 | 
             
              return if @footnotes.empty?
         | 
| 3 6 | 
             
              @footnotes.each { |fn| div.parent << fn }
         | 
| 4 7 | 
             
            end
         | 
| @@ -66,3 +69,13 @@ def footnote_parse(node, out) | |
| 66 69 | 
             
              @in_footnote = false
         | 
| 67 70 | 
             
              @seen_footnote << fn
         | 
| 68 71 | 
             
            end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                def make_footnote(node, fn)
         | 
| 74 | 
            +
                  return if @seen_footnote.include?(fn)
         | 
| 75 | 
            +
                  @in_footnote = true
         | 
| 76 | 
            +
                  @footnotes << make_generic_footnote_text(node, fn)
         | 
| 77 | 
            +
                  @in_footnote = false
         | 
| 78 | 
            +
                  @seen_footnote << fn
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
              end
         | 
| 81 | 
            +
            end
         | 
| @@ -1,4 +1,7 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            module IsoDoc
         | 
| 2 | 
            +
              class WordConvert < Common
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                def postprocess(result, filename, dir)
         | 
| 2 5 | 
             
              generate_header(filename, dir)
         | 
| 3 6 | 
             
              result = from_xhtml(cleanup(to_xhtml(result)))
         | 
| 4 7 | 
             
              toWord(result, filename, dir)
         | 
| @@ -53,7 +56,7 @@ end | |
| 53 56 | 
             
            def generate_header(filename, _dir)
         | 
| 54 57 | 
             
              return unless @header
         | 
| 55 58 | 
             
              template = Liquid::Template.parse(File.read(@header, encoding: "UTF-8"))
         | 
| 56 | 
            -
              meta =  | 
| 59 | 
            +
              meta = @meta.get
         | 
| 57 60 | 
             
              meta[:filename] = filename
         | 
| 58 61 | 
             
              params = meta.map { |k, v| [k.to_s, v] }.to_h
         | 
| 59 62 | 
             
              File.open("header.html", "w") do |f|
         | 
| @@ -107,4 +110,6 @@ def make_WordToC(docxml) | |
| 107 110 | 
             
              end
         | 
| 108 111 | 
             
              toc.sub(/(<p class="MsoToc1">)/,
         | 
| 109 112 | 
             
                      %{\\1#{WORD_TOC_PREFACE1}}) +  WORD_TOC_SUFFIX1
         | 
| 113 | 
            +
            end
         | 
| 114 | 
            +
              end
         | 
| 110 115 | 
             
            end
         | 
| @@ -1,4 +1,13 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            module IsoDoc
         | 
| 2 | 
            +
              class WordConvert < Common
         | 
| 3 | 
            +
                def make_body1(body, _docxml)
         | 
| 4 | 
            +
                  body.div **{ class: "WordSection1" } do |div1|
         | 
| 5 | 
            +
                    div1.p { |p| p << " " } # placeholder
         | 
| 6 | 
            +
                  end
         | 
| 7 | 
            +
                  section_break(body)
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def make_body2(body, docxml)
         | 
| 2 11 | 
             
              body.div **{ class: "WordSection2" } do |div2|
         | 
| 3 12 | 
             
                info docxml, div2
         | 
| 4 13 | 
             
                foreword docxml, div2
         | 
| @@ -136,4 +145,6 @@ def figure_aside_process(f, aside, key) | |
| 136 145 | 
             
                a.delete("class")
         | 
| 137 146 | 
             
                a.parent = dd
         | 
| 138 147 | 
             
              end
         | 
| 148 | 
            +
            end
         | 
| 149 | 
            +
              end
         | 
| 139 150 | 
             
            end
         | 
    
        data/lib/isodoc/xref_gen.rb
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            require "roman-numerals"
         | 
| 2 2 |  | 
| 3 3 | 
             
            module IsoDoc
         | 
| 4 | 
            -
              class  | 
| 4 | 
            +
              class Common
         | 
| 5 5 | 
             
                @anchors = {}
         | 
| 6 6 |  | 
| 7 7 | 
             
                def get_anchors
         | 
| @@ -15,6 +15,7 @@ module IsoDoc | |
| 15 15 | 
             
                def termnote_anchor_names(docxml)
         | 
| 16 16 | 
             
                  docxml.xpath(ns("//term[termnote]")).each do |t|
         | 
| 17 17 | 
             
                    t.xpath(ns("./termnote")).each_with_index do |n, i|
         | 
| 18 | 
            +
                      return if n["id"].nil? || n["id"].empty?
         | 
| 18 19 | 
             
                      @anchors[n["id"]] =
         | 
| 19 20 | 
             
                        { label: termnote_label(i + 1),
         | 
| 20 21 | 
             
                          xref: l10n("#{@anchors[t['id']][:xref]}, "\
         | 
| @@ -26,6 +27,7 @@ module IsoDoc | |
| 26 27 | 
             
                def termexample_anchor_names(docxml)
         | 
| 27 28 | 
             
                  docxml.xpath(ns("//term[termexample]")).each do |t|
         | 
| 28 29 | 
             
                    t.xpath(ns("./termexample")).each_with_index do |n, i|
         | 
| 30 | 
            +
                      return if n["id"].nil? || n["id"].empty?
         | 
| 29 31 | 
             
                      @anchors[n["id"]] =
         | 
| 30 32 | 
             
                        { label: (i + 1).to_s,
         | 
| 31 33 | 
             
                          xref: l10n("#{@anchors[t['id']][:xref]}, "\
         | 
| @@ -48,7 +50,7 @@ module IsoDoc | |
| 48 50 | 
             
                    notes = s.xpath(CHILD_NOTES_XPATH)
         | 
| 49 51 | 
             
                    notes.each_with_index do |n, i|
         | 
| 50 52 | 
             
                      next if @anchors[n["id"]]
         | 
| 51 | 
            -
                      next if n["id"].nil?
         | 
| 53 | 
            +
                      next if n["id"].nil? || n["id"].empty?
         | 
| 52 54 | 
             
                      idx = notes.size == 1 ? "" : " #{i + 1}"
         | 
| 53 55 | 
             
                      @anchors[n["id"]] = anchor_struct(idx, s, @note_xref_lbl)
         | 
| 54 56 | 
             
                    end
         | 
| @@ -65,6 +67,7 @@ module IsoDoc | |
| 65 67 | 
             
                    notes = s.xpath(CHILD_EXAMPLES_XPATH)
         | 
| 66 68 | 
             
                    notes.each_with_index do |n, i|
         | 
| 67 69 | 
             
                      next if @anchors[n["id"]]
         | 
| 70 | 
            +
                      next if n["id"].nil? || n["id"].empty?
         | 
| 68 71 | 
             
                      idx = notes.size == 1 ? "" : " #{i + 1}"
         | 
| 69 72 | 
             
                      @anchors[n["id"]] = anchor_struct(idx, s, @example_xref_lbl)
         | 
| 70 73 | 
             
                    end
         | 
| @@ -77,6 +80,7 @@ module IsoDoc | |
| 77 80 | 
             
                    notes = s.xpath(ns(".//ol")) - s.xpath(ns(".//clause//ol")) -
         | 
| 78 81 | 
             
                      s.xpath(ns(".//appendix//ol")) - s.xpath(ns(".//ol//ol"))
         | 
| 79 82 | 
             
                    notes.each_with_index do |n, i|
         | 
| 83 | 
            +
                      next if n["id"].nil? || n["id"].empty?
         | 
| 80 84 | 
             
                      idx = notes.size == 1 ? "" : " #{i + 1}"
         | 
| 81 85 | 
             
                      @anchors[n["id"]] = anchor_struct(idx, s, @list_lbl)
         | 
| 82 86 | 
             
                      list_item_anchor_names(n, @anchors[n["id"]], 1, "", notes.size != 1)
         | 
| @@ -128,6 +132,7 @@ module IsoDoc | |
| 128 132 | 
             
                      i += 1
         | 
| 129 133 | 
             
                    end
         | 
| 130 134 | 
             
                    label = i.to_s + (j.zero? ? "" : "-#{j}")
         | 
| 135 | 
            +
                      next if t["id"].nil? || t["id"].empty?
         | 
| 131 136 | 
             
                    @anchors[t["id"]] = anchor_struct(label, nil, @figure_lbl)
         | 
| 132 137 | 
             
                  end
         | 
| 133 138 | 
             
                end
         | 
| @@ -159,10 +164,12 @@ module IsoDoc | |
| 159 164 |  | 
| 160 165 | 
             
                def sequential_asset_names(clause)
         | 
| 161 166 | 
             
                  clause.xpath(ns(".//table")).each_with_index do |t, i|
         | 
| 167 | 
            +
                      next if t["id"].nil? || t["id"].empty?
         | 
| 162 168 | 
             
                    @anchors[t["id"]] = anchor_struct(i + 1, nil, @table_lbl)
         | 
| 163 169 | 
             
                  end
         | 
| 164 170 | 
             
                  sequential_figure_names(clause)
         | 
| 165 171 | 
             
                  clause.xpath(ns(".//formula")).each_with_index do |t, i|
         | 
| 172 | 
            +
                      next if t["id"].nil? || t["id"].empty?
         | 
| 166 173 | 
             
                    @anchors[t["id"]] = anchor_struct(i + 1, t, @formula_lbl)
         | 
| 167 174 | 
             
                  end
         | 
| 168 175 | 
             
                end
         | 
| @@ -176,16 +183,19 @@ module IsoDoc | |
| 176 183 | 
             
                      i += 1
         | 
| 177 184 | 
             
                    end
         | 
| 178 185 | 
             
                    label = "#{num}.#{i}" + (j.zero? ? "" : "-#{j}")
         | 
| 186 | 
            +
                      next if t["id"].nil? || t["id"].empty?
         | 
| 179 187 | 
             
                    @anchors[t["id"]] = anchor_struct(label, nil, @figure_lbl)
         | 
| 180 188 | 
             
                  end
         | 
| 181 189 | 
             
                end
         | 
| 182 190 |  | 
| 183 191 | 
             
                def hierarchical_asset_names(clause, num)
         | 
| 184 192 | 
             
                  clause.xpath(ns(".//table")).each_with_index do |t, i|
         | 
| 193 | 
            +
                      next if t["id"].nil? || t["id"].empty?
         | 
| 185 194 | 
             
                    @anchors[t["id"]] = anchor_struct("#{num}.#{i + 1}", nil, @table_lbl)
         | 
| 186 195 | 
             
                  end
         | 
| 187 196 | 
             
                  hierarchical_figure_names(clause, num)
         | 
| 188 197 | 
             
                  clause.xpath(ns(".//formula")).each_with_index do |t, i|
         | 
| 198 | 
            +
                      next if t["id"].nil? || t["id"].empty?
         | 
| 189 199 | 
             
                    @anchors[t["id"]] = anchor_struct("#{num}.#{i + 1}", t, @formula_lbl)
         | 
| 190 200 | 
             
                  end
         | 
| 191 201 | 
             
                end
         |