metanorma-standoc 1.6.1 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
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