metanorma-standoc 1.8.8 → 1.9.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +3 -13
  3. data/.hound.yml +3 -1
  4. data/.rubocop.yml +3 -7
  5. data/Gemfile.devel +0 -0
  6. data/lib/asciidoctor/standoc/base.rb +42 -36
  7. data/lib/asciidoctor/standoc/biblio.rng +1 -0
  8. data/lib/asciidoctor/standoc/blocks.rb +25 -9
  9. data/lib/asciidoctor/standoc/blocks_notes.rb +41 -24
  10. data/lib/asciidoctor/standoc/cleanup.rb +59 -84
  11. data/lib/asciidoctor/standoc/cleanup_block.rb +63 -85
  12. data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +51 -29
  13. data/lib/asciidoctor/standoc/cleanup_footnotes.rb +1 -0
  14. data/lib/asciidoctor/standoc/cleanup_image.rb +71 -0
  15. data/lib/asciidoctor/standoc/cleanup_maths.rb +36 -27
  16. data/lib/asciidoctor/standoc/cleanup_ref.rb +24 -15
  17. data/lib/asciidoctor/standoc/cleanup_ref_dl.rb +1 -1
  18. data/lib/asciidoctor/standoc/cleanup_reqt.rb +47 -0
  19. data/lib/asciidoctor/standoc/cleanup_section.rb +77 -134
  20. data/lib/asciidoctor/standoc/cleanup_section_names.rb +75 -0
  21. data/lib/asciidoctor/standoc/converter.rb +10 -3
  22. data/lib/asciidoctor/standoc/datamodel/plantuml_renderer.rb +67 -66
  23. data/lib/asciidoctor/standoc/front.rb +35 -18
  24. data/lib/asciidoctor/standoc/front_contributor.rb +70 -45
  25. data/lib/asciidoctor/standoc/inline.rb +30 -22
  26. data/lib/asciidoctor/standoc/isodoc.rng +321 -4
  27. data/lib/asciidoctor/standoc/lists.rb +4 -2
  28. data/lib/asciidoctor/standoc/macros.rb +50 -23
  29. data/lib/asciidoctor/standoc/macros_form.rb +63 -0
  30. data/lib/asciidoctor/standoc/ref.rb +87 -112
  31. data/lib/asciidoctor/standoc/ref_date_id.rb +62 -0
  32. data/lib/asciidoctor/standoc/ref_sect.rb +20 -17
  33. data/lib/asciidoctor/standoc/section.rb +3 -1
  34. data/lib/asciidoctor/standoc/term_lookup_cleanup.rb +31 -16
  35. data/lib/asciidoctor/standoc/terms.rb +27 -16
  36. data/lib/asciidoctor/standoc/utils.rb +35 -9
  37. data/lib/asciidoctor/standoc/validate.rb +30 -28
  38. data/lib/metanorma-standoc.rb +0 -1
  39. data/lib/metanorma/standoc/version.rb +5 -5
  40. data/metanorma-standoc.gemspec +11 -11
  41. data/spec/asciidoctor/base_spec.rb +715 -509
  42. data/spec/asciidoctor/blocks_spec.rb +830 -727
  43. data/spec/asciidoctor/cleanup_sections_spec.rb +51 -14
  44. data/spec/asciidoctor/cleanup_spec.rb +1836 -1673
  45. data/spec/asciidoctor/inline_spec.rb +330 -283
  46. data/spec/asciidoctor/isobib_cache_spec.rb +406 -358
  47. data/spec/asciidoctor/lists_spec.rb +3 -3
  48. data/spec/asciidoctor/macros_plantuml_spec.rb +8 -8
  49. data/spec/asciidoctor/macros_spec.rb +546 -444
  50. data/spec/asciidoctor/macros_yaml2text_spec.rb +1 -1
  51. data/spec/asciidoctor/refs_dl_spec.rb +4 -4
  52. data/spec/asciidoctor/refs_spec.rb +1528 -1533
  53. data/spec/asciidoctor/section_spec.rb +778 -689
  54. data/spec/asciidoctor/table_spec.rb +6 -6
  55. data/spec/asciidoctor/validate_spec.rb +296 -304
  56. data/spec/spec_helper.rb +13 -9
  57. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +66 -66
  58. data/spec/vcr_cassettes/isobib_get_123.yml +17 -17
  59. data/spec/vcr_cassettes/isobib_get_123_1.yml +31 -31
  60. data/spec/vcr_cassettes/isobib_get_123_1_fr.yml +40 -40
  61. data/spec/vcr_cassettes/isobib_get_123_2001.yml +17 -17
  62. data/spec/vcr_cassettes/isobib_get_124.yml +16 -16
  63. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +14 -14
  64. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +78 -66
  65. metadata +69 -67
  66. data/lib/liquid/custom_blocks/key_iterator.rb +0 -21
  67. data/lib/liquid/custom_blocks/with_json_nested_context.rb +0 -18
  68. data/lib/liquid/custom_blocks/with_yaml_nested_context.rb +0 -19
  69. 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
@@ -3,36 +3,37 @@ require "htmlentities"
3
3
  require "json"
4
4
  require "open-uri"
5
5
  require "mathml2asciimath"
6
+ require_relative "cleanup_section_names"
6
7
 
7
8
  module Asciidoctor
8
9
  module Standoc
9
10
  module Cleanup
10
- def make_preface(x, s)
11
- if x.at("//foreword | //introduction | //acknowledgements | "\
11
+ def make_preface(xml, sect)
12
+ if xml.at("//foreword | //introduction | //acknowledgements | "\
12
13
  "//*[@preface]")
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
+ preface = sect.add_previous_sibling("<preface/>").first
15
+ f = xml.at("//foreword") and preface.add_child f.remove
16
+ f = xml.at("//introduction") and preface.add_child f.remove
17
+ move_clauses_into_preface(xml, preface)
18
+ f = xml.at("//acknowledgements") and preface.add_child f.remove
18
19
  end
19
- make_abstract(x, s)
20
+ make_abstract(xml, sect)
20
21
  end
21
22
 
22
- def move_clauses_into_preface(x, preface)
23
- x.xpath("//*[@preface]").each do |c|
23
+ def move_clauses_into_preface(xml, preface)
24
+ xml.xpath("//*[@preface]").each do |c|
24
25
  c.delete("preface")
25
26
  preface.add_child c.remove
26
27
  end
27
28
  end
28
29
 
29
- def make_abstract(x, s)
30
- if x.at("//abstract[not(ancestor::bibitem)]")
31
- preface = s.at("//preface") ||
32
- s.add_previous_sibling("<preface/>").first
33
- abstract = x.at("//abstract[not(ancestor::bibitem)]").remove
30
+ def make_abstract(xml, sect)
31
+ if xml.at("//abstract[not(ancestor::bibitem)]")
32
+ preface = sect.at("//preface") ||
33
+ sect.add_previous_sibling("<preface/>").first
34
+ abstract = xml.at("//abstract[not(ancestor::bibitem)]").remove
34
35
  preface.prepend_child abstract.remove
35
- bibabstract = bibabstract_location(x)
36
+ bibabstract = bibabstract_location(xml)
36
37
  dupabstract = abstract.dup
37
38
  dupabstract.traverse { |n| n.remove_attribute("id") }
38
39
  dupabstract.remove_attribute("language")
@@ -42,43 +43,46 @@ module Asciidoctor
42
43
  end
43
44
  end
44
45
 
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)]")
46
+ def bibabstract_location(xml)
47
+ xml.at("//bibdata/script") || xml.at("//bibdata/language") ||
48
+ xml.at("//bibdata/contributor[not(following-sibling::contributor)]") ||
49
+ xml.at("//bibdata/date[not(following-sibling::date)]") ||
50
+ xml.at("//docnumber") ||
51
+ xml.at("//bibdata/docidentifier"\
52
+ "[not(following-sibling::docidentifier)]") ||
53
+ xml.at("//bibdata/uri[not(following-sibling::uri)]") ||
54
+ xml.at("//bibdata/title[not(following-sibling::title)]")
54
55
  end
55
56
 
56
- def make_bibliography(x, s)
57
- if x.at("//sections/references")
58
- biblio = s.add_next_sibling("<bibliography/>").first
59
- x.xpath("//sections/references").each do |r|
57
+ def make_bibliography(xml, sect)
58
+ if xml.at("//sections/references")
59
+ biblio = sect.add_next_sibling("<bibliography/>").first
60
+ xml.xpath("//sections/references").each do |r|
60
61
  biblio.add_child r.remove
61
62
  end
62
63
  end
63
64
  end
64
65
 
65
- def make_indexsect(x, s)
66
- x.xpath("//sections/indexsect").reverse_each { |r| s.next = r.remove }
66
+ def make_indexsect(xml, sect)
67
+ xml.xpath("//sections/indexsect").reverse_each do |r|
68
+ sect.next = r.remove
69
+ end
67
70
  end
68
71
 
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 }
72
+ def sections_order_cleanup(xml)
73
+ s = xml.at("//sections")
74
+ make_preface(xml, s)
75
+ make_annexes(xml)
76
+ make_indexsect(xml, s)
77
+ make_bibliography(xml, s)
78
+ xml.xpath("//sections/annex").reverse_each { |r| s.next = r.remove }
76
79
  end
77
-
78
- def make_annexes(x)
79
- x.xpath("//*[@annex]").each do |y|
80
+
81
+ def make_annexes(xml)
82
+ xml.xpath("//*[@annex]").each do |y|
80
83
  y.delete("annex")
81
84
  next if y.name == "annex" || !y.ancestors("annex").empty?
85
+
82
86
  y.wrap("<annex/>")
83
87
  y.parent["id"] = "_#{UUIDTools::UUID.random_create}"
84
88
  y.parent["obligation"] = y["obligation"]
@@ -87,59 +91,61 @@ module Asciidoctor
87
91
  end
88
92
  end
89
93
 
90
- def maxlevel(x)
94
+ def maxlevel(xml)
91
95
  max = 5
92
- x.xpath("//clause[@level]").each do |c|
96
+ xml.xpath("//clause[@level]").each do |c|
93
97
  max = c["level"].to_i if max < c["level"].to_i
94
98
  end
95
99
  max
96
100
  end
97
101
 
98
- def sections_level_cleanup(x)
99
- m = maxlevel(x)
102
+ def sections_level_cleanup(xml)
103
+ m = maxlevel(xml)
100
104
  return if m < 6
105
+
101
106
  m.downto(6).each do |l|
102
- x.xpath("//clause[@level = '#{l}']").each do |c|
107
+ xml.xpath("//clause[@level = '#{l}']").each do |c|
103
108
  c.delete("level")
104
109
  c.previous_element << c.remove
105
110
  end
106
111
  end
107
112
  end
108
113
 
109
- def sections_cleanup(x)
110
- sections_order_cleanup(x)
111
- sections_level_cleanup(x)
112
- sections_names_cleanup(x)
113
- change_clauses(x)
114
+ def sections_cleanup(xml)
115
+ sections_order_cleanup(xml)
116
+ sections_level_cleanup(xml)
117
+ sections_names_cleanup(xml)
118
+ change_clauses(xml)
114
119
  end
115
120
 
116
- def obligations_cleanup(x)
117
- obligations_cleanup_info(x)
118
- obligations_cleanup_norm(x)
119
- obligations_cleanup_inherit(x)
121
+ def obligations_cleanup(xml)
122
+ obligations_cleanup_info(xml)
123
+ obligations_cleanup_norm(xml)
124
+ obligations_cleanup_inherit(xml)
120
125
  end
121
126
 
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|
127
+ def obligations_cleanup_info(xml)
128
+ s = xml.at("//foreword") and s["obligation"] = "informative"
129
+ s = xml.at("//introduction") and s["obligation"] = "informative"
130
+ s = xml.at("//acknowledgements") and s["obligation"] = "informative"
131
+ xml.xpath("//references").each { |r| r["obligation"] = "informative" }
132
+ xml.xpath("//preface//clause").each do |r|
128
133
  r["obligation"] = "informative"
129
134
  end
130
135
  end
131
136
 
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" }
137
+ def obligations_cleanup_norm(xml)
138
+ s = xml.at("//clause[@type = 'scope']") and
139
+ s["obligation"] = "normative"
140
+ xml.xpath("//terms").each { |r| r["obligation"] = "normative" }
141
+ xml.xpath("//definitions").each { |r| r["obligation"] = "normative" }
136
142
  end
137
143
 
138
- def obligations_cleanup_inherit(x)
139
- x.xpath("//annex | //clause[not(ancestor::boilerplate)]").each do |r|
144
+ def obligations_cleanup_inherit(xml)
145
+ xml.xpath("//annex | //clause[not(ancestor::boilerplate)]").each do |r|
140
146
  r["obligation"] = "normative" unless r["obligation"]
141
147
  end
142
- x.xpath(Utils::SUBCLAUSE_XPATH).each do |r|
148
+ xml.xpath(Utils::SUBCLAUSE_XPATH).each do |r|
143
149
  o = r&.at("./ancestor::*/@obligation")&.text and r["obligation"] = o
144
150
  end
145
151
  end
@@ -149,8 +155,9 @@ module Asciidoctor
149
155
  sections_clausebefore_cleanup(xmldoc)
150
156
  end
151
157
 
152
- def preface_clausebefore_cleanup(xmldoc)
158
+ def preface_clausebefore_cleanup(xmldoc)
153
159
  return unless xmldoc.at("//preface")
160
+
154
161
  unless ins = xmldoc.at("//preface").children.first
155
162
  xmldoc.at("//preface") << " "
156
163
  ins = xmldoc.at("//preface").children.first
@@ -163,6 +170,7 @@ module Asciidoctor
163
170
 
164
171
  def sections_clausebefore_cleanup(xmldoc)
165
172
  return unless xmldoc.at("//sections")
173
+
166
174
  unless ins = xmldoc.at("//sections").children.first
167
175
  xmldoc.at("//sections") << " "
168
176
  ins = xmldoc.at("//sections").children.first
@@ -172,71 +180,6 @@ module Asciidoctor
172
180
  ins.previous = x.remove
173
181
  end
174
182
  end
175
-
176
- 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
183
- end
184
- node.at("./title")
185
- end
186
-
187
- def replace_title(doc, xpath, text, first = false)
188
- return unless text
189
- doc.xpath(xpath).each_with_index do |node, i|
190
- next if first && !i.zero?
191
- title = get_or_make_title(node)
192
- fn = title.xpath("./fn")
193
- fn.each { |n| n.remove }
194
- title.content = text
195
- fn.each { |n| title << n }
196
- end
197
- end
198
-
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)
207
- end
208
-
209
- def section_names_refs_cleanup(x)
210
- replace_title(x, "//references[@normative = 'true']",
211
- @i18n&.normref, true)
212
- replace_title(x, "//references[@normative = 'false']",
213
- @i18n&.bibliography, true)
214
- end
215
-
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
-
224
- def section_names_terms_cleanup(x)
225
- replace_title(x, "//definitions[@type = 'symbols']", @i18n&.symbols)
226
- replace_title(x, "//definitions[@type = 'abbreviated_terms']", @i18n&.abbrev)
227
- replace_title(x, "//definitions[not(@type)]", @i18n&.symbolsabbrev)
228
- replace_title(x, "//terms#{SYMnoABBR} | //clause[.//terms]#{SYMnoABBR}",
229
- @i18n&.termsdefsymbols, true)
230
- replace_title(x, "//terms#{ABBRnoSYM} | //clause[.//terms]#{ABBRnoSYM}",
231
- @i18n&.termsdefabbrev, true)
232
- replace_title(x, "//terms#{SYMABBR} | //clause[.//terms]#{SYMABBR}",
233
- @i18n&.termsdefsymbolsabbrev, true)
234
- replace_title(x, "//terms#{NO_SYMABBR} | //clause[.//terms]#{NO_SYMABBR}",
235
- @i18n&.termsdefsymbolsabbrev, true)
236
- replace_title(
237
- x, "//terms[not(.//definitions)] | //clause[.//terms][not(.//definitions)]",
238
- @i18n&.termsdef, true)
239
- end
240
183
  end
241
184
  end
242
185
  end