metanorma-standoc 2.2.3.1 → 2.2.5

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