metanorma-standoc 1.4.4 → 1.6.0

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