metanorma-standoc 2.4.2 → 2.4.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/metanorma/standoc/base.rb +10 -5
- data/lib/metanorma/standoc/blocks.rb +2 -1
- data/lib/metanorma/standoc/cleanup_block.rb +1 -2
- data/lib/metanorma/standoc/cleanup_boilerplate.rb +0 -1
- data/lib/metanorma/standoc/cleanup_footnotes.rb +5 -1
- data/lib/metanorma/standoc/cleanup_maths.rb +1 -1
- data/lib/metanorma/standoc/cleanup_ref.rb +20 -13
- data/lib/metanorma/standoc/cleanup_xref.rb +5 -5
- data/lib/metanorma/standoc/converter.rb +2 -1
- data/lib/metanorma/standoc/isodoc.rng +16 -7
- data/lib/metanorma/standoc/macros.rb +1 -0
- data/lib/metanorma/standoc/merge_bibitems.rb +2 -2
- data/lib/metanorma/standoc/ref.rb +40 -25
- data/lib/metanorma/standoc/ref_utility.rb +51 -3
- data/lib/metanorma/standoc/spans_to_bibitem.rb +3 -1
- data/lib/metanorma/standoc/spans_to_bibitem_preprocessing.rb +3 -2
- data/lib/metanorma/standoc/terms.rb +40 -24
- data/lib/metanorma/standoc/validate.rb +1 -27
- data/lib/metanorma/standoc/validate_xref.rb +32 -0
- data/lib/metanorma/standoc/version.rb +1 -1
- data/metanorma-standoc.gemspec +2 -1
- metadata +19 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 75e40756e5df255cdb9b0f3bb4d4d2f020ac176558e26bc673bf9b0cf9197d48
|
4
|
+
data.tar.gz: d1c03ebbfa2bffdc9e526370584ee26757c43e0d545c279a15b89000743efc18
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70c270785a8fa09a9734bca27b90a119b3bd7c9b78ab48f88aed19e6e5f805086996acc55412741c260b2ae272bac27b3ede2e6158aa215c12b0751bba98462a
|
7
|
+
data.tar.gz: 81881b81ae25e30dd2e4cfc22ff424fe268355697f62feaf18e3e07c2f55769fc64ab9f9a228cd5e815abf3144db6ec5d215702786863cb04d952d6b1f8ed9d4
|
@@ -168,9 +168,14 @@ module Metanorma
|
|
168
168
|
Metanorma.versioned(Metanorma, flavour)[-1]::VERSION
|
169
169
|
end
|
170
170
|
|
171
|
-
def
|
172
|
-
|
171
|
+
def schema_version
|
172
|
+
f = File.read(File.join(File.dirname(__FILE__), "isodoc.rng"))
|
173
|
+
m = / VERSION (v\S+)/.match(f)
|
174
|
+
m[1]
|
175
|
+
end
|
173
176
|
|
177
|
+
def clean_exit
|
178
|
+
@novalid or @log.write("#{@output_dir}#{@filename}.err")
|
174
179
|
@files_to_delete.each { |f| FileUtils.rm f }
|
175
180
|
end
|
176
181
|
|
@@ -185,7 +190,8 @@ module Metanorma
|
|
185
190
|
|
186
191
|
def makexml1(node)
|
187
192
|
result = ["<?xml version='1.0' encoding='UTF-8'?>",
|
188
|
-
"<#{xml_root_tag} type='semantic' version='#{version}'
|
193
|
+
"<#{xml_root_tag} type='semantic' version='#{version}' " \
|
194
|
+
"schema-version='#{schema_version}'>"]
|
189
195
|
result << noko { |ixml| front node, ixml }
|
190
196
|
result << noko { |ixml| middle node, ixml }
|
191
197
|
result << "</#{xml_root_tag}>"
|
@@ -225,8 +231,7 @@ module Metanorma
|
|
225
231
|
def metadata_attrs(node)
|
226
232
|
node.attributes.each_with_object([]) do |(k, v), ret|
|
227
233
|
%w(presentation semantic).each do |t|
|
228
|
-
|
229
|
-
|
234
|
+
/^#{t}-metadata-/.match?(k) or next
|
230
235
|
k = k.sub(/^#{t}-metadata-/, "")
|
231
236
|
csv_split(v, ",")&.each do |c|
|
232
237
|
ret << "<#{t}-metadata><#{k}>#{c}</#{k}></#{t}-metadata>"
|
@@ -197,8 +197,9 @@ module Metanorma
|
|
197
197
|
type: node.attr("type"))))
|
198
198
|
end
|
199
199
|
|
200
|
+
# term sources occasionally turning up as "source source"?
|
200
201
|
def paragraph(node)
|
201
|
-
node.role == "source" and return termsource(node)
|
202
|
+
node.role&.sub(/ .*$/, "") == "source" and return termsource(node)
|
202
203
|
noko do |xml|
|
203
204
|
xml.p **para_attrs(node) do |xml_t|
|
204
205
|
xml_t << node.content
|
@@ -238,7 +238,6 @@ module Metanorma
|
|
238
238
|
def bibdata_embed_id_cleanup(xmldoc)
|
239
239
|
@embed_id.nil? and return
|
240
240
|
bibdata = xmldoc.at("//bibdata")
|
241
|
-
#require "debug"; binding.b
|
242
241
|
@embed_id.each do |d|
|
243
242
|
bibdata = bibdata.at("./relation[@type = 'derivedFrom']/bibitem")
|
244
243
|
ident = bibdata.at("./docidentifier[@primary = 'true']") ||
|
@@ -42,11 +42,15 @@ module Metanorma
|
|
42
42
|
outnum = idx
|
43
43
|
seen[content] = outnum
|
44
44
|
end
|
45
|
-
fnote["reference"] = (outnum
|
45
|
+
fnote["reference"] = table_footnote_number(outnum)
|
46
46
|
fnote["table"] = true
|
47
47
|
[idx, seen]
|
48
48
|
end
|
49
49
|
|
50
|
+
def table_footnote_number(outnum)
|
51
|
+
(outnum - 1 + "a".ord).chr
|
52
|
+
end
|
53
|
+
|
50
54
|
def table_footnote_renumber(xmldoc)
|
51
55
|
xmldoc.xpath("//table | //figure").each do |t|
|
52
56
|
seen = {}
|
@@ -116,9 +116,7 @@ module Metanorma
|
|
116
116
|
|
117
117
|
def biblio_hidden_inherit(xmldoc)
|
118
118
|
xmldoc.xpath("//references[@hidden = 'true']").each do |r|
|
119
|
-
r.xpath("./bibitem").each
|
120
|
-
b["hidden"] = true
|
121
|
-
end
|
119
|
+
r.xpath("./bibitem").each { |b| b["hidden"] = true }
|
122
120
|
end
|
123
121
|
end
|
124
122
|
|
@@ -164,7 +162,7 @@ module Metanorma
|
|
164
162
|
|
165
163
|
def format_ref(ref, type)
|
166
164
|
ret = Nokogiri::XML.fragment(ref)
|
167
|
-
ret.traverse { |x| x.remove if x.name == "fn"}
|
165
|
+
ret.traverse { |x| x.remove if x.name == "fn" }
|
168
166
|
ref = to_xml(ret)
|
169
167
|
return @isodoc.docid_prefix(type, ref) if type != "metanorma"
|
170
168
|
return "[#{ref}]" if /^\d+$/.match(ref) && !/^\[.*\]$/.match(ref)
|
@@ -182,18 +180,27 @@ module Metanorma
|
|
182
180
|
xmldoc.xpath("//bibitem[not(ancestor::bibitem)]").each do |ref|
|
183
181
|
docid = select_docid(ref) or next
|
184
182
|
reference = format_ref(docid.children.to_xml, docid["type"])
|
185
|
-
@anchors[ref["id"]] = { xref: reference }
|
183
|
+
@anchors[ref["id"]] = { xref: reference, id: idtype2cit(ref) }
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def idtype2cit(ref)
|
188
|
+
ref.xpath("./docidentifier/@type").each_with_object({}) do |t, m|
|
189
|
+
m[t.text] and next
|
190
|
+
docid = select_docid(ref, t.text) or next
|
191
|
+
m[t.text] = format_ref(docid.children.to_xml, docid["type"])
|
186
192
|
end
|
187
193
|
end
|
188
194
|
|
189
|
-
def select_docid(ref)
|
190
|
-
|
191
|
-
|
192
|
-
ref.at("./docidentifier[@primary = 'true'][
|
193
|
-
ref.at("./docidentifier[@primary = 'true']") ||
|
194
|
-
ref.at("./docidentifier[
|
195
|
-
ref.at("./docidentifier[not(@type = 'DOI')][
|
196
|
-
ref.at("./docidentifier[not(@type = 'DOI')]")
|
195
|
+
def select_docid(ref, type = nil)
|
196
|
+
type and t = "[@type = '#{type}']"
|
197
|
+
ref.at("./docidentifier[@type = 'metanorma']#{t}") ||
|
198
|
+
ref.at("./docidentifier[@primary = 'true'][@language = '#{@lang}']#{t}") ||
|
199
|
+
ref.at("./docidentifier[@primary = 'true'][not(@language)]#{t}") ||
|
200
|
+
ref.at("./docidentifier[@primary = 'true']#{t}") ||
|
201
|
+
ref.at("./docidentifier[not(@type = 'DOI')][@language = '#{@lang}']#{t}") ||
|
202
|
+
ref.at("./docidentifier[not(@type = 'DOI')][not(@language)]#{t}") ||
|
203
|
+
ref.at("./docidentifier[not(@type = 'DOI')]#{t}")
|
197
204
|
end
|
198
205
|
|
199
206
|
def fetch_termbase(_termbase, _id)
|
@@ -72,17 +72,17 @@ module Metanorma
|
|
72
72
|
elem.name = name
|
73
73
|
elem["bibitemid"] = elem["target"]
|
74
74
|
if ref = @anchors&.dig(elem["target"], :xref)
|
75
|
+
t = @anchors.dig(elem["target"], :id, elem["style"]) and
|
76
|
+
ref = t
|
75
77
|
elem["citeas"] = @c.decode(ref)
|
76
|
-
else
|
77
|
-
elem["citeas"] = ""
|
78
|
-
xref_to_eref1(elem)
|
78
|
+
else xref_to_eref1(elem)
|
79
79
|
end
|
80
80
|
elem.delete("target")
|
81
|
-
elem.delete("style")
|
82
81
|
extract_localities(elem)
|
83
82
|
end
|
84
83
|
|
85
84
|
def xref_to_eref1(elem)
|
85
|
+
elem["citeas"] = ""
|
86
86
|
@internal_eref_namespaces.include?(elem["type"]) or
|
87
87
|
@log.add("Crossreferences", elem,
|
88
88
|
"#{elem['target']} does not have a corresponding " \
|
@@ -132,7 +132,7 @@ module Metanorma
|
|
132
132
|
|
133
133
|
def xref_compound_cleanup(xmldoc)
|
134
134
|
xmldoc.xpath("//xref").each do |x|
|
135
|
-
|
135
|
+
x["target"].include?(";") or next
|
136
136
|
locations = x["target"].split(";")
|
137
137
|
x["target"] = locations.first.sub(/^[^!]*!/, "")
|
138
138
|
xref_compound_cleanup1(x, locations)
|
@@ -22,6 +22,7 @@ module Metanorma
|
|
22
22
|
Asciidoctor::Extensions.register do
|
23
23
|
preprocessor Metanorma::Standoc::Datamodel::AttributesTablePreprocessor
|
24
24
|
preprocessor Metanorma::Standoc::Datamodel::DiagramPreprocessor
|
25
|
+
preprocessor Metanorma::Plugin::Glossarist::DatasetPreprocessor
|
25
26
|
preprocessor Metanorma::Plugin::Datastruct::Json2TextPreprocessor
|
26
27
|
preprocessor Metanorma::Plugin::Datastruct::Yaml2TextPreprocessor
|
27
28
|
inline_macro Metanorma::Standoc::PreferredTermInlineMacro
|
@@ -86,7 +87,7 @@ module Metanorma
|
|
86
87
|
basebackend "html"
|
87
88
|
outfilesuffix ".xml"
|
88
89
|
@libdir = File.dirname(self.class::_file || __FILE__)
|
89
|
-
|
90
|
+
@c = HTMLEntities.new
|
90
91
|
end
|
91
92
|
|
92
93
|
class << self
|
@@ -17,6 +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.2 -->
|
20
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">
|
21
22
|
<include href="reqt.rng"/>
|
22
23
|
<include href="basicdoc.rng">
|
@@ -210,6 +211,9 @@
|
|
210
211
|
<data type="boolean"/>
|
211
212
|
</attribute>
|
212
213
|
</optional>
|
214
|
+
<optional>
|
215
|
+
<attribute name="style"/>
|
216
|
+
</optional>
|
213
217
|
<ref name="CitationType"/>
|
214
218
|
<oneOrMore>
|
215
219
|
<ref name="PureTextElement"/>
|
@@ -1349,15 +1353,19 @@
|
|
1349
1353
|
</choice>
|
1350
1354
|
</element>
|
1351
1355
|
</define>
|
1356
|
+
<define name="Root-Attributes">
|
1357
|
+
<attribute name="version"/>
|
1358
|
+
<attribute name="schema-version"/>
|
1359
|
+
<attribute name="type">
|
1360
|
+
<choice>
|
1361
|
+
<value>semantic</value>
|
1362
|
+
<value>presentation</value>
|
1363
|
+
</choice>
|
1364
|
+
</attribute>
|
1365
|
+
</define>
|
1352
1366
|
<define name="standard-document">
|
1353
1367
|
<element name="standard-document">
|
1354
|
-
<
|
1355
|
-
<attribute name="type">
|
1356
|
-
<choice>
|
1357
|
-
<value>semantic</value>
|
1358
|
-
<value>presentation</value>
|
1359
|
-
</choice>
|
1360
|
-
</attribute>
|
1368
|
+
<ref name="Root-Attributes"/>
|
1361
1369
|
<ref name="bibdata"/>
|
1362
1370
|
<optional>
|
1363
1371
|
<ref name="misccontainer"/>
|
@@ -2131,6 +2139,7 @@
|
|
2131
2139
|
<choice>
|
2132
2140
|
<value>identical</value>
|
2133
2141
|
<value>modified</value>
|
2142
|
+
<value>adapted</value>
|
2134
2143
|
<value>restyled</value>
|
2135
2144
|
<value>context-added</value>
|
2136
2145
|
<value>generalisation</value>
|
@@ -12,6 +12,7 @@ require_relative "./macros_embed"
|
|
12
12
|
require_relative "./datamodel/attributes_table_preprocessor"
|
13
13
|
require_relative "./datamodel/diagram_preprocessor"
|
14
14
|
require "metanorma-plugin-datastruct"
|
15
|
+
require "metanorma-plugin-glossarist"
|
15
16
|
require "metanorma-plugin-lutaml"
|
16
17
|
|
17
18
|
module Metanorma
|
@@ -35,12 +35,12 @@ module Metanorma
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def merge1(old, new)
|
38
|
-
%i(link docid date title series).each do |k|
|
38
|
+
%i(link docid date title series biblionote).each do |k|
|
39
39
|
merge_by_type(old, new, k, :type)
|
40
40
|
end
|
41
41
|
merge_extent(old, new)
|
42
42
|
merge_contributor(old, new)
|
43
|
-
%i(place
|
43
|
+
%i(place version edition).each do |k|
|
44
44
|
merge_simple(old, new, k)
|
45
45
|
end
|
46
46
|
merge_relations(old, new)
|
@@ -14,25 +14,28 @@ module Metanorma
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
def isorefrender1(bib, match, year, allp = "")
|
17
|
+
def isorefrender1(bib, match, code, year, allp = "")
|
18
18
|
bib.title(**plaintxt) { |i| i << ref_normalise(match[:text]) }
|
19
19
|
docid(bib, match[:usrlbl]) if match[:usrlbl]
|
20
|
+
docid(bib, code[:usrlabel]) if code && code[:usrlabel]
|
20
21
|
docid(bib, id_and_year(match[:code], year) + allp)
|
21
22
|
docnumber(bib, match[:code])
|
22
23
|
end
|
23
24
|
|
24
|
-
def isorefmatchescode(match)
|
25
|
+
def isorefmatchescode(match, _item)
|
26
|
+
code = analyse_ref_code(match[:code])
|
25
27
|
yr = norm_year(match[:year])
|
26
28
|
{ code: match[:code], year: yr, match: match,
|
27
|
-
title: match[:text], usrlbl: match[:usrlbl],
|
28
|
-
lang: (@lang || :all) }
|
29
|
+
title: match[:text], usrlbl: match[:usrlbl] || code[:usrlabel],
|
30
|
+
analyse_code: code, lang: (@lang || :all) }
|
29
31
|
end
|
30
32
|
|
31
33
|
def isorefmatchesout(item, xml)
|
32
34
|
if item[:doc] then use_retrieved_relaton(item, xml)
|
33
35
|
else
|
34
36
|
xml.bibitem **attr_code(ref_attributes(item[:ref][:match])) do |t|
|
35
|
-
isorefrender1(t, item[:ref][:match], item[:ref][:
|
37
|
+
isorefrender1(t, item[:ref][:match], item[:ref][:analyse_code],
|
38
|
+
item[:ref][:year])
|
36
39
|
item[:ref][:year] and t.date type: "published" do |d|
|
37
40
|
set_date_range(d, item[:ref][:year])
|
38
41
|
end
|
@@ -41,21 +44,24 @@ module Metanorma
|
|
41
44
|
end
|
42
45
|
end
|
43
46
|
|
44
|
-
def isorefmatches2code(match)
|
47
|
+
def isorefmatches2code(match, _item)
|
48
|
+
code = analyse_ref_code(match[:code])
|
45
49
|
{ code: match[:code], no_year: true, lang: (@lang || :all),
|
46
50
|
note: match[:fn], year: nil, match: match,
|
47
|
-
|
51
|
+
analyse_code: code,
|
52
|
+
title: match[:text], usrlbl: match[:usrlbl] || code[:usrlabel] }
|
48
53
|
end
|
49
54
|
|
50
55
|
def isorefmatches2out(item, xml)
|
51
56
|
if item[:doc] then use_retrieved_relaton(item, xml)
|
52
|
-
else isorefmatches2_1(xml, item[:ref][:match]
|
57
|
+
else isorefmatches2_1(xml, item[:ref][:match],
|
58
|
+
item[:ref][:analyse_code])
|
53
59
|
end
|
54
60
|
end
|
55
61
|
|
56
|
-
def isorefmatches2_1(xml, match)
|
62
|
+
def isorefmatches2_1(xml, match, code)
|
57
63
|
xml.bibitem **attr_code(ref_attributes(match)) do |t|
|
58
|
-
isorefrender1(t, match, "--")
|
64
|
+
isorefrender1(t, match, code, "--")
|
59
65
|
t.date type: "published" do |d|
|
60
66
|
d.on "--"
|
61
67
|
end
|
@@ -68,13 +74,14 @@ module Metanorma
|
|
68
74
|
end
|
69
75
|
end
|
70
76
|
|
71
|
-
def isorefmatches3code(match)
|
77
|
+
def isorefmatches3code(match, _item)
|
78
|
+
code = analyse_ref_code(match[:code])
|
72
79
|
yr = norm_year(match[:year])
|
73
80
|
hasyr = !yr.nil? && yr != "--"
|
74
81
|
{ code: match[:code], match: match, yr: yr, hasyr: hasyr,
|
75
82
|
year: hasyr ? yr : nil,
|
76
83
|
all_parts: true, no_year: yr == "--",
|
77
|
-
|
84
|
+
title: match[:text], usrlbl: match[:usrlbl] || code[:usrlabel],
|
78
85
|
lang: (@lang || :all) }
|
79
86
|
end
|
80
87
|
|
@@ -82,14 +89,15 @@ module Metanorma
|
|
82
89
|
if item[:doc] then use_retrieved_relaton(item, xml)
|
83
90
|
else
|
84
91
|
isorefmatches3_1(xml, item[:ref][:match],
|
92
|
+
item[:ref][:analyse_code],
|
85
93
|
item[:ref][:yr],
|
86
94
|
item[:ref][:hasyr], item[:doc])
|
87
95
|
end
|
88
96
|
end
|
89
97
|
|
90
|
-
def isorefmatches3_1(xml, match, year, _hasyr, _ref)
|
98
|
+
def isorefmatches3_1(xml, match, code, year, _hasyr, _ref)
|
91
99
|
xml.bibitem(**attr_code(ref_attributes(match))) do |t|
|
92
|
-
isorefrender1(t, match, year, " (all parts)")
|
100
|
+
isorefrender1(t, match, code, year, " (all parts)")
|
93
101
|
conditional_date(t, match, year == "--")
|
94
102
|
iso_publisher(t, match[:code])
|
95
103
|
if match.names.include?("fn") && match[:fn]
|
@@ -110,7 +118,9 @@ module Metanorma
|
|
110
118
|
end
|
111
119
|
# code[:id].sub!(/[:-](19|20)[0-9][0-9]$/, "")
|
112
120
|
docid(bib, match[:usrlbl]) if match[:usrlbl]
|
113
|
-
docid(bib,
|
121
|
+
docid(bib, code[:usrlabel]) if code[:usrlabel]
|
122
|
+
code[:id] and
|
123
|
+
docid(bib, /^\d+$/.match?(code[:id]) ? "[#{code[:id]}]" : code[:id])
|
114
124
|
code[:type] == "repo" and
|
115
125
|
bib.docidentifier code[:key], type: "repository"
|
116
126
|
end
|
@@ -122,10 +132,10 @@ module Metanorma
|
|
122
132
|
t.formattedref format: "application/x-isodoc+xml" do |i|
|
123
133
|
i << ref_normalise_no_format(match[:text])
|
124
134
|
end
|
125
|
-
yr_match =
|
135
|
+
yr_match = refitem1yr(code[:id])
|
126
136
|
refitem_render1(match, code, t)
|
127
137
|
/^\d+$|^\(.+\)$/.match?(code[:id]) or
|
128
|
-
docnumber(t, code[:id]
|
138
|
+
docnumber(t, code[:id]&.sub(/[:-](19|20)[0-9][0-9]$/, ""))
|
129
139
|
conditional_date(t, yr_match || match, false)
|
130
140
|
end
|
131
141
|
end
|
@@ -143,16 +153,17 @@ module Metanorma
|
|
143
153
|
((code[:id] && code[:numeric]) || code[:nofetch]) and
|
144
154
|
return { code: nil, match: match, analyse_code: code,
|
145
155
|
hidden: code[:hidden] }
|
146
|
-
year = refitem1yr(code[:id])
|
147
156
|
{ code: code[:id], analyse_code: code, localfile: code[:localfile],
|
148
|
-
year: year,
|
157
|
+
year: (m = refitem1yr(code[:id])) ? m[:year] : nil,
|
149
158
|
title: match[:text], match: match, hidden: code[:hidden],
|
150
|
-
usrlbl: match[:usrlbl], lang: (@lang || :all) }
|
159
|
+
usrlbl: match[:usrlbl] || code[:usrlabel], lang: (@lang || :all) }
|
151
160
|
end
|
152
161
|
|
153
162
|
def refitem1yr(code)
|
154
|
-
yr_match = /[:-](?<year>(?:19|20)[0-9][0-9])
|
155
|
-
|
163
|
+
yr_match = /[:-](?<year>(?:19|20)[0-9][0-9])$/.match(code)
|
164
|
+
/[:-](?:19|20)[0-9][0-9].*?[:-](?:19|20)[0-9][0-9]$/.match(code) and
|
165
|
+
yr_match = nil
|
166
|
+
yr_match
|
156
167
|
end
|
157
168
|
|
158
169
|
def refitemout(item, xml)
|
@@ -200,13 +211,17 @@ module Metanorma
|
|
200
211
|
matched, matched2, matched3 = reference1_matches(item)
|
201
212
|
if matched3.nil? && matched2.nil? && matched.nil?
|
202
213
|
refitemcode(item, node).merge(process: 0)
|
203
|
-
elsif !matched.nil? then isorefmatchescode(matched
|
204
|
-
|
205
|
-
elsif !
|
214
|
+
elsif !matched.nil? then isorefmatchescode(matched,
|
215
|
+
item).merge(process: 1)
|
216
|
+
elsif !matched2.nil? then isorefmatches2code(matched2,
|
217
|
+
item).merge(process: 2)
|
218
|
+
elsif !matched3.nil? then isorefmatches3code(matched3,
|
219
|
+
item).merge(process: 3)
|
206
220
|
end
|
207
221
|
end
|
208
222
|
|
209
223
|
def reference1out(item, xml)
|
224
|
+
item[:ref][:analyse_code] ||= analyse_ref_code(item[:ref][:code])
|
210
225
|
case item[:ref][:process]
|
211
226
|
when 0 then refitemout(item, xml)
|
212
227
|
when 1 then isorefmatchesout(item, xml)
|
@@ -52,6 +52,7 @@ module Metanorma
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def docnumber(bib, code)
|
55
|
+
code or return
|
55
56
|
bib.docnumber do |d|
|
56
57
|
d << @c.decode(code).sub(/^[^\d]*/, "")
|
57
58
|
end
|
@@ -105,12 +106,59 @@ module Metanorma
|
|
105
106
|
ret.merge(numeric: true)
|
106
107
|
end
|
107
108
|
|
108
|
-
# ref id = (usrlbl)code[:-]year
|
109
|
-
# code = \[? number \]? | ident | nofetch(code) | hidden(code) |
|
110
|
-
# dropid(code) | # (repo|path):(key,code) | local-file(source,? key)
|
111
109
|
def analyse_ref_code(code)
|
112
110
|
ret = { id: code }
|
113
111
|
code.nil? || code.empty? and return ret
|
112
|
+
analyse_ref_code_csv(ret) ||
|
113
|
+
analyse_ref_code_nested(ret)
|
114
|
+
end
|
115
|
+
|
116
|
+
def analyse_ref_code_csv(ret)
|
117
|
+
ret[:id].include?("=") or return nil
|
118
|
+
line = CSV.parse_line(ret[:id], liberal_parsing: true) or return nil
|
119
|
+
a = analyse_ref_code_csv_breakup(line)
|
120
|
+
analyse_ref_code_csv_map(a)
|
121
|
+
rescue StandardError
|
122
|
+
nil
|
123
|
+
end
|
124
|
+
|
125
|
+
def analyse_ref_code_csv_breakup(line)
|
126
|
+
line.each_with_object({}) do |x, m|
|
127
|
+
kv = x.split("=", 2)
|
128
|
+
kv.size == 1 and kv = ["code", kv.first]
|
129
|
+
m[kv[0].to_sym] = kv[1].delete_prefix('"').delete_suffix('"')
|
130
|
+
.delete_prefix("'").delete_suffix("'")
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def analyse_ref_code_csv_map(source)
|
135
|
+
source.each_with_object({}) do |(k, v), ret|
|
136
|
+
case k
|
137
|
+
when :dropid, :hidden, :nofetch
|
138
|
+
ret[k] = v == "true"
|
139
|
+
when :repo, :path
|
140
|
+
ret[:type] = k.to_s
|
141
|
+
ret[:key] = v
|
142
|
+
ret[:nofetch] = true
|
143
|
+
source[:code] or
|
144
|
+
ret[:id] = v.sub(%r{^[^/]+/}, "")
|
145
|
+
when :"local-file"
|
146
|
+
ret[:localfile] = v
|
147
|
+
when :number
|
148
|
+
if source[:code] then ret[:usrlabel] = "(#{v})"
|
149
|
+
else ret[:numeric] = true
|
150
|
+
end
|
151
|
+
when :usrlabel
|
152
|
+
ret[:usrlabel] = "(#{v})"
|
153
|
+
when :code then ret[:id] = v
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
# ref id = (usrlbl)code[:-]year
|
159
|
+
# code = \[? number \]? | ident | nofetch(code) | hidden(code) |
|
160
|
+
# dropid(code) | # (repo|path):(key,code) | local-file(source,? key)
|
161
|
+
def analyse_ref_code_nested(ret)
|
114
162
|
analyse_ref_numeric(
|
115
163
|
analyse_ref_repo_path(
|
116
164
|
analyse_ref_dropid(
|
@@ -70,7 +70,9 @@ module Metanorma
|
|
70
70
|
ret = ""
|
71
71
|
spans[:edition] and ret += "<edition>#{spans[:edition]}</edition>"
|
72
72
|
spans[:version] and ret += "<version>#{spans[:version]}</version>"
|
73
|
-
spans[:note] and
|
73
|
+
spans[:note] and
|
74
|
+
ret += "<note type='#{spans[:note][:type]}'>#{spans[:note][:val]}" \
|
75
|
+
"</note>".sub(/<note type=''>/, "<note>")
|
74
76
|
ret
|
75
77
|
end
|
76
78
|
|
@@ -45,9 +45,10 @@ module Metanorma
|
|
45
45
|
when "pages", "volume", "issue"
|
46
46
|
ret[:extent][span[:key].to_sym] ||= []
|
47
47
|
ret[:extent][span[:key].to_sym] << span[:val]
|
48
|
-
when "pubplace", "title", "type", "series", "edition", "version"
|
49
|
-
"note"
|
48
|
+
when "pubplace", "title", "type", "series", "edition", "version"
|
50
49
|
ret[span[:key].to_sym] = span[:val]
|
50
|
+
when "note"
|
51
|
+
ret[span[:key].to_sym] = { type: span[:type], val: span[:val] }
|
51
52
|
when "in_title"
|
52
53
|
ret[:in][:title] = span[:val]
|
53
54
|
when "publisher"
|
@@ -6,10 +6,9 @@ module Metanorma
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def nonterm_symbols_parse(attrs, xml, node)
|
9
|
-
|
10
|
-
@definitions = false
|
9
|
+
stash_symbols
|
11
10
|
clause_parse(attrs, xml, node)
|
12
|
-
|
11
|
+
pop_symbols
|
13
12
|
end
|
14
13
|
|
15
14
|
def symbols_attrs(node, attr)
|
@@ -26,28 +25,45 @@ module Metanorma
|
|
26
25
|
node.role == "nonterm" and return nonterm_symbols_parse(attr, xml, node)
|
27
26
|
xml.definitions **attr_code(attr) do |xml_section|
|
28
27
|
xml_section.title { |t| t << node.title }
|
29
|
-
|
30
|
-
termdefs = @term_def
|
28
|
+
stash_symbols
|
31
29
|
@definitions = true
|
32
|
-
|
30
|
+
stash_term_def
|
33
31
|
xml_section << node.content
|
34
|
-
|
35
|
-
|
32
|
+
pop_symbols
|
33
|
+
pop_term_def
|
36
34
|
end
|
37
35
|
end
|
38
36
|
|
39
37
|
def nonterm_term_def_subclause_parse(attrs, xml, node)
|
40
|
-
|
41
|
-
@term_def = false
|
38
|
+
stash_term_def
|
42
39
|
clause_parse(attrs, xml, node)
|
43
|
-
|
40
|
+
pop_term_def
|
44
41
|
end
|
45
42
|
|
46
43
|
def terms_boilerplate_parse(attrs, xml, node)
|
47
|
-
|
48
|
-
@term_def = false
|
44
|
+
stash_term_def
|
49
45
|
clause_parse(attrs.merge(type: "boilerplate"), xml, node)
|
50
|
-
|
46
|
+
pop_term_def
|
47
|
+
end
|
48
|
+
|
49
|
+
def stash_term_def
|
50
|
+
@stashed_term_def ||= []
|
51
|
+
@stashed_term_def.push(@term_def)
|
52
|
+
@term_def = false
|
53
|
+
end
|
54
|
+
|
55
|
+
def pop_term_def
|
56
|
+
@term_def = @stashed_term_def.pop
|
57
|
+
end
|
58
|
+
|
59
|
+
def stash_symbols
|
60
|
+
@stashed_definitions ||= []
|
61
|
+
@stashed_definitions.push(@definitions)
|
62
|
+
@definitions = false
|
63
|
+
end
|
64
|
+
|
65
|
+
def pop_symbols
|
66
|
+
@definitions = @stashed_definitions.pop
|
51
67
|
end
|
52
68
|
|
53
69
|
# subclause contains subclauses
|
@@ -106,14 +122,14 @@ module Metanorma
|
|
106
122
|
end
|
107
123
|
|
108
124
|
def add_term_source(node, xml_t, seen_xref, match)
|
109
|
-
|
110
|
-
|
111
|
-
|
125
|
+
attrs = {}
|
126
|
+
body = seen_xref.children[0]
|
127
|
+
unless body.name == "concept"
|
112
128
|
attrs = termsource_origin_attrs(node, seen_xref)
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
129
|
+
body = body.children
|
130
|
+
end
|
131
|
+
xml_t.origin **attr_code(attrs) do |o|
|
132
|
+
o << body.to_xml
|
117
133
|
end
|
118
134
|
add_term_source_mod(xml_t, match)
|
119
135
|
end
|
@@ -136,15 +152,15 @@ module Metanorma
|
|
136
152
|
def extract_termsource_refs(text, node)
|
137
153
|
matched = TERM_REFERENCE_RE.match text
|
138
154
|
matched.nil? and @log.add("AsciiDoc Input", node,
|
139
|
-
"term reference not in expected format:"\
|
155
|
+
"term reference not in expected format:" \
|
140
156
|
"#{text}")
|
141
157
|
matched
|
142
158
|
end
|
143
159
|
|
144
160
|
def termsource_attrs(node, matched)
|
145
|
-
status = node.attr("status") ||
|
161
|
+
status = node.attr("status")&.downcase ||
|
146
162
|
(matched[:text] ? "modified" : "identical")
|
147
|
-
{ status: status, type: node.attr("type") || "authoritative" }
|
163
|
+
{ status: status, type: node.attr("type")&.downcase || "authoritative" }
|
148
164
|
end
|
149
165
|
|
150
166
|
def termsource(node)
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require "metanorma/standoc/utils"
|
2
2
|
require_relative "./validate_section"
|
3
3
|
require_relative "./validate_table"
|
4
|
+
require_relative "./validate_xref"
|
4
5
|
require "nokogiri"
|
5
6
|
require "jing"
|
6
7
|
require "iev"
|
@@ -155,22 +156,6 @@ module Metanorma
|
|
155
156
|
ret
|
156
157
|
end
|
157
158
|
|
158
|
-
def repeat_id_validate1(elem)
|
159
|
-
if @doc_ids[elem["id"]]
|
160
|
-
@log.add("Anchors", elem, "Anchor #{elem['id']} has already been " \
|
161
|
-
"used at line #{@doc_ids[elem['id']]}")
|
162
|
-
@fatalerror << "Multiple instances of same ID: #{elem['id']}"
|
163
|
-
end
|
164
|
-
@doc_ids[elem["id"]] = elem.line
|
165
|
-
end
|
166
|
-
|
167
|
-
def repeat_id_validate(doc)
|
168
|
-
@doc_ids = {}
|
169
|
-
doc.xpath("//*[@id]").each do |x|
|
170
|
-
repeat_id_validate1(x)
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
159
|
def schema_validate(doc, schema)
|
175
160
|
Tempfile.open(["tmp", ".xml"], encoding: "UTF-8") do |f|
|
176
161
|
schema_validate1(f, doc, schema)
|
@@ -214,17 +199,6 @@ module Metanorma
|
|
214
199
|
doc
|
215
200
|
end
|
216
201
|
|
217
|
-
# manually check for xref/@target, xref/@to integrity
|
218
|
-
def xref_validate(doc)
|
219
|
-
@doc_xrefs = doc.xpath("//xref/@target | //xref/@to")
|
220
|
-
.each_with_object({}) do |x, m|
|
221
|
-
m[x.text] = x
|
222
|
-
@doc_ids[x.text] and next
|
223
|
-
@log.add("Anchors", x.parent,
|
224
|
-
"Crossreference target #{x} is undefined")
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
202
|
def image_validate(doc)
|
229
203
|
image_exists(doc)
|
230
204
|
png_validate(doc)
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Metanorma
|
2
|
+
module Standoc
|
3
|
+
module Validate
|
4
|
+
def repeat_id_validate1(elem)
|
5
|
+
if @doc_ids[elem["id"]]
|
6
|
+
@log.add("Anchors", elem, "Anchor #{elem['id']} has already been " \
|
7
|
+
"used at line #{@doc_ids[elem['id']]}")
|
8
|
+
@fatalerror << "Multiple instances of same ID: #{elem['id']}"
|
9
|
+
end
|
10
|
+
@doc_ids[elem["id"]] = elem.line
|
11
|
+
end
|
12
|
+
|
13
|
+
def repeat_id_validate(doc)
|
14
|
+
@doc_ids = {}
|
15
|
+
doc.xpath("//*[@id]").each do |x|
|
16
|
+
repeat_id_validate1(x)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# manually check for xref/@target, xref/@to integrity
|
21
|
+
def xref_validate(doc)
|
22
|
+
@doc_xrefs = doc.xpath("//xref/@target | //xref/@to")
|
23
|
+
.each_with_object({}) do |x, m|
|
24
|
+
m[x.text] = x
|
25
|
+
@doc_ids[x.text] and next
|
26
|
+
@log.add("Anchors", x.parent,
|
27
|
+
"Crossreference target #{x} is undefined")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/metanorma-standoc.gemspec
CHANGED
@@ -30,9 +30,10 @@ Gem::Specification.new do |spec|
|
|
30
30
|
|
31
31
|
spec.add_dependency "asciidoctor", "~> 2.0.0"
|
32
32
|
spec.add_dependency "iev", "~> 0.3.0"
|
33
|
-
spec.add_dependency "isodoc", "~> 2.5.
|
33
|
+
spec.add_dependency "isodoc", "~> 2.5.4"
|
34
34
|
spec.add_dependency "metanorma", ">= 1.5.0"
|
35
35
|
spec.add_dependency "metanorma-plugin-datastruct", "~> 0.2.0"
|
36
|
+
spec.add_dependency "metanorma-plugin-glossarist", "~> 0.1.1"
|
36
37
|
spec.add_dependency "metanorma-plugin-lutaml"
|
37
38
|
spec.add_dependency "ruby-jing"
|
38
39
|
# relaton-cli not just relaton, to avoid circular reference in metanorma
|
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.4.
|
4
|
+
version: 2.4.4
|
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-
|
11
|
+
date: 2023-05-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: asciidoctor
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 2.5.
|
47
|
+
version: 2.5.4
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 2.5.
|
54
|
+
version: 2.5.4
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: metanorma
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 0.2.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: metanorma-plugin-glossarist
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.1.1
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.1.1
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: metanorma-plugin-lutaml
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -514,6 +528,7 @@ files:
|
|
514
528
|
- lib/metanorma/standoc/validate.rb
|
515
529
|
- lib/metanorma/standoc/validate_section.rb
|
516
530
|
- lib/metanorma/standoc/validate_table.rb
|
531
|
+
- lib/metanorma/standoc/validate_xref.rb
|
517
532
|
- lib/metanorma/standoc/version.rb
|
518
533
|
- lib/metanorma/standoc/views/datamodel/model_representation.adoc.erb
|
519
534
|
- lib/metanorma/standoc/views/datamodel/plantuml_representation.adoc.erb
|