isodoc 1.5.5 → 1.6.4
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/.github/workflows/rake.yml +2 -12
 - data/.hound.yml +3 -1
 - data/.rubocop.yml +3 -7
 - data/Gemfile +2 -2
 - data/Rakefile +2 -2
 - data/bin/rspec +1 -2
 - data/isodoc.gemspec +11 -11
 - data/lib/isodoc-yaml/i18n-ar.yaml +152 -0
 - data/lib/isodoc-yaml/i18n-de.yaml +149 -0
 - data/lib/isodoc-yaml/i18n-es.yaml +151 -0
 - data/lib/isodoc-yaml/i18n-ru.yaml +154 -0
 - data/lib/isodoc.rb +0 -2
 - data/lib/isodoc/base_style/all.css +7 -0
 - data/lib/isodoc/base_style/metanorma_word.css +7 -0
 - data/lib/isodoc/base_style/metanorma_word.scss +8 -0
 - data/lib/isodoc/base_style/reset.css +7 -0
 - data/lib/isodoc/base_style/reset.scss +9 -0
 - data/lib/isodoc/base_style/scripts.html +187 -0
 - data/lib/isodoc/class_utils.rb +6 -5
 - data/lib/isodoc/common.rb +2 -0
 - data/lib/isodoc/convert.rb +30 -17
 - data/lib/isodoc/css.rb +43 -34
 - data/lib/isodoc/function/blocks.rb +21 -4
 - data/lib/isodoc/function/blocks_example_note.rb +2 -2
 - data/lib/isodoc/function/cleanup.rb +53 -45
 - data/lib/isodoc/function/form.rb +51 -0
 - data/lib/isodoc/function/inline.rb +37 -15
 - data/lib/isodoc/function/references.rb +55 -42
 - data/lib/isodoc/function/section.rb +29 -16
 - data/lib/isodoc/function/table.rb +1 -0
 - data/lib/isodoc/function/to_word_html.rb +33 -29
 - data/lib/isodoc/function/utils.rb +180 -159
 - data/lib/isodoc/gem_tasks.rb +30 -31
 - data/lib/isodoc/headlesshtml_convert.rb +8 -7
 - data/lib/isodoc/html_convert.rb +6 -4
 - data/lib/isodoc/html_function/comments.rb +2 -0
 - data/lib/isodoc/html_function/footnotes.rb +14 -7
 - data/lib/isodoc/html_function/form.rb +62 -0
 - data/lib/isodoc/html_function/html.rb +30 -26
 - data/lib/isodoc/html_function/postprocess.rb +41 -82
 - data/lib/isodoc/html_function/postprocess_footnotes.rb +59 -0
 - data/lib/isodoc/i18n.rb +33 -31
 - data/lib/isodoc/pdf_convert.rb +12 -16
 - data/lib/isodoc/presentation_function/bibdata.rb +54 -30
 - data/lib/isodoc/presentation_function/block.rb +17 -8
 - data/lib/isodoc/presentation_function/inline.rb +84 -120
 - data/lib/isodoc/presentation_function/math.rb +84 -0
 - data/lib/isodoc/presentation_function/section.rb +20 -22
 - data/lib/isodoc/presentation_xml_convert.rb +2 -1
 - data/lib/isodoc/sassc_importer.rb +1 -1
 - data/lib/isodoc/version.rb +1 -1
 - data/lib/isodoc/word_function/body.rb +28 -24
 - data/lib/isodoc/word_function/footnotes.rb +22 -15
 - data/lib/isodoc/word_function/postprocess.rb +50 -36
 - data/lib/isodoc/xref.rb +9 -10
 - data/lib/isodoc/xref/xref_counter.rb +32 -17
 - data/lib/isodoc/xref/xref_gen.rb +33 -21
 - data/lib/isodoc/xref/xref_gen_seq.rb +60 -35
 - data/lib/isodoc/xref/xref_sect_gen.rb +37 -35
 - data/lib/isodoc/xslfo_convert.rb +36 -27
 - data/spec/assets/scripts_override.html +3 -0
 - data/spec/isodoc/blocks_spec.rb +2490 -2591
 - data/spec/isodoc/cleanup_spec.rb +1107 -1109
 - data/spec/isodoc/footnotes_spec.rb +1 -16
 - data/spec/isodoc/form_spec.rb +156 -0
 - data/spec/isodoc/i18n_spec.rb +984 -972
 - data/spec/isodoc/inline_spec.rb +1129 -912
 - data/spec/isodoc/lists_spec.rb +316 -315
 - data/spec/isodoc/postproc_spec.rb +1751 -1540
 - data/spec/isodoc/presentation_xml_spec.rb +403 -323
 - data/spec/isodoc/ref_spec.rb +718 -723
 - data/spec/isodoc/section_spec.rb +910 -902
 - data/spec/isodoc/table_spec.rb +566 -556
 - data/spec/isodoc/terms_spec.rb +251 -255
 - data/spec/isodoc/xref_spec.rb +3041 -2992
 - data/spec/isodoc/xslfo_convert_spec.rb +39 -0
 - data/spec/spec_helper.rb +30 -29
 - metadata +77 -65
 
| 
         @@ -1,28 +1,28 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require "twitter_cldr"
         
     | 
| 
       2 
     | 
    
         
            -
            require "bigdecimal"
         
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
1 
     | 
    
         
             
            module IsoDoc
         
     | 
| 
       5 
2 
     | 
    
         
             
              class PresentationXMLConvert < ::IsoDoc::Convert
         
     | 
| 
       6 
3 
     | 
    
         
             
                def prefix_container(container, linkend, _target)
         
     | 
| 
       7 
     | 
    
         
            -
                  l10n(@xrefs.anchor(container, :xref) 
     | 
| 
      
 4 
     | 
    
         
            +
                  l10n("#{@xrefs.anchor(container, :xref)}, #{linkend}")
         
     | 
| 
       8 
5 
     | 
    
         
             
                end
         
     | 
| 
       9 
6 
     | 
    
         | 
| 
       10 
7 
     | 
    
         
             
                def anchor_linkend(node, linkend)
         
     | 
| 
       11 
8 
     | 
    
         
             
                  if node["citeas"].nil? && node["bibitemid"]
         
     | 
| 
       12 
     | 
    
         
            -
                    return @xrefs.anchor(node["bibitemid"]  
     | 
| 
      
 9 
     | 
    
         
            +
                    return @xrefs.anchor(node["bibitemid"], :xref) || "???"
         
     | 
| 
       13 
10 
     | 
    
         
             
                  elsif node["target"] && node["droploc"]
         
     | 
| 
       14 
     | 
    
         
            -
                    return @xrefs.anchor(node["target"], :value) || 
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
      
 11 
     | 
    
         
            +
                    return @xrefs.anchor(node["target"], :value) ||
         
     | 
| 
      
 12 
     | 
    
         
            +
                        @xrefs.anchor(node["target"], :label) ||
         
     | 
| 
      
 13 
     | 
    
         
            +
                        @xrefs.anchor(node["target"], :xref) || "???"
         
     | 
| 
       16 
14 
     | 
    
         
             
                  elsif node["target"] && !/.#./.match(node["target"])
         
     | 
| 
       17 
15 
     | 
    
         
             
                    linkend = anchor_linkend1(node)
         
     | 
| 
       18 
16 
     | 
    
         
             
                  end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
       19 
18 
     | 
    
         
             
                  linkend || "???"
         
     | 
| 
       20 
19 
     | 
    
         
             
                end
         
     | 
| 
       21 
20 
     | 
    
         | 
| 
       22 
21 
     | 
    
         
             
                def anchor_linkend1(node)
         
     | 
| 
       23 
22 
     | 
    
         
             
                  linkend = @xrefs.anchor(node["target"], :xref)
         
     | 
| 
       24 
23 
     | 
    
         
             
                  container = @xrefs.anchor(node["target"], :container, false)
         
     | 
| 
       25 
     | 
    
         
            -
                  (container && get_note_container_id(node) != container && 
     | 
| 
      
 24 
     | 
    
         
            +
                  (container && get_note_container_id(node) != container &&
         
     | 
| 
      
 25 
     | 
    
         
            +
                   @xrefs.get[node["target"]]) and
         
     | 
| 
       26 
26 
     | 
    
         
             
                    linkend = prefix_container(container, linkend, node["target"])
         
     | 
| 
       27 
27 
     | 
    
         
             
                  capitalise_xref(node, linkend)
         
     | 
| 
       28 
28 
     | 
    
         
             
                end
         
     | 
| 
         @@ -31,86 +31,112 @@ module IsoDoc 
     | 
|
| 
       31 
31 
     | 
    
         
             
                  return linkend unless %w(Latn Cyrl Grek).include? @script
         
     | 
| 
       32 
32 
     | 
    
         
             
                  return linkend&.capitalize if node["case"] == "capital"
         
     | 
| 
       33 
33 
     | 
    
         
             
                  return linkend&.downcase if node["case"] == "lowercase"
         
     | 
| 
       34 
     | 
    
         
            -
                  return linkend if linkend[0,1].match(/\p{Upper}/)
         
     | 
| 
      
 34 
     | 
    
         
            +
                  return linkend if linkend[0, 1].match?(/\p{Upper}/)
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                  capitalise_xref1(node, linkend)
         
     | 
| 
      
 37 
     | 
    
         
            +
                end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                def capitalise_xref1(node, linkend)
         
     | 
| 
       35 
40 
     | 
    
         
             
                  prec = nearest_block_parent(node).xpath("./descendant-or-self::text()") &
         
     | 
| 
       36 
41 
     | 
    
         
             
                    node.xpath("./preceding::text()")
         
     | 
| 
       37 
     | 
    
         
            -
                   
     | 
| 
      
 42 
     | 
    
         
            +
                  if prec.empty? || /(?!<[^.].)\.\s+$/.match(prec.map(&:text).join)
         
     | 
| 
      
 43 
     | 
    
         
            +
                    linkend&.capitalize
         
     | 
| 
      
 44 
     | 
    
         
            +
                  else linkend
         
     | 
| 
      
 45 
     | 
    
         
            +
                  end
         
     | 
| 
       38 
46 
     | 
    
         
             
                end
         
     | 
| 
       39 
47 
     | 
    
         | 
| 
       40 
48 
     | 
    
         
             
                def nearest_block_parent(node)
         
     | 
| 
       41 
     | 
    
         
            -
                  until %w(p title td th name formula li dt dd sourcecode pre) 
     | 
| 
      
 49 
     | 
    
         
            +
                  until %w(p title td th name formula li dt dd sourcecode pre)
         
     | 
| 
      
 50 
     | 
    
         
            +
                      .include?(node.name)
         
     | 
| 
       42 
51 
     | 
    
         
             
                    node = node.parent
         
     | 
| 
       43 
52 
     | 
    
         
             
                  end
         
     | 
| 
       44 
53 
     | 
    
         
             
                  node
         
     | 
| 
       45 
54 
     | 
    
         
             
                end
         
     | 
| 
       46 
55 
     | 
    
         | 
| 
       47 
56 
     | 
    
         
             
                def non_locality_elems(node)
         
     | 
| 
       48 
     | 
    
         
            -
                  node.children. 
     | 
| 
       49 
     | 
    
         
            -
                     
     | 
| 
      
 57 
     | 
    
         
            +
                  node.children.reject do |c|
         
     | 
| 
      
 58 
     | 
    
         
            +
                    %w{locality localityStack}.include? c.name
         
     | 
| 
       50 
59 
     | 
    
         
             
                  end
         
     | 
| 
       51 
60 
     | 
    
         
             
                end
         
     | 
| 
       52 
61 
     | 
    
         | 
| 
       53 
     | 
    
         
            -
                def get_linkend( 
     | 
| 
       54 
     | 
    
         
            -
                   
     | 
| 
       55 
     | 
    
         
            -
                  return unless  
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
       57 
     | 
    
         
            -
                  link  
     | 
| 
       58 
     | 
    
         
            -
                   
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
      
 62 
     | 
    
         
            +
                def get_linkend(node)
         
     | 
| 
      
 63 
     | 
    
         
            +
                  c1 = non_locality_elems(node).select { |c| !c.text? || /\S/.match(c) }
         
     | 
| 
      
 64 
     | 
    
         
            +
                  return unless c1.empty?
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                  link = anchor_linkend(node, docid_l10n(node["target"] || node["citeas"]))
         
     | 
| 
      
 67 
     | 
    
         
            +
                  link += eref_localities(node.xpath(ns("./locality | ./localityStack")),
         
     | 
| 
      
 68 
     | 
    
         
            +
                                          link, node)
         
     | 
| 
      
 69 
     | 
    
         
            +
                  non_locality_elems(node).each(&:remove)
         
     | 
| 
      
 70 
     | 
    
         
            +
                  node.add_child(link)
         
     | 
| 
       60 
71 
     | 
    
         
             
                end
         
     | 
| 
       61 
72 
     | 
    
         
             
                # so not <origin bibitemid="ISO7301" citeas="ISO 7301">
         
     | 
| 
       62 
73 
     | 
    
         
             
                # <locality type="section"><reference>3.1</reference></locality></origin>
         
     | 
| 
       63 
74 
     | 
    
         | 
| 
       64 
     | 
    
         
            -
                def eref_localities(refs, target)
         
     | 
| 
      
 75 
     | 
    
         
            +
                def eref_localities(refs, target, node)
         
     | 
| 
       65 
76 
     | 
    
         
             
                  ret = ""
         
     | 
| 
       66 
77 
     | 
    
         
             
                  refs.each_with_index do |r, i|
         
     | 
| 
       67 
78 
     | 
    
         
             
                    delim = ","
         
     | 
| 
       68 
     | 
    
         
            -
                    delim = ";" if r.name == "localityStack" && i 
     | 
| 
       69 
     | 
    
         
            -
                    ret = eref_locality_stack(r, i, target, delim, ret)
         
     | 
| 
      
 79 
     | 
    
         
            +
                    delim = ";" if r.name == "localityStack" && i.positive?
         
     | 
| 
      
 80 
     | 
    
         
            +
                    ret = eref_locality_stack(r, i, target, delim, ret, node)
         
     | 
| 
       70 
81 
     | 
    
         
             
                  end
         
     | 
| 
       71 
82 
     | 
    
         
             
                  ret
         
     | 
| 
       72 
83 
     | 
    
         
             
                end
         
     | 
| 
       73 
84 
     | 
    
         | 
| 
       74 
     | 
    
         
            -
                def eref_locality_stack( 
     | 
| 
       75 
     | 
    
         
            -
                  if  
     | 
| 
       76 
     | 
    
         
            -
                     
     | 
| 
       77 
     | 
    
         
            -
                      ret += eref_localities0(rr, j, target, delim)
         
     | 
| 
      
 85 
     | 
    
         
            +
                def eref_locality_stack(ref, idx, target, delim, ret, node)
         
     | 
| 
      
 86 
     | 
    
         
            +
                  if ref.name == "localityStack"
         
     | 
| 
      
 87 
     | 
    
         
            +
                    ref.elements.each_with_index do |rr, j|
         
     | 
| 
      
 88 
     | 
    
         
            +
                      ret += eref_localities0(rr, j, target, delim, node)
         
     | 
| 
       78 
89 
     | 
    
         
             
                      delim = ","
         
     | 
| 
       79 
90 
     | 
    
         
             
                    end
         
     | 
| 
       80 
91 
     | 
    
         
             
                  else
         
     | 
| 
       81 
     | 
    
         
            -
                    ret += eref_localities0( 
     | 
| 
      
 92 
     | 
    
         
            +
                    ret += eref_localities0(ref, idx, target, delim, node)
         
     | 
| 
       82 
93 
     | 
    
         
             
                  end
         
     | 
| 
       83 
94 
     | 
    
         
             
                  ret
         
     | 
| 
       84 
95 
     | 
    
         
             
                end
         
     | 
| 
       85 
96 
     | 
    
         | 
| 
       86 
     | 
    
         
            -
                def eref_localities0( 
     | 
| 
       87 
     | 
    
         
            -
                  if  
     | 
| 
      
 97 
     | 
    
         
            +
                def eref_localities0(ref, _idx, target, delim, node)
         
     | 
| 
      
 98 
     | 
    
         
            +
                  if ref["type"] == "whole" then l10n("#{delim} #{@i18n.wholeoftext}")
         
     | 
| 
       88 
99 
     | 
    
         
             
                  else
         
     | 
| 
       89 
     | 
    
         
            -
                    eref_localities1(target,  
     | 
| 
      
 100 
     | 
    
         
            +
                    eref_localities1(target, ref["type"], ref.at(ns("./referenceFrom")),
         
     | 
| 
      
 101 
     | 
    
         
            +
                                     ref.at(ns("./referenceTo")), delim, node, @lang)
         
     | 
| 
       90 
102 
     | 
    
         
             
                  end
         
     | 
| 
       91 
103 
     | 
    
         
             
                end
         
     | 
| 
       92 
104 
     | 
    
         | 
| 
       93 
105 
     | 
    
         
             
                # TODO: move to localization file
         
     | 
| 
       94 
     | 
    
         
            -
                def eref_localities1_zh( 
     | 
| 
      
 106 
     | 
    
         
            +
                def eref_localities1_zh(_target, type, from, upto, node, delim)
         
     | 
| 
       95 
107 
     | 
    
         
             
                  ret = "#{delim} 第#{from.text}" if from
         
     | 
| 
       96 
     | 
    
         
            -
                  ret += "–#{ 
     | 
| 
       97 
     | 
    
         
            -
                  loc = (@i18n.locality[type] || type.sub(/^locality:/, "").capitalize 
     | 
| 
       98 
     | 
    
         
            -
                  ret += " #{loc}"
         
     | 
| 
      
 108 
     | 
    
         
            +
                  ret += "–#{upto.text}" if upto
         
     | 
| 
      
 109 
     | 
    
         
            +
                  loc = (@i18n.locality[type] || type.sub(/^locality:/, "").capitalize)
         
     | 
| 
      
 110 
     | 
    
         
            +
                  ret += " #{loc}" unless node["droploc"] == "true"
         
     | 
| 
       99 
111 
     | 
    
         
             
                  ret
         
     | 
| 
       100 
112 
     | 
    
         
             
                end
         
     | 
| 
       101 
113 
     | 
    
         | 
| 
       102 
114 
     | 
    
         
             
                # TODO: move to localization file
         
     | 
| 
       103 
     | 
    
         
            -
                def eref_localities1(target, type, from,  
     | 
| 
      
 115 
     | 
    
         
            +
                def eref_localities1(target, type, from, upto, delim, node, lang = "en")
         
     | 
| 
       104 
116 
     | 
    
         
             
                  return "" if type == "anchor"
         
     | 
| 
       105 
     | 
    
         
            -
             
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
      
 118 
     | 
    
         
            +
                  lang == "zh" and
         
     | 
| 
      
 119 
     | 
    
         
            +
                    return l10n(eref_localities1_zh(target, type, from, upto, node, delim))
         
     | 
| 
       106 
120 
     | 
    
         
             
                  ret = delim
         
     | 
| 
       107 
     | 
    
         
            -
                   
     | 
| 
       108 
     | 
    
         
            -
                  ret += " #{loc}"
         
     | 
| 
      
 121 
     | 
    
         
            +
                  ret += eref_locality_populate(type, node)
         
     | 
| 
       109 
122 
     | 
    
         
             
                  ret += " #{from.text}" if from
         
     | 
| 
       110 
     | 
    
         
            -
                  ret += "–#{ 
     | 
| 
      
 123 
     | 
    
         
            +
                  ret += "–#{upto.text}" if upto
         
     | 
| 
       111 
124 
     | 
    
         
             
                  l10n(ret)
         
     | 
| 
       112 
125 
     | 
    
         
             
                end
         
     | 
| 
       113 
126 
     | 
    
         | 
| 
      
 127 
     | 
    
         
            +
                def eref_locality_populate(type, node)
         
     | 
| 
      
 128 
     | 
    
         
            +
                  return "" if node["droploc"] == "true"
         
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
                  loc = @i18n.locality[type] || type.sub(/^locality:/, "")
         
     | 
| 
      
 131 
     | 
    
         
            +
                  loc = case node["case"]
         
     | 
| 
      
 132 
     | 
    
         
            +
                        when "capital" then loc.capitalize
         
     | 
| 
      
 133 
     | 
    
         
            +
                        when "lowercase" then loc.downcase
         
     | 
| 
      
 134 
     | 
    
         
            +
                        else
         
     | 
| 
      
 135 
     | 
    
         
            +
                          loc.capitalize
         
     | 
| 
      
 136 
     | 
    
         
            +
                        end
         
     | 
| 
      
 137 
     | 
    
         
            +
                  " #{loc}"
         
     | 
| 
      
 138 
     | 
    
         
            +
                end
         
     | 
| 
      
 139 
     | 
    
         
            +
             
     | 
| 
       114 
140 
     | 
    
         
             
                def xref(docxml)
         
     | 
| 
       115 
141 
     | 
    
         
             
                  docxml.xpath(ns("//xref")).each { |f| xref1(f) }
         
     | 
| 
       116 
142 
     | 
    
         
             
                end
         
     | 
| 
         @@ -127,8 +153,8 @@ module IsoDoc 
     | 
|
| 
       127 
153 
     | 
    
         
             
                  docxml.xpath(ns("//quote/source")).each { |f| xref1(f) }
         
     | 
| 
       128 
154 
     | 
    
         
             
                end
         
     | 
| 
       129 
155 
     | 
    
         | 
| 
       130 
     | 
    
         
            -
                def xref1( 
     | 
| 
       131 
     | 
    
         
            -
                  get_linkend( 
     | 
| 
      
 156 
     | 
    
         
            +
                def xref1(node)
         
     | 
| 
      
 157 
     | 
    
         
            +
                  get_linkend(node)
         
     | 
| 
       132 
158 
     | 
    
         
             
                end
         
     | 
| 
       133 
159 
     | 
    
         | 
| 
       134 
160 
     | 
    
         
             
                def concept(docxml)
         
     | 
| 
         @@ -136,107 +162,45 @@ module IsoDoc 
     | 
|
| 
       136 
162 
     | 
    
         
             
                end
         
     | 
| 
       137 
163 
     | 
    
         | 
| 
       138 
164 
     | 
    
         
             
                def concept1(node)
         
     | 
| 
       139 
     | 
    
         
            -
                  content = node.first_element_child.children. 
     | 
| 
       140 
     | 
    
         
            -
                     
     | 
| 
      
 165 
     | 
    
         
            +
                  content = node.first_element_child.children.reject do |c|
         
     | 
| 
      
 166 
     | 
    
         
            +
                    %w{locality localityStack}.include? c.name
         
     | 
| 
       141 
167 
     | 
    
         
             
                  end.select { |c| !c.text? || /\S/.match(c) }
         
     | 
| 
       142 
     | 
    
         
            -
                   
     | 
| 
       143 
     | 
    
         
            -
             
     | 
| 
       144 
     | 
    
         
            -
             
     | 
| 
       145 
     | 
    
         
            -
             
     | 
| 
       146 
     | 
    
         
            -
             
     | 
| 
       147 
     | 
    
         
            -
             
     | 
| 
       148 
     | 
    
         
            -
                MATHML = { "m" => "http://www.w3.org/1998/Math/MathML" }.freeze
         
     | 
| 
       149 
     | 
    
         
            -
             
     | 
| 
       150 
     | 
    
         
            -
                def mathml(docxml)
         
     | 
| 
       151 
     | 
    
         
            -
                  locale = twitter_cldr_localiser()
         
     | 
| 
       152 
     | 
    
         
            -
                  docxml.xpath("//m:math", MATHML).each do |f|
         
     | 
| 
       153 
     | 
    
         
            -
                    mathml1(f, locale)
         
     | 
| 
       154 
     | 
    
         
            -
                  end
         
     | 
| 
       155 
     | 
    
         
            -
                end
         
     | 
| 
       156 
     | 
    
         
            -
             
     | 
| 
       157 
     | 
    
         
            -
                # symbols is merged into
         
     | 
| 
       158 
     | 
    
         
            -
                # TwitterCldr::DataReaders::NumberDataReader.new(locale).symbols
         
     | 
| 
       159 
     | 
    
         
            -
                def localize_maths(f, locale)
         
     | 
| 
       160 
     | 
    
         
            -
                  f.xpath(".//m:mn", MATHML).each do |x|
         
     | 
| 
       161 
     | 
    
         
            -
                    num = BigDecimal(x.text)
         
     | 
| 
       162 
     | 
    
         
            -
                    precision = /\./.match(x.text) ? x.text.sub(/^.*\./, "").size : 0
         
     | 
| 
       163 
     | 
    
         
            -
                    x.children = localized_number(num, locale, precision)
         
     | 
| 
       164 
     | 
    
         
            -
                  end
         
     | 
| 
       165 
     | 
    
         
            -
                end
         
     | 
| 
       166 
     | 
    
         
            -
             
     | 
| 
       167 
     | 
    
         
            -
                # By itself twitter-cldr does not support fraction part digits grouping
         
     | 
| 
       168 
     | 
    
         
            -
                # and custom delimeter, will decorate fraction part manually
         
     | 
| 
       169 
     | 
    
         
            -
                def localized_number(num, locale, precision)
         
     | 
| 
       170 
     | 
    
         
            -
                  localized = (precision == 0) ? num.localize(locale).to_s :
         
     | 
| 
       171 
     | 
    
         
            -
                    num.localize(locale).to_decimal.to_s(:precision => precision)
         
     | 
| 
       172 
     | 
    
         
            -
                  twitter_cldr_reader_symbols = twitter_cldr_reader(locale)
         
     | 
| 
       173 
     | 
    
         
            -
                  return localized unless twitter_cldr_reader_symbols[:decimal]
         
     | 
| 
       174 
     | 
    
         
            -
                  integer, fraction = localized.split(twitter_cldr_reader_symbols[:decimal])
         
     | 
| 
       175 
     | 
    
         
            -
                  return localized if fraction.nil? || fraction.length.zero?
         
     | 
| 
       176 
     | 
    
         
            -
                  [integer, decorate_fraction_part(fraction, locale)].join(twitter_cldr_reader_symbols[:decimal])
         
     | 
| 
       177 
     | 
    
         
            -
                end
         
     | 
| 
       178 
     | 
    
         
            -
             
     | 
| 
       179 
     | 
    
         
            -
                def decorate_fraction_part(fract, locale)
         
     | 
| 
       180 
     | 
    
         
            -
                  result = []
         
     | 
| 
       181 
     | 
    
         
            -
                  twitter_cldr_reader_symbols = twitter_cldr_reader(locale)
         
     | 
| 
       182 
     | 
    
         
            -
                  fract = fract.slice(0..(twitter_cldr_reader_symbols[:precision] || -1))
         
     | 
| 
       183 
     | 
    
         
            -
                  fr_group_digits = twitter_cldr_reader_symbols[:fraction_group_digits] || 1
         
     | 
| 
       184 
     | 
    
         
            -
                  until fract.empty?
         
     | 
| 
       185 
     | 
    
         
            -
                    result.push(fract.slice!(0, fr_group_digits))
         
     | 
| 
       186 
     | 
    
         
            -
                  end
         
     | 
| 
       187 
     | 
    
         
            -
                  result.join(twitter_cldr_reader_symbols[:fraction_group].to_s)
         
     | 
| 
       188 
     | 
    
         
            -
                end
         
     | 
| 
       189 
     | 
    
         
            -
             
     | 
| 
       190 
     | 
    
         
            -
                def twitter_cldr_localiser_symbols
         
     | 
| 
       191 
     | 
    
         
            -
                  {}
         
     | 
| 
       192 
     | 
    
         
            -
                end
         
     | 
| 
       193 
     | 
    
         
            -
             
     | 
| 
       194 
     | 
    
         
            -
                def twitter_cldr_reader(locale)
         
     | 
| 
       195 
     | 
    
         
            -
                  num = TwitterCldr::DataReaders::NumberDataReader.new(locale)
         
     | 
| 
       196 
     | 
    
         
            -
                  num.symbols.merge!(twitter_cldr_localiser_symbols)
         
     | 
| 
       197 
     | 
    
         
            -
                end
         
     | 
| 
       198 
     | 
    
         
            -
             
     | 
| 
       199 
     | 
    
         
            -
                def twitter_cldr_localiser()
         
     | 
| 
       200 
     | 
    
         
            -
                  locale = TwitterCldr.supported_locale?(@lang.to_sym) ? @lang.to_sym : :en
         
     | 
| 
       201 
     | 
    
         
            -
                  twitter_cldr_reader(locale)
         
     | 
| 
       202 
     | 
    
         
            -
                  locale
         
     | 
| 
       203 
     | 
    
         
            -
                end
         
     | 
| 
       204 
     | 
    
         
            -
             
     | 
| 
       205 
     | 
    
         
            -
                def mathml1(f, locale)
         
     | 
| 
       206 
     | 
    
         
            -
                  localize_maths(f, locale)
         
     | 
| 
       207 
     | 
    
         
            -
                  return unless f.elements.size == 1 && f.elements.first.name == "mn"
         
     | 
| 
       208 
     | 
    
         
            -
                  if f.parent.name == "stem"
         
     | 
| 
       209 
     | 
    
         
            -
                    f.parent.replace(f.at("./m:mn", MATHML).children)
         
     | 
| 
       210 
     | 
    
         
            -
                  else
         
     | 
| 
       211 
     | 
    
         
            -
                    f.replace(f.at("./m:mn", MATHML).children)
         
     | 
| 
       212 
     | 
    
         
            -
                  end
         
     | 
| 
      
 168 
     | 
    
         
            +
                  n = if content.empty?
         
     | 
| 
      
 169 
     | 
    
         
            +
                        @i18n.term_defined_in.sub(/%/, node.first_element_child.to_xml)
         
     | 
| 
      
 170 
     | 
    
         
            +
                      else
         
     | 
| 
      
 171 
     | 
    
         
            +
                        "<em>#{node.children.to_xml}</em>"
         
     | 
| 
      
 172 
     | 
    
         
            +
                      end
         
     | 
| 
      
 173 
     | 
    
         
            +
                  node.replace(n)
         
     | 
| 
       213 
174 
     | 
    
         
             
                end
         
     | 
| 
       214 
175 
     | 
    
         | 
| 
       215 
176 
     | 
    
         
             
                def variant(docxml)
         
     | 
| 
       216 
177 
     | 
    
         
             
                  docxml.xpath(ns("//variant")).each { |f| variant1(f) }
         
     | 
| 
       217 
     | 
    
         
            -
                  docxml.xpath(ns("//variant[@remove = 'true']")).each 
     | 
| 
      
 178 
     | 
    
         
            +
                  docxml.xpath(ns("//variant[@remove = 'true']")).each(&:remove)
         
     | 
| 
       218 
179 
     | 
    
         
             
                  docxml.xpath(ns("//variant")).each do |v|
         
     | 
| 
       219 
180 
     | 
    
         
             
                    next unless v&.next&.name == "variant"
         
     | 
| 
      
 181 
     | 
    
         
            +
             
     | 
| 
       220 
182 
     | 
    
         
             
                    v.next = "/"
         
     | 
| 
       221 
183 
     | 
    
         
             
                  end
         
     | 
| 
       222 
184 
     | 
    
         
             
                  docxml.xpath(ns("//variant")).each { |f| f.replace(f.children) }
         
     | 
| 
       223 
185 
     | 
    
         
             
                end
         
     | 
| 
       224 
186 
     | 
    
         | 
| 
       225 
187 
     | 
    
         
             
                def variant1(node)
         
     | 
| 
       226 
     | 
    
         
            -
                  if (!node["lang"] || node["lang"] == @lang) && 
     | 
| 
      
 188 
     | 
    
         
            +
                  if (!node["lang"] || node["lang"] == @lang) &&
         
     | 
| 
      
 189 
     | 
    
         
            +
                      (!node["script"] || node["script"] == @script)
         
     | 
| 
       227 
190 
     | 
    
         
             
                  elsif found_matching_variant_sibling(node)
         
     | 
| 
       228 
191 
     | 
    
         
             
                    node["remove"] = "true"
         
     | 
| 
       229 
     | 
    
         
            -
                  else
         
     | 
| 
       230 
     | 
    
         
            -
                    #return unless !node.at("./preceding-sibling::xmlns:variant")
         
     | 
| 
       231 
192 
     | 
    
         
             
                  end
         
     | 
| 
       232 
193 
     | 
    
         
             
                end
         
     | 
| 
       233 
194 
     | 
    
         | 
| 
      
 195 
     | 
    
         
            +
                private
         
     | 
| 
      
 196 
     | 
    
         
            +
             
     | 
| 
       234 
197 
     | 
    
         
             
                def found_matching_variant_sibling(node)
         
     | 
| 
       235 
198 
     | 
    
         
             
                  prev = node.xpath("./preceding-sibling::xmlns:variant")
         
     | 
| 
       236 
199 
     | 
    
         
             
                  foll = node.xpath("./following-sibling::xmlns:variant")
         
     | 
| 
       237 
200 
     | 
    
         
             
                  found = false
         
     | 
| 
       238 
201 
     | 
    
         
             
                  (prev + foll).each do |n|
         
     | 
| 
       239 
     | 
    
         
            -
                    found = true if n["lang"] == @lang && 
     | 
| 
      
 202 
     | 
    
         
            +
                    found = true if n["lang"] == @lang &&
         
     | 
| 
      
 203 
     | 
    
         
            +
                      (!n["script"] || n["script"] == @script)
         
     | 
| 
       240 
204 
     | 
    
         
             
                  end
         
     | 
| 
       241 
205 
     | 
    
         
             
                  found
         
     | 
| 
       242 
206 
     | 
    
         
             
                end
         
     | 
| 
         @@ -0,0 +1,84 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "twitter_cldr"
         
     | 
| 
      
 2 
     | 
    
         
            +
            require "bigdecimal"
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            module IsoDoc
         
     | 
| 
      
 5 
     | 
    
         
            +
              class PresentationXMLConvert < ::IsoDoc::Convert
         
     | 
| 
      
 6 
     | 
    
         
            +
                MATHML = { "m" => "http://www.w3.org/1998/Math/MathML" }.freeze
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                def mathml(docxml)
         
     | 
| 
      
 9 
     | 
    
         
            +
                  locale = twitter_cldr_localiser
         
     | 
| 
      
 10 
     | 
    
         
            +
                  docxml.xpath("//m:math", MATHML).each do |f|
         
     | 
| 
      
 11 
     | 
    
         
            +
                    mathml1(f, locale)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                # symbols is merged into
         
     | 
| 
      
 16 
     | 
    
         
            +
                # TwitterCldr::DataReaders::NumberDataReader.new(locale).symbols
         
     | 
| 
      
 17 
     | 
    
         
            +
                def localize_maths(node, locale)
         
     | 
| 
      
 18 
     | 
    
         
            +
                  node.xpath(".//m:mn", MATHML).each do |x|
         
     | 
| 
      
 19 
     | 
    
         
            +
                    num = BigDecimal(x.text)
         
     | 
| 
      
 20 
     | 
    
         
            +
                    precision = /\./.match?(x.text) ? x.text.sub(/^.*\./, "").size : 0
         
     | 
| 
      
 21 
     | 
    
         
            +
                    x.children = localized_number(num, locale, precision)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  end
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                # By itself twitter-cldr does not support fraction part digits grouping
         
     | 
| 
      
 26 
     | 
    
         
            +
                # and custom delimeter, will decorate fraction part manually
         
     | 
| 
      
 27 
     | 
    
         
            +
                def localized_number(num, locale, precision)
         
     | 
| 
      
 28 
     | 
    
         
            +
                  localized = localized_number1(num, locale, precision)
         
     | 
| 
      
 29 
     | 
    
         
            +
                  twitter_cldr_reader_symbols = twitter_cldr_reader(locale)
         
     | 
| 
      
 30 
     | 
    
         
            +
                  return localized unless twitter_cldr_reader_symbols[:decimal]
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                  integer, fraction = localized.split(twitter_cldr_reader_symbols[:decimal])
         
     | 
| 
      
 33 
     | 
    
         
            +
                  return localized if fraction.nil? || fraction.length.zero?
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                  [integer, decorate_fraction_part(fraction, locale)]
         
     | 
| 
      
 36 
     | 
    
         
            +
                    .join(twitter_cldr_reader_symbols[:decimal])
         
     | 
| 
      
 37 
     | 
    
         
            +
                end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                def localized_number1(num, locale, precision)
         
     | 
| 
      
 40 
     | 
    
         
            +
                  if precision.zero?
         
     | 
| 
      
 41 
     | 
    
         
            +
                    num.localize(locale).to_s
         
     | 
| 
      
 42 
     | 
    
         
            +
                  else
         
     | 
| 
      
 43 
     | 
    
         
            +
                    num.localize(locale).to_decimal.to_s(precision: precision)
         
     | 
| 
      
 44 
     | 
    
         
            +
                  end
         
     | 
| 
      
 45 
     | 
    
         
            +
                end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                def decorate_fraction_part(fract, locale)
         
     | 
| 
      
 48 
     | 
    
         
            +
                  result = []
         
     | 
| 
      
 49 
     | 
    
         
            +
                  twitter_cldr_reader_symbols = twitter_cldr_reader(locale)
         
     | 
| 
      
 50 
     | 
    
         
            +
                  fract = fract.slice(0..(twitter_cldr_reader_symbols[:precision] || -1))
         
     | 
| 
      
 51 
     | 
    
         
            +
                  fr_group_digits = twitter_cldr_reader_symbols[:fraction_group_digits] || 1
         
     | 
| 
      
 52 
     | 
    
         
            +
                  until fract.empty?
         
     | 
| 
      
 53 
     | 
    
         
            +
                    result.push(fract.slice!(0, fr_group_digits))
         
     | 
| 
      
 54 
     | 
    
         
            +
                  end
         
     | 
| 
      
 55 
     | 
    
         
            +
                  result.join(twitter_cldr_reader_symbols[:fraction_group].to_s)
         
     | 
| 
      
 56 
     | 
    
         
            +
                end
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                def twitter_cldr_localiser_symbols
         
     | 
| 
      
 59 
     | 
    
         
            +
                  {}
         
     | 
| 
      
 60 
     | 
    
         
            +
                end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                def twitter_cldr_reader(locale)
         
     | 
| 
      
 63 
     | 
    
         
            +
                  num = TwitterCldr::DataReaders::NumberDataReader.new(locale)
         
     | 
| 
      
 64 
     | 
    
         
            +
                  num.symbols.merge!(twitter_cldr_localiser_symbols)
         
     | 
| 
      
 65 
     | 
    
         
            +
                end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                def twitter_cldr_localiser
         
     | 
| 
      
 68 
     | 
    
         
            +
                  locale = TwitterCldr.supported_locale?(@lang.to_sym) ? @lang.to_sym : :en
         
     | 
| 
      
 69 
     | 
    
         
            +
                  twitter_cldr_reader(locale)
         
     | 
| 
      
 70 
     | 
    
         
            +
                  locale
         
     | 
| 
      
 71 
     | 
    
         
            +
                end
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                def mathml1(node, locale)
         
     | 
| 
      
 74 
     | 
    
         
            +
                  localize_maths(node, locale)
         
     | 
| 
      
 75 
     | 
    
         
            +
                  return unless node.elements.size == 1 && node.elements.first.name == "mn"
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
                  if node.parent.name == "stem"
         
     | 
| 
      
 78 
     | 
    
         
            +
                    node.parent.replace(node.at("./m:mn", MATHML).children)
         
     | 
| 
      
 79 
     | 
    
         
            +
                  else
         
     | 
| 
      
 80 
     | 
    
         
            +
                    node.replace(node.at("./m:mn", MATHML).children)
         
     | 
| 
      
 81 
     | 
    
         
            +
                  end
         
     | 
| 
      
 82 
     | 
    
         
            +
                end
         
     | 
| 
      
 83 
     | 
    
         
            +
              end
         
     | 
| 
      
 84 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -2,20 +2,21 @@ module IsoDoc 
     | 
|
| 
       2 
2 
     | 
    
         
             
              class PresentationXMLConvert < ::IsoDoc::Convert
         
     | 
| 
       3 
3 
     | 
    
         
             
                def clause(docxml)
         
     | 
| 
       4 
4 
     | 
    
         
             
                  docxml.xpath(ns("//clause | "\
         
     | 
| 
       5 
     | 
    
         
            -
                                  "//terms | //definitions | //references")) 
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
      
 5 
     | 
    
         
            +
                                  "//terms | //definitions | //references"))
         
     | 
| 
      
 6 
     | 
    
         
            +
                    .each do |f|
         
     | 
| 
       7 
7 
     | 
    
         
             
                    clause1(f)
         
     | 
| 
       8 
8 
     | 
    
         
             
                  end
         
     | 
| 
       9 
9 
     | 
    
         
             
                end
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
                def clause1( 
     | 
| 
       12 
     | 
    
         
            -
                  level = @xrefs.anchor( 
     | 
| 
       13 
     | 
    
         
            -
                  t =  
     | 
| 
       14 
     | 
    
         
            -
                  return if ! 
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
      
 11 
     | 
    
         
            +
                def clause1(elem)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  level = @xrefs.anchor(elem["id"], :level, false) || "1"
         
     | 
| 
      
 13 
     | 
    
         
            +
                  t = elem.at(ns("./title")) and t["depth"] = level
         
     | 
| 
      
 14 
     | 
    
         
            +
                  return if !elem.ancestors("boilerplate").empty? ||
         
     | 
| 
      
 15 
     | 
    
         
            +
                    @suppressheadingnumbers || elem["unnumbered"]
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                  lbl = @xrefs.anchor(elem["id"], :label,
         
     | 
| 
      
 18 
     | 
    
         
            +
                                      elem.parent.name != "sections") or return
         
     | 
| 
      
 19 
     | 
    
         
            +
                  prefix_name(elem, "<tab/>", "#{lbl}#{clausedelim}", "title")
         
     | 
| 
       19 
20 
     | 
    
         
             
                end
         
     | 
| 
       20 
21 
     | 
    
         | 
| 
       21 
22 
     | 
    
         
             
                def annex(docxml)
         
     | 
| 
         @@ -24,12 +25,12 @@ module IsoDoc 
     | 
|
| 
       24 
25 
     | 
    
         
             
                  end
         
     | 
| 
       25 
26 
     | 
    
         
             
                end
         
     | 
| 
       26 
27 
     | 
    
         | 
| 
       27 
     | 
    
         
            -
                def annex1( 
     | 
| 
       28 
     | 
    
         
            -
                  lbl = @xrefs.anchor( 
     | 
| 
       29 
     | 
    
         
            -
                  if t =  
     | 
| 
      
 28 
     | 
    
         
            +
                def annex1(elem)
         
     | 
| 
      
 29 
     | 
    
         
            +
                  lbl = @xrefs.anchor(elem["id"], :label)
         
     | 
| 
      
 30 
     | 
    
         
            +
                  if t = elem.at(ns("./title"))
         
     | 
| 
       30 
31 
     | 
    
         
             
                    t.children = "<strong>#{t.children.to_xml}</strong>"
         
     | 
| 
       31 
32 
     | 
    
         
             
                  end
         
     | 
| 
       32 
     | 
    
         
            -
                  prefix_name( 
     | 
| 
      
 33 
     | 
    
         
            +
                  prefix_name(elem, "<br/><br/>", lbl, "title")
         
     | 
| 
       33 
34 
     | 
    
         
             
                end
         
     | 
| 
       34 
35 
     | 
    
         | 
| 
       35 
36 
     | 
    
         
             
                def term(docxml)
         
     | 
| 
         @@ -38,18 +39,15 @@ module IsoDoc 
     | 
|
| 
       38 
39 
     | 
    
         
             
                  end
         
     | 
| 
       39 
40 
     | 
    
         
             
                end
         
     | 
| 
       40 
41 
     | 
    
         | 
| 
       41 
     | 
    
         
            -
                def term1( 
     | 
| 
       42 
     | 
    
         
            -
                  lbl = @xrefs.get[ 
     | 
| 
       43 
     | 
    
         
            -
                  prefix_name( 
     | 
| 
      
 42 
     | 
    
         
            +
                def term1(elem)
         
     | 
| 
      
 43 
     | 
    
         
            +
                  lbl = @xrefs.get[elem["id"]][:label] or return
         
     | 
| 
      
 44 
     | 
    
         
            +
                  prefix_name(elem, "", "#{lbl}#{clausedelim}", "name")
         
     | 
| 
       44 
45 
     | 
    
         
             
                end
         
     | 
| 
       45 
46 
     | 
    
         | 
| 
       46 
     | 
    
         
            -
                def references(docxml)
         
     | 
| 
       47 
     | 
    
         
            -
                end
         
     | 
| 
      
 47 
     | 
    
         
            +
                def references(docxml); end
         
     | 
| 
       48 
48 
     | 
    
         | 
| 
       49 
49 
     | 
    
         
             
                def index(docxml)
         
     | 
| 
       50 
     | 
    
         
            -
                  docxml.xpath(ns("//index | //index-xref | //indexsect")).each 
     | 
| 
       51 
     | 
    
         
            -
                    f.remove
         
     | 
| 
       52 
     | 
    
         
            -
                  end
         
     | 
| 
      
 50 
     | 
    
         
            +
                  docxml.xpath(ns("//index | //index-xref | //indexsect")).each(&:remove)
         
     | 
| 
       53 
51 
     | 
    
         
             
                end
         
     | 
| 
       54 
52 
     | 
    
         
             
              end
         
     | 
| 
       55 
53 
     | 
    
         
             
            end
         
     |