metanorma-standoc 1.4.0 → 1.5.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 (64) 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 +28 -27
  8. data/lib/asciidoctor/standoc/biblio.rng +1 -1
  9. data/lib/asciidoctor/standoc/blocks.rb +25 -95
  10. data/lib/asciidoctor/standoc/blocks_notes.rb +89 -0
  11. data/lib/asciidoctor/standoc/cleanup.rb +10 -6
  12. data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +11 -24
  13. data/lib/asciidoctor/standoc/cleanup_inline.rb +1 -1
  14. data/lib/asciidoctor/standoc/cleanup_ref.rb +47 -1
  15. data/lib/asciidoctor/standoc/cleanup_section.rb +72 -5
  16. data/lib/asciidoctor/standoc/cleanup_terms.rb +10 -0
  17. data/lib/asciidoctor/standoc/converter.rb +16 -2
  18. data/lib/asciidoctor/standoc/inline.rb +1 -1
  19. data/lib/asciidoctor/standoc/isodoc.rng +439 -6
  20. data/lib/asciidoctor/standoc/lists.rb +12 -12
  21. data/lib/asciidoctor/standoc/macros_yaml2text.rb +32 -15
  22. data/lib/asciidoctor/standoc/ref.rb +75 -34
  23. data/lib/asciidoctor/standoc/reqt.rb +11 -6
  24. data/lib/asciidoctor/standoc/reqt.rng +23 -0
  25. data/lib/asciidoctor/standoc/section.rb +27 -25
  26. data/lib/asciidoctor/standoc/table.rb +3 -2
  27. data/lib/asciidoctor/standoc/utils.rb +16 -0
  28. data/lib/asciidoctor/standoc/views/datamodel/model_representation.adoc.erb +1 -1
  29. data/lib/metanorma/standoc/processor.rb +5 -7
  30. data/lib/metanorma/standoc/version.rb +1 -1
  31. data/metanorma-standoc.gemspec +3 -2
  32. data/spec/asciidoctor-standoc/base_spec.rb +3 -2
  33. data/spec/asciidoctor-standoc/blocks_spec.rb +68 -32
  34. data/spec/asciidoctor-standoc/cleanup_spec.rb +1221 -17
  35. data/spec/asciidoctor-standoc/datamodel/attributes_table_preprocessor_spec.rb +35 -0
  36. data/spec/asciidoctor-standoc/inline_spec.rb +3 -3
  37. data/spec/asciidoctor-standoc/isobib_cache_spec.rb +4 -4
  38. data/spec/asciidoctor-standoc/lists_spec.rb +7 -5
  39. data/spec/asciidoctor-standoc/macros_spec.rb +4 -3
  40. data/spec/asciidoctor-standoc/refs_dl_spec.rb +8 -6
  41. data/spec/asciidoctor-standoc/refs_spec.rb +275 -30
  42. data/spec/asciidoctor-standoc/section_spec.rb +42 -38
  43. data/spec/asciidoctor-standoc/table_spec.rb +3 -3
  44. data/spec/asciidoctor-standoc/validate_spec.rb +56 -0
  45. data/spec/assets/{html.css → html.scss} +0 -0
  46. data/spec/assets/i18n.yaml +17 -2
  47. data/spec/assets/iso123.rxl +107 -0
  48. data/spec/assets/{word.css → word.scss} +0 -0
  49. data/spec/examples/datamodel/blank_definition_profile.adoc +4 -0
  50. data/spec/examples/datamodel/models/models/{Signature copy.yml → SignatureBlankDefinition.yml} +2 -2
  51. data/spec/fixtures/macros_datamodel/blank_definition_profile.xml +51 -0
  52. data/spec/metanorma/processor_spec.rb +5 -6
  53. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +83 -83
  54. data/spec/vcr_cassettes/isobib_get_123.yml +19 -198
  55. data/spec/vcr_cassettes/isobib_get_123_1.yml +361 -0
  56. data/spec/vcr_cassettes/isobib_get_123_2001.yml +19 -19
  57. data/spec/vcr_cassettes/isobib_get_124.yml +21 -21
  58. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +10 -10
  59. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +42 -42
  60. metadata +32 -18
  61. data/lib/asciidoctor-yaml/i18n-en.yaml +0 -20
  62. data/lib/asciidoctor-yaml/i18n-fr.yaml +0 -13
  63. data/lib/asciidoctor-yaml/i18n-zh-Hans.yaml +0 -15
  64. data/lib/asciidoctor/standoc/i18n.rb +0 -39
@@ -13,7 +13,7 @@ module Asciidoctor
13
13
  end
14
14
 
15
15
  def ul_li(xml_ul, item)
16
- xml_ul.li **ul_li_attr(item) do |xml_li|
16
+ xml_ul.li **ul_li_attrs(item) do |xml_li|
17
17
  if item.blocks?
18
18
  xml_li.p(**id_attr(item)) { |t| t << item.text }
19
19
  xml_li << item.content
@@ -23,11 +23,11 @@ module Asciidoctor
23
23
  end
24
24
  end
25
25
 
26
- def ul_attr(node)
27
- attr_code(id_attr(node))
26
+ def ul_attrs(node)
27
+ attr_code(id_attr(node).merge(keep_attrs(node)))
28
28
  end
29
29
 
30
- def ul_li_attr(node)
30
+ def ul_li_attrs(node)
31
31
  attr_code(
32
32
  uncheckedcheckbox: node.attr?("checkbox") ? !node.attr?("checked") : nil,
33
33
  checkedcheckbox: node.attr?("checkbox") ? node.attr?("checked") : nil,
@@ -37,7 +37,7 @@ module Asciidoctor
37
37
  def ulist(node)
38
38
  return reference(node) if in_norm_ref? || in_biblio?
39
39
  noko do |xml|
40
- xml.ul **ul_attr(node) do |xml_ul|
40
+ xml.ul **ul_attrs(node) do |xml_ul|
41
41
  node.items.each do |item|
42
42
  ul_li(xml_ul, item)
43
43
  end
@@ -53,14 +53,14 @@ module Asciidoctor
53
53
  style
54
54
  end
55
55
 
56
- def ol_attr(node)
57
- attr_code(id: Utils::anchor_or_uuid(node),
58
- type: olist_style(node.style))
56
+ def ol_attrs(node)
57
+ attr_code(keep_attrs(node).merge(id: Utils::anchor_or_uuid(node),
58
+ type: olist_style(node.style)))
59
59
  end
60
60
 
61
61
  def olist(node)
62
62
  noko do |xml|
63
- xml.ol **ol_attr(node) do |xml_ol|
63
+ xml.ol **ol_attrs(node) do |xml_ol|
64
64
  node.items.each { |item| li(xml_ol, item) }
65
65
  end
66
66
  end.join("\n")
@@ -86,13 +86,13 @@ module Asciidoctor
86
86
  end
87
87
  end
88
88
 
89
- def dl_attr(node)
90
- attr_code(id_attr(node))
89
+ def dl_attrs(node)
90
+ attr_code(id_attr(node).merge(keep_attrs(node)))
91
91
  end
92
92
 
93
93
  def dlist(node)
94
94
  noko do |xml|
95
- xml.dl **dl_attr(node) do |xml_dl|
95
+ xml.dl **dl_attrs(node) do |xml_dl|
96
96
  node.items.each do |terms, dd|
97
97
  dt(terms, xml_dl)
98
98
  dd(dd, xml_dl)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'ostruct'
2
4
 
3
5
  module Asciidoctor
@@ -61,7 +63,7 @@ module Asciidoctor
61
63
  # - name: spaghetti
62
64
  # desc: wheat noodles of 9mm diameter
63
65
  # symbol: SPAG
64
- # symbol_def: the situation is message like spaghetti at a kid's meal
66
+ # symbol_def: the situation is message like spaghetti at a kid's
65
67
  #
66
68
  # will produce:
67
69
  # === spaghetti
@@ -77,19 +79,20 @@ module Asciidoctor
77
79
 
78
80
  def processed_lines(document, input_lines)
79
81
  result = []
82
+ current_macro_line_num = 0
80
83
  loop do
81
84
  line = input_lines.next
85
+ current_macro_line_num += 1
82
86
  if yaml_block_match = line.match(/^\[yaml2text,(.+?),(.+?)\]/)
83
87
  mark = input_lines.next
84
88
  current_yaml_block = []
85
89
  while (yaml_block_line = input_lines.next) != mark
86
90
  current_yaml_block.push(yaml_block_line)
87
91
  end
88
- content = nested_open_struct_from_yaml(yaml_block_match[1], document)
89
- result.push(*
90
- parse_blocks_recursively(lines: current_yaml_block,
91
- attributes: content,
92
- context_name: yaml_block_match[2]))
92
+ result.push(*read_yaml_and_parse_template(current_yaml_block,
93
+ document,
94
+ yaml_block_match,
95
+ current_macro_line_num))
93
96
  else
94
97
  result.push(line)
95
98
  end
@@ -97,9 +100,23 @@ module Asciidoctor
97
100
  result
98
101
  end
99
102
 
103
+ def read_yaml_and_parse_template(current_yaml_block, document, yaml_block_match, current_macro_line_num)
104
+ content = nested_open_struct_from_yaml(yaml_block_match[1], document)
105
+ parse_blocks_recursively(lines: current_yaml_block,
106
+ attributes: content,
107
+ context_name: yaml_block_match[2])
108
+ rescue StandardError => exception
109
+ document
110
+ .logger
111
+ .warn("Failed to parse yaml2text block on line #{current_macro_line_num}: #{exception.message}")
112
+ []
113
+ end
114
+
100
115
  def nested_open_struct_from_yaml(file_path, document)
101
116
  docfile_directory = File.dirname(document.attributes['docfile'] || '.')
102
- yaml_file_path = document.path_resolver.system_path(file_path, docfile_directory)
117
+ yaml_file_path = document
118
+ .path_resolver
119
+ .system_path(file_path, docfile_directory)
103
120
  content = YAML.safe_load(File.read(yaml_file_path))
104
121
  # Load content as json, then parse with JSON as nested open_struct
105
122
  JSON.parse(content.to_json, object_class: YamlBlockStruct)
@@ -112,19 +129,19 @@ module Asciidoctor
112
129
  result = []
113
130
  loop do
114
131
  line = lines.next
115
- if line.match(BLOCK_START_REGEXP)
132
+ if line.match?(BLOCK_START_REGEXP)
116
133
  line.gsub!(BLOCK_START_REGEXP,
117
134
  '<% \1.each&.with_index do |\2,index| %>')
118
135
  end
119
136
 
120
- if line.strip.match(BLOCK_END_REGEXP)
137
+ if line.strip.match?(BLOCK_END_REGEXP)
121
138
  line.gsub!(BLOCK_END_REGEXP, '<% end %>')
122
139
  end
123
140
  line.gsub!(/{\s*if\s*([^}]+)}/, '<% if \1 %>')
124
141
  line.gsub!(/{\s*?end\s*?}/, '<% end %>')
125
142
  line = line
126
- .gsub(/{(.+?[^}]*)}/, '<%= \1 %>')
127
- .gsub(/[a-z\.]+\#/, 'index')
143
+ .gsub(/{(.+?[^}]*)}/, '<%= \1 %>')
144
+ .gsub(/[a-z\.]+\#/, 'index')
128
145
  result.push(line)
129
146
  end
130
147
  result = parse_context_block(context_lines: result,
@@ -137,10 +154,10 @@ module Asciidoctor
137
154
  context_items:,
138
155
  context_name:)
139
156
  renderer = YamlContextRenderer
140
- .new(
141
- context_object: context_items,
142
- context_name: context_name
143
- )
157
+ .new(
158
+ context_object: context_items,
159
+ context_name: context_name
160
+ )
144
161
  renderer.render(context_lines.join("\n")).split("\n")
145
162
  end
146
163
  end
@@ -37,8 +37,7 @@ module Asciidoctor
37
37
  end
38
38
 
39
39
  def id_and_year(id, year)
40
- return id unless year
41
- "#{id}:#{year}"
40
+ year ? "#{id}:#{year}" : id
42
41
  end
43
42
 
44
43
  def docid(t, code)
@@ -58,8 +57,14 @@ module Asciidoctor
58
57
  end
59
58
 
60
59
  def norm_year(yr)
61
- return "--" if /^\&\#821[12];$/.match yr
62
- yr
60
+ /^\&\#821[12];$/.match(yr) ? "--" : yr
61
+ end
62
+
63
+ def isorefrender1(t, m, yr, allp = "")
64
+ t.title(**plaintxt) { |i| i << ref_normalise(m[:text]) }
65
+ docid(t, m[:usrlbl]) if m[:usrlbl]
66
+ docid(t, id_and_year(m[:code], yr) + allp)
67
+ docnumber(t, m[:code])
63
68
  end
64
69
 
65
70
  def isorefmatches(xml, m)
@@ -67,10 +72,7 @@ module Asciidoctor
67
72
  ref = fetch_ref xml, m[:code], yr, title: m[:text], usrlbl: m[:usrlbl]
68
73
  return use_my_anchor(ref, m[:anchor]) if ref
69
74
  xml.bibitem **attr_code(ref_attributes(m)) do |t|
70
- t.title(**plaintxt) { |i| i << ref_normalise(m[:text]) }
71
- docid(t, m[:usrlbl]) if m[:usrlbl]
72
- docid(t, id_and_year(m[:code], yr))
73
- docnumber(t, m[:code])
75
+ isorefrender1(t, m, yr)
74
76
  yr and t.date **{ type: "published" } do |d|
75
77
  set_date_range(d, yr)
76
78
  end
@@ -82,61 +84,65 @@ module Asciidoctor
82
84
  ref = fetch_ref xml, m[:code], nil, no_year: true, note: m[:fn],
83
85
  title: m[:text], usrlbl: m[:usrlbl]
84
86
  return use_my_anchor(ref, m[:anchor]) if ref
85
-
86
87
  xml.bibitem **attr_code(ref_attributes(m)) do |t|
87
- t.title(**plaintxt) { |i| i << ref_normalise(m[:text]) }
88
- docid(t, m[:usrlbl]) if m[:usrlbl]
89
- docid(t, id_and_year(m[:code], "--"))
90
- docnumber(t, m[:code])
88
+ isorefrender1(t, m, "--")
91
89
  t.date **{ type: "published" } do |d|
92
90
  d.on "--"
93
91
  end
94
92
  iso_publisher(t, m[:code])
95
- m[:fn].nil? or t.note(**plaintxt) { |p| p << "ISO DATE: #{m[:fn]}" }
93
+ m[:fn].nil? or t.note(**plaintxt.merge(type: "ISO DATE")) do |p|
94
+ p << "#{m[:fn]}"
95
+ end
96
96
  end
97
97
  end
98
98
 
99
99
  def conditional_date(t, m, noyr)
100
100
  m.names.include?("year") and !m[:year].nil? and
101
101
  t.date(**{ type: "published" }) do |d|
102
- if noyr then d.on "--"
103
- else
102
+ noyr and d.on "--" or
104
103
  set_date_range(d, norm_year(m[:year]))
105
- end
106
104
  end
107
105
  end
108
106
 
109
107
  def isorefmatches3(xml, m)
110
108
  yr = norm_year(m[:year])
111
- hasyr = m.names.include?("year") && yr != "--"
112
- noyr = m.names.include?("year") && yr == "--"
113
- ref = fetch_ref xml, m[:code], hasyr ? yr : nil,
114
- all_parts: true, no_year: noyr, text: m[:text], usrlbl: m[:usrlbl]
109
+ #hasyr = m.names.include?("year") && yr != "--"
110
+ hasyr = !yr.nil? && yr != "--"
111
+ #noyr = m.names.include?("year") && yr == "--"
112
+ ref = fetch_ref xml, m[:code], hasyr ? yr : nil, all_parts: true,
113
+ no_year: yr == "--", text: m[:text], usrlbl: m[:usrlbl]
115
114
  return use_my_anchor(ref, m[:anchor]) if ref
116
115
 
117
116
  xml.bibitem(**attr_code(ref_attributes(m))) do |t|
118
- t.title(**plaintxt) { |i| i << ref_normalise(m[:text]) }
119
- docid(t, m[:usrlbl]) if m[:usrlbl]
120
- docid(t, id_and_year(m[:code], yr) + " (all parts)")
121
- docnumber(t, m[:code])
122
- conditional_date(t, m, noyr)
117
+ isorefrender1(t, m, yr, " (all parts)")
118
+ conditional_date(t, m, yr == "--")
123
119
  iso_publisher(t, m[:code])
124
120
  m.names.include?("fn") && m[:fn] and
125
- t.note(**plaintxt) { |p| p << "ISO DATE: #{m[:fn]}" }
121
+ t.note(**plaintxt.merge(type: "ISO DATE")) { |p| p << "#{m[:fn]}" }
126
122
  t.extent **{ type: 'part' } do |e|
127
123
  e.referenceFrom "all"
128
124
  end
129
125
  end
130
126
  end
131
127
 
132
- def refitem_render(xml, m)
128
+ def refitem_render1(m, code, t)
129
+ if code[:type] == "path"
130
+ t.uri code[:key].sub(/\.[a-zA-Z0-9]+$/, ""), **{ type: "URI" }
131
+ t.uri code[:key].sub(/\.[a-zA-Z0-9]+$/, ""), **{ type: "citation" }
132
+ end
133
+ docid(t, m[:usrlbl]) if m[:usrlbl]
134
+ docid(t, /^\d+$/.match(code[:id]) ? "[#{code[:id]}]" : code[:id])
135
+ code[:type] == "repo" and
136
+ t.docidentifier code[:key], **{ type: "repository" }
137
+ end
138
+
139
+ def refitem_render(xml, m, code)
133
140
  xml.bibitem **attr_code(id: m[:anchor]) do |t|
134
141
  t.formattedref **{ format: "application/x-isodoc+xml" } do |i|
135
142
  i << ref_normalise_no_format(m[:text])
136
143
  end
137
- docid(t, m[:usrlbl]) if m[:usrlbl]
138
- docid(t, /^\d+$/.match(m[:code]) ? "[#{m[:code]}]" : m[:code])
139
- docnumber(t, m[:code]) unless /^\d+$|^\(.+\)$/.match(m[:code])
144
+ refitem_render1(m, code, t)
145
+ docnumber(t, code[:id]) unless /^\d+$|^\(.+\)$/.match(code[:id])
140
146
  end
141
147
  end
142
148
 
@@ -144,19 +150,54 @@ module Asciidoctor
144
150
  "https://www.metanorma.com/author/topics/document-format/bibliography/ , "\
145
151
  "https://www.metanorma.com/author/iso/topics/markup/#bibliographies".freeze
146
152
 
153
+ def analyse_ref_nofetch(ret)
154
+ return ret unless m = /^nofetch\((?<id>.+)\)$/.match(ret[:id])
155
+ ret[:id] = m[:id]
156
+ ret[:nofetch] = true
157
+ ret
158
+ end
159
+
160
+ def analyse_ref_repo_path(ret)
161
+ return ret unless m =
162
+ /^(?<type>repo|path):\((?<key>[^,]+),(?<id>.+)\)$/.match(ret[:id])
163
+ ret[:id] = m[:id]
164
+ ret[:type] = m[:type]
165
+ ret[:key] = m[:key]
166
+ ret[:nofetch] = true
167
+ ret
168
+ end
169
+
170
+ def analyse_ref_numeric(ret)
171
+ return ret unless /^\d+$/.match(ret[:id])
172
+ ret[:numeric] = true
173
+ ret
174
+ end
175
+
176
+ # ref id = (usrlbl)code[:-]year
177
+ # code = nofetch(code) | (repo|path):(key,code) | \[? number \]? | ident
178
+ def analyse_ref_code(code)
179
+ ret = {id: code}
180
+ return ret if code.nil? || code.empty?
181
+ ret = analyse_ref_nofetch(ret)
182
+ ret = analyse_ref_repo_path(ret)
183
+ ret = analyse_ref_numeric(ret)
184
+ ret
185
+ end
186
+
147
187
  # TODO: alternative where only title is available
148
188
  def refitem(xml, item, node)
149
189
  unless m = NON_ISO_REF.match(item)
150
190
  @log.add("AsciiDoc Input", node, "#{MALFORMED_REF}: #{item}")
151
191
  return
152
192
  end
153
- unless m[:code] && /^\d+$/.match(m[:code])
154
- ref = fetch_ref xml, m[:code],
193
+ code = analyse_ref_code(m[:code])
194
+ unless code[:id] && code[:numeric] || code[:nofetch]
195
+ ref = fetch_ref xml, code[:id],
155
196
  m.names.include?("year") ? m[:year] : nil, title: m[:text],
156
197
  usrlbl: m[:usrlbl]
157
198
  return use_my_anchor(ref, m[:anchor]) if ref
158
199
  end
159
- refitem_render(xml, m)
200
+ refitem_render(xml, m, code)
160
201
  end
161
202
 
162
203
  def ref_normalise(ref)
@@ -6,11 +6,15 @@ require "base64"
6
6
  module Asciidoctor
7
7
  module Standoc
8
8
  module Blocks
9
+ def reqt_subpart_attrs(node)
10
+ attr_code(keep_attrs(node).merge(exclude: node.option?("exclude"),
11
+ type: node.attr("type")))
12
+ end
13
+
9
14
  def requirement_subpart(node)
10
15
  name = node.role || node.attr("style")
11
16
  noko do |xml|
12
- xml.send name, **attr_code(exclude: node.option?("exclude"),
13
- type: node.attr("type")) do |o|
17
+ xml.send name, **reqt_subpart_attrs(node) do |o|
14
18
  o << node.content
15
19
  end
16
20
  end
@@ -35,22 +39,23 @@ module Asciidoctor
35
39
  end
36
40
  end
37
41
 
38
- def reqt_attributes(node)
39
- {
42
+ def reqt_attrs(node)
43
+ attr_code(keep_attrs(node).merge(id_unnum_attrs(node)).merge(
40
44
  id: Utils::anchor_or_uuid(node),
41
45
  unnumbered: node.option?("unnumbered") ? "true" : nil,
46
+ number: node.attr("number"),
42
47
  subsequence: node.attr("subsequence"),
43
48
  obligation: node.attr("obligation"),
44
49
  filename: node.attr("filename"),
45
50
  type: node.attr("type"),
46
51
  model: node.attr("model"),
47
- }
52
+ ))
48
53
  end
49
54
 
50
55
  def requirement(node, obligation)
51
56
  classif = node.attr("classification")
52
57
  noko do |xml|
53
- xml.send obligation, **attr_code(reqt_attributes(node)) do |ex|
58
+ xml.send obligation, **reqt_attrs(node) do |ex|
54
59
  node.title and ex.title { |t| t << node.title }
55
60
  node.attr("label") and ex.label { |l| l << node.attr("label") }
56
61
  node.attr("subject") and ex.subject { |s| s << node.attr("subject") }
@@ -30,9 +30,22 @@
30
30
  <data type="boolean"/>
31
31
  </attribute>
32
32
  </optional>
33
+ <optional>
34
+ <attribute name="number"/>
35
+ </optional>
33
36
  <optional>
34
37
  <attribute name="subsequence"/>
35
38
  </optional>
39
+ <optional>
40
+ <attribute name="keep-with-next">
41
+ <data type="boolean"/>
42
+ </attribute>
43
+ </optional>
44
+ <optional>
45
+ <attribute name="keep-lines-together">
46
+ <data type="boolean"/>
47
+ </attribute>
48
+ </optional>
36
49
  <attribute name="id">
37
50
  <data type="ID"/>
38
51
  </attribute>
@@ -141,6 +154,16 @@
141
154
  <data type="boolean"/>
142
155
  </attribute>
143
156
  </optional>
157
+ <optional>
158
+ <attribute name="keep-with-next">
159
+ <data type="boolean"/>
160
+ </attribute>
161
+ </optional>
162
+ <optional>
163
+ <attribute name="keep-lines-together">
164
+ <data type="boolean"/>
165
+ </attribute>
166
+ </optional>
144
167
  <oneOrMore>
145
168
  <ref name="BasicBlock"/>
146
169
  </oneOrMore>
@@ -13,9 +13,13 @@ module Asciidoctor
13
13
  @term_def
14
14
  end
15
15
 
16
- def sectiontype(node, level = true)
17
- ret = node&.attr("heading")&.downcase ||
16
+ def sectiontype1(node)
17
+ node&.attr("heading")&.downcase ||
18
18
  node.title.gsub(/<[^>]+>/, "").downcase
19
+ end
20
+
21
+ def sectiontype(node, level = true)
22
+ ret = sectiontype1(node)
19
23
  ret1 = sectiontype_streamline(ret)
20
24
  return ret1 if "symbols and abbreviated terms" == ret1
21
25
  return nil unless !level || node.level == 1
@@ -61,16 +65,18 @@ module Asciidoctor
61
65
  case sectiontype(node)
62
66
  when "introduction" then introduction_parse(a, xml, node)
63
67
  when "foreword" then foreword_parse(a, xml, node)
68
+ when "scope" then scope_parse(a, xml, node)
64
69
  when "normative references" then norm_ref_parse(a, xml, node)
65
70
  when "terms and definitions"
66
71
  @term_def = true
67
72
  term_def_parse(a, xml, node, true)
68
73
  @term_def = false
69
74
  when "symbols and abbreviated terms"
70
- symbols_parse(a, xml, node)
75
+ symbols_parse(symbols_attrs(node, a), xml, node)
71
76
  when "acknowledgements"
72
77
  acknowledgements_parse(a, xml, node)
73
- when "bibliography" then bibliography_parse(a, xml, node)
78
+ when "bibliography"
79
+ bibliography_parse(a, xml, node)
74
80
  else
75
81
  if @term_def then term_def_subclause_parse(a, xml, node)
76
82
  elsif @definitions then symbols_parse(a, xml, node)
@@ -106,7 +112,7 @@ module Asciidoctor
106
112
  def preamble(node)
107
113
  noko do |xml|
108
114
  xml.foreword **attr_code(section_attributes(node)) do |xml_abstract|
109
- xml_abstract.title { |t| t << (node.blocks[0].title || "Foreword") }
115
+ xml_abstract.title { |t| t << (node.blocks[0].title || @i18n.foreword) }
110
116
  content = node.content
111
117
  xml_abstract << content
112
118
  end
@@ -119,6 +125,10 @@ module Asciidoctor
119
125
  end
120
126
  end
121
127
 
128
+ def scope_parse(attrs, xml, node)
129
+ clause_parse(attrs.merge(type: "scope"), xml, node)
130
+ end
131
+
122
132
  def clause_parse(attrs, xml, node)
123
133
  attrs["inline-header".to_sym] = node.option? "inline-header"
124
134
  attrs[:bibitem] = true if node.option? "bibitem"
@@ -145,6 +155,15 @@ module Asciidoctor
145
155
  @definitions = true
146
156
  end
147
157
 
158
+ def symbols_attrs(node, a)
159
+ case sectiontype1(node)
160
+ when "symbols" then a.merge(type: "symbols")
161
+ when "abbreviated terms", "abbreviations" then a.merge(type: "abbreviated_terms")
162
+ else
163
+ a
164
+ end
165
+ end
166
+
148
167
  def symbols_parse(attr, xml, node)
149
168
  node.role == "nonterm" and return nonterm_symbols_parse(attr, xml, node)
150
169
  xml.definitions **attr_code(attr) do |xml_section|
@@ -159,9 +178,6 @@ module Asciidoctor
159
178
  end
160
179
  end
161
180
 
162
- SYMBOLS_TITLES = ["symbols and abbreviated terms", "symbols",
163
- "abbreviated terms"].freeze
164
-
165
181
  def nonterm_term_def_subclause_parse(attrs, xml, node)
166
182
  @term_def = false
167
183
  clause_parse(attrs, xml, node)
@@ -190,23 +206,9 @@ module Asciidoctor
190
206
  end
191
207
  end
192
208
 
193
- def term_def_title(toplevel, node)
194
- return node.title unless toplevel
195
- sub = node.find_by(context: :section) do |s|
196
- SYMBOLS_TITLES.include? s.title.downcase
197
- end
198
- return "Terms and definitions" if sub.empty?
199
- sym = /symbol/i.match(node.title)
200
- abbrev = /abbreviat/i.match(node.title)
201
- sym && abbrev and return "Terms, definitions, symbols and abbreviated terms"
202
- sym and return "Terms, definitions and symbols"
203
- abbrev and return "Terms, definitions and abbreviated terms"
204
- "Terms, definitions, symbols and abbreviated terms"
205
- end
206
-
207
209
  def term_def_parse(attrs, xml, node, toplevel)
208
210
  xml.terms **attr_code(attrs) do |section|
209
- section.title { |t| t << term_def_title(toplevel, node) }
211
+ section.title { |t| t << node.title }
210
212
  (s = node.attr("source")) && s.split(/,/).each do |s1|
211
213
  section.termdocsource(nil, **attr_code(bibitemid: s1))
212
214
  end
@@ -216,7 +218,7 @@ module Asciidoctor
216
218
 
217
219
  def introduction_parse(attrs, xml, node)
218
220
  xml.introduction **attr_code(attrs) do |xml_section|
219
- xml_section.title { |t| t << "Introduction" }
221
+ xml_section.title { |t| t << @i18n.introduction }
220
222
  content = node.content
221
223
  xml_section << content
222
224
  end
@@ -232,7 +234,7 @@ module Asciidoctor
232
234
 
233
235
  def acknowledgements_parse(attrs, xml, node)
234
236
  xml.acknowledgements **attr_code(attrs) do |xml_section|
235
- xml_section.title { |t| t << node.title || "Acknowledgements" }
237
+ xml_section.title { |t| t << node.title || @i18n.acknowledgements }
236
238
  content = node.content
237
239
  xml_section << content
238
240
  end