metanorma-standoc 2.2.3.1 → 2.2.5

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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/lib/metanorma/standoc/base.rb +2 -1
  3. data/lib/metanorma/standoc/biblio.rng +32 -1
  4. data/lib/metanorma/standoc/blocks.rb +2 -1
  5. data/lib/metanorma/standoc/cleanup_biblio.rb +111 -23
  6. data/lib/metanorma/standoc/cleanup_boilerplate.rb +2 -2
  7. data/lib/metanorma/standoc/front.rb +1 -0
  8. data/lib/metanorma/standoc/isodoc.rng +9 -0
  9. data/lib/metanorma/standoc/macros_plantuml.rb +23 -10
  10. data/lib/metanorma/standoc/render.rb +1 -0
  11. data/lib/metanorma/standoc/term_lookup_cleanup.rb +32 -13
  12. data/lib/metanorma/standoc/utils.rb +3 -3
  13. data/lib/metanorma/standoc/validate.rb +12 -3
  14. data/lib/metanorma/standoc/version.rb +1 -1
  15. data/metanorma-standoc.gemspec +2 -2
  16. data/spec/metanorma/base_spec.rb +10 -1
  17. data/spec/metanorma/biblio_spec.rb +47 -17
  18. data/spec/metanorma/blocks_spec.rb +2 -2
  19. data/spec/metanorma/cleanup_sections_spec.rb +2 -1
  20. data/spec/metanorma/inline_spec.rb +10 -9
  21. data/spec/metanorma/isobib_cache_spec.rb +2 -2
  22. data/spec/metanorma/macros_concept_spec.rb +1 -1
  23. data/spec/metanorma/macros_spec.rb +2 -2
  24. data/spec/metanorma/refs_spec.rb +25 -25
  25. data/spec/metanorma/validate_spec.rb +33 -0
  26. data/spec/vcr_cassettes/bsi16341.yml +38 -38
  27. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +64 -64
  28. data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec1.yml +13 -13
  29. data/spec/vcr_cassettes/hide_refs.yml +53 -53
  30. data/spec/vcr_cassettes/isobib_get_123.yml +11 -11
  31. data/spec/vcr_cassettes/isobib_get_123_1.yml +22 -22
  32. data/spec/vcr_cassettes/isobib_get_123_1_fr.yml +54 -54
  33. data/spec/vcr_cassettes/isobib_get_123_2.yml +24 -24
  34. data/spec/vcr_cassettes/isobib_get_123_2001.yml +12 -12
  35. data/spec/vcr_cassettes/isobib_get_124.yml +11 -11
  36. data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +22 -24
  37. data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +55 -55
  38. data/spec/vcr_cassettes/std-link.yml +13 -13
  39. metadata +6 -10
  40. data/spec/requirements/default/blocks_spec.rb +0 -250
  41. data/spec/requirements/default/cleanup_spec.rb +0 -173
  42. data/spec/requirements/modspec/cleanup_spec.rb +0 -333
  43. data/spec/requirements/modspec/validate_spec.rb +0 -330
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b46155f7c41f4ecd6a79e4395cd145f0f212a64c5bd27f93c8b861fbfcd57982
4
- data.tar.gz: 93bbad048282ad00874a071bbd583c9189d64bf6f7901fe5bacd10c4156c91a6
3
+ metadata.gz: 12bb8cacaa61b510652a691e358e62e0e2e4f4ea1ac37dcff09f394b097051a9
4
+ data.tar.gz: 714fa0c071097b0817e3b95c5066fbd181634f1b7f09cff04e2c1e5eb45b385a
5
5
  SHA512:
6
- metadata.gz: fd795c5f316556c3572c8d963d9d12f9cee6b91189ae288281d40133b09d10b6beeddb39ae1f6748b371b8a239844402cf843f4c796c69e9ab9a73900b0c0123
7
- data.tar.gz: 21803610b86d6f62a7a3d86c9dc34a0c229777bd84ce612cbe916ebcacee95a1442f6a6a09c142e928827f1337063d1e691a950a9dd269c9acc07ab3c89419a3
6
+ metadata.gz: 4a45f4013300b1c263e7f99ff50605e3576157afaacb4710c7a1f9b14c2e1ac6a624737be9a87e6a4ca3205756451b9a7cacde8df4bc8491d508121d5e821772
7
+ data.tar.gz: 0c5bdb3f7a121998082b101488352bba31cad34abedf1f7fb1845cf25438c671545e3c65d09ec6a5bf06a075c8f311edbe4f61d210f470b1da009c71c8ea7627
@@ -100,7 +100,8 @@ module Metanorma
100
100
  @lang = (node.attr("language") || "en")
101
101
  @script = (node.attr("script") ||
102
102
  Metanorma::Utils.default_script(node.attr("language")))
103
- @isodoc = isodoc(@lang, @script, node.attr("i18nyaml"))
103
+ @locale = node.attr("locale")
104
+ @isodoc = isodoc(@lang, @script, @locale, node.attr("i18nyaml"))
104
105
  @i18n = @isodoc.i18n
105
106
  end
106
107
 
@@ -73,8 +73,14 @@
73
73
  <text/>
74
74
  </element>
75
75
  </define>
76
- <define name="script">
76
+ <define name="locale">
77
77
  <a:documentation>ISO-639</a:documentation>
78
+ <element name="locale">
79
+ <text/>
80
+ </element>
81
+ </define>
82
+ <define name="script">
83
+ <a:documentation>ISO-3166</a:documentation>
78
84
  <element name="script">
79
85
  <text/>
80
86
  </element>
@@ -93,6 +99,9 @@
93
99
  <!-- multiple languages and scripts possible: comma delimit them if so -->
94
100
  <attribute name="language"/>
95
101
  </optional>
102
+ <optional>
103
+ <attribute name="locale"/>
104
+ </optional>
96
105
  <optional>
97
106
  <attribute name="script"/>
98
107
  </optional>
@@ -136,6 +145,9 @@
136
145
  <!-- multiple languages and scripts possible: comma delimit them if so -->
137
146
  <attribute name="language"/>
138
147
  </optional>
148
+ <optional>
149
+ <attribute name="locale"/>
150
+ </optional>
139
151
  <optional>
140
152
  <attribute name="script"/>
141
153
  </optional>
@@ -650,6 +662,9 @@
650
662
  <zeroOrMore>
651
663
  <ref name="language"/>
652
664
  </zeroOrMore>
665
+ <zeroOrMore>
666
+ <ref name="locale"/>
667
+ </zeroOrMore>
653
668
  <zeroOrMore>
654
669
  <ref name="script"/>
655
670
  </zeroOrMore>
@@ -741,6 +756,9 @@
741
756
  <zeroOrMore>
742
757
  <ref name="language"/>
743
758
  </zeroOrMore>
759
+ <zeroOrMore>
760
+ <ref name="locale"/>
761
+ </zeroOrMore>
744
762
  <zeroOrMore>
745
763
  <ref name="script"/>
746
764
  </zeroOrMore>
@@ -854,6 +872,15 @@
854
872
  <optional>
855
873
  <attribute name="type"/>
856
874
  </optional>
875
+ <optional>
876
+ <attribute name="language"/>
877
+ </optional>
878
+ <optional>
879
+ <attribute name="locale"/>
880
+ </optional>
881
+ <optional>
882
+ <attribute name="script"/>
883
+ </optional>
857
884
  <data type="anyURI"/>
858
885
  </define>
859
886
  <define name="DateType">
@@ -882,6 +909,7 @@
882
909
  <value>vote-started</value>
883
910
  <value>vote-ended</value>
884
911
  <value>announced</value>
912
+ <value>stable-until</value>
885
913
  </choice>
886
914
  </define>
887
915
  <define name="bdate">
@@ -930,6 +958,9 @@
930
958
  <optional>
931
959
  <attribute name="language"/>
932
960
  </optional>
961
+ <optional>
962
+ <attribute name="locale"/>
963
+ </optional>
933
964
  <optional>
934
965
  <attribute name="script"/>
935
966
  </optional>
@@ -174,7 +174,8 @@ module Metanorma
174
174
  end
175
175
 
176
176
  def figure_attrs(node)
177
- attr_code(id_unnum_attrs(node).merge(keep_attrs(node)))
177
+ attr_code(id_unnum_attrs(node).merge(keep_attrs(node))
178
+ .merge(class: node.attr("class")))
178
179
  end
179
180
 
180
181
  def image(node)
@@ -110,7 +110,10 @@ module Metanorma
110
110
 
111
111
  def formattedref_spans(xmldoc)
112
112
  xmldoc.xpath("//bibitem[formattedref//span]").each do |b|
113
- spans_to_bibitem(b, spans_preprocess(extract_content(b)))
113
+ spans = spans_preprocess(extract_content(b))
114
+ ret = spans_to_bibitem(spans)
115
+ spans[:type] and b["type"] = spans[:type]
116
+ b << ret
114
117
  end
115
118
  end
116
119
 
@@ -120,13 +123,19 @@ module Metanorma
120
123
 
121
124
  def extract_spans(bib)
122
125
  bib.xpath("./formattedref//span").each_with_object([]) do |s, m|
123
- keys = s["class"].split(".", 2)
124
- m << { key: keys[0], type: keys[1],
125
- val: s.children.to_xml }
126
- (s["class"] == "type" and s.remove) or s.replace(s.children)
126
+ next if s.at("./ancestor::span")
127
+
128
+ extract_spans1(s, m)
127
129
  end
128
130
  end
129
131
 
132
+ def extract_spans1(span, acc)
133
+ keys = span["class"].split(".", 2)
134
+ acc << { key: keys[0], type: keys[1],
135
+ val: span.children.to_xml }
136
+ (span["class"] == "type" and span.remove) or span.replace(span.children)
137
+ end
138
+
130
139
  def extract_docid(bib)
131
140
  bib.xpath("./docidentifier").each_with_object([]) do |d, m|
132
141
  m << { key: "docid", type: d["type"], val: d.text }
@@ -134,21 +143,61 @@ module Metanorma
134
143
  end
135
144
  end
136
145
 
146
+ def empty_span_hash
147
+ { contrib: [], docid: [], uri: [], date: [], extent: {}, in: {} }
148
+ end
149
+
137
150
  def spans_preprocess(spans)
138
- ret = { contributor: [], docid: [], uri: [], date: [] }
139
- spans.each do |s|
140
- case s[:key]
141
- when "uri", "docid"
142
- ret[s[:key].to_sym] << { type: s[:type], val: s[:val] }
143
- when "pubyear" then ret[:date] << { type: "published", val: s[:val] }
144
- when "pubplace", "title", "type" then ret[s[:key].to_sym] = s[:val]
145
- when "publisher"
146
- ret[:contributor] << { role: "publisher", entity: "organization",
147
- name: s[:val] }
148
- when "surname", "initials", "givenname", "formatted-initials"
149
- ret[:contributor] = spans_preprocess_contrib(s, ret[:contributor])
150
- end
151
+ ret = empty_span_hash
152
+ spans.each { |s| span_preprocess1(s, ret) }
153
+ host_rearrange(ret)
154
+ end
155
+
156
+ def span_preprocess1(span, ret)
157
+ case span[:key]
158
+ when "uri", "docid"
159
+ ret[span[:key].to_sym] << { type: span[:type], val: span[:val] }
160
+ when "date"
161
+ ret[span[:key].to_sym] << { type: span[:type] || "published",
162
+ val: span[:val] }
163
+ when "pages", "volume", "issue"
164
+ ret[:extent][span[:key].to_sym] ||= []
165
+ ret[:extent][span[:key].to_sym] << span[:val]
166
+ when "pubplace", "title", "type", "series"
167
+ ret[span[:key].to_sym] = span[:val]
168
+ when "in_title"
169
+ ret[:in][:title] = span[:val]
170
+ when "publisher"
171
+ ret[:contrib] << { role: "publisher", entity: "organization",
172
+ name: span[:val] }
173
+ when "surname", "initials", "givenname", "formatted-initials"
174
+ ret[:contrib] = spans_preprocess_contrib(span, ret[:contrib])
175
+ when "organization"
176
+ ret[:contrib] = spans_preprocess_org(span, ret[:contrib])
177
+ when "in_surname", "in_initials", "in_givenname",
178
+ "in_formatted-initials"
179
+ ret[:in][:contrib] ||= []
180
+ span[:key].sub!(/^in_/, "")
181
+ ret[:in][:contrib] =
182
+ spans_preprocess_contrib(span, ret[:in][:contrib])
183
+ when "in_organization"
184
+ ret[:in][:contrib] ||= []
185
+ span[:key].sub!(/^in_/, "")
186
+ ret[:in][:contrib] =
187
+ spans_preprocess_org(span, ret[:in][:contrib])
151
188
  end
189
+ end
190
+
191
+ def host_rearrange(ret)
192
+ ret[:in][:title] or return ret
193
+ ret[:in].merge!(empty_span_hash, { type: "misc" }) { |_, old, _| old }
194
+
195
+ %i(series).each do |k|
196
+ ret[:in][k] = ret[k]
197
+ ret.delete(k)
198
+ end
199
+ /^in/.match?(ret[:type]) and ret[:in][:type] =
200
+ ret[:type].sub(/^in/, "")
152
201
  ret
153
202
  end
154
203
 
@@ -169,16 +218,55 @@ module Metanorma
169
218
  contrib[-1][:role] != (span[:type] || "author")
170
219
  end
171
220
 
172
- def spans_to_bibitem(bib, spans)
221
+ def spans_preprocess_org(span, contrib)
222
+ contrib << { role: span[:type] || "author", entity: "organization",
223
+ name: span[:val] }
224
+ contrib
225
+ end
226
+
227
+ def spans_to_bibitem(spans)
173
228
  ret = ""
174
229
  spans[:title] and ret += "<title>#{spans[:title]}</title>"
230
+ ret += spans_to_bibitem_docid(spans)
231
+ spans[:contrib].each { |s| ret += span_to_contrib(s) }
232
+ spans[:series] and
233
+ ret += "<series><title>#{spans[:series]}</title></series>"
234
+ spans[:pubplace] and ret += "<place>#{spans[:pubplace]}</place>"
235
+ ret += spans_to_bibitem_host(spans)
236
+ ret + spans_to_bibitem_extent(spans[:extent])
237
+ end
238
+
239
+ def spans_to_bibitem_host(spans)
240
+ return "" if spans[:in].empty?
241
+
242
+ ret =
243
+ "<relation type='includedIn'><bibitem type='#{spans[:in][:type]}'>"
244
+ spans[:in].delete(:type)
245
+ ret + "#{spans_to_bibitem(spans[:in])}</bibitem></relation>"
246
+ end
247
+
248
+ def spans_to_bibitem_docid(spans)
249
+ ret = ""
175
250
  spans[:uri].each { |s| ret += span_to_docid(s, "uri") }
176
251
  spans[:docid].each { |s| ret += span_to_docid(s, "docidentifier") }
177
252
  spans[:date].each { |s| ret += span_to_docid(s, "date") }
178
- spans[:contributor].each { |s| ret += span_to_contrib(s) }
179
- spans[:pubplace] and ret += "<place>#{spans[:place]}</place>"
180
- spans[:type] and bib["type"] = spans[:type]
181
- bib << ret
253
+ ret
254
+ end
255
+
256
+ def spans_to_bibitem_extent(spans)
257
+ ret = ""
258
+ { volume: "volume", issue: "issue", pages: "page" }.each do |k, v|
259
+ spans[k]&.each { |s| ret += span_to_extent(s, v) }
260
+ end
261
+ ret
262
+ end
263
+
264
+ def span_to_extent(span, key)
265
+ values = span.split(/[-–]/)
266
+ ret = "<extent type='#{key}'><referenceFrom>#{values[0]}</referenceFrom>"
267
+ values[1] and
268
+ ret += "<referenceTo>#{values[1]}</referenceTo>"
269
+ "#{ret}</extent>"
182
270
  end
183
271
 
184
272
  def span_to_docid(span, key)
@@ -4,7 +4,7 @@ module Metanorma
4
4
  def external_terms_boilerplate(sources)
5
5
  @i18n.l10n(
6
6
  @i18n.external_terms_boilerplate.gsub(/%/, sources || "???"),
7
- @lang, @script
7
+ @lang, @script, @locale
8
8
  )
9
9
  end
10
10
 
@@ -64,7 +64,7 @@ module Metanorma
64
64
  x = xmldoc.dup
65
65
  x.root.add_namespace(nil, self.class::XML_NAMESPACE)
66
66
  xml = Nokogiri::XML(x.to_xml)
67
- @isodoc ||= isodoc(@lang, @script)
67
+ @isodoc ||= isodoc(@lang, @script, @locale)
68
68
  @isodoc.info(xml, nil)
69
69
  @isodoc
70
70
  end
@@ -95,6 +95,7 @@ module Metanorma
95
95
 
96
96
  def metadata_language(node, xml)
97
97
  xml.language (node.attr("language") || "en")
98
+ l = node.attr("locale") and xml.locale l
98
99
  end
99
100
 
100
101
  def metadata_script(node, xml)
@@ -205,6 +205,15 @@
205
205
  <data type="boolean"/>
206
206
  </attribute>
207
207
  </optional>
208
+ <optional>
209
+ <attribute name="style">
210
+ <choice>
211
+ <value>basic</value>
212
+ <value>full</value>
213
+ <value>short</value>
214
+ </choice>
215
+ </attribute>
216
+ </optional>
208
217
  <ref name="XrefBody"/>
209
218
  </element>
210
219
  </define>
@@ -1,21 +1,22 @@
1
1
  module Metanorma
2
2
  module Standoc
3
3
  class PlantUMLBlockMacroBackend
4
- # https://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby
5
4
  def self.plantuml_installed?
6
- cmd = "plantuml"
7
- exts = ENV["PATHEXT"] ? ENV["PATHEXT"].split(";") : [""]
8
- ENV["PATH"].split(File::PATH_SEPARATOR).each do |path|
9
- exts.each do |ext|
10
- exe = File.join(path, "#{cmd}#{ext}")
11
- return exe if File.executable?(exe) && !File.directory?(exe)
12
- end
5
+ unless which("plantuml")
6
+ raise "PlantUML not installed"
7
+ end
8
+ end
9
+
10
+ def self.plantuml_bin
11
+ if Gem.win_platform? || which("plantumlc")
12
+ "plantumlc"
13
+ else
14
+ "plantuml"
13
15
  end
14
- raise "PlantUML not installed"
15
16
  end
16
17
 
17
18
  def self.run(umlfile, outfile)
18
- system "plantuml #{umlfile.path}" or (warn $? and return false)
19
+ system "#{plantuml_bin} #{umlfile.path}" or (warn $? and return false)
19
20
  i = 0
20
21
  until !Gem.win_platform? || File.exist?(outfile) || i == 15
21
22
  sleep(1)
@@ -84,6 +85,18 @@ module Metanorma
84
85
  memo
85
86
  end
86
87
  end
88
+
89
+ # https://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby
90
+ def self.which(cmd)
91
+ exts = ENV["PATHEXT"] ? ENV["PATHEXT"].split(";") : [""]
92
+ ENV["PATH"].split(File::PATH_SEPARATOR).each do |path|
93
+ exts.each do |ext|
94
+ exe = File.join(path, "#{cmd}#{ext}")
95
+ return exe if File.executable?(exe) && !File.directory?(exe)
96
+ end
97
+ end
98
+ nil
99
+ end
87
100
  end
88
101
 
89
102
  class PlantUMLBlockMacro < Asciidoctor::Extensions::BlockProcessor
@@ -30,6 +30,7 @@ module Metanorma
30
30
  tocrecommendations: @tocrecommendations,
31
31
  fonts: node.attr("fonts"),
32
32
  fontlicenseagreement: node.attr("font-license-agreement"),
33
+ localizenumber: node.attr("localize-number"),
33
34
  }
34
35
  end
35
36
 
@@ -42,7 +42,8 @@ module Metanorma
42
42
  refterm = n.at("./refterm") or next
43
43
  p = @termlookup[:secondary2primary][refterm.text] and
44
44
  refterm.children = p
45
- refterm.replace("<preferred><expression><name>#{refterm.children.to_xml}"\
45
+ refterm.replace("<preferred><expression>"\
46
+ "<name>#{refterm.children.to_xml}"\
46
47
  "</name></expression></preferred>")
47
48
  end
48
49
  end
@@ -69,33 +70,51 @@ module Metanorma
69
70
 
70
71
  def remove_missing_ref(node, target)
71
72
  if node.at("./parent::concept[@type = 'symbol']")
73
+ log.add("AsciiDoc Input", node,
74
+ remove_missing_ref_msg(node, target, :symbol))
72
75
  remove_missing_ref_symbol(node, target)
73
76
  else
77
+ log.add("AsciiDoc Input", node,
78
+ remove_missing_ref_msg(node, target, :term))
74
79
  remove_missing_ref_term(node, target)
75
80
  end
76
81
  end
77
82
 
83
+ def remove_missing_ref_msg(node, target, type)
84
+ type == :symbol and return <<~LOG
85
+ Error: Symbol reference in `symbol[#{target}]` missing: "#{target}" is not defined in document
86
+ LOG
87
+ ret = <<~LOG
88
+ Error: Term reference to `#{target}` missing: "#{target}" is not defined in document
89
+ LOG
90
+ remove_missing_ref_msg1(node, target, ret)
91
+ end
92
+
93
+ def remove_missing_ref_msg1(node, target, ret)
94
+ target2 = "_#{target.downcase.gsub(/-/, '_')}"
95
+ if node.document.at("//*[@id = '#{target}']")&.name == "terms" ||
96
+ node.document.at("//*[@id = '#{target2}']")&.name == "terms"
97
+ ret.strip!
98
+ ret += ". Did you mean to point to a subterm?"
99
+ end
100
+ ret
101
+ end
102
+
78
103
  def remove_missing_ref_term(node, target)
79
- log.add("AsciiDoc Input", node,
80
- %(Error: Term reference to `#{target}` missing: \
81
- "#{target}" is not defined in document))
82
104
  node.name = "strong"
83
- node&.at("../xrefrender")&.remove
84
- display = node&.at("../renderterm")&.remove&.children
85
- display = [] if display.nil? || display&.to_xml == node.text
105
+ node.at("../xrefrender")&.remove
106
+ display = node.at("../renderterm")&.remove&.children
107
+ display = [] if display.nil? || display.to_xml == node.text
86
108
  d = display.empty? ? "" : ", display <tt>#{display.to_xml}</tt>"
87
109
  node.children = "term <tt>#{node.text}</tt>#{d} "\
88
110
  "not resolved via ID <tt>#{target}</tt>"
89
111
  end
90
112
 
91
113
  def remove_missing_ref_symbol(node, target)
92
- log.add("AsciiDoc Input", node,
93
- %(Error: Symbol reference in `symbol[#{target}]` missing: \
94
- "#{target}" is not defined in document))
95
114
  node.name = "strong"
96
- node&.at("../xrefrender")&.remove
97
- display = node&.at("../renderterm")&.remove&.children
98
- display = [] if display.nil? || display&.to_xml == node.text
115
+ node.at("../xrefrender")&.remove
116
+ display = node.at("../renderterm")&.remove&.children
117
+ display = [] if display.nil? || display.to_xml == node.text
99
118
  d = display.empty? ? "" : ", display <tt>#{display.to_xml}</tt>"
100
119
  node.children = "symbol <tt>#{node.text}</tt>#{d} "\
101
120
  "not resolved via ID <tt>#{target}</tt>"
@@ -36,10 +36,10 @@ module Metanorma
36
36
  SUBCLAUSE_XPATH = "//clause[not(parent::sections)]"\
37
37
  "[not(ancestor::boilerplate)]".freeze
38
38
 
39
- def isodoc(lang, script, i18nyaml = nil)
39
+ def isodoc(lang, script, locale, i18nyaml = nil)
40
40
  conv = presentation_xml_converter(EmptyAttr.new)
41
- i18n = conv.i18n_init(lang, script, i18nyaml)
42
- conv.metadata_init(lang, script, i18n)
41
+ i18n = conv.i18n_init(lang, script, locale, i18nyaml)
42
+ conv.metadata_init(lang, script, locale, i18n)
43
43
  conv
44
44
  end
45
45
 
@@ -77,15 +77,24 @@ module Metanorma
77
77
  next if doc.at("//term[@id = '#{x['target']}']")
78
78
  next if doc.at("//definitions//dt[@id = '#{x['target']}']")
79
79
 
80
- @log.add("Anchors", x,
81
- "#{tag.capitalize} #{x&.at("../#{refterm}")&.text} is "\
82
- "pointing to #{x['target']}, which is not a term or symbol")
80
+ @log.add("Anchors", x, concept_validate_msg(doc, tag, refterm, x))
83
81
  found = true
84
82
  end
85
83
  found and
86
84
  @fatalerror << "#{tag.capitalize} not cross-referencing term or symbol"
87
85
  end
88
86
 
87
+ def concept_validate_msg(doc, tag, refterm, xref)
88
+ ret = <<~LOG
89
+ #{tag.capitalize} #{xref.at("../#{refterm}")&.text} is pointing to #{xref['target']}, which is not a term or symbol
90
+ LOG
91
+ if doc.at("//*[@id = '#{xref['target']}']")&.name == "terms"
92
+ ret = ret.strip
93
+ ret += ". Did you mean to point to a subterm?"
94
+ end
95
+ ret
96
+ end
97
+
89
98
  def repeat_id_validate1(ids, elem)
90
99
  if ids[elem["id"]]
91
100
  @log.add("Anchors", elem, "Anchor #{elem['id']} has already been "\
@@ -19,6 +19,6 @@ module Metanorma
19
19
  end
20
20
 
21
21
  module Standoc
22
- VERSION = "2.2.3.1".freeze
22
+ VERSION = "2.2.5".freeze
23
23
  end
24
24
  end
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
27
27
 
28
28
  spec.add_dependency "asciidoctor", "~> 2.0.0"
29
29
  spec.add_dependency "iev", "~> 0.3.0"
30
- spec.add_dependency "isodoc", "~> 2.2.3"
30
+ spec.add_dependency "isodoc", "~> 2.3.1"
31
31
  spec.add_dependency "metanorma"
32
32
  spec.add_dependency "metanorma-plugin-datastruct", "~> 0.2.0"
33
33
  spec.add_dependency "metanorma-plugin-lutaml"
@@ -37,7 +37,7 @@ Gem::Specification.new do |spec|
37
37
  spec.add_dependency "concurrent-ruby"
38
38
  spec.add_dependency "latexmath"
39
39
  spec.add_dependency "mathml2asciimath"
40
- spec.add_dependency "mn-requirements", "~> 0.1.3"
40
+ spec.add_dependency "mn-requirements", "~> 0.1.4"
41
41
  spec.add_dependency "pngcheck"
42
42
  spec.add_dependency "relaton-cli", "~> 1.13.0"
43
43
  spec.add_dependency "relaton-iev", "~> 1.1.0"
@@ -6,6 +6,13 @@ RSpec.describe Metanorma::Standoc do
6
6
  expect(Metanorma::Standoc::VERSION).not_to be nil
7
7
  end
8
8
 
9
+ it "applies Asciidoctor substitutions" do
10
+ expect(Metanorma::Utils.asciidoc_sub("A -- B"))
11
+ .to eq "A&#8201;&#8212;&#8201;B"
12
+ expect(Metanorma::Utils.asciidoc_sub("*A* stem:[x]"))
13
+ .to eq "<strong>A</strong> <stem type=\"AsciiMath\">x</stem>"
14
+ end
15
+
9
16
  it "processes named entities" do
10
17
  FileUtils.rm_f "test.doc"
11
18
  input = <<~INPUT
@@ -554,6 +561,7 @@ RSpec.describe Metanorma::Standoc do
554
561
  :tc-docnumber: 2000
555
562
  :language: el
556
563
  :script: Grek
564
+ :locale: CY
557
565
  :publisher: IEC;IETF;ISO
558
566
  :uri: A
559
567
  :xml-uri: B
@@ -689,6 +697,7 @@ RSpec.describe Metanorma::Standoc do
689
697
  <revision-date>2000-01</revision-date>
690
698
  </version>
691
699
  <language>el</language>
700
+ <locale>CY</locale>
692
701
  <script>Grek</script>
693
702
  <abstract><p>This is the abstract of the document</p>
694
703
  <p>This is the second paragraph of the abstract of the document.</p></abstract>
@@ -780,7 +789,7 @@ RSpec.describe Metanorma::Standoc do
780
789
 
781
790
  INPUT
782
791
  output = <<~OUTPUT
783
- <standard-document xmlns="https://www.metanorma.org/ns/standoc" type="semantic" version="#{Metanorma::Standoc::VERSION}">
792
+ <standard-document xmlns="https://www.metanorma.org/ns/standoc" type="semantic" version="#{Metanorma::Standoc::VERSION}">
784
793
  <bibdata type='standard'>
785
794
  <title language='en' format='text/plain'>Document title</title>
786
795
  <contributor>