metanorma-standoc 1.6.1 → 1.7.0

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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +66 -0
  3. data/README.adoc +1 -3
  4. data/lib/asciidoctor/standoc/base.rb +8 -16
  5. data/lib/asciidoctor/standoc/basicdoc.rng +50 -3
  6. data/lib/asciidoctor/standoc/cleanup.rb +52 -4
  7. data/lib/asciidoctor/standoc/cleanup_block.rb +41 -4
  8. data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +47 -20
  9. data/lib/asciidoctor/standoc/cleanup_footnotes.rb +14 -0
  10. data/lib/asciidoctor/standoc/cleanup_inline.rb +9 -3
  11. data/lib/asciidoctor/standoc/cleanup_ref.rb +17 -24
  12. data/lib/asciidoctor/standoc/cleanup_terms.rb +4 -6
  13. data/lib/asciidoctor/standoc/converter.rb +71 -1
  14. data/lib/asciidoctor/standoc/front.rb +6 -0
  15. data/lib/asciidoctor/standoc/front_contributor.rb +8 -4
  16. data/lib/asciidoctor/standoc/inline.rb +6 -5
  17. data/lib/asciidoctor/standoc/isodoc.rng +36 -43
  18. data/lib/asciidoctor/standoc/lists.rb +4 -2
  19. data/lib/asciidoctor/standoc/macros.rb +55 -59
  20. data/lib/asciidoctor/standoc/macros_terms.rb +82 -0
  21. data/lib/asciidoctor/standoc/ref.rb +19 -25
  22. data/lib/asciidoctor/standoc/ref_sect.rb +4 -3
  23. data/lib/asciidoctor/standoc/section.rb +21 -20
  24. data/lib/asciidoctor/standoc/table.rb +12 -0
  25. data/lib/asciidoctor/standoc/term_lookup_cleanup.rb +86 -0
  26. data/lib/asciidoctor/standoc/utils.rb +2 -0
  27. data/lib/metanorma/standoc/version.rb +1 -1
  28. data/metanorma-standoc.gemspec +5 -3
  29. data/spec/asciidoctor-standoc/base_spec.rb +14 -4
  30. data/spec/asciidoctor-standoc/blocks_spec.rb +14 -9
  31. data/spec/asciidoctor-standoc/cleanup_sections_spec.rb +1519 -0
  32. data/spec/asciidoctor-standoc/cleanup_spec.rb +416 -1554
  33. data/spec/asciidoctor-standoc/converter_spec.rb +8 -0
  34. data/spec/asciidoctor-standoc/inline_spec.rb +2 -5
  35. data/spec/asciidoctor-standoc/isobib_cache_spec.rb +16 -9
  36. data/spec/asciidoctor-standoc/lists_spec.rb +10 -1
  37. data/spec/asciidoctor-standoc/macros_lutaml_spec.rb +80 -0
  38. data/spec/asciidoctor-standoc/macros_plantuml_spec.rb +307 -0
  39. data/spec/asciidoctor-standoc/macros_spec.rb +408 -169
  40. data/spec/asciidoctor-standoc/refs_dl_spec.rb +6 -6
  41. data/spec/asciidoctor-standoc/refs_spec.rb +112 -65
  42. data/spec/asciidoctor-standoc/section_spec.rb +17 -12
  43. data/spec/asciidoctor-standoc/table_spec.rb +86 -0
  44. data/spec/asciidoctor-standoc/validate_spec.rb +26 -0
  45. data/spec/fixtures/diagram_definitions.lutaml +22 -0
  46. data/spec/fixtures/test.exp +121 -0
  47. data/spec/spec_helper.rb +33 -0
  48. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +59 -243
  49. data/spec/vcr_cassettes/isobib_get_123.yml +12 -12
  50. data/spec/vcr_cassettes/isobib_get_123_1.yml +27 -119
  51. data/spec/vcr_cassettes/isobib_get_123_1_fr.yml +35 -35
  52. data/spec/vcr_cassettes/isobib_get_123_2001.yml +14 -60
  53. data/spec/vcr_cassettes/isobib_get_124.yml +11 -57
  54. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +8 -8
  55. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +281 -157
  56. metadata +45 -11
  57. data/.github/workflows/macos.yml +0 -41
  58. data/.github/workflows/ubuntu.yml +0 -45
  59. data/.github/workflows/windows.yml +0 -43
@@ -55,7 +55,7 @@ module Asciidoctor
55
55
 
56
56
  def ol_attrs(node)
57
57
  attr_code(keep_attrs(node).merge(id: Utils::anchor_or_uuid(node),
58
- type: olist_style(node.style)))
58
+ type: olist_style(node.style)))
59
59
  end
60
60
 
61
61
  def olist(node)
@@ -87,7 +87,9 @@ module Asciidoctor
87
87
  end
88
88
 
89
89
  def dl_attrs(node)
90
- attr_code(id_attr(node).merge(keep_attrs(node)))
90
+ attr_code(keep_attrs(node).
91
+ merge(id: Utils::anchor_or_uuid(node),
92
+ key: node.option?("key") ? "true" : nil))
91
93
  end
92
94
 
93
95
  def dlist(node)
@@ -3,87 +3,57 @@ require "fileutils"
3
3
  require "uuidtools"
4
4
  require "yaml"
5
5
  require_relative "./macros_plantuml.rb"
6
+ require_relative "./macros_terms.rb"
6
7
  require_relative "./datamodel/attributes_table_preprocessor.rb"
7
8
  require_relative "./datamodel/diagram_preprocessor.rb"
8
9
  require "metanorma-plugin-datastruct"
10
+ require "metanorma-plugin-lutaml"
9
11
 
10
12
  module Asciidoctor
11
13
  module Standoc
12
- class AltTermInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
14
+ class InheritInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
13
15
  use_dsl
14
- named :alt
16
+ named :inherit
15
17
  parse_content_as :text
16
18
  using_format :short
17
19
 
18
20
  def process(parent, _target, attrs)
19
21
  out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
20
- %{<admitted>#{out}</admitted>}
22
+ %{<inherit>#{out}</inherit>}
21
23
  end
22
24
  end
23
25
 
24
- class DeprecatedTermInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
26
+ class IndexXrefInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
25
27
  use_dsl
26
- named :deprecated
27
- parse_content_as :text
28
- using_format :short
28
+ named :index
29
29
 
30
- def process(parent, _target, attrs)
31
- out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
32
- %{<deprecates>#{out}</deprecates>}
30
+ def preprocess_attrs(attrs)
31
+ return unless attrs.size > 1 && attrs.size < 5
32
+ ret = { primary: attrs[1], target: attrs[attrs.size] }
33
+ ret[:secondary] = attrs[2] if attrs.size > 2
34
+ ret[:tertiary] = attrs[3] if attrs.size > 3
35
+ ret
33
36
  end
34
- end
35
-
36
- class DomainTermInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
37
- use_dsl
38
- named :domain
39
- parse_content_as :text
40
- using_format :short
41
37
 
42
- def process(parent, _target, attrs)
43
- out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
44
- %{<domain>#{out}</domain>}
38
+ def process(_parent, target, attr)
39
+ args = preprocess_attrs(attr) or return
40
+ ret = "<index-xref also='#{target == 'also'}'><primary>#{args[:primary]}</primary>"
41
+ ret += "<secondary>#{args[:secondary]}</secondary>" if args[:secondary]
42
+ ret += "<tertiary>#{args[:tertiary]}</tertiary>" if args[:tertiary]
43
+ ret + "<target>#{args[:target]}</target></index-xref>"
45
44
  end
46
45
  end
47
46
 
48
- class InheritInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
47
+ class IndexRangeInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
49
48
  use_dsl
50
- named :inherit
49
+ named "index-range".to_sym
51
50
  parse_content_as :text
52
- using_format :short
53
-
54
- def process(parent, _target, attrs)
55
- out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
56
- %{<inherit>#{out}</inherit>}
57
- end
58
- end
59
-
60
- class ConceptInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
61
- use_dsl
62
- named :concept
63
- name_positional_attributes "id", "word", "term"
64
- # match %r{concept:(?<target>[^\[]*)\[(?<content>|.*?[^\\])\]$}
65
- match /\{\{(?<content>|.*?[^\\])\}\}/
66
- using_format :short
67
-
68
- # deal with locality attrs and their disruption of positional attrs
69
- def preprocess_attrs(attrs)
70
- attrs.delete("term") if attrs["term"] && !attrs["word"]
71
- attrs.delete(3) if attrs[3] == attrs["term"]
72
- a = attrs.keys.reject { |k| k.is_a?(String) || [1, 2].include?(k) }
73
- attrs["word"] ||= attrs[a[0]] if !a.empty?
74
- attrs["term"] ||= attrs[a[1]] if a.length > 1
75
- attrs
76
- end
77
51
 
78
- def process(parent, _target, attr)
79
- attr = preprocess_attrs(attr)
80
- localities = attr.keys.reject { |k| %w(id word term).include? k }.
81
- reject { |k| k.is_a? Numeric }.
82
- map { |k| "#{k}=#{attr[k]}" }.join(",")
83
- text = [localities, attr["word"]].reject{ |k| k.nil? || k.empty? }.
84
- join(",")
85
- out = Asciidoctor::Inline.new(parent, :quoted, text).convert
86
- %{<concept key="#{attr['id']}" term="#{attr['term']}">#{out}</concept>}
52
+ def process(parent, target, attr)
53
+ text = attr["text"]
54
+ text = "((#{text}))" unless /^\(\(.+\)\)$/.match(text)
55
+ out = parent.sub_macros(text)
56
+ out.sub(/<index>/, "<index to='#{target}'>")
87
57
  end
88
58
  end
89
59
 
@@ -134,7 +104,7 @@ module Asciidoctor
134
104
  if (attributes.size == 1) && attributes.key?("text")
135
105
  rt = attributes["text"]
136
106
  elsif (attributes.size == 2) && attributes.key?(1) &&
137
- attributes.key?("rpbegin")
107
+ attributes.key?("rpbegin")
138
108
  # for example, html5ruby:楽聖少女[がくせいしょうじょ]
139
109
  rt = attributes[1] || ""
140
110
  else
@@ -157,7 +127,7 @@ module Asciidoctor
157
127
  attrs["name"] = "todo"
158
128
  attrs["caption"] = "TODO"
159
129
  create_block parent, :admonition, reader.lines, attrs,
160
- content_model: :compound
130
+ content_model: :compound
161
131
  end
162
132
  end
163
133
 
@@ -170,7 +140,7 @@ module Asciidoctor
170
140
  para.set_attr("caption", "TODO")
171
141
  para.lines[0].sub!(/^TODO: /, "")
172
142
  todo = Block.new parent, :admonition, attributes: para.attributes,
173
- source: para.lines, content_model: :compound
143
+ source: para.lines, content_model: :compound
174
144
  parent.blocks[parent.blocks.index(para)] = todo
175
145
  end
176
146
  end
@@ -186,5 +156,31 @@ module Asciidoctor
186
156
  %{<autonumber type=#{target}>#{out}</autonumber>}
187
157
  end
188
158
  end
159
+
160
+ class VariantInlineMacro < Extensions::InlineMacroProcessor
161
+ use_dsl
162
+ named :lang
163
+ parse_content_as :text
164
+
165
+ def process(parent, target, attrs)
166
+ /^(?<lang>[^-]*)(-(?<script>.*))?$/ =~ target
167
+ out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
168
+ script ?
169
+ %{<variant lang=#{lang} script=#{script}>#{out}</variant>} :
170
+ %{<variant lang=#{lang}>#{out}</variant>}
171
+ end
172
+ end
173
+
174
+ class FootnoteBlockInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
175
+ use_dsl
176
+ named :footnoteblock
177
+ parse_content_as :text
178
+ using_format :short
179
+
180
+ def process(parent, _target, attrs)
181
+ out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
182
+ %{<footnoteblock>#{out}</footnoteblock>}
183
+ end
184
+ end
189
185
  end
190
186
  end
@@ -0,0 +1,82 @@
1
+ module Asciidoctor
2
+ module Standoc
3
+ class AltTermInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
4
+ use_dsl
5
+ named :alt
6
+ parse_content_as :text
7
+ using_format :short
8
+
9
+ def process(parent, _target, attrs)
10
+ out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
11
+ %{<admitted>#{out}</admitted>}
12
+ end
13
+ end
14
+
15
+ class DeprecatedTermInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
16
+ use_dsl
17
+ named :deprecated
18
+ parse_content_as :text
19
+ using_format :short
20
+
21
+ def process(parent, _target, attrs)
22
+ out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
23
+ %{<deprecates>#{out}</deprecates>}
24
+ end
25
+ end
26
+
27
+ class DomainTermInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
28
+ use_dsl
29
+ named :domain
30
+ parse_content_as :text
31
+ using_format :short
32
+
33
+ def process(parent, _target, attrs)
34
+ out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
35
+ %{<domain>#{out}</domain>}
36
+ end
37
+ end
38
+
39
+ # Macro to transform `term[X,Y]` into em, termxref xml
40
+ class TermRefInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
41
+ use_dsl
42
+ named :term
43
+ name_positional_attributes 'name', 'termxref'
44
+ using_format :short
45
+
46
+ def process(_parent, _target, attrs)
47
+ termref = attrs['termxref'] || attrs['name']
48
+ "<em>#{attrs['name']}</em> (<termxref>#{termref}</termxref>)"
49
+ end
50
+ end
51
+
52
+ class ConceptInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
53
+ use_dsl
54
+ named :concept
55
+ name_positional_attributes "id", "word", "term"
56
+ # match %r{concept:(?<target>[^\[]*)\[(?<content>|.*?[^\\])\]$}
57
+ match /\{\{(?<content>|.*?[^\\])\}\}/
58
+ using_format :short
59
+
60
+ # deal with locality attrs and their disruption of positional attrs
61
+ def preprocess_attrs(attrs)
62
+ attrs.delete("term") if attrs["term"] && !attrs["word"]
63
+ attrs.delete(3) if attrs[3] == attrs["term"]
64
+ a = attrs.keys.reject { |k| k.is_a?(String) || [1, 2].include?(k) }
65
+ attrs["word"] ||= attrs[a[0]] if !a.empty?
66
+ attrs["term"] ||= attrs[a[1]] if a.length > 1
67
+ attrs
68
+ end
69
+
70
+ def process(parent, _target, attr)
71
+ attr = preprocess_attrs(attr)
72
+ localities = attr.keys.reject { |k| %w(id word term).include? k }.
73
+ reject { |k| k.is_a? Numeric }.
74
+ map { |k| "#{k}=#{attr[k]}" }.join(",")
75
+ text = [localities, attr["word"]].reject{ |k| k.nil? || k.empty? }.
76
+ join(",")
77
+ out = Asciidoctor::Inline.new(parent, :quoted, text).convert
78
+ %{<concept key="#{attr['id']}" term="#{attr['term']}">#{out}</concept>}
79
+ end
80
+ end
81
+ end
82
+ end
@@ -1,6 +1,6 @@
1
1
  module Asciidoctor
2
2
  module Standoc
3
- module Lists
3
+ module Refs
4
4
  def iso_publisher(t, code)
5
5
  code.sub(/ .*$/, "").split(/\//).each do |abbrev|
6
6
  t.contributor do |c|
@@ -56,7 +56,9 @@ module Asciidoctor
56
56
  end
57
57
 
58
58
  def norm_year(yr)
59
- /^\&\#821[12];$/.match(yr) ? "--" : yr
59
+ /^\&\#821[12];$/.match(yr) and return "--"
60
+ /^\d\d\d\d-\d\d\d\d$/.match(yr) and return yr
61
+ yr&.sub(/(?<=[0-9])-.*$/, "")
60
62
  end
61
63
 
62
64
  def isorefrender1(t, m, yr, allp = "")
@@ -68,8 +70,7 @@ module Asciidoctor
68
70
 
69
71
  def isorefmatches(xml, m)
70
72
  yr = norm_year(m[:year])
71
- ref = fetch_ref xml, m[:code], yr, title: m[:text], usrlbl: m[:usrlbl],
72
- lang: (@lang || :all)
73
+ ref = fetch_ref xml, m[:code], yr, title: m[:text], usrlbl: m[:usrlbl], lang: (@lang || :all)
73
74
  return use_my_anchor(ref, m[:anchor]) if ref
74
75
  xml.bibitem **attr_code(ref_attributes(m)) do |t|
75
76
  isorefrender1(t, m, yr)
@@ -94,7 +95,7 @@ module Asciidoctor
94
95
  d.on "--"
95
96
  end
96
97
  iso_publisher(t, m[:code])
97
- m[:fn].nil? or t.note(**plaintxt.merge(type: "ISO DATE")) do |p|
98
+ m[:fn].nil? or t.note(**plaintxt.merge(type: "Unpublished-Status")) do |p|
98
99
  p << "#{m[:fn]}"
99
100
  end
100
101
  end
@@ -103,8 +104,7 @@ module Asciidoctor
103
104
  def conditional_date(t, m, noyr)
104
105
  m.names.include?("year") and !m[:year].nil? and
105
106
  t.date(**{ type: "published" }) do |d|
106
- noyr and d.on "--" or
107
- set_date_range(d, norm_year(m[:year]))
107
+ noyr and d.on "--" or set_date_range(d, norm_year(m[:year]))
108
108
  end
109
109
  end
110
110
 
@@ -112,8 +112,7 @@ module Asciidoctor
112
112
  yr = norm_year(m[:year])
113
113
  hasyr = !yr.nil? && yr != "--"
114
114
  ref = fetch_ref xml, m[:code], hasyr ? yr : nil, all_parts: true,
115
- no_year: yr == "--", text: m[:text], usrlbl: m[:usrlbl],
116
- lang: (@lang || :all)
115
+ no_year: yr == "--", text: m[:text], usrlbl: m[:usrlbl], lang: (@lang || :all)
117
116
  return use_my_anchor(ref, m[:anchor]) if ref
118
117
  isorefmatches3_1(xml, m, yr, hasyr, ref)
119
118
  end
@@ -124,7 +123,7 @@ module Asciidoctor
124
123
  conditional_date(t, m, yr == "--")
125
124
  iso_publisher(t, m[:code])
126
125
  m.names.include?("fn") && m[:fn] and
127
- t.note(**plaintxt.merge(type: "ISO DATE")) { |p| p << "#{m[:fn]}" }
126
+ t.note(**plaintxt.merge(type: "Unpublished-Status")) { |p| p << "#{m[:fn]}" }
128
127
  t.extent **{ type: 'part' } do |e|
129
128
  e.referenceFrom "all"
130
129
  end
@@ -138,8 +137,7 @@ module Asciidoctor
138
137
  end
139
138
  docid(t, m[:usrlbl]) if m[:usrlbl]
140
139
  docid(t, /^\d+$/.match(code[:id]) ? "[#{code[:id]}]" : code[:id])
141
- code[:type] == "repo" and
142
- t.docidentifier code[:key], **{ type: "repository" }
140
+ code[:type] == "repo" and t.docidentifier code[:key], **{ type: "repository" }
143
141
  end
144
142
 
145
143
  def refitem_render(xml, m, code)
@@ -153,9 +151,8 @@ module Asciidoctor
153
151
  end
154
152
 
155
153
  MALFORMED_REF = "no anchor on reference, markup may be malformed: see "\
156
- "https://www.metanorma.com/author/topics/document-format/"\
157
- "bibliography/ , https://www.metanorma.com/author/iso/topics/markup/"\
158
- "#bibliographies".freeze
154
+ "https://www.metanorma.com/author/topics/document-format/bibliography/ , "\
155
+ "https://www.metanorma.com/author/iso/topics/markup/#bibliographies".freeze
159
156
 
160
157
  def analyse_ref_nofetch(ret)
161
158
  return ret unless m = /^nofetch\((?<id>.+)\)$/.match(ret[:id])
@@ -163,9 +160,9 @@ module Asciidoctor
163
160
  end
164
161
 
165
162
  def analyse_ref_repo_path(ret)
166
- return ret unless m =
167
- /^(?<type>repo|path):\((?<key>[^,]+),(?<id>.+)\)$/.match(ret[:id])
168
- ret.merge(id: m[:id], type: m[:type], key: m[:key], nofetch: true)
163
+ return ret unless m = /^(?<type>repo|path):\((?<key>[^,]+),?(?<id>.*)\)$/.match(ret[:id])
164
+ id = m[:id].empty? ? m[:key].sub(%r{^[^/]+/}, "") : m[:id]
165
+ ret.merge(id: id, type: m[:type], key: m[:key], nofetch: true)
169
166
  end
170
167
 
171
168
  def analyse_ref_numeric(ret)
@@ -191,8 +188,7 @@ module Asciidoctor
191
188
  def refitem1(xml, item, m)
192
189
  code = analyse_ref_code(m[:code])
193
190
  unless code[:id] && code[:numeric] || code[:nofetch]
194
- ref = fetch_ref xml, code[:id],
195
- m.names.include?("year") ? m[:year] : nil, title: m[:text],
191
+ ref = fetch_ref xml, code[:id], m.names.include?("year") ? m[:year] : nil, title: m[:text],
196
192
  usrlbl: m[:usrlbl], lang: (@lang || :all)
197
193
  return use_my_anchor(ref, m[:anchor]) if ref
198
194
  end
@@ -209,8 +205,7 @@ module Asciidoctor
209
205
 
210
206
  ISO_REF = %r{^<ref\sid="(?<anchor>[^"]+)">
211
207
  \[(?<usrlbl>\([^)]+\))?(?<code>(ISO|IEC)[^0-9]*\s[0-9-]+|IEV)
212
- (:(?<year>[0-9][0-9-]+))?\]</ref>,?\s*
213
- (?<text>.*)$}xm
208
+ (:(?<year>[0-9][0-9-]+))?\]</ref>,?\s*(?<text>.*)$}xm
214
209
 
215
210
  ISO_REF_NO_YEAR = %r{^<ref\sid="(?<anchor>[^"]+)">
216
211
  \[(?<usrlbl>\([^)]+\))?(?<code>(ISO|IEC)[^0-9]*\s[0-9-]+):
@@ -225,7 +220,7 @@ module Asciidoctor
225
220
 
226
221
  NON_ISO_REF = %r{^<ref\sid="(?<anchor>[^"]+)">
227
222
  \[(?<usrlbl>\([^)]+\))?(?<code>[^\]]+?)
228
- ([:-](?<year>(19|20)[0-9][0-9]))?\]</ref>,?\s*(?<text>.*)$}xm
223
+ ([:-](?<year>(19|20)[0-9][0-9][0-9-]*))?\]</ref>,?\s*(?<text>.*)$}xm
229
224
 
230
225
  def reference1_matches(item)
231
226
  matched = ISO_REF.match item
@@ -236,8 +231,7 @@ module Asciidoctor
236
231
 
237
232
  def reference1(node, item, xml)
238
233
  matched, matched2, matched3 = reference1_matches(item)
239
- if matched3.nil? && matched2.nil? && matched.nil?
240
- refitem(xml, item, node)
234
+ if matched3.nil? && matched2.nil? && matched.nil? then refitem(xml, item, node)
241
235
  elsif !matched.nil? then isorefmatches(xml, matched)
242
236
  elsif !matched2.nil? then isorefmatches2(xml, matched2)
243
237
  elsif !matched3.nil? then isorefmatches3(xml, matched3)
@@ -21,8 +21,8 @@ module Asciidoctor
21
21
  @log.add("AsciiDoc Input", node, "Section not marked up as [bibliography]!")
22
22
  @biblio = true
23
23
  xml.references **attr_code(attrs.merge(normative: false)) do |xml_section|
24
- title = node.level == 1 ? "Bibliography" : node.title
25
- xml_section.title { |t| t << title }
24
+ #title = node.level == 1 ? "Bibliography" : node.title
25
+ xml_section.title { |t| t << node.title }
26
26
  xml_section << node.content
27
27
  end
28
28
  @biblio = false
@@ -44,7 +44,8 @@ module Asciidoctor
44
44
  @log.add("AsciiDoc Input", node, "Section not marked up as [bibliography]!")
45
45
  @norm_ref = true
46
46
  xml.references **attr_code(attrs.merge(normative: true)) do |xml_section|
47
- xml_section.title { |t| t << "Normative References" }
47
+ #xml_section.title { |t| t << "Normative References" }
48
+ xml_section.title { |t| t << node.title }
48
49
  xml_section << node.content
49
50
  end
50
51
  @norm_ref = false
@@ -14,8 +14,7 @@ module Asciidoctor
14
14
  end
15
15
 
16
16
  def sectiontype1(node)
17
- node&.attr("heading")&.downcase ||
18
- node.title.gsub(/<[^>]+>/, "").downcase
17
+ node&.attr("heading")&.downcase || node.title.gsub(/<[^>]+>/, "").downcase
19
18
  end
20
19
 
21
20
  def sectiontype(node, level = true)
@@ -47,15 +46,12 @@ module Asciidoctor
47
46
 
48
47
  def section_attributes(node)
49
48
  ret = { id: Utils::anchor_or_uuid(node),
50
- language: node.attributes["language"],
51
- script: node.attributes["script"],
52
- annex: (
53
- ((node.attr("style") == "appendix" || node.role == "appendix") &&
54
- node.level == 1) ? true : nil
55
- ),
56
- preface: (
57
- (node.role == "preface" || node.attr("style") == "preface") ?
58
- true : nil) }
49
+ language: node.attributes["language"],
50
+ script: node.attributes["script"],
51
+ annex: ( ((node.attr("style") == "appendix" || node.role == "appendix") &&
52
+ node.level == 1) ? true : nil),
53
+ preface: (
54
+ (node.role == "preface" || node.attr("style") == "preface") ? true : nil) }
59
55
  return ret unless node.attributes["change"]
60
56
  ret.merge(change: node.attributes["change"],
61
57
  path: node.attributes["path"],
@@ -105,9 +101,9 @@ module Asciidoctor
105
101
 
106
102
  def set_obligation(attrs, node)
107
103
  attrs[:obligation] = node.attributes.has_key?("obligation") ?
108
- node.attr("obligation") :
109
- node.parent.attributes.has_key?("obligation") ?
110
- node.parent.attr("obligation") : "normative"
104
+ node.attr("obligation") :
105
+ node.parent.attributes.has_key?("obligation") ?
106
+ node.parent.attr("obligation") : "normative"
111
107
  end
112
108
 
113
109
  def preamble(node)
@@ -187,18 +183,23 @@ module Asciidoctor
187
183
  @term_def = defs
188
184
  end
189
185
 
186
+ def terms_boilerplate_parse(attrs, xml, node)
187
+ defs = @term_def
188
+ @term_def = false
189
+ clause_parse(attrs.merge(type: "boilerplate"), xml, node)
190
+ @term_def = defs
191
+ end
192
+
190
193
  # subclause contains subclauses
191
194
  def term_def_subclause_parse(attrs, xml, node)
192
- node.role == "nonterm" and
193
- return nonterm_term_def_subclause_parse(attrs, xml, node)
195
+ node.role == "nonterm" and return nonterm_term_def_subclause_parse(attrs, xml, node)
196
+ node.role == "boilerplate" and return terms_boilerplate_parse(attrs, xml, node)
194
197
  st = sectiontype(node, false)
195
198
  return symbols_parse(attrs, xml, node) if @definitions
196
199
  sub = node.find_by(context: :section) { |s| s.level == node.level + 1 }
197
200
  sub.empty? || (return term_def_parse(attrs, xml, node, false))
198
- st == "symbols and abbreviated terms" and
199
- (return symbols_parse(attrs, xml, node))
200
- st == "terms and definitions" and
201
- return clause_parse(attrs, xml, node)
201
+ st == "symbols and abbreviated terms" and (return symbols_parse(attrs, xml, node))
202
+ st == "terms and definitions" and return clause_parse(attrs, xml, node)
202
203
  term_def_subclause_parse1(attrs, xml, node)
203
204
  end
204
205