metanorma-standoc 1.4.4 → 1.6.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 (74) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/macos.yml +4 -9
  3. data/.github/workflows/ubuntu.yml +1 -5
  4. data/.github/workflows/windows.yml +2 -12
  5. data/.rubocop.yml +1 -1
  6. data/lib/asciidoctor/standoc/base.rb +11 -5
  7. data/lib/asciidoctor/standoc/base_structured_text_preprocessor.rb +123 -0
  8. data/lib/asciidoctor/standoc/basicdoc.rng +23 -0
  9. data/lib/asciidoctor/standoc/cleanup.rb +32 -12
  10. data/lib/asciidoctor/standoc/cleanup_amend.rb +54 -0
  11. data/lib/asciidoctor/standoc/cleanup_block.rb +0 -2
  12. data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +11 -24
  13. data/lib/asciidoctor/standoc/cleanup_footnotes.rb +0 -3
  14. data/lib/asciidoctor/standoc/cleanup_inline.rb +62 -1
  15. data/lib/asciidoctor/standoc/cleanup_ref.rb +10 -7
  16. data/lib/asciidoctor/standoc/cleanup_section.rb +91 -8
  17. data/lib/asciidoctor/standoc/cleanup_terms.rb +12 -2
  18. data/lib/asciidoctor/standoc/converter.rb +3 -3
  19. data/lib/asciidoctor/standoc/front.rb +0 -12
  20. data/lib/asciidoctor/standoc/front_contributor.rb +51 -10
  21. data/lib/asciidoctor/standoc/inline.rb +21 -31
  22. data/lib/asciidoctor/standoc/isodoc.rng +137 -21
  23. data/lib/asciidoctor/standoc/json2_text_preprocessor.rb +44 -0
  24. data/lib/asciidoctor/standoc/log.rb +10 -1
  25. data/lib/asciidoctor/standoc/macros.rb +45 -33
  26. data/lib/asciidoctor/standoc/ref.rb +45 -45
  27. data/lib/asciidoctor/standoc/section.rb +39 -30
  28. data/lib/asciidoctor/standoc/table.rb +3 -2
  29. data/lib/asciidoctor/standoc/utils.rb +18 -1
  30. data/lib/asciidoctor/standoc/validate.rb +30 -18
  31. data/lib/asciidoctor/standoc/validate_section.rb +1 -1
  32. data/lib/asciidoctor/standoc/views/datamodel/model_representation.adoc.erb +10 -10
  33. data/lib/asciidoctor/standoc/yaml2_text_preprocessor.rb +46 -0
  34. data/lib/liquid/custom_blocks/key_iterator.rb +21 -0
  35. data/lib/liquid/custom_filters/values.rb +7 -0
  36. data/lib/metanorma/standoc.rb +0 -5
  37. data/lib/metanorma/standoc/version.rb +20 -1
  38. data/metanorma-standoc.gemspec +4 -5
  39. data/spec/asciidoctor-standoc/base_spec.rb +140 -7
  40. data/spec/asciidoctor-standoc/blocks_spec.rb +275 -149
  41. data/spec/asciidoctor-standoc/cleanup_spec.rb +1372 -56
  42. data/spec/asciidoctor-standoc/inline_spec.rb +133 -6
  43. data/spec/asciidoctor-standoc/isobib_cache_spec.rb +9 -7
  44. data/spec/asciidoctor-standoc/macros_json2text_spec.rb +10 -0
  45. data/spec/asciidoctor-standoc/macros_spec.rb +43 -23
  46. data/spec/asciidoctor-standoc/macros_yaml2text_spec.rb +5 -560
  47. data/spec/asciidoctor-standoc/refs_dl_spec.rb +9 -7
  48. data/spec/asciidoctor-standoc/refs_spec.rb +43 -34
  49. data/spec/asciidoctor-standoc/section_spec.rb +42 -39
  50. data/spec/asciidoctor-standoc/table_spec.rb +119 -113
  51. data/spec/asciidoctor-standoc/validate_spec.rb +45 -1
  52. data/spec/assets/i18n.yaml +17 -2
  53. data/spec/examples/codes_table.html +1365 -1365
  54. data/spec/fixtures/macros_datamodel/address_class_profile.xml +46 -46
  55. data/spec/fixtures/macros_datamodel/address_component_profile.xml +21 -21
  56. data/spec/fixtures/macros_datamodel/blank_definition_profile.xml +21 -21
  57. data/spec/metanorma/processor_spec.rb +1 -2
  58. data/spec/spec_helper.rb +110 -109
  59. data/spec/support/shared_examples/structured_data_2_text_preprocessor.rb +629 -0
  60. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +71 -71
  61. data/spec/vcr_cassettes/isobib_get_123.yml +16 -16
  62. data/spec/vcr_cassettes/isobib_get_123_1.yml +36 -36
  63. data/spec/vcr_cassettes/isobib_get_123_2001.yml +16 -16
  64. data/spec/vcr_cassettes/isobib_get_124.yml +17 -17
  65. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +8 -8
  66. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +39 -37
  67. metadata +29 -14
  68. data/lib/asciidoctor-yaml/i18n-en.yaml +0 -20
  69. data/lib/asciidoctor-yaml/i18n-fr.yaml +0 -13
  70. data/lib/asciidoctor-yaml/i18n-zh-Hans.yaml +0 -15
  71. data/lib/asciidoctor/standoc/i18n.rb +0 -39
  72. data/lib/asciidoctor/standoc/macros_yaml2text.rb +0 -165
  73. data/lib/metanorma/standoc/latexml_requirement.rb +0 -62
  74. data/lib/metanorma/standoc/requirement.rb +0 -13
@@ -42,8 +42,7 @@ module Asciidoctor
42
42
 
43
43
  def docid(t, code)
44
44
  type, code1 = /^\[\d+\]$|^\([^)]+\).*$/.match(code) ?
45
- ["metanorma", mn_code(code)] :
46
- @bibdb&.docid_type(code) || [nil, code]
45
+ ["metanorma", mn_code(code)] : @bibdb&.docid_type(code) || [nil, code]
47
46
  code1.sub!(/^nofetch\((.+)\)$/, "\\1")
48
47
  t.docidentifier **attr_code(type: type) do |d|
49
48
  d << code1
@@ -61,10 +60,10 @@ module Asciidoctor
61
60
  end
62
61
 
63
62
  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
+ t.title(**plaintxt) { |i| i << ref_normalise(m[:text]) }
64
+ docid(t, m[:usrlbl]) if m[:usrlbl]
65
+ docid(t, id_and_year(m[:code], yr) + allp)
66
+ docnumber(t, m[:code])
68
67
  end
69
68
 
70
69
  def isorefmatches(xml, m)
@@ -84,6 +83,10 @@ module Asciidoctor
84
83
  ref = fetch_ref xml, m[:code], nil, no_year: true, note: m[:fn],
85
84
  title: m[:text], usrlbl: m[:usrlbl]
86
85
  return use_my_anchor(ref, m[:anchor]) if ref
86
+ isorefmatches2_1(xml, m)
87
+ end
88
+
89
+ def isorefmatches2_1(xml, m)
87
90
  xml.bibitem **attr_code(ref_attributes(m)) do |t|
88
91
  isorefrender1(t, m, "--")
89
92
  t.date **{ type: "published" } do |d|
@@ -106,15 +109,17 @@ module Asciidoctor
106
109
 
107
110
  def isorefmatches3(xml, m)
108
111
  yr = norm_year(m[:year])
109
- hasyr = m.names.include?("year") && yr != "--"
110
- noyr = m.names.include?("year") && yr == "--"
111
- ref = fetch_ref xml, m[:code], hasyr ? yr : nil,
112
- all_parts: true, no_year: noyr, text: m[:text], usrlbl: m[:usrlbl]
112
+ hasyr = !yr.nil? && yr != "--"
113
+ ref = fetch_ref xml, m[:code], hasyr ? yr : nil, all_parts: true,
114
+ no_year: yr == "--", text: m[:text], usrlbl: m[:usrlbl]
113
115
  return use_my_anchor(ref, m[:anchor]) if ref
116
+ isorefmatches3_1(xml, m, yr, hasyr, ref)
117
+ end
114
118
 
119
+ def isorefmatches3_1(xml, m, yr, hasyr, ref)
115
120
  xml.bibitem(**attr_code(ref_attributes(m))) do |t|
116
121
  isorefrender1(t, m, yr, " (all parts)")
117
- conditional_date(t, m, noyr)
122
+ conditional_date(t, m, yr == "--")
118
123
  iso_publisher(t, m[:code])
119
124
  m.names.include?("fn") && m[:fn] and
120
125
  t.note(**plaintxt.merge(type: "ISO DATE")) { |p| p << "#{m[:fn]}" }
@@ -146,43 +151,32 @@ module Asciidoctor
146
151
  end
147
152
 
148
153
  MALFORMED_REF = "no anchor on reference, markup may be malformed: see "\
149
- "https://www.metanorma.com/author/topics/document-format/bibliography/ , "\
150
- "https://www.metanorma.com/author/iso/topics/markup/#bibliographies".freeze
154
+ "https://www.metanorma.com/author/topics/document-format/"\
155
+ "bibliography/ , https://www.metanorma.com/author/iso/topics/markup/"\
156
+ "#bibliographies".freeze
151
157
 
152
158
  def analyse_ref_nofetch(ret)
153
- if m = /^nofetch\((?<id>.+)\)$/.match(ret[:id])
154
- ret[:id] = m[:id]
155
- ret[:nofetch] = true
156
- end
157
- ret
159
+ return ret unless m = /^nofetch\((?<id>.+)\)$/.match(ret[:id])
160
+ ret.merge(id: m[:id], nofetch: true)
158
161
  end
159
-
162
+
160
163
  def analyse_ref_repo_path(ret)
161
- if m = /^(?<type>repo|path):\((?<key>[^,]+),(?<id>.+)\)$/.match(ret[:id])
162
- ret[:id] = m[:id]
163
- ret[:type] = m[:type]
164
- ret[:key] = m[:key]
165
- ret[:nofetch] = true
166
- end
167
- ret
164
+ return ret unless m =
165
+ /^(?<type>repo|path):\((?<key>[^,]+),(?<id>.+)\)$/.match(ret[:id])
166
+ ret.merge(id: m[:id], type: m[:type], key: m[:key], nofetch: true)
168
167
  end
169
168
 
170
169
  def analyse_ref_numeric(ret)
171
- if /^\d+$/.match(ret[:id])
172
- ret[:numeric] = true
173
- end
174
- ret
170
+ return ret unless /^\d+$/.match(ret[:id])
171
+ ret.merge(numeric: true)
175
172
  end
176
173
 
177
174
  # ref id = (usrlbl)code[:-]year
178
- # code = nofetch(code) | (repo|path):(key,code) | \[? number \]? | identifier
175
+ # code = nofetch(code) | (repo|path):(key,code) | \[? number \]? | ident
179
176
  def analyse_ref_code(code)
180
177
  ret = {id: code}
181
178
  return ret if code.nil? || code.empty?
182
- ret = analyse_ref_nofetch(ret)
183
- ret = analyse_ref_repo_path(ret)
184
- ret = analyse_ref_numeric(ret)
185
- ret
179
+ analyse_ref_nofetch(analyse_ref_repo_path(analyse_ref_numeric(ret)))
186
180
  end
187
181
 
188
182
  # TODO: alternative where only title is available
@@ -191,6 +185,10 @@ module Asciidoctor
191
185
  @log.add("AsciiDoc Input", node, "#{MALFORMED_REF}: #{item}")
192
186
  return
193
187
  end
188
+ refitem1(xml, item, m)
189
+ end
190
+
191
+ def refitem1(xml, item, m)
194
192
  code = analyse_ref_code(m[:code])
195
193
  unless code[:id] && code[:numeric] || code[:nofetch]
196
194
  ref = fetch_ref xml, code[:id],
@@ -215,23 +213,25 @@ module Asciidoctor
215
213
  (?<text>.*)$}xm
216
214
 
217
215
  ISO_REF_NO_YEAR = %r{^<ref\sid="(?<anchor>[^"]+)">
218
- \[(?<usrlbl>\([^)]+\))?(?<code>(ISO|IEC)[^0-9]*\s[0-9-]+):(--|\&\#821[12]\;)\]</ref>,?\s*
216
+ \[(?<usrlbl>\([^)]+\))?(?<code>(ISO|IEC)[^0-9]*\s[0-9-]+):
217
+ (--|\&\#821[12]\;)\]</ref>,?\s*
219
218
  (<fn[^>]*>\s*<p>(?<fn>[^\]]+)</p>\s*</fn>)?,?\s?(?<text>.*)$}xm
220
219
 
221
220
  ISO_REF_ALL_PARTS = %r{^<ref\sid="(?<anchor>[^"]+)">
222
- \[(?<usrlbl>\([^)]+\))?(?<code>(ISO|IEC)[^0-9]*\s[0-9]+)(:(?<year>--|\&\#821[12]\;|[0-9][0-9-]+))?\s
221
+ \[(?<usrlbl>\([^)]+\))?(?<code>(ISO|IEC)[^0-9]*\s[0-9]+)
222
+ (:(?<year>--|\&\#821[12]\;|[0-9][0-9-]+))?\s
223
223
  \(all\sparts\)\]</ref>,?\s*
224
224
  (<fn[^>]*>\s*<p>(?<fn>[^\]]+)</p>\s*</fn>,?\s?)?(?<text>.*)$}xm
225
225
 
226
226
  NON_ISO_REF = %r{^<ref\sid="(?<anchor>[^"]+)">
227
- \[(?<usrlbl>\([^)]+\))?(?<code>[^\]]+?)([:-](?<year>(19|20)[0-9][0-9]))?\]</ref>,?\s*
228
- (?<text>.*)$}xm
229
-
230
- def reference1_matches(item)
231
- matched = ISO_REF.match item
232
- matched2 = ISO_REF_NO_YEAR.match item
233
- matched3 = ISO_REF_ALL_PARTS.match item
234
- [matched, matched2, matched3]
227
+ \[(?<usrlbl>\([^)]+\))?(?<code>[^\]]+?)
228
+ ([:-](?<year>(19|20)[0-9][0-9]))?\]</ref>,?\s*(?<text>.*)$}xm
229
+
230
+ def reference1_matches(item)
231
+ matched = ISO_REF.match item
232
+ matched2 = ISO_REF_NO_YEAR.match item
233
+ matched3 = ISO_REF_ALL_PARTS.match item
234
+ [matched, matched2, matched3]
235
235
  end
236
236
 
237
237
  def reference1(node, item, xml)
@@ -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
@@ -42,7 +46,7 @@ module Asciidoctor
42
46
  end
43
47
 
44
48
  def section_attributes(node)
45
- { id: Utils::anchor_or_uuid(node),
49
+ ret = { id: Utils::anchor_or_uuid(node),
46
50
  language: node.attributes["language"],
47
51
  script: node.attributes["script"],
48
52
  annex: (
@@ -51,8 +55,13 @@ module Asciidoctor
51
55
  ),
52
56
  preface: (
53
57
  (node.role == "preface" || node.attr("style") == "preface") ?
54
- true : nil),
55
- }
58
+ true : nil) }
59
+ return ret unless node.attributes["change"]
60
+ ret.merge(change: node.attributes["change"],
61
+ path: node.attributes["path"],
62
+ path_end: node.attributes["path_end"],
63
+ title: node.attributes["title"],
64
+ )
56
65
  end
57
66
 
58
67
  def section(node)
@@ -61,16 +70,18 @@ module Asciidoctor
61
70
  case sectiontype(node)
62
71
  when "introduction" then introduction_parse(a, xml, node)
63
72
  when "foreword" then foreword_parse(a, xml, node)
73
+ when "scope" then scope_parse(a, xml, node)
64
74
  when "normative references" then norm_ref_parse(a, xml, node)
65
75
  when "terms and definitions"
66
76
  @term_def = true
67
77
  term_def_parse(a, xml, node, true)
68
78
  @term_def = false
69
79
  when "symbols and abbreviated terms"
70
- symbols_parse(a, xml, node)
80
+ symbols_parse(symbols_attrs(node, a), xml, node)
71
81
  when "acknowledgements"
72
82
  acknowledgements_parse(a, xml, node)
73
- when "bibliography" then bibliography_parse(a, xml, node)
83
+ when "bibliography"
84
+ bibliography_parse(a, xml, node)
74
85
  else
75
86
  if @term_def then term_def_subclause_parse(a, xml, node)
76
87
  elsif @definitions then symbols_parse(a, xml, node)
@@ -106,7 +117,7 @@ module Asciidoctor
106
117
  def preamble(node)
107
118
  noko do |xml|
108
119
  xml.foreword **attr_code(section_attributes(node)) do |xml_abstract|
109
- xml_abstract.title { |t| t << (node.blocks[0].title || "Foreword") }
120
+ xml_abstract.title { |t| t << (node.blocks[0].title || @i18n.foreword) }
110
121
  content = node.content
111
122
  xml_abstract << content
112
123
  end
@@ -119,6 +130,10 @@ module Asciidoctor
119
130
  end
120
131
  end
121
132
 
133
+ def scope_parse(attrs, xml, node)
134
+ clause_parse(attrs.merge(type: "scope"), xml, node)
135
+ end
136
+
122
137
  def clause_parse(attrs, xml, node)
123
138
  attrs["inline-header".to_sym] = node.option? "inline-header"
124
139
  attrs[:bibitem] = true if node.option? "bibitem"
@@ -140,9 +155,19 @@ module Asciidoctor
140
155
  end
141
156
 
142
157
  def nonterm_symbols_parse(attrs, xml, node)
158
+ defs = @definitions
143
159
  @definitions = false
144
160
  clause_parse(attrs, xml, node)
145
- @definitions = true
161
+ @definitions = defs
162
+ end
163
+
164
+ def symbols_attrs(node, a)
165
+ case sectiontype1(node)
166
+ when "symbols" then a.merge(type: "symbols")
167
+ when "abbreviated terms", "abbreviations" then a.merge(type: "abbreviated_terms")
168
+ else
169
+ a
170
+ end
146
171
  end
147
172
 
148
173
  def symbols_parse(attr, xml, node)
@@ -159,13 +184,11 @@ module Asciidoctor
159
184
  end
160
185
  end
161
186
 
162
- SYMBOLS_TITLES = ["symbols and abbreviated terms", "symbols",
163
- "abbreviated terms"].freeze
164
-
165
187
  def nonterm_term_def_subclause_parse(attrs, xml, node)
188
+ defs = @term_def
166
189
  @term_def = false
167
190
  clause_parse(attrs, xml, node)
168
- @term_def = true
191
+ @term_def = defs
169
192
  end
170
193
 
171
194
  # subclause contains subclauses
@@ -190,23 +213,9 @@ module Asciidoctor
190
213
  end
191
214
  end
192
215
 
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
216
  def term_def_parse(attrs, xml, node, toplevel)
208
217
  xml.terms **attr_code(attrs) do |section|
209
- section.title { |t| t << term_def_title(toplevel, node) }
218
+ section.title { |t| t << node.title }
210
219
  (s = node.attr("source")) && s.split(/,/).each do |s1|
211
220
  section.termdocsource(nil, **attr_code(bibitemid: s1))
212
221
  end
@@ -216,7 +225,7 @@ module Asciidoctor
216
225
 
217
226
  def introduction_parse(attrs, xml, node)
218
227
  xml.introduction **attr_code(attrs) do |xml_section|
219
- xml_section.title { |t| t << "Introduction" }
228
+ xml_section.title { |t| t << @i18n.introduction }
220
229
  content = node.content
221
230
  xml_section << content
222
231
  end
@@ -232,7 +241,7 @@ module Asciidoctor
232
241
 
233
242
  def acknowledgements_parse(attrs, xml, node)
234
243
  xml.acknowledgements **attr_code(attrs) do |xml_section|
235
- xml_section.title { |t| t << node.title || "Acknowledgements" }
244
+ xml_section.title { |t| t << node.title || @i18n.acknowledgements }
236
245
  content = node.content
237
246
  xml_section << content
238
247
  end
@@ -45,8 +45,9 @@ module Asciidoctor
45
45
  end
46
46
 
47
47
  def table_cell(c, xml_tr, tblsec)
48
- cell_attributes = { id: c.id, colspan: c.colspan,
49
- rowspan: c.rowspan, align: c.attr("halign") }
48
+ cell_attributes =
49
+ { id: c.id, colspan: c.colspan, valign: c.attr("valign"),
50
+ rowspan: c.rowspan, align: c.attr("halign") }
50
51
  cell_tag = "td"
51
52
  cell_tag = "th" if tblsec == :head || c.style == :header
52
53
  xml_tr.send cell_tag, **attr_code(cell_attributes) do |thd|
@@ -128,7 +128,8 @@ module Asciidoctor
128
128
  ::Nokogiri::XML::Builder.with fragment, &block
129
129
  fragment.to_xml(encoding: "US-ASCII", indent: 0).lines.map do |l|
130
130
  l.gsub(/>\n$/, ">").gsub(/\s*\n$/m, " ").gsub("&#150;", "\u0096").
131
- gsub("&#151;", "\u0097")
131
+ gsub("&#151;", "\u0097").gsub("&#x96;", "\u0096").
132
+ gsub("&#x97;", "\u0097")
132
133
  end
133
134
  end
134
135
 
@@ -173,6 +174,22 @@ module Asciidoctor
173
174
 
174
175
  SUBCLAUSE_XPATH = "//clause[not(parent::sections)]"\
175
176
  "[not(ancestor::boilerplate)]".freeze
177
+
178
+ def isodoc(lang, script, i18nyaml = nil)
179
+ conv = html_converter(EmptyAttr.new)
180
+ i18n = conv.i18n_init(lang, script, i18nyaml)
181
+ conv.metadata_init(lang, script, i18n)
182
+ conv
183
+ end
184
+
185
+ class EmptyAttr
186
+ def attr(_x)
187
+ nil
188
+ end
189
+ def attributes
190
+ {}
191
+ end
192
+ end
176
193
  end
177
194
  end
178
195
  end
@@ -8,7 +8,8 @@ module Asciidoctor
8
8
  module Standoc
9
9
  module Validate
10
10
 
11
- SOURCELOCALITY = "./termsource/origin//locality[@type = 'clause']/referenceFrom".freeze
11
+ SOURCELOCALITY = "./termsource/origin//locality[@type = 'clause']/"\
12
+ "referenceFrom".freeze
12
13
 
13
14
  def init_iev
14
15
  return nil if @no_isobib
@@ -19,13 +20,16 @@ module Asciidoctor
19
20
 
20
21
  def iev_validate(xmldoc)
21
22
  xmldoc.xpath("//term").each do |t|
22
- /^IEC 60050-/.match(t&.at("./termsource/origin/@citeas")&.text) or next
23
- pref = t.xpath("./preferred").inject([]) { |m, x| m << x&.text&.downcase }
24
- locality = t.xpath(SOURCELOCALITY)&.text or next
23
+ /^IEC 60050-/.match(t&.at("./termsource/origin/@citeas")&.text) &&
24
+ loc = t.xpath(SOURCELOCALITY)&.text or next
25
25
  @iev = init_iev or return
26
- iev = @iev.fetch(locality, xmldoc&.at("//language")&.text || "en") or next
26
+ iev = @iev.fetch(loc, xmldoc&.at("//language")&.text || "en") or next
27
+ pref = t.xpath("./preferred").inject([]) do |m, x|
28
+ m << x&.text&.downcase
29
+ end
27
30
  pref.include?(iev.downcase) or
28
- @log.add("Bibliography", t, %(Term "#{pref[0]}" does not match IEV #{locality} "#{iev}"))
31
+ @log.add("Bibliography", t, %(Term "#{pref[0]}" does not match ) +
32
+ %(IEV #{loc} "#{iev}"))
29
33
  end
30
34
  end
31
35
 
@@ -35,20 +39,26 @@ module Asciidoctor
35
39
  iev_validate(doc.root)
36
40
  end
37
41
 
42
+ def repeat_id_validate1(ids, x)
43
+ if ids[x["id"]]
44
+ @log.add("Anchors", x, "Anchor #{x['id']} has already been used "\
45
+ "at line #{ids[x['id']]}")
46
+ raise StandardError.new "Error: multiple instances of same ID"
47
+ else
48
+ ids[x["id"]] = x.line
49
+ end
50
+ ids
51
+ end
52
+
38
53
  def repeat_id_validate(doc)
39
54
  ids = {}
40
- crash = false
41
- doc.xpath("//*[@id]").each do |x|
42
- if ids[x["id"]]
43
- @log.add("Anchors", x, "Anchor #{x['id']} has already been used at line #{ids[x['id']]}")
44
- crash = true
45
- else
46
- ids[x["id"]] = x.line
55
+ begin
56
+ doc.xpath("//*[@id]").each do |x|
57
+ ids = repeat_id_validate1(ids, x)
47
58
  end
48
- end
49
- if crash
59
+ rescue StandardError => e
50
60
  clean_exit
51
- abort("Cannot deal with multiple instances of same ID")
61
+ abort(e.message)
52
62
  end
53
63
  end
54
64
 
@@ -59,8 +69,10 @@ module Asciidoctor
59
69
  f.close
60
70
  errors = Jing.new(schema).validate(f.path)
61
71
  warn "Syntax Valid!" if errors.none?
62
- errors.each do |error|
63
- @log.add("Syntax", "XML Line #{"%06d" % error[:line]}:#{error[:column]}", error[:message])
72
+ errors.each do |e|
73
+ @log.add("Metanorma XML Syntax",
74
+ "XML Line #{"%06d" % e[:line]}:#{e[:column]}",
75
+ e[:message])
64
76
  end
65
77
  rescue Jing::Error => e
66
78
  clean_exit
@@ -22,7 +22,7 @@ module Asciidoctor
22
22
  def style_warning(node, msg, text = nil)
23
23
  w = msg
24
24
  w += ": #{text}" if text
25
- @log.add("Style Warning", node, w)
25
+ @log.add("Metanorma XML Style Warning", node, w)
26
26
  end
27
27
 
28
28
  def asset_title_style(root)