metanorma-standoc 1.4.2 → 1.5.2

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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/macos.yml +0 -7
  3. data/.github/workflows/ubuntu.yml +6 -11
  4. data/.github/workflows/windows.yml +0 -8
  5. data/.rubocop.yml +1 -1
  6. data/Rakefile +2 -0
  7. data/lib/asciidoctor/standoc/base.rb +15 -21
  8. data/lib/asciidoctor/standoc/cleanup.rb +1 -0
  9. data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +11 -24
  10. data/lib/asciidoctor/standoc/cleanup_inline.rb +57 -1
  11. data/lib/asciidoctor/standoc/cleanup_ref.rb +13 -8
  12. data/lib/asciidoctor/standoc/cleanup_section.rb +90 -6
  13. data/lib/asciidoctor/standoc/cleanup_terms.rb +12 -2
  14. data/lib/asciidoctor/standoc/converter.rb +16 -2
  15. data/lib/asciidoctor/standoc/front.rb +0 -12
  16. data/lib/asciidoctor/standoc/front_contributor.rb +28 -3
  17. data/lib/asciidoctor/standoc/inline.rb +1 -1
  18. data/lib/asciidoctor/standoc/isodoc.rng +16 -7
  19. data/lib/asciidoctor/standoc/log.rb +10 -1
  20. data/lib/asciidoctor/standoc/ref.rb +24 -25
  21. data/lib/asciidoctor/standoc/section.rb +31 -27
  22. data/lib/asciidoctor/standoc/utils.rb +18 -1
  23. data/lib/asciidoctor/standoc/validate.rb +30 -18
  24. data/lib/asciidoctor/standoc/validate_section.rb +1 -1
  25. data/lib/metanorma/standoc/processor.rb +0 -4
  26. data/lib/metanorma/standoc/version.rb +1 -1
  27. data/metanorma-standoc.gemspec +3 -2
  28. data/spec/asciidoctor-standoc/base_spec.rb +21 -6
  29. data/spec/asciidoctor-standoc/blocks_spec.rb +21 -7
  30. data/spec/asciidoctor-standoc/cleanup_spec.rb +1337 -23
  31. data/spec/asciidoctor-standoc/inline_spec.rb +7 -4
  32. data/spec/asciidoctor-standoc/macros_spec.rb +41 -23
  33. data/spec/asciidoctor-standoc/refs_dl_spec.rb +9 -7
  34. data/spec/asciidoctor-standoc/refs_spec.rb +16 -16
  35. data/spec/asciidoctor-standoc/section_spec.rb +42 -38
  36. data/spec/asciidoctor-standoc/table_spec.rb +7 -1
  37. data/spec/asciidoctor-standoc/validate_spec.rb +40 -0
  38. data/spec/assets/{html.css → html.scss} +0 -0
  39. data/spec/assets/i18n.yaml +17 -2
  40. data/spec/assets/{word.css → word.scss} +0 -0
  41. data/spec/metanorma/processor_spec.rb +1 -2
  42. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +66 -66
  43. data/spec/vcr_cassettes/isobib_get_123.yml +16 -16
  44. data/spec/vcr_cassettes/isobib_get_123_1.yml +33 -33
  45. data/spec/vcr_cassettes/isobib_get_123_2001.yml +19 -19
  46. data/spec/vcr_cassettes/isobib_get_124.yml +19 -19
  47. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +8 -8
  48. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +28 -28
  49. metadata +22 -12
  50. data/lib/asciidoctor-yaml/i18n-en.yaml +0 -20
  51. data/lib/asciidoctor-yaml/i18n-fr.yaml +0 -13
  52. data/lib/asciidoctor-yaml/i18n-zh-Hans.yaml +0 -15
  53. data/lib/asciidoctor/standoc/i18n.rb +0 -39
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a3fe7b42105c2a89fb897699fde276f7b4cee0602de41f6edcd2f81ad5cbd2a3
4
- data.tar.gz: 442a50e5a3633c41b95cd9ac223976448c5f7ee5c4932034ddf81a939cfa1f80
3
+ metadata.gz: 910ada4e6d4f62c6106391e3ec0de46a7ba4a9d5362bb103cd80ee0b2acef9dc
4
+ data.tar.gz: de8546c035da0236faa4a6ca5df9b0f54f16806d09386793f359e55b69884212
5
5
  SHA512:
6
- metadata.gz: b11e454cf7ffdb63e00a2a2df8ae8a2fec586546a35363c3b64cdb32dca70717f50462ee29ee0c3b292bf07f6ff5bad80611160a91dd9f22f7d776b39ab01134
7
- data.tar.gz: 1c0fc47083cc3d87e467d94a648f6deed8e2a79ca8eec87ec25ab8c62728fe2c85a809b991acd7776172e484a5886697f046451d79535d967cc0dd2dcfafe2a6
6
+ metadata.gz: 422e64b66f95fa4c49727687c446bd3f79bc09aa0609b352bd68cc659ff06bf57243ed410e4baa8f0cb501f101212d305a756b41548fcee7e877135aea22e1f3
7
+ data.tar.gz: 97d6e164975997ecc396376abdaf2edad43c1f4fbfa601dbbc5f2f4d465747164350f500aaadc05f9fd6ed1e499925df7d74626fcde21a0578feeb50d607b84e
@@ -29,10 +29,6 @@ jobs:
29
29
  uses: actions/setup-ruby@v1
30
30
  with:
31
31
  ruby-version: ${{ matrix.ruby }}
32
- architecture: 'x64'
33
- - uses: actions/setup-node@v1
34
- with:
35
- node-version: '10.x'
36
32
  - name: Install LaTeXML
37
33
  run: |
38
34
  brew install libxml2 cpanminus
@@ -41,9 +37,6 @@ jobs:
41
37
  - name: Install PlantUML
42
38
  run: |
43
39
  brew install plantuml
44
- - name: Install puppeteer
45
- run: |
46
- npm -g i puppeteer
47
40
  - name: Update gems
48
41
  run: |
49
42
  sudo gem install bundler --force
@@ -29,10 +29,6 @@ jobs:
29
29
  uses: actions/setup-ruby@v1
30
30
  with:
31
31
  ruby-version: ${{ matrix.ruby }}
32
- architecture: 'x64'
33
- - uses: actions/setup-node@v1
34
- with:
35
- node-version: '10.x'
36
32
  - name: Update gems
37
33
  run: |
38
34
  gem install bundler
@@ -42,13 +38,12 @@ jobs:
42
38
  sudo snap install latexml --edge
43
39
  echo "::add-path::/snap/bin"
44
40
  - name: Install PlantUML
45
- run: |
46
- curl -L https://raw.githubusercontent.com/metanorma/plantuml-install/master/ubuntu.sh | sudo bash
47
- - name: Install puppeteer
48
- run: |
49
- sudo apt-get update
50
- sudo apt-get install -y libgbm1
51
- npm install -g puppeteer@3.0.1
41
+ uses: nick-invision/retry@v1
42
+ with:
43
+ polling_interval_seconds: 5
44
+ timeout_minutes: 5
45
+ max_attempts: 3
46
+ command: sudo apt-get update -y && sudo bash -c "curl -L https://github.com/metanorma/plantuml-install/raw/master/ubuntu.sh | bash"
52
47
  - name: Run specs
53
48
  run: |
54
49
  bundle exec rake
@@ -29,10 +29,6 @@ jobs:
29
29
  uses: actions/setup-ruby@v1
30
30
  with:
31
31
  ruby-version: ${{ matrix.ruby }}
32
- architecture: 'x64'
33
- - uses: actions/setup-node@v1
34
- with:
35
- node-version: '10.x'
36
32
  - name: Install MN Windows dependencies
37
33
  shell: pwsh
38
34
  run: |
@@ -50,10 +46,6 @@ jobs:
50
46
  refreshenv
51
47
  set PATH=C:\Strawberry\c\bin;C:\Strawberry\perl\site\bin;C:\Strawberry\perl\bin;%PATH%
52
48
  where latexmlmath
53
- - name: Install puppeteer
54
- shell: pwsh
55
- run: |
56
- npm -g i puppeteer
57
49
  - name: Run specs
58
50
  shell: pwsh
59
51
  run: |
@@ -5,6 +5,6 @@
5
5
  inherit_from:
6
6
  - https://raw.githubusercontent.com/riboseinc/oss-guides/master/ci/rubocop.yml
7
7
  AllCops:
8
- TargetRubyVersion: 2.3
8
+ TargetRubyVersion: 2.6
9
9
  Rails:
10
10
  Enabled: true
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
+ require 'isodoc/gem_tasks'
3
4
 
5
+ IsoDoc::GemTasks.install
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
8
  task default: :spec
@@ -14,22 +14,6 @@ module Asciidoctor
14
14
  XML_ROOT_TAG = "standard-document".freeze
15
15
  XML_NAMESPACE = "https://www.metanorma.org/ns/standoc".freeze
16
16
 
17
- Asciidoctor::Extensions.register do
18
- preprocessor Asciidoctor::Standoc::Datamodel::AttributesTablePreprocessor
19
- preprocessor Asciidoctor::Standoc::Datamodel::DiagramPreprocessor
20
- preprocessor Asciidoctor::Standoc::Yaml2TextPreprocessor
21
- inline_macro Asciidoctor::Standoc::AltTermInlineMacro
22
- inline_macro Asciidoctor::Standoc::DeprecatedTermInlineMacro
23
- inline_macro Asciidoctor::Standoc::DomainTermInlineMacro
24
- inline_macro Asciidoctor::Standoc::InheritInlineMacro
25
- inline_macro Asciidoctor::Standoc::HTML5RubyMacro
26
- inline_macro Asciidoctor::Standoc::ConceptInlineMacro
27
- block Asciidoctor::Standoc::ToDoAdmonitionBlock
28
- treeprocessor Asciidoctor::Standoc::ToDoInlineAdmonitionBlock
29
- block Asciidoctor::Standoc::PlantUMLBlockMacro
30
- block Asciidoctor::Standoc::PseudocodeBlockMacro
31
- end
32
-
33
17
  def xml_root_tag
34
18
  self.class::XML_ROOT_TAG
35
19
  end
@@ -117,6 +101,7 @@ module Asciidoctor
117
101
  @filename = node.attr("docfile") ?
118
102
  File.basename(node.attr("docfile")).gsub(/\.adoc$/, "") : ""
119
103
  @localdir = Utils::localdir(node)
104
+ @output_dir = outputdir node
120
105
  @no_isobib_cache = node.attr("no-isobib-cache")
121
106
  @no_isobib = node.attr("no-isobib")
122
107
  @bibdb = nil
@@ -126,9 +111,10 @@ module Asciidoctor
126
111
  @log = Asciidoctor::Standoc::Log.new
127
112
  init_bib_caches(node)
128
113
  init_iev_caches(node)
129
- lang = (node.attr("language") || "en")
130
- script = (node.attr("script") || "en")
131
- i18n_init(lang, script)
114
+ @lang = (node.attr("language") || "en")
115
+ @script = (node.attr("script") || "Latn")
116
+ @isodoc = isodoc(@lang, @script, node.attr("i18nyaml"))
117
+ @i18n = @isodoc.i18n
132
118
  end
133
119
 
134
120
  def default_fonts(node)
@@ -158,7 +144,7 @@ module Asciidoctor
158
144
  end
159
145
 
160
146
  def clean_exit
161
- @log.write(@localdir + @filename + ".err") unless @novalid
147
+ @log.write(@output_dir + @filename + ".err") unless @novalid
162
148
  @files_to_delete.each { |f| FileUtils.rm f }
163
149
  end
164
150
 
@@ -184,7 +170,7 @@ module Asciidoctor
184
170
  end
185
171
 
186
172
  def doctype(node)
187
- node.attr("doctype")
173
+ node.attr("doctype")&.gsub(/\s+/, "-")&.downcase
188
174
  end
189
175
 
190
176
  def front(node, xml)
@@ -243,6 +229,14 @@ module Asciidoctor
243
229
  end
244
230
  end.join("\n")
245
231
  end
232
+
233
+ private
234
+
235
+ def outputdir(node)
236
+ if node.attr("output_dir").nil_or_empty? then Utils::localdir(node)
237
+ else File.join(node.attr("output_dir"), "")
238
+ end
239
+ end
246
240
  end
247
241
  end
248
242
  end
@@ -71,6 +71,7 @@ module Asciidoctor
71
71
  para_cleanup(xmldoc)
72
72
  empty_element_cleanup(xmldoc)
73
73
  img_cleanup(xmldoc)
74
+ anchor_cleanup(xmldoc)
74
75
  xmldoc
75
76
  end
76
77
 
@@ -2,25 +2,25 @@ module Asciidoctor
2
2
  module Standoc
3
3
  module Cleanup
4
4
  def external_terms_boilerplate(sources)
5
- IsoDoc::Function::I18n::l10n(
6
- @external_terms_boilerplate.gsub(/%/, sources || "???"),
5
+ @i18n.l10n(
6
+ @i18n.external_terms_boilerplate.gsub(/%/, sources || "???"),
7
7
  @lang, @script)
8
8
  end
9
9
 
10
10
  def internal_external_terms_boilerplate(sources)
11
- IsoDoc::Function::I18n::l10n(
12
- @internal_external_terms_boilerplate.gsub(/%/, sources || "??"),
11
+ @i18n.l10n(
12
+ @i18n.internal_external_terms_boilerplate.gsub(/%/, sources || "??"),
13
13
  @lang, @script)
14
14
  end
15
15
 
16
16
  def term_defs_boilerplate(div, source, term, preface, isodoc)
17
- div.next = @term_def_boilerplate
17
+ a = @i18n.term_def_boilerplate and div.next = a
18
18
  source.each do |s|
19
19
  @anchors[s["bibitemid"]] or
20
20
  @log.add("Crossreferences", nil, "term source #{s['bibitemid']} not referenced")
21
21
  end
22
22
  if source.empty? && term.nil?
23
- div.next = @no_terms_boilerplate
23
+ div.next = @i18n.no_terms_boilerplate
24
24
  else
25
25
  div.next = term_defs_boilerplate_cont(source, term, isodoc)
26
26
  end
@@ -30,7 +30,7 @@ module Asciidoctor
30
30
  sources = isodoc.sentence_join(src.map do |s|
31
31
  %{<eref bibitemid="#{s['bibitemid']}"/>}
32
32
  end)
33
- if src.empty? then @internal_terms_boilerplate
33
+ if src.empty? then @i18n.internal_terms_boilerplate
34
34
  elsif term.nil? then external_terms_boilerplate(sources)
35
35
  else
36
36
  internal_external_terms_boilerplate(sources)
@@ -42,7 +42,7 @@ module Asciidoctor
42
42
  ["reference", "bibitem"].include? e.name
43
43
  end
44
44
  f.at("./title").next =
45
- "<p>#{(refs.empty? ? @norm_empty_pref : @norm_with_refs_pref)}</p>"
45
+ "<p>#{(refs.empty? ? @i18n.norm_empty_pref : @i18n.norm_with_refs_pref)}</p>"
46
46
  end
47
47
 
48
48
  TERM_CLAUSE = "//sections/terms | "\
@@ -54,13 +54,9 @@ module Asciidoctor
54
54
  x = xmldoc.dup
55
55
  x.root.add_namespace(nil, self.class::XML_NAMESPACE)
56
56
  xml = Nokogiri::XML(x.to_xml)
57
- conv = html_converter(EmptyAttr.new)
58
- @lang = xmldoc&.at("//bibdata/language")&.text
59
- @script = xmldoc&.at("//bibdata/script")&.text
60
- conv.i18n_init(@lang, @script)
61
- conv.metadata_init(@lang, @script, conv.labels)
62
- conv.info(xml, nil)
63
- conv
57
+ @isodoc ||= isodoc(@lang, @script)
58
+ @isodoc.info(xml, nil)
59
+ @isodoc
64
60
  end
65
61
 
66
62
  def boilerplate_cleanup(xmldoc)
@@ -83,15 +79,6 @@ module Asciidoctor
83
79
  preface.previous = b
84
80
  end
85
81
 
86
- class EmptyAttr
87
- def attr(_x)
88
- nil
89
- end
90
- def attributes
91
- {}
92
- end
93
- end
94
-
95
82
  def boilerplate_file(xmldoc)
96
83
  File.join(@libdir, "boilerplate.xml")
97
84
  end
@@ -117,7 +117,8 @@ module Asciidoctor
117
117
  def concept_termbase_cleanup(x)
118
118
  text = x&.children&.first&.remove&.text
119
119
  termbase, key = x["key"].split(/:/, 2)
120
- x.add_child(%(<termref base="#{termbase}" target="#{key}">#{text}</termref>))
120
+ x.add_child(%(<termref base="#{termbase}" target="#{key}">) +
121
+ "#{text}</termref>")
121
122
  end
122
123
 
123
124
  def concept_xref_cleanup(x)
@@ -129,6 +130,61 @@ module Asciidoctor
129
130
  x.children = "<eref>#{x.children.to_xml}</eref>"
130
131
  extract_localities(x.first_element_child)
131
132
  end
133
+
134
+ NAMECHAR = "\u0000-\u0022\u0024\u002c\u002f\u003a-\u0040\\u005b-\u005e"\
135
+ "\u0060\u007b-\u00b6\u00b8-\u00bf\u00d7\u00f7\u037e\u2000-\u200b"\
136
+ "\u200e-\u203e\u2041-\u206f\u2190-\u2bff\u2ff0-\u3000".freeze
137
+ #"\ud800-\uf8ff\ufdd0-\ufdef\ufffe-\uffff".freeze
138
+ NAMESTARTCHAR = "\\u002d\u002e\u0030-\u0039\u00b7\u0300-\u036f"\
139
+ "\u203f-\u2040".freeze
140
+
141
+ def to_ncname(s)
142
+ start = s[0]
143
+ ret1 = %r([#{NAMECHAR}#]).match(start) ? "_" :
144
+ (%r([#{NAMESTARTCHAR}#]).match(start) ? "_#{start}" : start)
145
+ ret = ret1 + s[1..-1].gsub(%r([#{NAMECHAR}#]), "_")
146
+ ret
147
+ end
148
+
149
+ def to_xreftarget(s)
150
+ return to_ncname(s) unless /^[^#]+#.+$/.match(s)
151
+ /^(?<pref>[^#]+)#(?<suff>.+)$/ =~ s
152
+ pref = pref.gsub(%r([#{NAMECHAR}]), "_")
153
+ suff = suff.gsub(%r([#{NAMECHAR}]), "_")
154
+ "#{pref}##{suff}"
155
+ end
156
+
157
+ IDREF = "//*/@id | //review/@from | //review/@to | "\
158
+ "//callout/@target | //citation/@bibitemid | //eref/@bibitemid".freeze
159
+
160
+ def anchor_cleanup(x)
161
+ anchor_cleanup1(x)
162
+ xreftarget_cleanup(x)
163
+ end
164
+
165
+ def anchor_cleanup1(x)
166
+ x.xpath(IDREF).each do |s|
167
+ if (ret = to_ncname(s.value)) != (orig = s.value)
168
+ s.value = ret
169
+ output = s.parent.dup
170
+ output.children.remove
171
+ @log.add("Anchors", s.parent, "normalised identifier in #{output} "\
172
+ "from #{orig}")
173
+ end
174
+ end
175
+ end
176
+
177
+ def xreftarget_cleanup(x)
178
+ x.xpath("//xref/@target").each do |s|
179
+ if (ret = to_xreftarget(s.value)) != (orig = s.value)
180
+ s.value = ret
181
+ output = s.parent.dup
182
+ output.children.remove
183
+ @log.add("Anchors", s.parent, "normalised identifier in #{output} "\
184
+ "from #{orig}")
185
+ end
186
+ end
187
+ end
132
188
  end
133
189
  end
134
190
  end
@@ -50,7 +50,8 @@ module Asciidoctor
50
50
  # only numeric references are renumbered
51
51
  def biblio_renumber(xmldoc)
52
52
  r = xmldoc.at("//references[@normative = 'false'] | "\
53
- "//clause[.//references[@normative = 'false']]") or return
53
+ "//clause[.//references[@normative = 'false']] | "\
54
+ "//annex[.//references[@normative = 'false']]") or return
54
55
  r.xpath(".//bibitem[not(ancestor::bibitem)]").each_with_index do |b, i|
55
56
  next unless docid = b.at("./docidentifier[@type = 'metanorma']")
56
57
  next unless /^\[\d+\]$/.match(docid.text)
@@ -132,15 +133,17 @@ module Asciidoctor
132
133
  end
133
134
 
134
135
  def validate_ref_dl(bib, c)
135
- unless bib["id"]
136
+ id = bib["id"]
137
+ id ||= c["id"] unless /^_/.match(c["id"]) # do not accept implicit id
138
+ unless id
136
139
  @log.add("Anchors", c, "The following reference is missing "\
137
- "an anchor:\n" + c.to_xml)
140
+ "an anchor:\n" + c.to_xml)
138
141
  return
139
142
  end
140
- bib["title"] or @log.add("Bibliography", c, "Reference #{bib['id']} "\
141
- "is missing a title")
142
- bib["docid"] or @log.add("Bibliography", c, "Reference #{bib['id']} "\
143
- "is missing a document identifier (docid)")
143
+ bib["title"] or @log.add("Bibliography", c, "Reference #{id} "\
144
+ "is missing a title")
145
+ bib["docid"] or @log.add("Bibliography", c, "Reference #{id} "\
146
+ "is missing a document identifier (docid)")
144
147
  end
145
148
 
146
149
  def extract_from_p(tag, bib, key)
@@ -200,7 +203,9 @@ module Asciidoctor
200
203
  end
201
204
  if !nested and c.at("./title")
202
205
  title = c.at("./title").remove.children.to_xml
203
- bib["title"] = bib["title"] ? Array(bib["title"]) : []
206
+ bib["title"] = [bib["title"]] if bib["title"].is_a? Hash
207
+ bib["title"] = [bib["title"]] if bib["title"].is_a? String
208
+ bib["title"] = [] unless bib["title"]
204
209
  bib["title"] << title if !title.empty?
205
210
  end
206
211
  bib
@@ -39,6 +39,7 @@ module Asciidoctor
39
39
  dupabstract.traverse { |n| n.remove_attribute("id") }
40
40
  dupabstract.remove_attribute("language")
41
41
  dupabstract.remove_attribute("script")
42
+ dupabstract&.at("./title")&.remove
42
43
  bibabstract.next = dupabstract
43
44
  end
44
45
  end
@@ -105,6 +106,7 @@ module Asciidoctor
105
106
  def sections_cleanup(x)
106
107
  sections_order_cleanup(x)
107
108
  sections_level_cleanup(x)
109
+ sections_names_cleanup(x)
108
110
  end
109
111
 
110
112
  def obligations_cleanup(x)
@@ -118,15 +120,15 @@ module Asciidoctor
118
120
  (s = x.at("//introduction")) && s["obligation"] = "informative"
119
121
  (s = x.at("//acknowledgements")) && s["obligation"] = "informative"
120
122
  x.xpath("//references").each { |r| r["obligation"] = "informative" }
121
- x.xpath("//preface//clause").each { |r| r["obligation"] = "informative" }
123
+ x.xpath("//preface//clause").each do |r|
124
+ r["obligation"] = "informative"
125
+ end
122
126
  end
123
127
 
124
128
  def obligations_cleanup_norm(x)
125
- (s = x.at("//clause[title = 'Scope']")) && s["obligation"] = "normative"
126
- (s = x.at("//clause[title = 'Symbols and Abbreviated Terms']")) &&
127
- s["obligation"] = "normative"
129
+ (s = x.at("//clause[@type = 'scope']")) && s["obligation"] = "normative"
128
130
  x.xpath("//terms").each { |r| r["obligation"] = "normative" }
129
- x.xpath("//symbols-abbrevs").each { |r| r["obligation"] = "normative" }
131
+ x.xpath("//definitions").each { |r| r["obligation"] = "normative" }
130
132
  end
131
133
 
132
134
  def obligations_cleanup_inherit(x)
@@ -139,16 +141,98 @@ module Asciidoctor
139
141
  end
140
142
 
141
143
  def clausebefore_cleanup(xmldoc)
144
+ preface_clausebefore_cleanup(xmldoc)
145
+ sections_clausebefore_cleanup(xmldoc)
146
+ end
147
+
148
+ def preface_clausebefore_cleanup(xmldoc)
149
+ return unless xmldoc.at("//preface")
150
+ unless ins = xmldoc.at("//preface").children.first
151
+ xmldoc.at("//preface") << " "
152
+ ins = xmldoc.at("//preface").children.first
153
+ end
154
+ xmldoc.xpath("//preface//*[@beforeclauses = 'true']").each do |x|
155
+ x.delete("beforeclauses")
156
+ ins.previous = x.remove
157
+ end
158
+ end
159
+
160
+ def sections_clausebefore_cleanup(xmldoc)
142
161
  return unless xmldoc.at("//sections")
143
162
  unless ins = xmldoc.at("//sections").children.first
144
163
  xmldoc.at("//sections") << " "
145
164
  ins = xmldoc.at("//sections").children.first
146
165
  end
147
- xmldoc.xpath("//*[@beforeclauses = 'true']").each do |x|
166
+ xmldoc.xpath("//sections//*[@beforeclauses = 'true']").each do |x|
148
167
  x.delete("beforeclauses")
149
168
  ins.previous = x.remove
150
169
  end
151
170
  end
171
+
172
+ def get_or_make_title(node)
173
+ unless node.at("./title")
174
+ if node.children.empty?
175
+ node << "<title/>"
176
+ else
177
+ node.children.first.previous = "<title/>"
178
+ end
179
+ end
180
+ node.at("./title")
181
+ end
182
+
183
+ def replace_title(doc, xpath, text, first = false)
184
+ return unless text
185
+ doc.xpath(xpath).each_with_index do |node, i|
186
+ next if first && !i.zero?
187
+ title = get_or_make_title(node)
188
+ fn = title.xpath("./fn")
189
+ fn.each { |n| n.remove }
190
+ title.content = text
191
+ fn.each { |n| title << n }
192
+ end
193
+ end
194
+
195
+ def sections_names_cleanup(x)
196
+ replace_title(x, "//clause[@type = 'scope']", @i18n&.scope)
197
+ replace_title(x, "//preface//abstract", @i18n&.abstract)
198
+ replace_title(x, "//foreword", @i18n&.foreword)
199
+ replace_title(x, "//introduction", @i18n&.introduction)
200
+ replace_title(x, "//acknowledgements", @i18n&.acknowledgements)
201
+ section_names_refs_cleanup(x)
202
+ section_names_terms_cleanup(x)
203
+ end
204
+
205
+ def section_names_refs_cleanup(x)
206
+ replace_title(x, "//references[@normative = 'true']",
207
+ @i18n&.normref, true)
208
+ replace_title(x, "//references[@normative = 'false']",
209
+ @i18n&.bibliography, true)
210
+ end
211
+
212
+ NO_SYMABBR = "[.//definitions[not(@type)]]"
213
+ SYMABBR = "[.//definitions[@type = 'symbols']"\
214
+ "[@type = 'abbreviated_terms']]".freeze
215
+ SYMnoABBR = "[.//definitions[@type = 'symbols']"\
216
+ "[not(@type = 'abbreviated_terms')]]".freeze
217
+ ABBRnoSYM = "[.//definitions[not(@type = 'symbols')]"\
218
+ "[@type = 'abbreviated_terms']]".freeze
219
+
220
+ def section_names_terms_cleanup(x)
221
+ replace_title(x, "//definitions[@type = 'symbols']", @i18n&.symbols)
222
+ replace_title(x, "//definitions[@type = 'abbreviated_terms']", @i18n&.abbrev)
223
+ replace_title(x, "//definitions[not(@type)]", @i18n&.symbolsabbrev)
224
+ replace_title(x, "//terms#{SYMnoABBR} | //clause[.//terms]#{SYMnoABBR}",
225
+ @i18n&.termsdefsymbols, true)
226
+ replace_title(x, "//terms#{ABBRnoSYM} | //clause[.//terms]#{ABBRnoSYM}",
227
+ @i18n&.termsdefabbrev, true)
228
+ replace_title(x, "//terms#{SYMABBR} | //clause[.//terms]#{SYMABBR}",
229
+ @i18n&.termsdefsymbolsabbrev, true)
230
+ replace_title(x, "//terms#{NO_SYMABBR} | //clause[.//terms]#{NO_SYMABBR}",
231
+ @i18n&.termsdefsymbolsabbrev, true)
232
+ replace_title(
233
+ x, "//terms[not(.//definitions)] | //clause[.//terms][not(.//definitions)]",
234
+ @i18n&.termsdef, true)
235
+ end
152
236
  end
153
237
  end
154
238
  end