metanorma-standoc 1.8.7 → 1.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +0 -2
  3. data/Gemfile.devel +0 -0
  4. data/lib/asciidoctor/standoc/base.rb +39 -36
  5. data/lib/asciidoctor/standoc/biblio.rng +1 -0
  6. data/lib/asciidoctor/standoc/blocks.rb +25 -9
  7. data/lib/asciidoctor/standoc/blocks_notes.rb +41 -24
  8. data/lib/asciidoctor/standoc/cleanup.rb +59 -84
  9. data/lib/asciidoctor/standoc/cleanup_block.rb +63 -85
  10. data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +51 -29
  11. data/lib/asciidoctor/standoc/cleanup_footnotes.rb +1 -0
  12. data/lib/asciidoctor/standoc/cleanup_image.rb +71 -0
  13. data/lib/asciidoctor/standoc/cleanup_maths.rb +36 -27
  14. data/lib/asciidoctor/standoc/cleanup_ref.rb +24 -15
  15. data/lib/asciidoctor/standoc/cleanup_ref_dl.rb +1 -1
  16. data/lib/asciidoctor/standoc/cleanup_reqt.rb +47 -0
  17. data/lib/asciidoctor/standoc/cleanup_section.rb +104 -94
  18. data/lib/asciidoctor/standoc/converter.rb +10 -3
  19. data/lib/asciidoctor/standoc/datamodel/plantuml_renderer.rb +67 -66
  20. data/lib/asciidoctor/standoc/front.rb +35 -18
  21. data/lib/asciidoctor/standoc/front_contributor.rb +5 -5
  22. data/lib/asciidoctor/standoc/inline.rb +1 -1
  23. data/lib/asciidoctor/standoc/isodoc.rng +305 -4
  24. data/lib/asciidoctor/standoc/lists.rb +4 -2
  25. data/lib/asciidoctor/standoc/macros.rb +50 -23
  26. data/lib/asciidoctor/standoc/macros_form.rb +63 -0
  27. data/lib/asciidoctor/standoc/ref.rb +87 -112
  28. data/lib/asciidoctor/standoc/ref_date_id.rb +62 -0
  29. data/lib/asciidoctor/standoc/ref_sect.rb +20 -17
  30. data/lib/asciidoctor/standoc/section.rb +3 -1
  31. data/lib/asciidoctor/standoc/term_lookup_cleanup.rb +31 -16
  32. data/lib/asciidoctor/standoc/terms.rb +27 -16
  33. data/lib/asciidoctor/standoc/utils.rb +35 -9
  34. data/lib/asciidoctor/standoc/validate.rb +30 -28
  35. data/lib/metanorma-standoc.rb +0 -1
  36. data/lib/metanorma/standoc/version.rb +5 -5
  37. data/metanorma-standoc.gemspec +11 -11
  38. data/spec/asciidoctor/base_spec.rb +85 -19
  39. data/spec/asciidoctor/blocks_spec.rb +830 -727
  40. data/spec/asciidoctor/cleanup_sections_spec.rb +51 -14
  41. data/spec/asciidoctor/cleanup_spec.rb +1900 -1917
  42. data/spec/asciidoctor/inline_spec.rb +282 -283
  43. data/spec/asciidoctor/isobib_cache_spec.rb +406 -358
  44. data/spec/asciidoctor/lists_spec.rb +3 -3
  45. data/spec/asciidoctor/macros_plantuml_spec.rb +8 -8
  46. data/spec/asciidoctor/macros_spec.rb +546 -444
  47. data/spec/asciidoctor/macros_yaml2text_spec.rb +1 -1
  48. data/spec/asciidoctor/refs_dl_spec.rb +4 -4
  49. data/spec/asciidoctor/refs_spec.rb +19 -19
  50. data/spec/asciidoctor/section_spec.rb +778 -689
  51. data/spec/asciidoctor/table_spec.rb +6 -6
  52. data/spec/asciidoctor/validate_spec.rb +21 -21
  53. data/spec/spec_helper.rb +13 -9
  54. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +62 -62
  55. data/spec/vcr_cassettes/isobib_get_123.yml +16 -16
  56. data/spec/vcr_cassettes/isobib_get_123_1.yml +28 -28
  57. data/spec/vcr_cassettes/isobib_get_123_1_fr.yml +41 -41
  58. data/spec/vcr_cassettes/isobib_get_123_2001.yml +16 -16
  59. data/spec/vcr_cassettes/isobib_get_124.yml +15 -15
  60. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +14 -14
  61. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +63 -61
  62. metadata +68 -67
  63. data/lib/liquid/custom_blocks/key_iterator.rb +0 -21
  64. data/lib/liquid/custom_blocks/with_json_nested_context.rb +0 -18
  65. data/lib/liquid/custom_blocks/with_yaml_nested_context.rb +0 -19
  66. data/lib/liquid/custom_filters/values.rb +0 -7
@@ -3,36 +3,39 @@ require "pathname"
3
3
  require "open-uri"
4
4
  require "html2doc"
5
5
  require "asciimath2unitsml"
6
- require_relative "./cleanup_block.rb"
7
- require_relative "./cleanup_footnotes.rb"
8
- require_relative "./cleanup_ref.rb"
9
- require_relative "./cleanup_ref_dl.rb"
10
- require_relative "./cleanup_boilerplate.rb"
11
- require_relative "./cleanup_section.rb"
12
- require_relative "./cleanup_terms.rb"
13
- require_relative "./cleanup_inline.rb"
14
- require_relative "./cleanup_amend.rb"
6
+ require_relative "./cleanup_block"
7
+ require_relative "./cleanup_footnotes"
8
+ require_relative "./cleanup_ref"
9
+ require_relative "./cleanup_ref_dl"
10
+ require_relative "./cleanup_boilerplate"
11
+ require_relative "./cleanup_section"
12
+ require_relative "./cleanup_terms"
13
+ require_relative "./cleanup_inline"
14
+ require_relative "./cleanup_amend"
15
15
  require "relaton_iev"
16
16
 
17
17
  module Asciidoctor
18
18
  module Standoc
19
19
  module Cleanup
20
20
  def asciimath2mathml(text)
21
- text = text.gsub(%r{<stem type="AsciiMath">(.+?)</stem>}m) do |m|
22
- "<amathstem>#{HTMLEntities.new.decode($1)}</amathstem>"
23
- end
24
- text = Html2Doc.asciimath_to_mathml(text, ["<amathstem>", "</amathstem>"])
25
- x = Nokogiri::XML(text)
26
- x.xpath("//*[local-name() = 'math'][not(parent::stem)]").each do |y|
27
- y.wrap("<stem type='MathML'></stem>")
28
- end
29
- x.to_xml
21
+ text = text.gsub(%r{<stem type="AsciiMath">(.+?)</stem>}m) do
22
+ "<amathstem>#{HTMLEntities.new.decode($1)}</amathstem>"
23
+ end
24
+ text = Html2Doc.asciimath_to_mathml(text,
25
+ ["<amathstem>", "</amathstem>"])
26
+ x = Nokogiri::XML(text)
27
+ x.xpath("//*[local-name() = 'math'][not(parent::stem)]").each do |y|
28
+ y.wrap("<stem type='MathML'></stem>")
29
+ end
30
+ x.to_xml
30
31
  end
31
32
 
32
33
  def xml_unescape_mathml(x)
33
34
  return if x.children.any? { |y| y.element? }
34
- math = x.text.gsub(/&lt;/, "<").gsub(/&gt;/, ">").gsub(/&quot;/, '"').gsub(/&apos;/, "'").gsub(/&amp;/, "&").
35
- gsub(/<[^: \r\n\t\/]+:/, "<").gsub(/<\/[^ \r\n\t:]+:/, "</")
35
+
36
+ math = x.text.gsub(/&lt;/, "<").gsub(/&gt;/, ">")
37
+ .gsub(/&quot;/, '"').gsub(/&apos;/, "'").gsub(/&amp;/, "&")
38
+ .gsub(/<[^: \r\n\t\/]+:/, "<").gsub(/<\/[^ \r\n\t:]+:/, "</")
36
39
  x.children = math
37
40
  end
38
41
 
@@ -40,12 +43,13 @@ module Asciidoctor
40
43
 
41
44
  def mathml_preserve_space(m)
42
45
  m.xpath(".//m:mtext", "m" => MATHML_NS).each do |x|
43
- x.children = x.children.to_xml.gsub(/^\s/, "&#xA0;").gsub(/\s$/, "&#xA0;")
46
+ x.children = x.children.to_xml
47
+ .gsub(/^\s/, "&#xA0;").gsub(/\s$/, "&#xA0;")
44
48
  end
45
49
  end
46
50
 
47
51
  def mathml_namespace(stem)
48
- stem.xpath("./math", ).each { |x| x.default_namespace = MATHML_NS }
52
+ stem.xpath("./math").each { |x| x.default_namespace = MATHML_NS }
49
53
  end
50
54
 
51
55
  def mathml_mi_italics
@@ -55,7 +59,8 @@ module Asciidoctor
55
59
 
56
60
  # presuppose multichar mi upright, singlechar mi MathML default italic
57
61
  def mathml_italicise(x)
58
- x.xpath(".//m:mi[not(ancestor::*[@mathvariant])]", "m" => MATHML_NS).each do |i|
62
+ x.xpath(".//m:mi[not(ancestor::*[@mathvariant])]",
63
+ "m" => MATHML_NS).each do |i|
59
64
  char = HTMLEntities.new.decode(i.text)
60
65
  i["mathvariant"] = "normal" if mi_italicise?(char)
61
66
  end
@@ -63,10 +68,11 @@ module Asciidoctor
63
68
 
64
69
  def mi_italicise?(c)
65
70
  return false if c.length > 1
66
- if /\p{Greek}/.match(c)
71
+
72
+ if /\p{Greek}/.match?(c)
67
73
  /\p{Lower}/.match(c) && !mathml_mi_italics[:lowergreek] ||
68
74
  /\p{Upper}/.match(c) && !mathml_mi_italics[:uppergreek]
69
- elsif /\p{Latin}/.match(c)
75
+ elsif /\p{Latin}/.match?(c)
70
76
  /\p{Lower}/.match(c) && !mathml_mi_italics[:lowerroman] ||
71
77
  /\p{Upper}/.match(c) && !mathml_mi_italics[:upperroman]
72
78
  else
@@ -87,6 +93,7 @@ module Asciidoctor
87
93
 
88
94
  def mathml_unitsML(xmldoc)
89
95
  return unless xmldoc.at(".//m:*", "m" => UNITSML_NS)
96
+
90
97
  misc = add_misc_container(xmldoc)
91
98
  unitsml = misc.add_child("<UnitsML xmlns='#{UNITSML_NS}'/>").first
92
99
  %w(Unit CountedItem Quantity Dimension Prefix).each do |t|
@@ -95,12 +102,14 @@ module Asciidoctor
95
102
  end
96
103
 
97
104
  def gather_unitsml(unitsml, xmldoc, t)
98
- tags = xmldoc.xpath(".//m:#{t}", "m" => UNITSML_NS).each_with_object({}) do |x, m|
105
+ tags = xmldoc.xpath(".//m:#{t}", "m" => UNITSML_NS)
106
+ .each_with_object({}) do |x, m|
99
107
  m[x["id"]] = x.remove
100
108
  end
101
109
  return if tags.empty?
110
+
102
111
  set = unitsml.add_child("<#{t}Set/>").first
103
- tags.values.each { |v| set << v }
112
+ tags.each_value { |v| set << v }
104
113
  end
105
114
 
106
115
  def asciimath2unitsml_options
@@ -14,9 +14,10 @@ module Asciidoctor
14
14
  fold_notes_into_biblio(refs)
15
15
  bib = sort_biblio(refs.xpath("./bibitem"))
16
16
  insert = refs&.at("./bibitem")&.previous_element
17
- refs.xpath("./bibitem").each { |b| b.remove }
17
+ refs.xpath("./bibitem").each(&:remove)
18
18
  bib.reverse.each do |b|
19
- insert and insert.next = b.to_xml or refs.children.first.add_previous_sibling b.to_xml
19
+ insert and insert.next = b.to_xml or
20
+ refs.children.first.add_previous_sibling b.to_xml
20
21
  end
21
22
  extract_notes_from_biblio(refs)
22
23
  refs.xpath("./references").each { |r| biblio_reorder1(r) }
@@ -24,7 +25,7 @@ module Asciidoctor
24
25
 
25
26
  def fold_notes_into_biblio(refs)
26
27
  refs.xpath("./bibitem").each do |r|
27
- while r&.next_element&.name == "note" do
28
+ while r&.next_element&.name == "note"
28
29
  r.next_element["appended"] = true
29
30
  r << r.next_element.remove
30
31
  end
@@ -49,12 +50,15 @@ module Asciidoctor
49
50
  # only numeric references are renumbered
50
51
  def biblio_renumber(xmldoc)
51
52
  i = 0
52
- xmldoc.xpath("//bibliography//references | //clause//references | //annex//references").each do |r|
53
+ xmldoc.xpath("//bibliography//references | //clause//references | "\
54
+ "//annex//references").each do |r|
53
55
  next if r["normative"] == "true"
56
+
54
57
  r.xpath("./bibitem").each do |b|
55
58
  i += 1
56
59
  next unless docid = b.at("./docidentifier[@type = 'metanorma']")
57
- next unless /^\[\d+\]$/.match(docid.text)
60
+ next unless /^\[\d+\]$/.match?(docid.text)
61
+
58
62
  docid.children = "[#{i}]"
59
63
  end
60
64
  end
@@ -70,9 +74,10 @@ module Asciidoctor
70
74
 
71
75
  def normref_cleanup(xmldoc)
72
76
  r = xmldoc.at(self.class::NORM_REF) || return
73
- preface = r.xpath("./title/following-sibling::*") & # intersection
74
- r.xpath("./bibitem[1]/preceding-sibling::*")
75
- preface.each { |n| n.remove }
77
+ preface = ((r.xpath("./title/following-sibling::*") & # intersection
78
+ r.xpath("./bibitem[1]/preceding-sibling::*")) -
79
+ r.xpath("./note[@type = 'boilerplate']/descendant-or-self::*"))
80
+ preface.each(&:remove)
76
81
  end
77
82
 
78
83
  def biblio_cleanup(xmldoc)
@@ -92,6 +97,7 @@ module Asciidoctor
92
97
  def format_ref(ref, type)
93
98
  return @isodoc.docid_prefix(type, ref) if type != "metanorma"
94
99
  return "[#{ref}]" if /^\d+$/.match(ref) && !/^\[.*\]$/.match(ref)
100
+
95
101
  ref
96
102
  end
97
103
 
@@ -103,7 +109,7 @@ module Asciidoctor
103
109
 
104
110
  def reference_names(xmldoc)
105
111
  xmldoc.xpath("//bibitem[not(ancestor::bibitem)]").each do |ref|
106
- isopub = ref.at(ISO_PUBLISHER_XPATH)
112
+ # isopub = ref.at(ISO_PUBLISHER_XPATH)
107
113
  docid = ref.at("./docidentifier[@type = 'metanorma']") ||
108
114
  ref.at("./docidentifier[not(@type = 'DOI')]") or next
109
115
  reference = format_ref(docid.text, docid["type"])
@@ -111,18 +117,20 @@ module Asciidoctor
111
117
  end
112
118
  end
113
119
 
114
- def fetch_termbase(termbase, id)
120
+ def fetch_termbase(_termbase, _id)
115
121
  ""
116
122
  end
117
123
 
118
124
  def read_local_bibitem(uri)
119
- return nil if %r{^http[s]?://}.match(uri)
120
- file = @localdir + uri + ".rxl"
121
- File.file?(file) or file = @localdir + uri + ".xml"
125
+ return nil if %r{^https?://}.match?(uri)
126
+
127
+ file = "#{@localdir}#{uri}.rxl"
128
+ File.file?(file) or file = "#{@localdir}#{uri}.xml"
122
129
  File.file?(file) or return nil
123
130
  xml = Nokogiri::XML(File.read(file, encoding: "utf-8"))
124
131
  ret = xml.at("//*[local-name() = 'bibdata']") or return nil
125
- ret = Nokogiri::XML(ret.to_xml.sub(%r{(<bibdata[^>]*?) xmlns=("[^"]+"|'[^']+')}, "\\1")).root
132
+ ret = Nokogiri::XML(ret.to_xml
133
+ .sub(%r{(<bibdata[^>]*?) xmlns=("[^"]+"|'[^']+')}, "\\1")).root
126
134
  ret.name = "bibitem"
127
135
  ins = ret.at("./*[local-name() = 'docidentifier']") or return nil
128
136
  ins.previous = %{<uri type="citation">#{uri}</uri>}
@@ -132,7 +140,8 @@ module Asciidoctor
132
140
 
133
141
  # if citation uri points to local file, get bibitem from it
134
142
  def fetch_local_bibitem(xmldoc)
135
- xmldoc.xpath("//bibitem[formattedref][uri[@type = 'citation']]").each do |b|
143
+ xmldoc.xpath("//bibitem[formattedref][uri[@type = 'citation']]")
144
+ .each do |b|
136
145
  uri = b&.at("./uri[@type = 'citation']")&.text
137
146
  bibitem = read_local_bibitem(uri) or next
138
147
  bibitem["id"] = b["id"]
@@ -8,7 +8,7 @@ module Asciidoctor
8
8
  xmldoc.xpath("//clause[@bibitem = 'true']").each do |c|
9
9
  bib = dl_bib_extract(c) or next
10
10
  validate_ref_dl(bib, c)
11
- bibitemxml = RelatonBib::BibliographicItem.new(RelatonBib::HashConverter::hash_to_bib(bib)).to_xml or next
11
+ bibitemxml = RelatonBib::BibliographicItem.from_hash(bib).to_xml or next
12
12
  bibitem = Nokogiri::XML(bibitemxml)
13
13
  bibitem.root["id"] = c["id"] if c["id"] && !/^_/.match(c["id"])
14
14
  c.replace(bibitem.root)
@@ -0,0 +1,47 @@
1
+ module Asciidoctor
2
+ module Standoc
3
+ module Cleanup
4
+ def requirement_cleanup(reqt)
5
+ requirement_descriptions(reqt)
6
+ requirement_inherit(reqt)
7
+ end
8
+
9
+ def requirement_inherit(reqt)
10
+ reqt.xpath("//requirement | //recommendation | //permission")
11
+ .each do |r|
12
+ ins = r.at("./classification") ||
13
+ r.at("./description | ./measurementtarget | ./specification | "\
14
+ "./verification | ./import | ./description | ./requirement | "\
15
+ "./recommendation | ./permission")
16
+ r.xpath("./*//inherit").each { |i| ins.previous = i }
17
+ end
18
+ end
19
+
20
+ def requirement_descriptions(reqt)
21
+ reqt.xpath("//requirement | //recommendation | //permission")
22
+ .each do |r|
23
+ r.children.each do |e|
24
+ unless e.element? && (reqt_subpart(e.name) ||
25
+ %w(requirement recommendation permission).include?(e.name))
26
+ t = Nokogiri::XML::Element.new("description", reqt)
27
+ e.before(t)
28
+ t.children = e.remove
29
+ end
30
+ end
31
+ requirement_cleanup1(r)
32
+ end
33
+ end
34
+
35
+ def requirement_cleanup1(reqt)
36
+ while d = reqt.at("./description[following-sibling::*[1]"\
37
+ "[self::description]]")
38
+ n = d.next.remove
39
+ d << n.children
40
+ end
41
+ reqt.xpath("./description[normalize-space(.)='']").each do |r|
42
+ r.replace("\n")
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -7,32 +7,32 @@ require "mathml2asciimath"
7
7
  module Asciidoctor
8
8
  module Standoc
9
9
  module Cleanup
10
- def make_preface(x, s)
11
- if x.at("//foreword | //introduction | //acknowledgements | "\
10
+ def make_preface(xml, s)
11
+ if xml.at("//foreword | //introduction | //acknowledgements | "\
12
12
  "//*[@preface]")
13
13
  preface = s.add_previous_sibling("<preface/>").first
14
- f = x.at("//foreword") and preface.add_child f.remove
15
- f = x.at("//introduction") and preface.add_child f.remove
16
- move_clauses_into_preface(x, preface)
17
- f = x.at("//acknowledgements") and preface.add_child f.remove
14
+ f = xml.at("//foreword") and preface.add_child f.remove
15
+ f = xml.at("//introduction") and preface.add_child f.remove
16
+ move_clauses_into_preface(xml, preface)
17
+ f = xml.at("//acknowledgements") and preface.add_child f.remove
18
18
  end
19
- make_abstract(x, s)
19
+ make_abstract(xml, s)
20
20
  end
21
21
 
22
- def move_clauses_into_preface(x, preface)
23
- x.xpath("//*[@preface]").each do |c|
22
+ def move_clauses_into_preface(xml, preface)
23
+ xml.xpath("//*[@preface]").each do |c|
24
24
  c.delete("preface")
25
25
  preface.add_child c.remove
26
26
  end
27
27
  end
28
28
 
29
- def make_abstract(x, s)
30
- if x.at("//abstract[not(ancestor::bibitem)]")
29
+ def make_abstract(xml, s)
30
+ if xml.at("//abstract[not(ancestor::bibitem)]")
31
31
  preface = s.at("//preface") ||
32
32
  s.add_previous_sibling("<preface/>").first
33
- abstract = x.at("//abstract[not(ancestor::bibitem)]").remove
33
+ abstract = xml.at("//abstract[not(ancestor::bibitem)]").remove
34
34
  preface.prepend_child abstract.remove
35
- bibabstract = bibabstract_location(x)
35
+ bibabstract = bibabstract_location(xml)
36
36
  dupabstract = abstract.dup
37
37
  dupabstract.traverse { |n| n.remove_attribute("id") }
38
38
  dupabstract.remove_attribute("language")
@@ -42,43 +42,44 @@ module Asciidoctor
42
42
  end
43
43
  end
44
44
 
45
- def bibabstract_location(x)
46
- bibabstract = x.at("//bibdata/script") || x.at("//bibdata/language") ||
47
- x.at("//bibdata/contributor[not(following-sibling::contributor)]") ||
48
- x.at("//bibdata/date[not(following-sibling::date)]") ||
49
- x.at("//docnumber") ||
50
- x.at("//bibdata/docidentifier"\
51
- "[not(following-sibling::docidentifier)]") ||
52
- x.at("//bibdata/uri[not(following-sibling::uri)]") ||
53
- x.at("//bibdata/title[not(following-sibling::title)]")
45
+ def bibabstract_location(xml)
46
+ xml.at("//bibdata/script") || xml.at("//bibdata/language") ||
47
+ xml.at("//bibdata/contributor[not(following-sibling::contributor)]") ||
48
+ xml.at("//bibdata/date[not(following-sibling::date)]") ||
49
+ xml.at("//docnumber") ||
50
+ xml.at("//bibdata/docidentifier"\
51
+ "[not(following-sibling::docidentifier)]") ||
52
+ xml.at("//bibdata/uri[not(following-sibling::uri)]") ||
53
+ xml.at("//bibdata/title[not(following-sibling::title)]")
54
54
  end
55
55
 
56
- def make_bibliography(x, s)
57
- if x.at("//sections/references")
56
+ def make_bibliography(xml, s)
57
+ if xml.at("//sections/references")
58
58
  biblio = s.add_next_sibling("<bibliography/>").first
59
- x.xpath("//sections/references").each do |r|
59
+ xml.xpath("//sections/references").each do |r|
60
60
  biblio.add_child r.remove
61
61
  end
62
62
  end
63
63
  end
64
64
 
65
- def make_indexsect(x, s)
66
- x.xpath("//sections/indexsect").reverse_each { |r| s.next = r.remove }
65
+ def make_indexsect(xml, s)
66
+ xml.xpath("//sections/indexsect").reverse_each { |r| s.next = r.remove }
67
67
  end
68
68
 
69
- def sections_order_cleanup(x)
70
- s = x.at("//sections")
71
- make_preface(x, s)
72
- make_annexes(x)
73
- make_indexsect(x, s)
74
- make_bibliography(x, s)
75
- x.xpath("//sections/annex").reverse_each { |r| s.next = r.remove }
69
+ def sections_order_cleanup(xml)
70
+ s = xml.at("//sections")
71
+ make_preface(xml, s)
72
+ make_annexes(xml)
73
+ make_indexsect(xml, s)
74
+ make_bibliography(xml, s)
75
+ xml.xpath("//sections/annex").reverse_each { |r| s.next = r.remove }
76
76
  end
77
-
78
- def make_annexes(x)
79
- x.xpath("//*[@annex]").each do |y|
77
+
78
+ def make_annexes(xml)
79
+ xml.xpath("//*[@annex]").each do |y|
80
80
  y.delete("annex")
81
81
  next if y.name == "annex" || !y.ancestors("annex").empty?
82
+
82
83
  y.wrap("<annex/>")
83
84
  y.parent["id"] = "_#{UUIDTools::UUID.random_create}"
84
85
  y.parent["obligation"] = y["obligation"]
@@ -87,59 +88,61 @@ module Asciidoctor
87
88
  end
88
89
  end
89
90
 
90
- def maxlevel(x)
91
+ def maxlevel(xml)
91
92
  max = 5
92
- x.xpath("//clause[@level]").each do |c|
93
+ xml.xpath("//clause[@level]").each do |c|
93
94
  max = c["level"].to_i if max < c["level"].to_i
94
95
  end
95
96
  max
96
97
  end
97
98
 
98
- def sections_level_cleanup(x)
99
- m = maxlevel(x)
99
+ def sections_level_cleanup(xml)
100
+ m = maxlevel(xml)
100
101
  return if m < 6
102
+
101
103
  m.downto(6).each do |l|
102
- x.xpath("//clause[@level = '#{l}']").each do |c|
104
+ xml.xpath("//clause[@level = '#{l}']").each do |c|
103
105
  c.delete("level")
104
106
  c.previous_element << c.remove
105
107
  end
106
108
  end
107
109
  end
108
110
 
109
- def sections_cleanup(x)
110
- sections_order_cleanup(x)
111
- sections_level_cleanup(x)
112
- sections_names_cleanup(x)
113
- change_clauses(x)
111
+ def sections_cleanup(xml)
112
+ sections_order_cleanup(xml)
113
+ sections_level_cleanup(xml)
114
+ sections_names_cleanup(xml)
115
+ change_clauses(xml)
114
116
  end
115
117
 
116
- def obligations_cleanup(x)
117
- obligations_cleanup_info(x)
118
- obligations_cleanup_norm(x)
119
- obligations_cleanup_inherit(x)
118
+ def obligations_cleanup(xml)
119
+ obligations_cleanup_info(xml)
120
+ obligations_cleanup_norm(xml)
121
+ obligations_cleanup_inherit(xml)
120
122
  end
121
123
 
122
- def obligations_cleanup_info(x)
123
- (s = x.at("//foreword")) && s["obligation"] = "informative"
124
- (s = x.at("//introduction")) && s["obligation"] = "informative"
125
- (s = x.at("//acknowledgements")) && s["obligation"] = "informative"
126
- x.xpath("//references").each { |r| r["obligation"] = "informative" }
127
- x.xpath("//preface//clause").each do |r|
124
+ def obligations_cleanup_info(xml)
125
+ s = xml.at("//foreword") and s["obligation"] = "informative"
126
+ s = xml.at("//introduction") and s["obligation"] = "informative"
127
+ s = xml.at("//acknowledgements") and s["obligation"] = "informative"
128
+ xml.xpath("//references").each { |r| r["obligation"] = "informative" }
129
+ xml.xpath("//preface//clause").each do |r|
128
130
  r["obligation"] = "informative"
129
131
  end
130
132
  end
131
133
 
132
- def obligations_cleanup_norm(x)
133
- (s = x.at("//clause[@type = 'scope']")) && s["obligation"] = "normative"
134
- x.xpath("//terms").each { |r| r["obligation"] = "normative" }
135
- x.xpath("//definitions").each { |r| r["obligation"] = "normative" }
134
+ def obligations_cleanup_norm(xml)
135
+ s = xml.at("//clause[@type = 'scope']") and
136
+ s["obligation"] = "normative"
137
+ xml.xpath("//terms").each { |r| r["obligation"] = "normative" }
138
+ xml.xpath("//definitions").each { |r| r["obligation"] = "normative" }
136
139
  end
137
140
 
138
- def obligations_cleanup_inherit(x)
139
- x.xpath("//annex | //clause[not(ancestor::boilerplate)]").each do |r|
141
+ def obligations_cleanup_inherit(xml)
142
+ xml.xpath("//annex | //clause[not(ancestor::boilerplate)]").each do |r|
140
143
  r["obligation"] = "normative" unless r["obligation"]
141
144
  end
142
- x.xpath(Utils::SUBCLAUSE_XPATH).each do |r|
145
+ xml.xpath(Utils::SUBCLAUSE_XPATH).each do |r|
143
146
  o = r&.at("./ancestor::*/@obligation")&.text and r["obligation"] = o
144
147
  end
145
148
  end
@@ -149,8 +152,9 @@ module Asciidoctor
149
152
  sections_clausebefore_cleanup(xmldoc)
150
153
  end
151
154
 
152
- def preface_clausebefore_cleanup(xmldoc)
155
+ def preface_clausebefore_cleanup(xmldoc)
153
156
  return unless xmldoc.at("//preface")
157
+
154
158
  unless ins = xmldoc.at("//preface").children.first
155
159
  xmldoc.at("//preface") << " "
156
160
  ins = xmldoc.at("//preface").children.first
@@ -163,6 +167,7 @@ module Asciidoctor
163
167
 
164
168
  def sections_clausebefore_cleanup(xmldoc)
165
169
  return unless xmldoc.at("//sections")
170
+
166
171
  unless ins = xmldoc.at("//sections").children.first
167
172
  xmldoc.at("//sections") << " "
168
173
  ins = xmldoc.at("//sections").children.first
@@ -174,56 +179,59 @@ module Asciidoctor
174
179
  end
175
180
 
176
181
  def get_or_make_title(node)
177
- unless node.at("./title")
178
- if node.children.empty?
179
- node << "<title/>"
180
- else
181
- node.children.first.previous = "<title/>"
182
- end
182
+ unless node.at("./title")
183
+ if node.children.empty?
184
+ node << "<title/>"
185
+ else
186
+ node.children.first.previous = "<title/>"
183
187
  end
184
- node.at("./title")
188
+ end
189
+ node.at("./title")
185
190
  end
186
191
 
187
192
  def replace_title(doc, xpath, text, first = false)
188
193
  return unless text
194
+
189
195
  doc.xpath(xpath).each_with_index do |node, i|
190
196
  next if first && !i.zero?
197
+
191
198
  title = get_or_make_title(node)
192
199
  fn = title.xpath("./fn")
193
- fn.each { |n| n.remove }
200
+ fn.each(&:remove)
194
201
  title.content = text
195
202
  fn.each { |n| title << n }
196
203
  end
197
204
  end
198
205
 
199
- def sections_names_cleanup(x)
200
- replace_title(x, "//clause[@type = 'scope']", @i18n&.scope)
201
- replace_title(x, "//preface//abstract", @i18n&.abstract)
202
- replace_title(x, "//foreword", @i18n&.foreword)
203
- replace_title(x, "//introduction", @i18n&.introduction)
204
- replace_title(x, "//acknowledgements", @i18n&.acknowledgements)
205
- section_names_refs_cleanup(x)
206
- section_names_terms_cleanup(x)
206
+ def sections_names_cleanup(xml)
207
+ replace_title(xml, "//clause[@type = 'scope']", @i18n&.scope)
208
+ replace_title(xml, "//preface//abstract", @i18n&.abstract)
209
+ replace_title(xml, "//foreword", @i18n&.foreword)
210
+ replace_title(xml, "//introduction", @i18n&.introduction)
211
+ replace_title(xml, "//acknowledgements", @i18n&.acknowledgements)
212
+ section_names_refs_cleanup(xml)
213
+ section_names_terms_cleanup(xml)
207
214
  end
208
215
 
209
- def section_names_refs_cleanup(x)
210
- replace_title(x, "//references[@normative = 'true']",
216
+ def section_names_refs_cleanup(xml)
217
+ replace_title(xml, "//references[@normative = 'true']",
211
218
  @i18n&.normref, true)
212
- replace_title(x, "//references[@normative = 'false']",
219
+ replace_title(xml, "//references[@normative = 'false']",
213
220
  @i18n&.bibliography, true)
214
221
  end
215
222
 
216
- NO_SYMABBR = "[.//definitions[not(@type)]]"
217
- SYMABBR = "[.//definitions[@type = 'symbols']"\
218
- "[@type = 'abbreviated_terms']]".freeze
219
- SYMnoABBR = "[.//definitions[@type = 'symbols']"\
220
- "[not(@type = 'abbreviated_terms')]]".freeze
221
- ABBRnoSYM = "[.//definitions[not(@type = 'symbols')]"\
222
- "[@type = 'abbreviated_terms']]".freeze
223
+ NO_SYMABBR = "[.//definitions[not(@type)]]".freeze
224
+ SYMABBR = "[.//definitions[@type = 'symbols']]"\
225
+ "[.//definitions[@type = 'abbreviated_terms']]".freeze
226
+ SYMnoABBR = "[.//definitions[@type = 'symbols']]"\
227
+ "[not(.//definitions[@type = 'abbreviated_terms'])]".freeze
228
+ ABBRnoSYM = "[.//definitions[@type = 'abbreviated_terms']]"\
229
+ "[not(.//definitions[@type = 'symbols'])]".freeze
223
230
 
224
231
  def section_names_terms_cleanup(x)
225
232
  replace_title(x, "//definitions[@type = 'symbols']", @i18n&.symbols)
226
- replace_title(x, "//definitions[@type = 'abbreviated_terms']", @i18n&.abbrev)
233
+ replace_title(x, "//definitions[@type = 'abbreviated_terms']",
234
+ @i18n&.abbrev)
227
235
  replace_title(x, "//definitions[not(@type)]", @i18n&.symbolsabbrev)
228
236
  replace_title(x, "//terms#{SYMnoABBR} | //clause[.//terms]#{SYMnoABBR}",
229
237
  @i18n&.termsdefsymbols, true)
@@ -234,8 +242,10 @@ module Asciidoctor
234
242
  replace_title(x, "//terms#{NO_SYMABBR} | //clause[.//terms]#{NO_SYMABBR}",
235
243
  @i18n&.termsdefsymbolsabbrev, true)
236
244
  replace_title(
237
- x, "//terms[not(.//definitions)] | //clause[.//terms][not(.//definitions)]",
238
- @i18n&.termsdef, true)
245
+ x,
246
+ "//terms[not(.//definitions)] | //clause[.//terms][not(.//definitions)]",
247
+ @i18n&.termsdef, true
248
+ )
239
249
  end
240
250
  end
241
251
  end