metanorma-standoc 3.0.6 → 3.0.7
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/lib/metanorma/standoc/anchor.rb +1 -1
 - data/lib/metanorma/standoc/cleanup_boilerplate.rb +13 -3
 - data/lib/metanorma/standoc/cleanup_section.rb +4 -2
 - data/lib/metanorma/standoc/cleanup_section_names.rb +1 -0
 - data/lib/metanorma/standoc/cleanup_text.rb +9 -8
 - data/lib/metanorma/standoc/converter.rb +1 -0
 - data/lib/metanorma/standoc/front_organisation.rb +13 -4
 - data/lib/metanorma/standoc/inline.rb +3 -1
 - data/lib/metanorma/standoc/isodoc.rng +16 -1
 - data/lib/metanorma/standoc/macros_inline.rb +1 -1
 - data/lib/metanorma/standoc/section.rb +38 -79
 - data/lib/metanorma/standoc/sectiontype.rb +76 -0
 - data/lib/metanorma/standoc/utils.rb +1 -1
 - data/lib/metanorma/standoc/validate.rb +48 -9
 - data/lib/metanorma/standoc/validate_section.rb +5 -6
 - data/lib/metanorma/standoc/version.rb +1 -1
 - metadata +3 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: ab57258611b63bcabb64f17d1fe44bf74d8169ffd707ce96db6fa4f074a0f007
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 3c39749483d8687dbcaea874d3d1e37a90b61e54d45fba10346025eef2378a7a
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: c0cff4afac83b0a64838f23be4895f3dc6b5f02d986fd6d08706cb2dd8fc03ef2f5a446bb06e81c3a5a3d30a1a086a3e703af6d074f8dc14f0a93d524407334a
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 37ebfa958164eca83ddd835efbb50da1d36b7fcba0dc0c350abbf0da3833a132bfc9680c036367ff288c9163230e5c0a7852cded007c9ac50d73fe2117b3bade
         
     | 
| 
         @@ -51,7 +51,7 @@ module Metanorma 
     | 
|
| 
       51 
51 
     | 
    
         
             
                      case: %w(capital lowercase).detect { |x| attrs.key?(x) },
         
     | 
| 
       52 
52 
     | 
    
         
             
                      label: attrs["label"],
         
     | 
| 
       53 
53 
     | 
    
         
             
                      style: attrs["style"] || @xrefstyle,
         
     | 
| 
       54 
     | 
    
         
            -
                      droploc: attrs.key?("droploc")  
     | 
| 
      
 54 
     | 
    
         
            +
                      droploc: attrs.key?("droploc") || nil,
         
     | 
| 
       55 
55 
     | 
    
         
             
                      text: }.compact
         
     | 
| 
       56 
56 
     | 
    
         
             
                  end
         
     | 
| 
       57 
57 
     | 
    
         | 
| 
         @@ -84,7 +84,8 @@ module Metanorma 
     | 
|
| 
       84 
84 
     | 
    
         
             
                  end
         
     | 
| 
       85 
85 
     | 
    
         | 
| 
       86 
86 
     | 
    
         
             
                  def boilerplate_file(_xmldoc)
         
     | 
| 
       87 
     | 
    
         
            -
                    File.join(@libdir, "boilerplate.xml")
         
     | 
| 
      
 87 
     | 
    
         
            +
                    ret = File.join(@libdir, "boilerplate.xml")
         
     | 
| 
      
 88 
     | 
    
         
            +
                    File.exist?(ret) ? ret : ""
         
     | 
| 
       88 
89 
     | 
    
         
             
                  end
         
     | 
| 
       89 
90 
     | 
    
         | 
| 
       90 
91 
     | 
    
         
             
                  def boilerplate(xml, conv)
         
     | 
| 
         @@ -92,14 +93,23 @@ module Metanorma 
     | 
|
| 
       92 
93 
     | 
    
         
             
                    xml.at("//metanorma-extension/semantic-metadata/" \
         
     | 
| 
       93 
94 
     | 
    
         
             
                           "headless[text() = 'true']") and return nil
         
     | 
| 
       94 
95 
     | 
    
         
             
                    file = boilerplate_file(xml)
         
     | 
| 
       95 
     | 
    
         
            -
                    @boilerplateauthority 
     | 
| 
      
 96 
     | 
    
         
            +
                    file2 = @boilerplateauthority
         
     | 
| 
      
 97 
     | 
    
         
            +
                    @boilerplateauthority &&
         
     | 
| 
      
 98 
     | 
    
         
            +
                      !(Pathname.new @boilerplateauthority).absolute? and
         
     | 
| 
       96 
99 
     | 
    
         
             
                      file2 = File.join(@localdir, @boilerplateauthority)
         
     | 
| 
       97 
100 
     | 
    
         
             
                    resolve_boilerplate_files(process_boilerplate_file(file, conv),
         
     | 
| 
       98 
101 
     | 
    
         
             
                                              process_boilerplate_file(file2, conv))
         
     | 
| 
       99 
102 
     | 
    
         
             
                  end
         
     | 
| 
       100 
103 
     | 
    
         | 
| 
       101 
104 
     | 
    
         
             
                  def process_boilerplate_file(filename, conv)
         
     | 
| 
       102 
     | 
    
         
            -
                     
     | 
| 
      
 105 
     | 
    
         
            +
                    filename.nil? || filename.empty? and return
         
     | 
| 
      
 106 
     | 
    
         
            +
                    filename = filename.strip
         
     | 
| 
      
 107 
     | 
    
         
            +
                    unless File.exist?(filename)
         
     | 
| 
      
 108 
     | 
    
         
            +
                      msg = "Specified boilerplate file does not exist: #{filename}"
         
     | 
| 
      
 109 
     | 
    
         
            +
                      @log.add("Include", nil, msg, severity: 0)
         
     | 
| 
      
 110 
     | 
    
         
            +
                      return
         
     | 
| 
      
 111 
     | 
    
         
            +
                    end
         
     | 
| 
      
 112 
     | 
    
         
            +
             
     | 
| 
       103 
113 
     | 
    
         
             
                    b = conv.populate_template(boilerplate_read(filename), nil)
         
     | 
| 
       104 
114 
     | 
    
         
             
                    boilerplate_file_convert(b)
         
     | 
| 
       105 
115 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -5,12 +5,13 @@ module Metanorma 
     | 
|
| 
       5 
5 
     | 
    
         
             
                module Cleanup
         
     | 
| 
       6 
6 
     | 
    
         
             
                  def make_preface(xml, sect)
         
     | 
| 
       7 
7 
     | 
    
         
             
                    if xml.at("//foreword | //introduction | //acknowledgements | " \
         
     | 
| 
       8 
     | 
    
         
            -
                              "//*[@preface]")
         
     | 
| 
      
 8 
     | 
    
         
            +
                              "//executivesummary | //*[@preface]")
         
     | 
| 
       9 
9 
     | 
    
         
             
                      preface = sect.add_previous_sibling("<preface/>").first
         
     | 
| 
       10 
10 
     | 
    
         
             
                      f = xml.at("//foreword") and to_preface(preface, f)
         
     | 
| 
       11 
11 
     | 
    
         
             
                      f = xml.at("//introduction") and to_preface(preface, f)
         
     | 
| 
       12 
12 
     | 
    
         
             
                      move_clauses_into_preface(xml, preface)
         
     | 
| 
       13 
13 
     | 
    
         
             
                      f = xml.at("//acknowledgements") and to_preface(preface, f)
         
     | 
| 
      
 14 
     | 
    
         
            +
                      f = xml.at("//executivesummary") and to_preface(preface, f)
         
     | 
| 
       14 
15 
     | 
    
         
             
                    end
         
     | 
| 
       15 
16 
     | 
    
         
             
                    make_abstract(xml, sect)
         
     | 
| 
       16 
17 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -148,7 +149,8 @@ module Metanorma 
     | 
|
| 
       148 
149 
     | 
    
         | 
| 
       149 
150 
     | 
    
         
             
                  def obligations_cleanup_info(xml)
         
     | 
| 
       150 
151 
     | 
    
         
             
                    xml.xpath("//foreword | //introduction | //acknowledgements | " \
         
     | 
| 
       151 
     | 
    
         
            -
                              "//references | //preface//clause") 
     | 
| 
      
 152 
     | 
    
         
            +
                              "//executivesummary | //references | //preface//clause")
         
     | 
| 
      
 153 
     | 
    
         
            +
                      .each do |r|
         
     | 
| 
       152 
154 
     | 
    
         
             
                      r["obligation"] = "informative"
         
     | 
| 
       153 
155 
     | 
    
         
             
                    end
         
     | 
| 
       154 
156 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -42,6 +42,7 @@ module Metanorma 
     | 
|
| 
       42 
42 
     | 
    
         
             
                    replace_title(xml, "//foreword", @i18n&.foreword)
         
     | 
| 
       43 
43 
     | 
    
         
             
                    replace_title(xml, "//introduction", @i18n&.introduction)
         
     | 
| 
       44 
44 
     | 
    
         
             
                    replace_title(xml, "//acknowledgements", @i18n&.acknowledgements)
         
     | 
| 
      
 45 
     | 
    
         
            +
                    replace_title(xml, "//executivesummary", @i18n&.executivesummary)
         
     | 
| 
       45 
46 
     | 
    
         
             
                  end
         
     | 
| 
       46 
47 
     | 
    
         | 
| 
       47 
48 
     | 
    
         
             
                  def section_names_refs_cleanup(xml)
         
     | 
| 
         @@ -32,16 +32,16 @@ module Metanorma 
     | 
|
| 
       32 
32 
     | 
    
         
             
                      e[:skip] and next
         
     | 
| 
       33 
33 
     | 
    
         
             
                      lines = lines_strip_textspan(e, block[i + 1])
         
     | 
| 
       34 
34 
     | 
    
         
             
                      out = Metanorma::Utils.line_sanitise(lines)
         
     | 
| 
       35 
     | 
    
         
            -
                      e[:last] or out.pop
         
     | 
| 
      
 35 
     | 
    
         
            +
                      # e[:last] or out.pop
         
     | 
| 
       36 
36 
     | 
    
         
             
                      e[:elem].replace(out.join)
         
     | 
| 
       37 
37 
     | 
    
         
             
                    end
         
     | 
| 
       38 
38 
     | 
    
         
             
                  end
         
     | 
| 
       39 
39 
     | 
    
         | 
| 
       40 
     | 
    
         
            -
                  def lines_strip_textspan(span,  
     | 
| 
      
 40 
     | 
    
         
            +
                  def lines_strip_textspan(span, _nextspan)
         
     | 
| 
       41 
41 
     | 
    
         
             
                    lines = span[:text].lines[0..-2].map(&:rstrip) <<
         
     | 
| 
       42 
42 
     | 
    
         
             
                      span[:text].lines[-1]&.sub(/\n$/, "")
         
     | 
| 
       43 
43 
     | 
    
         
             
                    # no final line rstrip: can be space linking to next line
         
     | 
| 
       44 
     | 
    
         
            -
                    span[:last] or lines << nextspan[:text].lines.first # next token context
         
     | 
| 
      
 44 
     | 
    
         
            +
                    # span[:last] or lines << nextspan[:text].lines.first # next token context
         
     | 
| 
       45 
45 
     | 
    
         
             
                    lines
         
     | 
| 
       46 
46 
     | 
    
         
             
                  end
         
     | 
| 
       47 
47 
     | 
    
         | 
| 
         @@ -137,11 +137,12 @@ module Metanorma 
     | 
|
| 
       137 
137 
     | 
    
         | 
| 
       138 
138 
     | 
    
         
             
                  def block?(elem)
         
     | 
| 
       139 
139 
     | 
    
         
             
                    %w(title name variant-title clause figure annex example introduction
         
     | 
| 
       140 
     | 
    
         
            -
                       foreword acknowledgements note li th td dt dd p 
     | 
| 
       141 
     | 
    
         
            -
                       abstract preferred admitted related deprecates 
     | 
| 
       142 
     | 
    
         
            -
                       usage-info expression pronunciation 
     | 
| 
       143 
     | 
    
         
            -
                       definition termnote termexample modification 
     | 
| 
       144 
     | 
    
         
            -
                       newcontent floating-title tab review admonition 
     | 
| 
      
 140 
     | 
    
         
            +
                       foreword acknowledgements executivesummary note li th td dt dd p
         
     | 
| 
      
 141 
     | 
    
         
            +
                       quote label abstract preferred admitted related deprecates
         
     | 
| 
      
 142 
     | 
    
         
            +
                       field-of-application usage-info expression pronunciation
         
     | 
| 
      
 143 
     | 
    
         
            +
                       grammar-value domain definition termnote termexample modification
         
     | 
| 
      
 144 
     | 
    
         
            +
                       description newcontent floating-title tab review admonition
         
     | 
| 
      
 145 
     | 
    
         
            +
                       annotation).include? elem.name
         
     | 
| 
       145 
146 
     | 
    
         
             
                  end
         
     | 
| 
       146 
147 
     | 
    
         | 
| 
       147 
148 
     | 
    
         
             
                  def empty_tag_with_text_content?(elem)
         
     | 
| 
         @@ -39,6 +39,7 @@ module Metanorma 
     | 
|
| 
       39 
39 
     | 
    
         
             
                    preprocessor Metanorma::Standoc::Datamodel::DiagramPreprocessor
         
     | 
| 
       40 
40 
     | 
    
         
             
                    preprocessor Metanorma::Plugin::Datastruct::Json2TextPreprocessor
         
     | 
| 
       41 
41 
     | 
    
         
             
                    preprocessor Metanorma::Plugin::Datastruct::Yaml2TextPreprocessor
         
     | 
| 
      
 42 
     | 
    
         
            +
                    preprocessor Metanorma::Plugin::Datastruct::Data2TextPreprocessor
         
     | 
| 
       42 
43 
     | 
    
         
             
                    preprocessor Metanorma::Plugin::Glossarist::DatasetPreprocessor
         
     | 
| 
       43 
44 
     | 
    
         
             
                    preprocessor Metanorma::Standoc::NamedEscapePreprocessor
         
     | 
| 
       44 
45 
     | 
    
         
             
                    inline_macro Metanorma::Standoc::PreferredTermInlineMacro
         
     | 
| 
         @@ -14,16 +14,24 @@ module Metanorma 
     | 
|
| 
       14 
14 
     | 
    
         
             
                  end
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
                  def organization(org, orgname, node = nil, default_org = nil, attrs = {})
         
     | 
| 
       17 
     | 
    
         
            -
                     
     | 
| 
       18 
     | 
    
         
            -
                    n = abbrevs.invert[orgname] and orgname = n
         
     | 
| 
      
 17 
     | 
    
         
            +
                    orgname, abbr = org_name_and_abbrev(attrs, orgname)
         
     | 
| 
       19 
18 
     | 
    
         
             
                    org.name orgname
         
     | 
| 
       20 
19 
     | 
    
         
             
                    default_org && (a = node&.attr("subdivision")) && !attrs[:subdiv] and
         
     | 
| 
       21 
20 
     | 
    
         
             
                      subdivision(a, node&.attr("subdivision-abbr"), org)
         
     | 
| 
       22 
21 
     | 
    
         
             
                    a = attrs[:subdiv] and subdivision(a, nil, org)
         
     | 
| 
       23 
     | 
    
         
            -
                    abbr = org_abbrev[orgname]
         
     | 
| 
       24 
22 
     | 
    
         
             
                    abbr and org.abbreviation abbr
         
     | 
| 
       25 
23 
     | 
    
         
             
                  end
         
     | 
| 
       26 
24 
     | 
    
         | 
| 
      
 25 
     | 
    
         
            +
                  def org_name_and_abbrev(org, orgname)
         
     | 
| 
      
 26 
     | 
    
         
            +
                    if org[:abbrev]
         
     | 
| 
      
 27 
     | 
    
         
            +
                      [orgname, org[:abbrev]]
         
     | 
| 
      
 28 
     | 
    
         
            +
                    else
         
     | 
| 
      
 29 
     | 
    
         
            +
                      abbrevs = org_abbrev
         
     | 
| 
      
 30 
     | 
    
         
            +
                      n = abbrevs.invert[orgname] and orgname = n
         
     | 
| 
      
 31 
     | 
    
         
            +
                      [orgname, org_abbrev[orgname]]
         
     | 
| 
      
 32 
     | 
    
         
            +
                    end
         
     | 
| 
      
 33 
     | 
    
         
            +
                  end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
       27 
35 
     | 
    
         
             
                  def subdivision(attr, abbr, org)
         
     | 
| 
       28 
36 
     | 
    
         
             
                    abbrs = csv_split(abbr) || []
         
     | 
| 
       29 
37 
     | 
    
         
             
                    subdivs = csv_split(attr, ";")
         
     | 
| 
         @@ -50,7 +58,7 @@ module Metanorma 
     | 
|
| 
       50 
58 
     | 
    
         
             
                    list.empty? and return
         
     | 
| 
       51 
59 
     | 
    
         
             
                    org.subdivision **attr_code(type: list[0][:type]) do |s|
         
     | 
| 
       52 
60 
     | 
    
         
             
                      s.name { |n| n << list[0][:value] }
         
     | 
| 
       53 
     | 
    
         
            -
                      subdiv_build(list[1 
     | 
| 
      
 61 
     | 
    
         
            +
                      subdiv_build(list[1..], s)
         
     | 
| 
       54 
62 
     | 
    
         
             
                      a = list[0][:abbr] and s.abbreviation { |n| n << a }
         
     | 
| 
       55 
63 
     | 
    
         
             
                    end
         
     | 
| 
       56 
64 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -180,6 +188,7 @@ module Metanorma 
     | 
|
| 
       180 
188 
     | 
    
         | 
| 
       181 
189 
     | 
    
         
             
                  def extract_org_attrs_complex(node, opts, source, suffix)
         
     | 
| 
       182 
190 
     | 
    
         
             
                    { name: node.attr(source + suffix),
         
     | 
| 
      
 191 
     | 
    
         
            +
                      abbrev: node.attr("#{source}_abbr#{suffix}"),
         
     | 
| 
       183 
192 
     | 
    
         
             
                      role: opts[:role], desc: opts[:desc],
         
     | 
| 
       184 
193 
     | 
    
         
             
                      subdiv: node.attr("#{source}_subdivision#{suffix}"),
         
     | 
| 
       185 
194 
     | 
    
         
             
                      logo: node.attr("#{source}_logo#{suffix}") }.compact
         
     | 
| 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            <?xml version="1.0" encoding="UTF-8"?>
         
     | 
| 
       2 
2 
     | 
    
         
             
            <grammar xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
         
     | 
| 
       3 
     | 
    
         
            -
            <!-- VERSION v2.0. 
     | 
| 
      
 3 
     | 
    
         
            +
            <!-- VERSION v2.0.4 -->
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
              <!--
         
     | 
| 
       6 
6 
     | 
    
         
             
                ALERT: cannot have root comments, because of https://github.com/metanorma/metanorma/issues/437
         
     | 
| 
         @@ -1328,6 +1328,7 @@ numbers</a:documentation> 
     | 
|
| 
       1328 
1328 
     | 
    
         
             
                      <ref name="foreword"/>
         
     | 
| 
       1329 
1329 
     | 
    
         
             
                      <ref name="introduction"/>
         
     | 
| 
       1330 
1330 
     | 
    
         
             
                      <ref name="acknowledgements"/>
         
     | 
| 
      
 1331 
     | 
    
         
            +
                      <ref name="executivesummary"/>
         
     | 
| 
       1331 
1332 
     | 
    
         
             
                    </choice>
         
     | 
| 
       1332 
1333 
     | 
    
         
             
                  </oneOrMore>
         
     | 
| 
       1333 
1334 
     | 
    
         
             
                </element>
         
     | 
| 
         @@ -1351,6 +1352,11 @@ numbers</a:documentation> 
     | 
|
| 
       1351 
1352 
     | 
    
         
             
                  <ref name="Content-Section"/>
         
     | 
| 
       1352 
1353 
     | 
    
         
             
                </element>
         
     | 
| 
       1353 
1354 
     | 
    
         
             
              </define>
         
     | 
| 
      
 1355 
     | 
    
         
            +
              <define name="executivesummary">
         
     | 
| 
      
 1356 
     | 
    
         
            +
                <element name="executivesummary">
         
     | 
| 
      
 1357 
     | 
    
         
            +
                  <ref name="Content-Section"/>
         
     | 
| 
      
 1358 
     | 
    
         
            +
                </element>
         
     | 
| 
      
 1359 
     | 
    
         
            +
              </define>
         
     | 
| 
       1354 
1360 
     | 
    
         
             
              <define name="indexsect">
         
     | 
| 
       1355 
1361 
     | 
    
         
             
                <element name="indexsect">
         
     | 
| 
       1356 
1362 
     | 
    
         
             
                  <ref name="Content-Section"/>
         
     | 
| 
         @@ -1576,6 +1582,15 @@ used in document amendments</a:documentation> 
     | 
|
| 
       1576 
1582 
     | 
    
         
             
              <define name="annex">
         
     | 
| 
       1577 
1583 
     | 
    
         
             
                <element name="annex">
         
     | 
| 
       1578 
1584 
     | 
    
         
             
                  <ref name="Annex-Section"/>
         
     | 
| 
      
 1585 
     | 
    
         
            +
                  <zeroOrMore>
         
     | 
| 
      
 1586 
     | 
    
         
            +
                    <ref name="annex-appendix"/>
         
     | 
| 
      
 1587 
     | 
    
         
            +
                  </zeroOrMore>
         
     | 
| 
      
 1588 
     | 
    
         
            +
                </element>
         
     | 
| 
      
 1589 
     | 
    
         
            +
              </define>
         
     | 
| 
      
 1590 
     | 
    
         
            +
              <define name="annex-appendix">
         
     | 
| 
      
 1591 
     | 
    
         
            +
                <a:documentation>Appendix, distinct subclause type for annexes (annex to annex, rather than subclause to annex)</a:documentation>
         
     | 
| 
      
 1592 
     | 
    
         
            +
                <element name="appendix">
         
     | 
| 
      
 1593 
     | 
    
         
            +
                  <ref name="Clause-Section"/>
         
     | 
| 
       1579 
1594 
     | 
    
         
             
                </element>
         
     | 
| 
       1580 
1595 
     | 
    
         
             
              </define>
         
     | 
| 
       1581 
1596 
     | 
    
         
             
              <define name="terms">
         
     | 
| 
         @@ -208,7 +208,7 @@ module Metanorma 
     | 
|
| 
       208 
208 
     | 
    
         
             
                    fmt = format(out, target)
         
     | 
| 
       209 
209 
     | 
    
         
             
                    fmt.empty? and fmt = "default"
         
     | 
| 
       210 
210 
     | 
    
         
             
                    fmt = %( number-format="#{fmt}")
         
     | 
| 
       211 
     | 
    
         
            -
                    <<~OUTPUT
         
     | 
| 
      
 211 
     | 
    
         
            +
                    <<~OUTPUT.strip
         
     | 
| 
       212 
212 
     | 
    
         
             
                      <stem type="MathML"#{fmt}><math xmlns='#{MATHML_NS}'><mn>#{number(target)}</mn></math></stem>
         
     | 
| 
       213 
213 
     | 
    
         
             
                    OUTPUT
         
     | 
| 
       214 
214 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -1,6 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require "uri" if /^2\./.match?(RUBY_VERSION)
         
     | 
| 
       2 
2 
     | 
    
         
             
            require_relative "ref_sect"
         
     | 
| 
       3 
3 
     | 
    
         
             
            require_relative "terms"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require_relative "sectiontype"
         
     | 
| 
       4 
5 
     | 
    
         | 
| 
       5 
6 
     | 
    
         
             
            module Metanorma
         
     | 
| 
       6 
7 
     | 
    
         
             
              module Standoc
         
     | 
| 
         @@ -9,77 +10,6 @@ module Metanorma 
     | 
|
| 
       9 
10 
     | 
    
         
             
                  @term_def = false
         
     | 
| 
       10 
11 
     | 
    
         
             
                  @norm_ref = false
         
     | 
| 
       11 
12 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
                  def sectiontype1(node)
         
     | 
| 
       13 
     | 
    
         
            -
                    node.attr("style") == "abstract" and return "abstract"
         
     | 
| 
       14 
     | 
    
         
            -
                    node.attr("heading")&.downcase ||
         
     | 
| 
       15 
     | 
    
         
            -
                      node.title
         
     | 
| 
       16 
     | 
    
         
            -
                        .gsub(%r{<index>.*?</index>}m, "")
         
     | 
| 
       17 
     | 
    
         
            -
                        .gsub(%r{<fn[^<>]*>.*?</fn>}m, "")
         
     | 
| 
       18 
     | 
    
         
            -
                        .gsub(/<[^<>]+>/, "")
         
     | 
| 
       19 
     | 
    
         
            -
                        .strip.downcase.sub(/\.$/, "")
         
     | 
| 
       20 
     | 
    
         
            -
                  end
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                  def sectiontype(node, level = true)
         
     | 
| 
       23 
     | 
    
         
            -
                    ret = sectiontype1(node)
         
     | 
| 
       24 
     | 
    
         
            -
                    ret1 = preface_main_filter(sectiontype_streamline(ret), node)
         
     | 
| 
       25 
     | 
    
         
            -
                    ret1 == "symbols and abbreviated terms" and return ret1
         
     | 
| 
       26 
     | 
    
         
            -
                    !level || node.level == 1 || node.attr("heading") or return nil
         
     | 
| 
       27 
     | 
    
         
            -
                    !node.attr("heading") && @seen_headers.include?(ret) and return nil
         
     | 
| 
       28 
     | 
    
         
            -
                    @seen_headers << ret unless ret1.nil?
         
     | 
| 
       29 
     | 
    
         
            -
                    @seen_headers_canonical << ret1 unless ret1.nil?
         
     | 
| 
       30 
     | 
    
         
            -
                    ret1
         
     | 
| 
       31 
     | 
    
         
            -
                  end
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
                  def sectiontype_streamline(ret)
         
     | 
| 
       34 
     | 
    
         
            -
                    case ret
         
     | 
| 
       35 
     | 
    
         
            -
                    when "terms and definitions",
         
     | 
| 
       36 
     | 
    
         
            -
                      "terms, definitions, symbols and abbreviated terms",
         
     | 
| 
       37 
     | 
    
         
            -
                      "terms, definitions, symbols and abbreviations",
         
     | 
| 
       38 
     | 
    
         
            -
                      "terms, definitions and symbols",
         
     | 
| 
       39 
     | 
    
         
            -
                      "terms, definitions and abbreviations",
         
     | 
| 
       40 
     | 
    
         
            -
                      "terms, definitions and abbreviated terms"
         
     | 
| 
       41 
     | 
    
         
            -
                      "terms and definitions"
         
     | 
| 
       42 
     | 
    
         
            -
                    when "symbols and abbreviated terms",
         
     | 
| 
       43 
     | 
    
         
            -
                      "symbols", "abbreviated terms", "abbreviations",
         
     | 
| 
       44 
     | 
    
         
            -
                      "symbols and abbreviations"
         
     | 
| 
       45 
     | 
    
         
            -
                      "symbols and abbreviated terms"
         
     | 
| 
       46 
     | 
    
         
            -
                    when "acknowledgements", "acknowledgments"
         
     | 
| 
       47 
     | 
    
         
            -
                      "acknowledgements"
         
     | 
| 
       48 
     | 
    
         
            -
                    else
         
     | 
| 
       49 
     | 
    
         
            -
                      ret
         
     | 
| 
       50 
     | 
    
         
            -
                    end
         
     | 
| 
       51 
     | 
    
         
            -
                  end
         
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
     | 
    
         
            -
                  PREFACE_CLAUSE_NAMES =
         
     | 
| 
       54 
     | 
    
         
            -
                    %w(abstract foreword introduction metanorma-extension termdocsource
         
     | 
| 
       55 
     | 
    
         
            -
                       misc-container metanorma-extension acknowledgements).freeze
         
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
       57 
     | 
    
         
            -
                  MAIN_CLAUSE_NAMES =
         
     | 
| 
       58 
     | 
    
         
            -
                    ["normative references", "terms and definitions", "scope",
         
     | 
| 
       59 
     | 
    
         
            -
                     "symbols and abbreviated terms", "clause", "bibliography"].freeze
         
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
                  def role_style(node, value)
         
     | 
| 
       62 
     | 
    
         
            -
                    node.role == value || node.attr("style") == value
         
     | 
| 
       63 
     | 
    
         
            -
                  end
         
     | 
| 
       64 
     | 
    
         
            -
             
     | 
| 
       65 
     | 
    
         
            -
                  def start_main_section(ret, node)
         
     | 
| 
       66 
     | 
    
         
            -
                    role_style(node, "preface") and return
         
     | 
| 
       67 
     | 
    
         
            -
                    @preface = false if self.class::MAIN_CLAUSE_NAMES.include?(ret)
         
     | 
| 
       68 
     | 
    
         
            -
                    @preface = false if self.class::PREFACE_CLAUSE_NAMES
         
     | 
| 
       69 
     | 
    
         
            -
                      .intersection(@seen_headers_canonical + [ret]).empty?
         
     | 
| 
       70 
     | 
    
         
            -
                  end
         
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
       72 
     | 
    
         
            -
                  def preface_main_filter(ret, node)
         
     | 
| 
       73 
     | 
    
         
            -
                    start_main_section(ret, node)
         
     | 
| 
       74 
     | 
    
         
            -
                    if @preface
         
     | 
| 
       75 
     | 
    
         
            -
                      self.class::MAIN_CLAUSE_NAMES.include?(ret) and return nil
         
     | 
| 
       76 
     | 
    
         
            -
                    else
         
     | 
| 
       77 
     | 
    
         
            -
                      self.class::PREFACE_CLAUSE_NAMES.include?(ret) and return nil
         
     | 
| 
       78 
     | 
    
         
            -
                    end
         
     | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
       80 
     | 
    
         
            -
                    ret
         
     | 
| 
       81 
     | 
    
         
            -
                  end
         
     | 
| 
       82 
     | 
    
         
            -
             
     | 
| 
       83 
13 
     | 
    
         
             
                  def section_attributes(node)
         
     | 
| 
       84 
14 
     | 
    
         
             
                    ret =
         
     | 
| 
       85 
15 
     | 
    
         
             
                      { id: Metanorma::Utils::anchor_or_uuid(node),
         
     | 
| 
         @@ -120,6 +50,8 @@ module Metanorma 
     | 
|
| 
       120 
50 
     | 
    
         
             
                        symbols_parse(symbols_attrs(node, a), xml, node)
         
     | 
| 
       121 
51 
     | 
    
         
             
                      when "acknowledgements"
         
     | 
| 
       122 
52 
     | 
    
         
             
                        acknowledgements_parse(a, xml, node)
         
     | 
| 
      
 53 
     | 
    
         
            +
                      when "executivesummary"
         
     | 
| 
      
 54 
     | 
    
         
            +
                        executivesummary_parse(a, xml, node)
         
     | 
| 
       123 
55 
     | 
    
         
             
                      when "bibliography"
         
     | 
| 
       124 
56 
     | 
    
         
             
                        bibliography_parse(a, xml, node)
         
     | 
| 
       125 
57 
     | 
    
         
             
                      else
         
     | 
| 
         @@ -188,47 +120,74 @@ module Metanorma 
     | 
|
| 
       188 
120 
     | 
    
         
             
                    clause_parse(attrs.merge(type: "scope"), xml, node)
         
     | 
| 
       189 
121 
     | 
    
         
             
                  end
         
     | 
| 
       190 
122 
     | 
    
         | 
| 
       191 
     | 
    
         
            -
                  def  
     | 
| 
      
 123 
     | 
    
         
            +
                  def clause_attrs_preprocess(attrs, node)
         
     | 
| 
       192 
124 
     | 
    
         
             
                    attrs[:"inline-header"] = node.option? "inline-header"
         
     | 
| 
       193 
125 
     | 
    
         
             
                    attrs[:bibitem] = true if node.option? "bibitem"
         
     | 
| 
       194 
126 
     | 
    
         
             
                    attrs[:level] = node.attr("level")
         
     | 
| 
       195 
127 
     | 
    
         
             
                    set_obligation(attrs, node)
         
     | 
| 
      
 128 
     | 
    
         
            +
                  end
         
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
                  def clause_parse(attrs, xml, node)
         
     | 
| 
      
 131 
     | 
    
         
            +
                    clause_attrs_preprocess(attrs, node)
         
     | 
| 
      
 132 
     | 
    
         
            +
                    node.option?("appendix") && support_appendix?(node) and
         
     | 
| 
      
 133 
     | 
    
         
            +
                      return appendix_parse(attrs, xml, node)
         
     | 
| 
       196 
134 
     | 
    
         
             
                    xml.send :clause, **attr_code(attrs) do |xml_section|
         
     | 
| 
       197 
135 
     | 
    
         
             
                      xml_section.title { |n| n << node.title } unless node.title.nil?
         
     | 
| 
       198 
136 
     | 
    
         
             
                      xml_section << node.content
         
     | 
| 
       199 
137 
     | 
    
         
             
                    end
         
     | 
| 
       200 
138 
     | 
    
         
             
                  end
         
     | 
| 
       201 
139 
     | 
    
         | 
| 
       202 
     | 
    
         
            -
                  def  
     | 
| 
      
 140 
     | 
    
         
            +
                  def annex_attrs_preprocess(attrs, node)
         
     | 
| 
       203 
141 
     | 
    
         
             
                    attrs[:"inline-header"] = node.option? "inline-header"
         
     | 
| 
       204 
142 
     | 
    
         
             
                    set_obligation(attrs, node)
         
     | 
| 
      
 143 
     | 
    
         
            +
                  end
         
     | 
| 
      
 144 
     | 
    
         
            +
             
     | 
| 
      
 145 
     | 
    
         
            +
                  def annex_parse(attrs, xml, node)
         
     | 
| 
      
 146 
     | 
    
         
            +
                    annex_attrs_preprocess(attrs, node)
         
     | 
| 
       205 
147 
     | 
    
         
             
                    xml.annex **attr_code(attrs) do |xml_section|
         
     | 
| 
       206 
148 
     | 
    
         
             
                      xml_section.title { |name| name << node.title }
         
     | 
| 
       207 
149 
     | 
    
         
             
                      xml_section << node.content
         
     | 
| 
       208 
150 
     | 
    
         
             
                    end
         
     | 
| 
       209 
151 
     | 
    
         
             
                  end
         
     | 
| 
       210 
152 
     | 
    
         | 
| 
      
 153 
     | 
    
         
            +
                  def support_appendix?(_node)
         
     | 
| 
      
 154 
     | 
    
         
            +
                    false
         
     | 
| 
      
 155 
     | 
    
         
            +
                  end
         
     | 
| 
      
 156 
     | 
    
         
            +
             
     | 
| 
      
 157 
     | 
    
         
            +
                  def appendix_parse(attrs, xml, node)
         
     | 
| 
      
 158 
     | 
    
         
            +
                    attrs[:"inline-header"] = node.option? "inline-header"
         
     | 
| 
      
 159 
     | 
    
         
            +
                    set_obligation(attrs, node)
         
     | 
| 
      
 160 
     | 
    
         
            +
                    xml.appendix **attr_code(attrs) do |xml_section|
         
     | 
| 
      
 161 
     | 
    
         
            +
                      xml_section.title { |name| name << node.title }
         
     | 
| 
      
 162 
     | 
    
         
            +
                      xml_section << node.content
         
     | 
| 
      
 163 
     | 
    
         
            +
                    end
         
     | 
| 
      
 164 
     | 
    
         
            +
                  end
         
     | 
| 
      
 165 
     | 
    
         
            +
             
     | 
| 
       211 
166 
     | 
    
         
             
                  def introduction_parse(attrs, xml, node)
         
     | 
| 
       212 
167 
     | 
    
         
             
                    xml.introduction **attr_code(attrs) do |xml_section|
         
     | 
| 
       213 
168 
     | 
    
         
             
                      xml_section.title { |t| t << @i18n.introduction }
         
     | 
| 
       214 
     | 
    
         
            -
                       
     | 
| 
       215 
     | 
    
         
            -
                      xml_section << content
         
     | 
| 
      
 169 
     | 
    
         
            +
                      xml_section << node.content
         
     | 
| 
       216 
170 
     | 
    
         
             
                    end
         
     | 
| 
       217 
171 
     | 
    
         
             
                  end
         
     | 
| 
       218 
172 
     | 
    
         | 
| 
       219 
173 
     | 
    
         
             
                  def foreword_parse(attrs, xml, node)
         
     | 
| 
       220 
174 
     | 
    
         
             
                    xml.foreword **attr_code(attrs) do |xml_section|
         
     | 
| 
       221 
175 
     | 
    
         
             
                      xml_section.title { |t| t << node.title }
         
     | 
| 
       222 
     | 
    
         
            -
                       
     | 
| 
       223 
     | 
    
         
            -
                      xml_section << content
         
     | 
| 
      
 176 
     | 
    
         
            +
                      xml_section << node.content
         
     | 
| 
       224 
177 
     | 
    
         
             
                    end
         
     | 
| 
       225 
178 
     | 
    
         
             
                  end
         
     | 
| 
       226 
179 
     | 
    
         | 
| 
       227 
180 
     | 
    
         
             
                  def acknowledgements_parse(attrs, xml, node)
         
     | 
| 
       228 
181 
     | 
    
         
             
                    xml.acknowledgements **attr_code(attrs) do |xml_section|
         
     | 
| 
       229 
182 
     | 
    
         
             
                      xml_section.title { |t| (t << node.title) || @i18n.acknowledgements }
         
     | 
| 
       230 
     | 
    
         
            -
                       
     | 
| 
       231 
     | 
    
         
            -
             
     | 
| 
      
 183 
     | 
    
         
            +
                      xml_section << node.content
         
     | 
| 
      
 184 
     | 
    
         
            +
                    end
         
     | 
| 
      
 185 
     | 
    
         
            +
                  end
         
     | 
| 
      
 186 
     | 
    
         
            +
             
     | 
| 
      
 187 
     | 
    
         
            +
                  def executivesummary_parse(attrs, xml, node)
         
     | 
| 
      
 188 
     | 
    
         
            +
                    xml.executivesummary **attr_code(attrs) do |xml_section|
         
     | 
| 
      
 189 
     | 
    
         
            +
                      xml_section.title { |t| (t << node.title) || @i18n.executivesummary }
         
     | 
| 
      
 190 
     | 
    
         
            +
                      xml_section << node.content
         
     | 
| 
       232 
191 
     | 
    
         
             
                    end
         
     | 
| 
       233 
192 
     | 
    
         
             
                  end
         
     | 
| 
       234 
193 
     | 
    
         | 
| 
         @@ -0,0 +1,76 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Metanorma
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Standoc
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Section
         
     | 
| 
      
 4 
     | 
    
         
            +
                  def sectiontype1(node)
         
     | 
| 
      
 5 
     | 
    
         
            +
                    node.attr("style") == "abstract" and return "abstract"
         
     | 
| 
      
 6 
     | 
    
         
            +
                    node.attr("heading")&.downcase ||
         
     | 
| 
      
 7 
     | 
    
         
            +
                      node.title
         
     | 
| 
      
 8 
     | 
    
         
            +
                        .gsub(%r{<index>.*?</index>}m, "")
         
     | 
| 
      
 9 
     | 
    
         
            +
                        .gsub(%r{<fn[^<>]*>.*?</fn>}m, "")
         
     | 
| 
      
 10 
     | 
    
         
            +
                        .gsub(/<[^<>]+>/, "")
         
     | 
| 
      
 11 
     | 
    
         
            +
                        .strip.downcase.sub(/\.$/, "")
         
     | 
| 
      
 12 
     | 
    
         
            +
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                  def sectiontype(node, level = true)
         
     | 
| 
      
 15 
     | 
    
         
            +
                    ret = sectiontype1(node)
         
     | 
| 
      
 16 
     | 
    
         
            +
                    ret1 = preface_main_filter(sectiontype_streamline(ret), node)
         
     | 
| 
      
 17 
     | 
    
         
            +
                    ret1 == "symbols and abbreviated terms" and return ret1
         
     | 
| 
      
 18 
     | 
    
         
            +
                    !level || node.level == 1 || node.attr("heading") or return nil
         
     | 
| 
      
 19 
     | 
    
         
            +
                    !node.attr("heading") && @seen_headers.include?(ret) and return nil
         
     | 
| 
      
 20 
     | 
    
         
            +
                    @seen_headers << ret unless ret1.nil?
         
     | 
| 
      
 21 
     | 
    
         
            +
                    @seen_headers_canonical << ret1 unless ret1.nil?
         
     | 
| 
      
 22 
     | 
    
         
            +
                    ret1
         
     | 
| 
      
 23 
     | 
    
         
            +
                  end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                  def sectiontype_streamline(ret)
         
     | 
| 
      
 26 
     | 
    
         
            +
                    case ret
         
     | 
| 
      
 27 
     | 
    
         
            +
                    when "terms and definitions",
         
     | 
| 
      
 28 
     | 
    
         
            +
                      "terms, definitions, symbols and abbreviated terms",
         
     | 
| 
      
 29 
     | 
    
         
            +
                      "terms, definitions, symbols and abbreviations",
         
     | 
| 
      
 30 
     | 
    
         
            +
                      "terms, definitions and symbols",
         
     | 
| 
      
 31 
     | 
    
         
            +
                      "terms, definitions and abbreviations",
         
     | 
| 
      
 32 
     | 
    
         
            +
                      "terms, definitions and abbreviated terms"
         
     | 
| 
      
 33 
     | 
    
         
            +
                      "terms and definitions"
         
     | 
| 
      
 34 
     | 
    
         
            +
                    when "symbols and abbreviated terms",
         
     | 
| 
      
 35 
     | 
    
         
            +
                      "symbols", "abbreviated terms", "abbreviations",
         
     | 
| 
      
 36 
     | 
    
         
            +
                      "symbols and abbreviations"
         
     | 
| 
      
 37 
     | 
    
         
            +
                      "symbols and abbreviated terms"
         
     | 
| 
      
 38 
     | 
    
         
            +
                    when "acknowledgements", "acknowledgments"
         
     | 
| 
      
 39 
     | 
    
         
            +
                      "acknowledgements"
         
     | 
| 
      
 40 
     | 
    
         
            +
                    when "executive summary", "executive-summary", "executive_summary"
         
     | 
| 
      
 41 
     | 
    
         
            +
                      "executivesummary"
         
     | 
| 
      
 42 
     | 
    
         
            +
                    else
         
     | 
| 
      
 43 
     | 
    
         
            +
                      ret
         
     | 
| 
      
 44 
     | 
    
         
            +
                    end
         
     | 
| 
      
 45 
     | 
    
         
            +
                  end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                  PREFACE_CLAUSE_NAMES =
         
     | 
| 
      
 48 
     | 
    
         
            +
                    %w(abstract foreword introduction metanorma-extension termdocsource
         
     | 
| 
      
 49 
     | 
    
         
            +
                       misc-container metanorma-extension acknowledgements executivesummary)
         
     | 
| 
      
 50 
     | 
    
         
            +
                      .freeze
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                  MAIN_CLAUSE_NAMES =
         
     | 
| 
      
 53 
     | 
    
         
            +
                    ["normative references", "terms and definitions", "scope",
         
     | 
| 
      
 54 
     | 
    
         
            +
                     "symbols and abbreviated terms", "clause", "bibliography"].freeze
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                  def role_style(node, value)
         
     | 
| 
      
 57 
     | 
    
         
            +
                    node.role == value || node.attr("style") == value
         
     | 
| 
      
 58 
     | 
    
         
            +
                  end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                  def start_main_section(ret, node)
         
     | 
| 
      
 61 
     | 
    
         
            +
                    role_style(node, "preface") and return
         
     | 
| 
      
 62 
     | 
    
         
            +
                    @preface = false if self.class::MAIN_CLAUSE_NAMES.include?(ret)
         
     | 
| 
      
 63 
     | 
    
         
            +
                    @preface = false if self.class::PREFACE_CLAUSE_NAMES
         
     | 
| 
      
 64 
     | 
    
         
            +
                      .intersection(@seen_headers_canonical + [ret]).empty?
         
     | 
| 
      
 65 
     | 
    
         
            +
                  end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                  def preface_main_filter(ret, node)
         
     | 
| 
      
 68 
     | 
    
         
            +
                    start_main_section(ret, node)
         
     | 
| 
      
 69 
     | 
    
         
            +
                    @preface && self.class::MAIN_CLAUSE_NAMES.include?(ret) and return nil
         
     | 
| 
      
 70 
     | 
    
         
            +
                    !@preface && self.class::PREFACE_CLAUSE_NAMES.include?(ret) and
         
     | 
| 
      
 71 
     | 
    
         
            +
                      return nil
         
     | 
| 
      
 72 
     | 
    
         
            +
                    ret
         
     | 
| 
      
 73 
     | 
    
         
            +
                  end
         
     | 
| 
      
 74 
     | 
    
         
            +
                end
         
     | 
| 
      
 75 
     | 
    
         
            +
              end
         
     | 
| 
      
 76 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -119,7 +119,7 @@ module Metanorma 
     | 
|
| 
       119 
119 
     | 
    
         
             
                  end
         
     | 
| 
       120 
120 
     | 
    
         | 
| 
       121 
121 
     | 
    
         
             
                  SECTION_CONTAINERS =
         
     | 
| 
       122 
     | 
    
         
            -
                    %w(foreword introduction acknowledgements abstract
         
     | 
| 
      
 122 
     | 
    
         
            +
                    %w(foreword introduction acknowledgements executivesummary abstract
         
     | 
| 
       123 
123 
     | 
    
         
             
                       clause references terms definitions annex appendix indexsect
         
     | 
| 
       124 
124 
     | 
    
         
             
                       executivesummary).freeze
         
     | 
| 
       125 
125 
     | 
    
         | 
| 
         @@ -163,27 +163,66 @@ module Metanorma 
     | 
|
| 
       163 
163 
     | 
    
         
             
                      @log.add("Anchors", elem,
         
     | 
| 
       164 
164 
     | 
    
         
             
                               "Anchor #{elem['id']} has already been " \
         
     | 
| 
       165 
165 
     | 
    
         
             
                               "used at line #{@doc_ids[elem['id']]}", severity: 0)
         
     | 
| 
      
 166 
     | 
    
         
            +
                    else
         
     | 
| 
      
 167 
     | 
    
         
            +
                      @doc_ids[elem["id"]] = elem.line
         
     | 
| 
       166 
168 
     | 
    
         
             
                    end
         
     | 
| 
       167 
     | 
    
         
            -
                    @doc_ids[elem["id"]] = elem.line
         
     | 
| 
       168 
169 
     | 
    
         
             
                  end
         
     | 
| 
       169 
170 
     | 
    
         | 
| 
       170 
171 
     | 
    
         
             
                  def repeat_id_validate(doc)
         
     | 
| 
       171 
     | 
    
         
            -
                    @doc_ids = {}
         
     | 
| 
      
 172 
     | 
    
         
            +
                    @doc_ids = {} # hash of all ids in document to line number
         
     | 
| 
      
 173 
     | 
    
         
            +
                    @doc_id_seq = [] # ordered list of all ids in document
         
     | 
| 
       172 
174 
     | 
    
         
             
                    doc.xpath("//*[@id]").each do |x|
         
     | 
| 
      
 175 
     | 
    
         
            +
                      @doc_id_seq << x["id"]
         
     | 
| 
       173 
176 
     | 
    
         
             
                      repeat_id_validate1(x)
         
     | 
| 
       174 
177 
     | 
    
         
             
                    end
         
     | 
| 
      
 178 
     | 
    
         
            +
                    @doc_id_seq.sort!
         
     | 
| 
       175 
179 
     | 
    
         
             
                  end
         
     | 
| 
       176 
180 
     | 
    
         | 
| 
       177 
     | 
    
         
            -
                  #  
     | 
| 
      
 181 
     | 
    
         
            +
                  # Retrieve IDs between two nominated values
         
     | 
| 
      
 182 
     | 
    
         
            +
                  # (exclusive of start_id AND exclusive of end_id)
         
     | 
| 
      
 183 
     | 
    
         
            +
                  def get_ids_between(start_id, end_id)
         
     | 
| 
      
 184 
     | 
    
         
            +
                    start_index = @doc_id_seq.bsearch_index { |id| id > start_id }
         
     | 
| 
      
 185 
     | 
    
         
            +
                    end_index = @doc_id_seq.bsearch_index { |id| id >= end_id }
         
     | 
| 
      
 186 
     | 
    
         
            +
                    # start_id is greater than or equal to all elements
         
     | 
| 
      
 187 
     | 
    
         
            +
                    start_index.nil? and return []
         
     | 
| 
      
 188 
     | 
    
         
            +
                    # end_id is greater than all elements
         
     | 
| 
      
 189 
     | 
    
         
            +
                    end_index.nil? and end_index = @doc_id_seq.length
         
     | 
| 
      
 190 
     | 
    
         
            +
                    start_index >= end_index and return []
         
     | 
| 
      
 191 
     | 
    
         
            +
                    @doc_id_seq[start_index...end_index]
         
     | 
| 
      
 192 
     | 
    
         
            +
                  end
         
     | 
| 
      
 193 
     | 
    
         
            +
             
     | 
| 
      
 194 
     | 
    
         
            +
                  # manually check for xref/@target et sim. integrity
         
     | 
| 
       178 
195 
     | 
    
         
             
                  def xref_validate(doc)
         
     | 
| 
       179 
     | 
    
         
            -
                     
     | 
| 
       180 
     | 
    
         
            -
             
     | 
| 
       181 
     | 
    
         
            -
             
     | 
| 
       182 
     | 
    
         
            -
             
     | 
| 
       183 
     | 
    
         
            -
             
     | 
| 
       184 
     | 
    
         
            -
             
     | 
| 
      
 196 
     | 
    
         
            +
                    xref_validate_exists(doc)
         
     | 
| 
      
 197 
     | 
    
         
            +
                    xref_range_record(doc)
         
     | 
| 
      
 198 
     | 
    
         
            +
                  end
         
     | 
| 
      
 199 
     | 
    
         
            +
             
     | 
| 
      
 200 
     | 
    
         
            +
                  def xref_validate_exists(doc)
         
     | 
| 
      
 201 
     | 
    
         
            +
                    @doc_xrefs =
         
     | 
| 
      
 202 
     | 
    
         
            +
                      doc.xpath("//xref/@target | //xref//location/@target | //index/@to")
         
     | 
| 
      
 203 
     | 
    
         
            +
                        .each_with_object({}) do |x, m|
         
     | 
| 
      
 204 
     | 
    
         
            +
                        m[x.text] = x.parent
         
     | 
| 
      
 205 
     | 
    
         
            +
                        @doc_ids[x.text] and next
         
     | 
| 
      
 206 
     | 
    
         
            +
                        @log.add("Anchors", x.parent,
         
     | 
| 
      
 207 
     | 
    
         
            +
                                 "Crossreference target #{x} is undefined", severity: 1)
         
     | 
| 
      
 208 
     | 
    
         
            +
                      end
         
     | 
| 
      
 209 
     | 
    
         
            +
                  end
         
     | 
| 
      
 210 
     | 
    
         
            +
             
     | 
| 
      
 211 
     | 
    
         
            +
                  # If there is an xref range, record the IDs between the two targets
         
     | 
| 
      
 212 
     | 
    
         
            +
                  def xref_range_record(doc)
         
     | 
| 
      
 213 
     | 
    
         
            +
                    doc.xpath("//xref//location[@connective = 'to']").each do |to|
         
     | 
| 
      
 214 
     | 
    
         
            +
                      process_range_location(to)
         
     | 
| 
       185 
215 
     | 
    
         
             
                    end
         
     | 
| 
       186 
216 
     | 
    
         
             
                  end
         
     | 
| 
      
 217 
     | 
    
         
            +
             
     | 
| 
      
 218 
     | 
    
         
            +
                  def process_range_location(to_location)
         
     | 
| 
      
 219 
     | 
    
         
            +
                    # Get the preceding location element if it exists
         
     | 
| 
      
 220 
     | 
    
         
            +
                    from = to_location.previous_element
         
     | 
| 
      
 221 
     | 
    
         
            +
                    from && from.name == "location" or return
         
     | 
| 
      
 222 
     | 
    
         
            +
                    from["target"] && to_location["target"] or return
         
     | 
| 
      
 223 
     | 
    
         
            +
                    get_ids_between(from["target"], to_location["target"])
         
     | 
| 
      
 224 
     | 
    
         
            +
                      .each { |id| @doc_xrefs[id] = from }
         
     | 
| 
      
 225 
     | 
    
         
            +
                  end
         
     | 
| 
       187 
226 
     | 
    
         
             
                end
         
     | 
| 
       188 
227 
     | 
    
         
             
              end
         
     | 
| 
       189 
228 
     | 
    
         
             
            end
         
     | 
| 
         @@ -46,12 +46,11 @@ module Metanorma 
     | 
|
| 
       46 
46 
     | 
    
         | 
| 
       47 
47 
     | 
    
         
             
                  def hanging_para_style(root)
         
     | 
| 
       48 
48 
     | 
    
         
             
                    root.xpath("//clause | //annex | //foreword | //introduction | " \
         
     | 
| 
       49 
     | 
    
         
            -
                               "//acknowledgements").each do |c|
         
     | 
| 
       50 
     | 
    
         
            -
                       
     | 
| 
       51 
     | 
    
         
            -
                       
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
      
 49 
     | 
    
         
            +
                               "//acknowledgements | //executivesummary").each do |c|
         
     | 
| 
      
 50 
     | 
    
         
            +
                      c.at("./clause") or next
         
     | 
| 
      
 51 
     | 
    
         
            +
                      c.elements.reject do |n|
         
     | 
| 
      
 52 
     | 
    
         
            +
                        %w(clause title).include? n.name
         
     | 
| 
      
 53 
     | 
    
         
            +
                      end.empty? and next
         
     | 
| 
       55 
54 
     | 
    
         
             
                      style_warning(c, "Hanging paragraph in clause")
         
     | 
| 
       56 
55 
     | 
    
         
             
                    end
         
     | 
| 
       57 
56 
     | 
    
         
             
                  end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: metanorma-standoc
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 3.0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 3.0.7
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Ribose Inc.
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire:
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2025-04- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2025-04-29 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: addressable
         
     | 
| 
         @@ -560,6 +560,7 @@ files: 
     | 
|
| 
       560 
560 
     | 
    
         
             
            - lib/metanorma/standoc/reqt.rb
         
     | 
| 
       561 
561 
     | 
    
         
             
            - lib/metanorma/standoc/reqt.rng
         
     | 
| 
       562 
562 
     | 
    
         
             
            - lib/metanorma/standoc/section.rb
         
     | 
| 
      
 563 
     | 
    
         
            +
            - lib/metanorma/standoc/sectiontype.rb
         
     | 
| 
       563 
564 
     | 
    
         
             
            - lib/metanorma/standoc/spans_to_bibitem.rb
         
     | 
| 
       564 
565 
     | 
    
         
             
            - lib/metanorma/standoc/spans_to_bibitem_preprocessing.rb
         
     | 
| 
       565 
566 
     | 
    
         
             
            - lib/metanorma/standoc/table.rb
         
     |