metanorma-standoc 2.5.5 → 2.6.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ffaa13eaacb9efa7c94a2e891d4e7a90b9306a729510f8f2c0b0110e68a4ec49
4
- data.tar.gz: 63dc9c98c8a1657aa6d0871105d0e21b8720378d0606b8e819b7f75606763964
3
+ metadata.gz: 42b32b109ae4f5ac4505f2218a4d4c5768ad388ffb29d3ae292b61fab8923030
4
+ data.tar.gz: aafef4197f9d88913ef52f8effacb515e54e94f456757758e9ac0bfe41b2656d
5
5
  SHA512:
6
- metadata.gz: 771694d3618c4d671d5ebf6006f502717d9c30c34e72b9385efcabcf9a5a504d4a47ca7a862dbcea7f5c7f7d3b8db18a73afba8d367bfc974fcc7b7981944967
7
- data.tar.gz: 8c5ca650403236e66e3e6fff578889977f86812cd8127e0521257427c97e6a5425437cdc9f4f10208d865ee71fdbc26da1faff28430cb7633bc2829bc641058c
6
+ metadata.gz: 13a8345e82e041ebbefecddeea7ba719898b6997877891d76177872b672e9bce7d00c060bf98569b0acd49c0c3ba691a989032e3650066030cf99a86991b5cbb
7
+ data.tar.gz: 37c1b235d071bb2d7b4f5ff8e73e3f5a3ca668c726245ea75002152bbd9931b07e67869dee8b0b6b8685e4480054f50244ddfa492cdd12275e30d27ec2d389e2
@@ -42,6 +42,7 @@ module Metanorma
42
42
  end
43
43
 
44
44
  def init_vars
45
+ @log = Metanorma::Utils::Log.new # for error reporting downstream
45
46
  @fn_number ||= 0
46
47
  @refids = Set.new
47
48
  @anchor_alias = {}
@@ -55,6 +56,7 @@ module Metanorma
55
56
  end
56
57
 
57
58
  def init_misc(node)
59
+ @doctype = doctype(node)
58
60
  @draft = node.attributes.has_key?("draft")
59
61
  @index_terms = node.attr("index-terms")
60
62
  @boilerplateauthority = node.attr("boilerplate-authority")
@@ -101,7 +103,6 @@ module Metanorma
101
103
 
102
104
  def init_output(node)
103
105
  @fontheader = default_fonts(node)
104
- @log = Metanorma::Utils::Log.new
105
106
  @files_to_delete = []
106
107
  @filename = if node.attr("docfile")
107
108
  File.basename(node.attr("docfile"))&.gsub(/\.adoc$/, "")
@@ -177,7 +178,7 @@ module Metanorma
177
178
  end
178
179
 
179
180
  def clean_exit
180
- @novalid or @log.write("#{@output_dir}#{@filename}.err")
181
+ @novalid or @log.write("#{@output_dir}#{@filename}.err.html")
181
182
  @files_to_delete.each { |f| FileUtils.rm f }
182
183
  end
183
184
 
@@ -346,6 +346,8 @@
346
346
  <ref name="keyword"/>
347
347
  <ref name="xref"/>
348
348
  <ref name="hyperlink"/>
349
+ <ref name="index"/>
350
+ <ref name="index-xref"/>
349
351
  </choice>
350
352
  </oneOrMore>
351
353
  </element>
@@ -623,6 +625,8 @@
623
625
  <ref name="eref"/>
624
626
  <ref name="xref"/>
625
627
  <ref name="hyperlink"/>
628
+ <ref name="index"/>
629
+ <ref name="index-xref"/>
626
630
  </choice>
627
631
  </zeroOrMore>
628
632
  </element>
@@ -636,6 +640,8 @@
636
640
  <ref name="eref"/>
637
641
  <ref name="xref"/>
638
642
  <ref name="hyperlink"/>
643
+ <ref name="index"/>
644
+ <ref name="index-xref"/>
639
645
  </choice>
640
646
  </zeroOrMore>
641
647
  </element>
@@ -648,6 +654,8 @@
648
654
  <ref name="eref"/>
649
655
  <ref name="xref"/>
650
656
  <ref name="hyperlink"/>
657
+ <ref name="index"/>
658
+ <ref name="index-xref"/>
651
659
  </choice>
652
660
  </zeroOrMore>
653
661
  </element>
@@ -655,7 +663,11 @@
655
663
  <define name="keyword">
656
664
  <element name="keyword">
657
665
  <zeroOrMore>
658
- <ref name="PureTextElement"/>
666
+ <choice>
667
+ <ref name="PureTextElement"/>
668
+ <ref name="index"/>
669
+ <ref name="index-xref"/>
670
+ </choice>
659
671
  </zeroOrMore>
660
672
  </element>
661
673
  </define>
@@ -676,7 +688,11 @@
676
688
  <define name="strike">
677
689
  <element name="strike">
678
690
  <zeroOrMore>
679
- <ref name="PureTextElement"/>
691
+ <choice>
692
+ <ref name="PureTextElement"/>
693
+ <ref name="index"/>
694
+ <ref name="index-xref"/>
695
+ </choice>
680
696
  </zeroOrMore>
681
697
  </element>
682
698
  </define>
@@ -1283,7 +1283,7 @@
1283
1283
  <value>mergedInto</value>
1284
1284
  <value>splits</value>
1285
1285
  <value>splitInto</value>
1286
- <value>instance</value>
1286
+ <value>instanceOf</value>
1287
1287
  <value>hasInstance</value>
1288
1288
  <value>exemplarOf</value>
1289
1289
  <value>hasExemplar</value>
@@ -25,6 +25,7 @@ module Metanorma
25
25
  module Standoc
26
26
  module Cleanup
27
27
  def cleanup(xmldoc)
28
+ @doctype = xmldoc.at("//bibdata/ext/doctype")&.text
28
29
  element_name_cleanup(xmldoc)
29
30
  passthrough_cleanup(xmldoc)
30
31
  unnumbered_blocks_cleanup(xmldoc)
@@ -17,7 +17,7 @@
17
17
  these elements; we just want one namespace for any child grammars
18
18
  of this.
19
19
  -->
20
- <!-- VERSION v1.2.4 -->
20
+ <!-- VERSION v1.2.5 -->
21
21
  <grammar xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
22
22
  <include href="reqt.rng"/>
23
23
  <include href="basicdoc.rng">
@@ -485,6 +485,8 @@
485
485
  <choice>
486
486
  <text/>
487
487
  <ref name="callout"/>
488
+ <ref name="xref"/>
489
+ <ref name="eref"/>
488
490
  </choice>
489
491
  </oneOrMore>
490
492
  <zeroOrMore>
@@ -865,6 +867,7 @@
865
867
  <ref name="PureTextElement"/>
866
868
  <ref name="stem"/>
867
869
  <ref name="index"/>
870
+ <ref name="index-xref"/>
868
871
  <ref name="eref"/>
869
872
  <ref name="erefstack"/>
870
873
  <ref name="xref"/>
@@ -880,6 +883,7 @@
880
883
  <ref name="PureTextElement"/>
881
884
  <ref name="stem"/>
882
885
  <ref name="index"/>
886
+ <ref name="index-xref"/>
883
887
  <ref name="eref"/>
884
888
  <ref name="erefstack"/>
885
889
  <ref name="xref"/>
@@ -894,6 +898,7 @@
894
898
  <choice>
895
899
  <ref name="PureTextElement"/>
896
900
  <ref name="index"/>
901
+ <ref name="index-xref"/>
897
902
  <ref name="eref"/>
898
903
  <ref name="erefstack"/>
899
904
  <ref name="xref"/>
@@ -908,6 +913,7 @@
908
913
  <choice>
909
914
  <ref name="PureTextElement"/>
910
915
  <ref name="index"/>
916
+ <ref name="index-xref"/>
911
917
  </choice>
912
918
  </zeroOrMore>
913
919
  </element>
@@ -918,6 +924,7 @@
918
924
  <choice>
919
925
  <ref name="PureTextElement"/>
920
926
  <ref name="index"/>
927
+ <ref name="index-xref"/>
921
928
  </choice>
922
929
  </zeroOrMore>
923
930
  </element>
@@ -928,6 +935,7 @@
928
935
  <choice>
929
936
  <ref name="PureTextElement"/>
930
937
  <ref name="index"/>
938
+ <ref name="index-xref"/>
931
939
  </choice>
932
940
  </zeroOrMore>
933
941
  </element>
@@ -938,6 +946,7 @@
938
946
  <choice>
939
947
  <ref name="PureTextElement"/>
940
948
  <ref name="index"/>
949
+ <ref name="index-xref"/>
941
950
  </choice>
942
951
  </zeroOrMore>
943
952
  </element>
@@ -1047,6 +1056,8 @@
1047
1056
  <ref name="keyword"/>
1048
1057
  <ref name="xref"/>
1049
1058
  <ref name="hyperlink"/>
1059
+ <ref name="index"/>
1060
+ <ref name="index-xref"/>
1050
1061
  </choice>
1051
1062
  </element>
1052
1063
  </define>
@@ -1060,6 +1071,8 @@
1060
1071
  <ref name="keyword"/>
1061
1072
  <ref name="xref"/>
1062
1073
  <ref name="hyperlink"/>
1074
+ <ref name="index"/>
1075
+ <ref name="index-xref"/>
1063
1076
  </choice>
1064
1077
  </element>
1065
1078
  </define>
@@ -1126,6 +1139,8 @@
1126
1139
  <choice>
1127
1140
  <ref name="PureTextElement"/>
1128
1141
  <ref name="stem"/>
1142
+ <ref name="index"/>
1143
+ <ref name="index-xref"/>
1129
1144
  </choice>
1130
1145
  </zeroOrMore>
1131
1146
  </element>
@@ -1136,6 +1151,8 @@
1136
1151
  <choice>
1137
1152
  <ref name="PureTextElement"/>
1138
1153
  <ref name="stem"/>
1154
+ <ref name="index"/>
1155
+ <ref name="index-xref"/>
1139
1156
  </choice>
1140
1157
  </zeroOrMore>
1141
1158
  </element>
@@ -47,7 +47,7 @@ module Metanorma
47
47
  end
48
48
 
49
49
  def merge_simple(old, new, field)
50
- new[field].blank? and return
50
+ (new[field].nil? || new[field].empty?) and return
51
51
  old[field] = new[field]
52
52
  end
53
53
 
@@ -77,12 +77,10 @@ module Metanorma
77
77
  # @old.field is an array, overwrite only those array elements
78
78
  # where @old.field[attribute] = @new.field[attribute]
79
79
  def merge_by_type(old, new, field, attributes, opt = {})
80
- new.nil? || new[field].blank? and return
80
+ new.nil? || new[field].nil? || new[field].empty? and return
81
81
  old.nil? and return new[field]
82
- if !old[field].is_a?(::Array) || old[field].empty?
82
+ !old[field].is_a?(::Array) || old[field].empty? and
83
83
  return old[field] = new[field]
84
- end
85
-
86
84
  old[field] = merge_by_type1(old, new, field, attributes, opt)
87
85
  end
88
86
 
@@ -1,4 +1,5 @@
1
1
  require_relative "ref_utility"
2
+ require_relative "ref_queue"
2
3
 
3
4
  module Metanorma
4
5
  module Standoc
@@ -226,42 +227,6 @@ module Metanorma
226
227
  when 3 then isorefmatches3out(item, xml)
227
228
  end
228
229
  end
229
-
230
- def reference(node)
231
- refs = node.items.each_with_object([]) do |b, m|
232
- m << reference1code(b.text, node)
233
- end
234
- reference_populate(reference_normalise(refs))
235
- end
236
-
237
- def reference_normalise(refs)
238
- refs.each do |r|
239
- r[:code] = @c.decode(r[:code])
240
- .gsub("\u2009\u2014\u2009", " -- ").strip
241
- end
242
- end
243
-
244
- def reference_populate(refs)
245
- results = refs.each_with_index.with_object(Queue.new) do |(ref, i), res|
246
- fetch_ref_async(ref.merge(ord: i), i, res)
247
- end
248
- ret = reference_queue(refs, results)
249
- noko do |xml|
250
- ret.each { |b| reference1out(b, xml) }
251
- end.join
252
- end
253
-
254
- def reference_queue(refs, results)
255
- refs.each.with_object([]) do |_, m|
256
- ref, i, doc = results.pop
257
- m[i.to_i] = { ref: ref }
258
- if doc.is_a?(RelatonBib::RequestError)
259
- @log.add("Bibliography", nil, "Could not retrieve #{ref[:code]}: " \
260
- "no access to online site")
261
- else m[i.to_i][:doc] = doc
262
- end
263
- end
264
- end
265
230
  end
266
231
  end
267
232
  end
@@ -0,0 +1,237 @@
1
+ module Metanorma
2
+ module Standoc
3
+ module Refs
4
+ def reference(node)
5
+ refs = node.items.each_with_object([]) do |b, m|
6
+ m << reference1code(b.text, node)
7
+ end
8
+ reference_populate(reference_normalise(refs))
9
+ end
10
+
11
+ def reference_normalise(refs)
12
+ refs.each do |r|
13
+ r[:code] = @c.decode(r[:code])
14
+ .gsub("\u2009\u2014\u2009", " -- ").strip
15
+ end
16
+ end
17
+
18
+ def reference_populate(refs)
19
+ ret = reference_queue(*references_fetch(refs))
20
+ joint_prep = joint_entries_prep(ret)
21
+ out = references2xml(ret)
22
+ joint_entries(out, joint_prep).compact.map { |x| to_xml(x) }.join
23
+ end
24
+
25
+ def references2xml(ret)
26
+ out = ret.map do |b|
27
+ b.nil? ? nil : noko { |xml| reference1out(b, xml) }.join
28
+ end
29
+ out.map { |x| x.nil? ? nil : Nokogiri::XML(x).root }
30
+ end
31
+
32
+ def references_fetch(refs)
33
+ i = 0
34
+ ret = refs.each_with_object(Queue.new) do |ref, res|
35
+ i = fetch_ref_async(ref.merge(ord: i), i, res)
36
+ end
37
+ [ret, i]
38
+ end
39
+
40
+ def reference_queue(results, size)
41
+ (1..size).each.with_object([]) do |_, m|
42
+ ref, i, doc = results.pop
43
+ m[i.to_i] = { ref: ref }
44
+ if doc.is_a?(RelatonBib::RequestError)
45
+ @log.add("Bibliography", nil, "Could not retrieve #{ref[:code]}: " \
46
+ "no access to online site")
47
+ else m[i.to_i][:doc] = doc end
48
+ end
49
+ end
50
+
51
+ def joint_entries(out, joint_prep)
52
+ joint_prep.each do |k, v|
53
+ v[:merge]&.each do |i|
54
+ merge_entries(out[k], out[i]) and out[i] = nil
55
+ end
56
+ v[:dual]&.each do |i|
57
+ dual_entries(out[k], out[i]) and out[i] = nil
58
+ end
59
+ end
60
+ out
61
+ end
62
+
63
+ # append publishers docids of add to base
64
+ def merge_entries(base, add)
65
+ merge_publishers(base, add)
66
+ merge_docids(base, add)
67
+ merge_urls(base, add)
68
+ end
69
+
70
+ def merge_publishers(base, add)
71
+ ins = base.at("//contributor[last()]") || base.children[-1]
72
+ add.xpath("//contributor[role/@type = 'publisher']").reverse.each do |p|
73
+ ins.next = p
74
+ end
75
+ end
76
+
77
+ def merge_docids(base, add)
78
+ ins = base.at("//docidentifier[last()]")
79
+ [ins, add].each do |v|
80
+ v.at("//docidentifier[@primary = 'true']") or
81
+ v.at("//docidentifier")["primary"] = true
82
+ end
83
+ add.xpath("//docidentifier").reverse.each do |p|
84
+ ins.next = p
85
+ end
86
+ end
87
+
88
+ def merge_urls(base, add)
89
+ ins = base.at("./uri[last()]") || base.at("./title[last()]")
90
+ add.xpath("./uri").reverse.each do |p|
91
+ ins.next = p
92
+ end
93
+ end
94
+
95
+ def dual_entries(base, add)
96
+ ins = docrelation_insert(base)
97
+ ins.next = "<relation type='hasReproduction'>#{to_xml(add)}</relation>"
98
+ end
99
+
100
+ def docrelation_insert(base)
101
+ %w(relation copyright status abstract locale language note version
102
+ edition contributor date docnumber docidentifier).each do |v|
103
+ r = base.at("//#{v}[last()]") and return r
104
+ end
105
+ end
106
+
107
+ JOINT_REFS = %i(merge dual).freeze
108
+
109
+ def joint_entries_prep(out)
110
+ out.each_with_object({}) do |r, m|
111
+ JOINT_REFS.each do |v|
112
+ if i = r&.dig(:ref, "#{v}_into".to_sym)
113
+ m[i] ||= { "#{v}": [] }
114
+ m[i][v][r[:ref][:merge_order]] = r[:ref][:ord]
115
+ end
116
+ end
117
+ end
118
+ end
119
+
120
+ def global_ievcache_name
121
+ "#{Dir.home}/.iev/cache"
122
+ end
123
+
124
+ def local_ievcache_name(cachename)
125
+ return nil if cachename.nil?
126
+
127
+ cachename += "_iev" unless cachename.empty?
128
+ cachename = "iev" if cachename.empty?
129
+ "#{cachename}/cache"
130
+ end
131
+
132
+ def fetch_ref(xml, code, year, **opts)
133
+ return nil if opts[:no_year]
134
+
135
+ code = code.sub(/^\([^)]+\)/, "")
136
+ hit = fetch_ref1(code, year, opts) or return nil
137
+ xml.parent.add_child(smart_render_xml(hit, code, opts))
138
+ xml
139
+ rescue RelatonBib::RequestError
140
+ @log.add("Bibliography", nil, "Could not retrieve #{code}: " \
141
+ "no access to online site")
142
+ nil
143
+ end
144
+
145
+ def fetch_ref1(code, year, opts)
146
+ if opts[:localfile]
147
+ @local_bibdb.get(code, opts[:localfile])
148
+ else @bibdb&.fetch(code, year, opts)
149
+ end
150
+ end
151
+
152
+ def unfetchable_ref_code?(ref)
153
+ ref[:code].nil? || ref[:code].empty? || ref[:no_year] ||
154
+ /^\(.+\)$/.match?(ref[:code]) ||
155
+ (@bibdb.nil? && !ref[:localfile])
156
+ end
157
+
158
+ def fetch_ref_async(ref, idx, res)
159
+ if unfetchable_ref_code?(ref)
160
+ res << [ref, idx, nil]
161
+ idx += 1
162
+ elsif ref[:localfile]
163
+ res << [ref, idx, @local_bibdb.get(ref[:code], ref[:localfile])]
164
+ idx += 1
165
+ else idx = fetch_ref_async1(ref, idx, res)
166
+ end
167
+ idx
168
+ end
169
+
170
+ def fetch_ref_async1(ref, idx, res)
171
+ @bibdb.fetch_async(ref[:code], ref[:year], ref) do |doc|
172
+ res << [ref, idx, doc]
173
+ end
174
+ fetch_ref_async_dual(ref, idx, idx + 1, res)
175
+ end
176
+
177
+ def fetch_ref_async_dual(ref, orig, idx, res)
178
+ JOINT_REFS.each do |m|
179
+ ref.dig(:analyse_code, m)&.each_with_index do |code, i|
180
+ @bibdb.fetch_async(code, nil, ref.merge(ord: idx)) do |doc|
181
+ res << [ref.merge("#{m}_into": orig, merge_order: i, ord: idx),
182
+ idx, doc]
183
+ end
184
+ idx += 1
185
+ end
186
+ end
187
+ idx
188
+ end
189
+
190
+ def smart_render_xml(xml, code, opts)
191
+ xml.respond_to? :to_xml or return nil
192
+ xml = Nokogiri::XML(xml.to_xml(lang: opts[:lang]))
193
+ emend_biblio(xml, code, opts[:title], opts[:usrlbl])
194
+ xml.xpath("//date").each { |d| Metanorma::Utils::endash_date(d) }
195
+ xml.traverse do |n|
196
+ n.text? and n.replace(Metanorma::Utils::smartformat(n.text))
197
+ end
198
+ xml.to_xml.sub(/<\?[^>]+>/, "")
199
+ end
200
+
201
+ def use_retrieved_relaton(item, xml)
202
+ xml.parent.add_child(smart_render_xml(item[:doc], item[:ref][:code],
203
+ item[:ref]))
204
+ use_my_anchor(xml, item[:ref][:match][:anchor],
205
+ hidden: item.dig(:ref, :analyse_code, :hidden),
206
+ dropid: item.dig(:ref, :analyse_code, :dropid))
207
+ end
208
+
209
+ def init_bib_caches(node)
210
+ return if @no_isobib
211
+
212
+ global = !@no_isobib_cache && !node.attr("local-cache-only")
213
+ local = node.attr("local-cache") || node.attr("local-cache-only")
214
+ local = nil if @no_isobib_cache
215
+ @bibdb = Relaton::Db.init_bib_caches(
216
+ local_cache: local,
217
+ flush_caches: node.attr("flush-caches"),
218
+ global_cache: global,
219
+ )
220
+ end
221
+
222
+ def init_iev_caches(node)
223
+ unless @no_isobib_cache || @no_isobib
224
+ node.attr("local-cache-only") or
225
+ @iev_globalname = global_ievcache_name
226
+ @iev_localname = local_ievcache_name(node.attr("local-cache") ||
227
+ node.attr("local-cache-only"))
228
+ if node.attr("flush-caches")
229
+ FileUtils.rm_f @iev_globalname unless @iev_globalname.nil?
230
+ FileUtils.rm_f @iev_localname unless @iev_localname.nil?
231
+ end
232
+ end
233
+ # @iev = Iev::Db.new(globalname, localname) unless @no_isobib
234
+ end
235
+ end
236
+ end
237
+ end
@@ -53,59 +53,6 @@ module Metanorma
53
53
  end
54
54
  end
55
55
 
56
- def global_ievcache_name
57
- "#{Dir.home}/.iev/cache"
58
- end
59
-
60
- def local_ievcache_name(cachename)
61
- return nil if cachename.nil?
62
-
63
- cachename += "_iev" unless cachename.empty?
64
- cachename = "iev" if cachename.empty?
65
- "#{cachename}/cache"
66
- end
67
-
68
- def fetch_ref(xml, code, year, **opts)
69
- return nil if opts[:no_year]
70
-
71
- code = code.sub(/^\([^)]+\)/, "")
72
- hit = fetch_ref1(code, year, opts) or return nil
73
- xml.parent.add_child(smart_render_xml(hit, code, opts))
74
- xml
75
- rescue RelatonBib::RequestError
76
- @log.add("Bibliography", nil, "Could not retrieve #{code}: " \
77
- "no access to online site")
78
- nil
79
- end
80
-
81
- def fetch_ref1(code, year, opts)
82
- if opts[:localfile]
83
- @local_bibdb.get(code, opts[:localfile])
84
- else @bibdb&.fetch(code, year, opts)
85
- end
86
- end
87
-
88
- def unfetchable_ref_code?(ref)
89
- ref[:code].nil? || ref[:code].empty? || ref[:no_year] ||
90
- /^\(.+\)$/.match?(ref[:code]) ||
91
- (@bibdb.nil? && !ref[:localfile])
92
- end
93
-
94
- def fetch_ref_async(ref, idx, res)
95
- if unfetchable_ref_code?(ref)
96
- res << [ref, idx, nil]
97
- elsif ref[:localfile]
98
- res << [ref, idx, @local_bibdb.get(ref[:code], ref[:localfile])]
99
- else fetch_ref_async1(ref, idx, res)
100
- end
101
- end
102
-
103
- def fetch_ref_async1(ref, idx, res)
104
- @bibdb.fetch_async(ref[:code], ref[:year], ref) do |doc|
105
- res << [ref, idx, doc]
106
- end
107
- end
108
-
109
56
  def emend_biblio(xml, code, title, usrlbl)
110
57
  emend_biblio_id(xml, code)
111
58
  emend_biblio_title(xml, code, title)
@@ -138,52 +85,6 @@ module Metanorma
138
85
  xml.at("/bibitem/docidentifier").next =
139
86
  "<docidentifier type='metanorma'>#{mn_code(usrlbl)}</docidentifier>"
140
87
  end
141
-
142
- def smart_render_xml(xml, code, opts)
143
- xml.respond_to? :to_xml or return nil
144
- xml = Nokogiri::XML(xml.to_xml(lang: opts[:lang]))
145
- emend_biblio(xml, code, opts[:title], opts[:usrlbl])
146
- xml.xpath("//date").each { |d| Metanorma::Utils::endash_date(d) }
147
- xml.traverse do |n|
148
- n.text? and n.replace(Metanorma::Utils::smartformat(n.text))
149
- end
150
- xml.to_xml.sub(/<\?[^>]+>/, "")
151
- end
152
-
153
- def use_retrieved_relaton(item, xml)
154
- xml.parent.add_child(smart_render_xml(item[:doc], item[:ref][:code],
155
- item[:ref]))
156
- use_my_anchor(xml, item[:ref][:match][:anchor],
157
- hidden: item.dig(:ref, :analyse_code, :hidden),
158
- dropid: item.dig(:ref, :analyse_code, :dropid))
159
- end
160
-
161
- def init_bib_caches(node)
162
- return if @no_isobib
163
-
164
- global = !@no_isobib_cache && !node.attr("local-cache-only")
165
- local = node.attr("local-cache") || node.attr("local-cache-only")
166
- local = nil if @no_isobib_cache
167
- @bibdb = Relaton::Db.init_bib_caches(
168
- local_cache: local,
169
- flush_caches: node.attr("flush-caches"),
170
- global_cache: global,
171
- )
172
- end
173
-
174
- def init_iev_caches(node)
175
- unless @no_isobib_cache || @no_isobib
176
- node.attr("local-cache-only") or
177
- @iev_globalname = global_ievcache_name
178
- @iev_localname = local_ievcache_name(node.attr("local-cache") ||
179
- node.attr("local-cache-only"))
180
- if node.attr("flush-caches")
181
- FileUtils.rm_f @iev_globalname unless @iev_globalname.nil?
182
- FileUtils.rm_f @iev_localname unless @iev_localname.nil?
183
- end
184
- end
185
- # @iev = Iev::Db.new(globalname, localname) unless @no_isobib
186
- end
187
88
  end
188
89
  end
189
90
  end
@@ -69,43 +69,46 @@ module Metanorma
69
69
  def analyse_ref_localfile(ret)
70
70
  m = /^local-file\((?:(?<source>[^,]+),\s*)?(?<id>.+)\)$/.match(ret[:id])
71
71
  m or return ret
72
-
73
72
  ret.merge(id: m[:id], localfile: (m[:source] || "default"))
74
73
  end
75
74
 
76
75
  def analyse_ref_nofetch(ret)
77
- return ret unless m = /^nofetch\((?<id>.+)\)$/.match(ret[:id])
78
-
76
+ m = /^nofetch\((?<id>.+)\)$/.match(ret[:id]) or return ret
79
77
  ret.merge(id: m[:id], nofetch: true)
80
78
  end
81
79
 
82
80
  def analyse_ref_hidden(ret)
83
- return ret unless m = /^hidden\((?<id>.+)\)$/.match(ret[:id])
84
-
81
+ m = /^hidden\((?<id>.+)\)$/.match(ret[:id]) or return ret
85
82
  ret.merge(id: m[:id], hidden: true)
86
83
  end
87
84
 
88
85
  def analyse_ref_dropid(ret)
89
- return ret unless m = /^dropid\((?<id>.+)\)$/.match(ret[:id])
90
-
86
+ m = /^dropid\((?<id>.+)\)$/.match(ret[:id]) or return ret
91
87
  ret.merge(id: m[:id], dropid: true)
92
88
  end
93
89
 
94
90
  def analyse_ref_repo_path(ret)
95
- return ret unless m =
96
- /^(?<type>repo|path):\((?<key>[^,]+),?(?<id>.*)\)$/
97
- .match(ret[:id])
98
-
91
+ m = /^(?<type>repo|path):\((?<key>[^,]+),?(?<id>.*)\)$/
92
+ .match(ret[:id]) or return ret
99
93
  id = m[:id].empty? ? m[:key].sub(%r{^[^/]+/}, "") : m[:id]
100
94
  ret.merge(id: id, type: m[:type], key: m[:key], nofetch: true)
101
95
  end
102
96
 
103
97
  def analyse_ref_numeric(ret)
104
- return ret unless /^\d+$/.match?(ret[:id])
105
-
98
+ /^\d+$/.match?(ret[:id]) or return ret
106
99
  ret.merge(numeric: true)
107
100
  end
108
101
 
102
+ def analyse_ref_dual(ret)
103
+ m = /^(?<type>merge|dual)\((?<keys>.+)\)$/.match(ret[:id]) or
104
+ return ret
105
+ line = CSV.parse_line(m[:keys], liberal_parsing: true) or return ret
106
+ line.size > 1 or return ret
107
+ ret[:id] = line.first
108
+ ret[m[:type].to_sym] = line[1..-1].map(&:strip)
109
+ ret
110
+ end
111
+
109
112
  def analyse_ref_code(code)
110
113
  ret = { id: code }
111
114
  code.nil? || code.empty? and return ret
@@ -157,13 +160,16 @@ module Metanorma
157
160
 
158
161
  # ref id = (usrlbl)code[:-]year
159
162
  # code = \[? number \]? | ident | nofetch(code) | hidden(code) |
160
- # dropid(code) | # (repo|path):(key,code) | local-file(source,? key)
163
+ # dropid(code) | # (repo|path):(key,code) | local-file(source,? key) |
164
+ # merge(code, code) | dual(code, code)
161
165
  def analyse_ref_code_nested(ret)
162
- analyse_ref_numeric(
163
- analyse_ref_repo_path(
164
- analyse_ref_dropid(
165
- analyse_ref_hidden(
166
- analyse_ref_nofetch(analyse_ref_localfile(ret)),
166
+ analyse_ref_dual(
167
+ analyse_ref_numeric(
168
+ analyse_ref_repo_path(
169
+ analyse_ref_dropid(
170
+ analyse_ref_hidden(
171
+ analyse_ref_nofetch(analyse_ref_localfile(ret)),
172
+ ),
167
173
  ),
168
174
  ),
169
175
  ),
@@ -193,12 +199,12 @@ module Metanorma
193
199
  REF
194
200
 
195
201
  def ref_normalise(ref)
196
- ref.gsub(/&amp;amp;/, "&amp;").gsub(%r{^<em>(.*)</em>}, "\\1")
202
+ ref.gsub("&amp;amp;", "&amp;").gsub(%r{^<em>(.*)</em>}, "\\1")
197
203
  end
198
204
 
199
205
  def ref_normalise_no_format(ref)
200
- ref.gsub(/&amp;amp;/, "&amp;")
201
- .gsub(/>\n/, "> \n")
206
+ ref.gsub("&amp;amp;", "&amp;")
207
+ .gsub(">\n", "> \n")
202
208
  end
203
209
 
204
210
  def skip_docid
@@ -11,6 +11,7 @@ module Metanorma
11
11
  module Standoc
12
12
  module Validate
13
13
  def content_validate(doc)
14
+ @doctype = doc.at("//bibdata/ext/doctype")&.text
14
15
  repeat_id_validate(doc.root) # feeds xref_validate
15
16
  xref_validate(doc) # feeds nested_asset_validate
16
17
  nested_asset_validate(doc)
@@ -19,6 +19,6 @@ module Metanorma
19
19
  end
20
20
 
21
21
  module Standoc
22
- VERSION = "2.5.5".freeze
22
+ VERSION = "2.6.1".freeze
23
23
  end
24
24
  end
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_dependency "addressable", "~> 2.8.0"
32
32
  spec.add_dependency "asciidoctor", "~> 2.0.0"
33
33
  spec.add_dependency "iev", "~> 0.3.0"
34
- spec.add_dependency "isodoc", "~> 2.6.1"
34
+ spec.add_dependency "isodoc", "~> 2.6.3"
35
35
  spec.add_dependency "metanorma", ">= 1.6.0"
36
36
  spec.add_dependency "metanorma-plugin-datastruct", "~> 0.2.0"
37
37
  spec.add_dependency "metanorma-plugin-glossarist", "~> 0.1.1"
@@ -40,9 +40,8 @@ Gem::Specification.new do |spec|
40
40
  # relaton-cli not just relaton, to avoid circular reference in metanorma
41
41
  spec.add_dependency "asciimath2unitsml", "~> 0.4.0"
42
42
  spec.add_dependency "concurrent-ruby"
43
- spec.add_dependency "plurimath"
44
43
  spec.add_dependency "pngcheck"
45
- spec.add_dependency "relaton-cli", "~> 1.15.0"
44
+ spec.add_dependency "relaton-cli", "~> 1.16.0"
46
45
  spec.add_dependency "relaton-iev", "~> 1.1.5"
47
46
  spec.add_dependency "unicode2latex", "~> 0.0.1"
48
47
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metanorma-standoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.5
4
+ version: 2.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-06 00:00:00.000000000 Z
11
+ date: 2023-10-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 2.6.1
61
+ version: 2.6.3
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 2.6.1
68
+ version: 2.6.3
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: metanorma
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -164,20 +164,6 @@ dependencies:
164
164
  - - ">="
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
- - !ruby/object:Gem::Dependency
168
- name: plurimath
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - ">="
172
- - !ruby/object:Gem::Version
173
- version: '0'
174
- type: :runtime
175
- prerelease: false
176
- version_requirements: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - ">="
179
- - !ruby/object:Gem::Version
180
- version: '0'
181
167
  - !ruby/object:Gem::Dependency
182
168
  name: pngcheck
183
169
  requirement: !ruby/object:Gem::Requirement
@@ -198,14 +184,14 @@ dependencies:
198
184
  requirements:
199
185
  - - "~>"
200
186
  - !ruby/object:Gem::Version
201
- version: 1.15.0
187
+ version: 1.16.0
202
188
  type: :runtime
203
189
  prerelease: false
204
190
  version_requirements: !ruby/object:Gem::Requirement
205
191
  requirements:
206
192
  - - "~>"
207
193
  - !ruby/object:Gem::Version
208
- version: 1.15.0
194
+ version: 1.16.0
209
195
  - !ruby/object:Gem::Dependency
210
196
  name: relaton-iev
211
197
  requirement: !ruby/object:Gem::Requirement
@@ -528,6 +514,7 @@ files:
528
514
  - lib/metanorma/standoc/merge_bibitems.rb
529
515
  - lib/metanorma/standoc/processor.rb
530
516
  - lib/metanorma/standoc/ref.rb
517
+ - lib/metanorma/standoc/ref_queue.rb
531
518
  - lib/metanorma/standoc/ref_sect.rb
532
519
  - lib/metanorma/standoc/ref_utility.rb
533
520
  - lib/metanorma/standoc/render.rb