metanorma-standoc 2.8.8 → 2.8.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/isodoc/html/htmlstyle.css +52 -0
- data/lib/metanorma/standoc/base.rb +3 -2
- data/lib/metanorma/standoc/basicdoc.rng +840 -419
- data/lib/metanorma/standoc/biblio.rng +26 -27
- data/lib/metanorma/standoc/cleanup.rb +1 -0
- data/lib/metanorma/standoc/cleanup_bibdata.rb +0 -84
- data/lib/metanorma/standoc/cleanup_bibitem.rb +47 -0
- data/lib/metanorma/standoc/cleanup_dochistory.rb +89 -0
- data/lib/metanorma/standoc/cleanup_image.rb +1 -6
- data/lib/metanorma/standoc/cleanup_inline.rb +1 -6
- data/lib/metanorma/standoc/cleanup_maths.rb +1 -2
- data/lib/metanorma/standoc/init.rb +2 -0
- data/lib/metanorma/standoc/inline.rb +2 -1
- data/lib/metanorma/standoc/isodoc.rng +351 -510
- data/lib/metanorma/standoc/ref.rb +27 -26
- data/lib/metanorma/standoc/ref_utility.rb +15 -9
- data/lib/metanorma/standoc/version.rb +1 -1
- data/metanorma-standoc.gemspec +2 -2
- metadata +8 -7
@@ -122,6 +122,23 @@
|
|
122
122
|
</oneOrMore>
|
123
123
|
</choice>
|
124
124
|
</define>
|
125
|
+
<define name="LocalizedMarkedUpString1">
|
126
|
+
<!-- multiple languages and scripts possible: comma delimit them if so -->
|
127
|
+
<ref name="LocalizedStringAttrs"/>
|
128
|
+
<oneOrMore>
|
129
|
+
<ref name="TextElement"/>
|
130
|
+
</oneOrMore>
|
131
|
+
</define>
|
132
|
+
<define name="LocalizedMarkedUpString">
|
133
|
+
<choice>
|
134
|
+
<ref name="LocalizedMarkedUpString1"/>
|
135
|
+
<oneOrMore>
|
136
|
+
<element name="variant">
|
137
|
+
<ref name="LocalizedMarkedUpString1"/>
|
138
|
+
</element>
|
139
|
+
</oneOrMore>
|
140
|
+
</choice>
|
141
|
+
</define>
|
125
142
|
<!--
|
126
143
|
Unlike UML, change type to format: type is overloaded
|
127
144
|
Would be need if plain were default value and could omit the attribute
|
@@ -204,10 +221,7 @@
|
|
204
221
|
</define>
|
205
222
|
<define name="roledescription">
|
206
223
|
<element name="description">
|
207
|
-
<ref name="
|
208
|
-
<oneOrMore>
|
209
|
-
<ref name="TextElement"/>
|
210
|
-
</oneOrMore>
|
224
|
+
<ref name="LocalizedMarkedUpString"/>
|
211
225
|
</element>
|
212
226
|
</define>
|
213
227
|
<define name="person">
|
@@ -332,10 +346,7 @@
|
|
332
346
|
</define>
|
333
347
|
<define name="affiliationdescription">
|
334
348
|
<element name="description">
|
335
|
-
<ref name="
|
336
|
-
<oneOrMore>
|
337
|
-
<ref name="TextElement"/>
|
338
|
-
</oneOrMore>
|
349
|
+
<ref name="LocalizedMarkedUpString"/>
|
339
350
|
</element>
|
340
351
|
</define>
|
341
352
|
<define name="organization">
|
@@ -384,7 +395,7 @@
|
|
384
395
|
</define>
|
385
396
|
<define name="logo">
|
386
397
|
<element name="logo">
|
387
|
-
<ref name="image"/>
|
398
|
+
<ref name="image-no-id"/>
|
388
399
|
</element>
|
389
400
|
</define>
|
390
401
|
<define name="depiction">
|
@@ -393,7 +404,7 @@
|
|
393
404
|
<attribute name="scope"/>
|
394
405
|
</optional>
|
395
406
|
<zeroOrMore>
|
396
|
-
<ref name="image"/>
|
407
|
+
<ref name="image-no-id"/>
|
397
408
|
</zeroOrMore>
|
398
409
|
</element>
|
399
410
|
</define>
|
@@ -946,10 +957,7 @@
|
|
946
957
|
<optional>
|
947
958
|
<attribute name="type"/>
|
948
959
|
</optional>
|
949
|
-
<ref name="
|
950
|
-
<zeroOrMore>
|
951
|
-
<ref name="TextElement"/>
|
952
|
-
</zeroOrMore>
|
960
|
+
<ref name="LocalizedMarkedUpString"/>
|
953
961
|
</define>
|
954
962
|
<!-- TitleType = ( "alternative" | "original" | "unofficial" | "subtitle" | "main" ) -->
|
955
963
|
<define name="TypedUri">
|
@@ -1040,10 +1048,7 @@
|
|
1040
1048
|
<data type="boolean"/>
|
1041
1049
|
</attribute>
|
1042
1050
|
</optional>
|
1043
|
-
<ref name="
|
1044
|
-
<oneOrMore>
|
1045
|
-
<ref name="TextElement"/>
|
1046
|
-
</oneOrMore>
|
1051
|
+
<ref name="LocalizedMarkedUpString"/>
|
1047
1052
|
</element>
|
1048
1053
|
</define>
|
1049
1054
|
<define name="docnumber">
|
@@ -1268,10 +1273,7 @@
|
|
1268
1273
|
<optional>
|
1269
1274
|
<attribute name="type"/>
|
1270
1275
|
</optional>
|
1271
|
-
<ref name="
|
1272
|
-
<oneOrMore>
|
1273
|
-
<ref name="TextElement"/>
|
1274
|
-
</oneOrMore>
|
1276
|
+
<ref name="LocalizedMarkedUpString"/>
|
1275
1277
|
</element>
|
1276
1278
|
</define>
|
1277
1279
|
<define name="bibabstract">
|
@@ -1279,7 +1281,7 @@
|
|
1279
1281
|
<ref name="LocalizedStringAttrs"/>
|
1280
1282
|
<choice>
|
1281
1283
|
<oneOrMore>
|
1282
|
-
<ref name="
|
1284
|
+
<ref name="BasicBlockNoId"/>
|
1283
1285
|
</oneOrMore>
|
1284
1286
|
<oneOrMore>
|
1285
1287
|
<ref name="TextElement"/>
|
@@ -1389,10 +1391,7 @@
|
|
1389
1391
|
</attribute>
|
1390
1392
|
<optional>
|
1391
1393
|
<element name="description">
|
1392
|
-
<ref name="
|
1393
|
-
<oneOrMore>
|
1394
|
-
<ref name="TextElement"/>
|
1395
|
-
</oneOrMore>
|
1394
|
+
<ref name="LocalizedMarkedUpString"/>
|
1396
1395
|
</element>
|
1397
1396
|
</optional>
|
1398
1397
|
<element name="bibitem">
|
@@ -149,90 +149,6 @@ module Metanorma
|
|
149
149
|
ins.next = c
|
150
150
|
end
|
151
151
|
end
|
152
|
-
|
153
|
-
def bib_relation_insert_pt(xmldoc)
|
154
|
-
ins = nil
|
155
|
-
%w(relation copyright status abstract script language note version
|
156
|
-
edition contributor).each do |x|
|
157
|
-
ins = xmldoc.at("//bibdata/#{x}[last()]") and break
|
158
|
-
end
|
159
|
-
ins
|
160
|
-
end
|
161
|
-
|
162
|
-
def ext_dochistory_cleanup(xmldoc)
|
163
|
-
t = xmldoc.xpath("//metanorma-extension/clause/title").detect do |x|
|
164
|
-
x.text.strip.casecmp("document history").zero?
|
165
|
-
end or return
|
166
|
-
a = t.at("../sourcecode") or return
|
167
|
-
ins = bib_relation_insert_pt(xmldoc) or return
|
168
|
-
docid = xmldoc.at("//bibdata/docidentifier")
|
169
|
-
yaml = YAML.safe_load(a.text, permitted_classes: [Date])
|
170
|
-
ext_dochistory_process(yaml, ins, docid)
|
171
|
-
end
|
172
|
-
|
173
|
-
def ext_dochistory_process(yaml, ins, docid)
|
174
|
-
yaml.is_a?(Hash) and yaml = [yaml]
|
175
|
-
yaml.reverse.each do |y|
|
176
|
-
type = y["relation.type"] || "updatedBy"
|
177
|
-
docid and
|
178
|
-
y["docid"] ||= [{ "type" => docid["type"], "id" => docid.text }]
|
179
|
-
r = yaml2relaton(y, amend_hash2mn(y["amend"]))
|
180
|
-
ins.next = "<relation type='#{type}'>#{r}</relation>"
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
def amend_hash2mn(yaml)
|
185
|
-
yaml.nil? and return ""
|
186
|
-
yaml.is_a?(Hash) and yaml = [yaml]
|
187
|
-
yaml.map { |x| amend_hash2mn1(x) }.join("\n")
|
188
|
-
end
|
189
|
-
|
190
|
-
def amend_attrs(yaml)
|
191
|
-
ret = ""
|
192
|
-
yaml["change"] ||= "modify"
|
193
|
-
%w(change path path_end title).each do |x|
|
194
|
-
a = yaml[x] and ret += " #{x}='#{a}'"
|
195
|
-
end
|
196
|
-
ret = "<amend#{ret}>"
|
197
|
-
end
|
198
|
-
|
199
|
-
def amend_hash2mn1(yaml)
|
200
|
-
ret = amend_attrs(yaml)
|
201
|
-
ret += amend_description(yaml)
|
202
|
-
ret += amend_location(yaml)
|
203
|
-
ret += amend_classification(yaml)
|
204
|
-
"#{ret}</amend>"
|
205
|
-
end
|
206
|
-
|
207
|
-
def amend_location(yaml)
|
208
|
-
a = yaml["location"] or return ""
|
209
|
-
a.is_a?(Array) or a = [a]
|
210
|
-
ret = a.map do |x|
|
211
|
-
elem = Nokogiri::XML("<location>#{x}</location>").root
|
212
|
-
extract_localities(elem)
|
213
|
-
elem.children.to_xml
|
214
|
-
end.join("\n")
|
215
|
-
"<location>#{ret}</location>"
|
216
|
-
end
|
217
|
-
|
218
|
-
def amend_description(yaml)
|
219
|
-
a = yaml["description"] or return ""
|
220
|
-
out = adoc2xml(a, backend.to_sym)
|
221
|
-
"<description>#{out.children.to_xml}</description>"
|
222
|
-
end
|
223
|
-
|
224
|
-
def amend_classification(yaml)
|
225
|
-
a = yaml["classification"] or return ""
|
226
|
-
a.is_a?(Array) or a = [a]
|
227
|
-
a.map { |x| amend_classification1(x) }.join("\n")
|
228
|
-
end
|
229
|
-
|
230
|
-
def amend_classification1(yaml)
|
231
|
-
yaml.is_a?(Hash) or yaml = { "tag" => "default", "value" => yaml }
|
232
|
-
<<~OUT
|
233
|
-
<classification><tag>#{yaml['tag']}</tag><value>#{yaml['value']}</value></classification>
|
234
|
-
OUT
|
235
|
-
end
|
236
152
|
end
|
237
153
|
end
|
238
154
|
end
|
@@ -133,11 +133,58 @@ module Metanorma
|
|
133
133
|
end
|
134
134
|
end
|
135
135
|
|
136
|
+
def attachment_cleanup(xmldoc)
|
137
|
+
xmldoc.xpath("//bibitem[uri/@type = 'attachment']").each do |b|
|
138
|
+
b["hidden"] = "true"
|
139
|
+
u = b.at("./uri[@type = 'attachment']")
|
140
|
+
c = b.at("./uri[@type = 'citation']") ||
|
141
|
+
u.after("<uri type='citation'/>")
|
142
|
+
uri = save_attachment(u.text, b)
|
143
|
+
u.children = uri
|
144
|
+
c.children = uri
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def save_attachment(path, bib)
|
149
|
+
init_attachments
|
150
|
+
valid_attachment?(path, bib) or return ""
|
151
|
+
f = File.basename(path)
|
152
|
+
File.exist?(File.join(@attachmentsdir, f)) and
|
153
|
+
f += "_#{UUIDTools::UUID.random_create}"
|
154
|
+
ret = File.join(@attachmentsdir, f)
|
155
|
+
FileUtils.cp(path, ret)
|
156
|
+
datauri_attachment(ret, bib.document)
|
157
|
+
ret
|
158
|
+
end
|
159
|
+
|
160
|
+
def datauri_attachment(path, doc)
|
161
|
+
@datauriattachment or return
|
162
|
+
n = add_misc_container(doc)
|
163
|
+
f = File.basename(path)
|
164
|
+
d = Vectory::Utils.datauri(path)
|
165
|
+
n << "<attachment name='#{f}'>#{d}</attachment>"
|
166
|
+
end
|
167
|
+
|
168
|
+
def valid_attachment?(path, bib)
|
169
|
+
File.exist?(path) and return true
|
170
|
+
@log.add("Bibliography", bib, "Attachment #{path} does not exist",
|
171
|
+
severity: 0)
|
172
|
+
false
|
173
|
+
end
|
174
|
+
|
175
|
+
def init_attachments
|
176
|
+
@attachmentsdir and return
|
177
|
+
@attachmentsdir = File.join(@output_dir, "_#{@filename}_attachments")
|
178
|
+
FileUtils.rm_rf(@attachmentsdir)
|
179
|
+
FileUtils.mkdir_p(@attachmentsdir)
|
180
|
+
end
|
181
|
+
|
136
182
|
def bibitem_cleanup(xmldoc)
|
137
183
|
bibitem_nested_id(xmldoc)
|
138
184
|
ref_dl_cleanup(xmldoc)
|
139
185
|
formattedref_spans(xmldoc)
|
140
186
|
fetch_local_bibitem(xmldoc)
|
187
|
+
attachment_cleanup(xmldoc)
|
141
188
|
end
|
142
189
|
end
|
143
190
|
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module Metanorma
|
2
|
+
module Standoc
|
3
|
+
module Cleanup
|
4
|
+
def bib_relation_insert_pt(xmldoc)
|
5
|
+
ins = nil
|
6
|
+
%w(relation copyright status abstract script language note version
|
7
|
+
edition contributor).each do |x|
|
8
|
+
ins = xmldoc.at("//bibdata/#{x}[last()]") and break
|
9
|
+
end
|
10
|
+
ins
|
11
|
+
end
|
12
|
+
|
13
|
+
def ext_dochistory_cleanup(xmldoc)
|
14
|
+
t = xmldoc.xpath("//metanorma-extension/clause/title").detect do |x|
|
15
|
+
x.text.strip.casecmp("document history").zero?
|
16
|
+
end or return
|
17
|
+
a = t.at("../sourcecode") or return
|
18
|
+
ins = bib_relation_insert_pt(xmldoc) or return
|
19
|
+
docid = xmldoc.at("//bibdata/docidentifier")
|
20
|
+
yaml = YAML.safe_load(a.text, permitted_classes: [Date])
|
21
|
+
ext_dochistory_process(yaml, ins, docid)
|
22
|
+
end
|
23
|
+
|
24
|
+
def ext_dochistory_process(yaml, ins, docid)
|
25
|
+
yaml.is_a?(Hash) and yaml = [yaml]
|
26
|
+
yaml.reverse.each do |y|
|
27
|
+
type = y["relation.type"] || "updatedBy"
|
28
|
+
docid and
|
29
|
+
y["docid"] ||= [{ "type" => docid["type"], "id" => docid.text }]
|
30
|
+
r = yaml2relaton(y, amend_hash2mn(y["amend"]))
|
31
|
+
ins.next = "<relation type='#{type}'>#{r}</relation>"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def amend_hash2mn(yaml)
|
36
|
+
yaml.nil? and return ""
|
37
|
+
yaml.is_a?(Hash) and yaml = [yaml]
|
38
|
+
yaml.map { |x| amend_hash2mn1(x) }.join("\n")
|
39
|
+
end
|
40
|
+
|
41
|
+
def amend_attrs(yaml)
|
42
|
+
ret = ""
|
43
|
+
yaml["change"] ||= "modify"
|
44
|
+
%w(change path path_end title).each do |x|
|
45
|
+
a = yaml[x] and ret += " #{x}='#{a}'"
|
46
|
+
end
|
47
|
+
ret = "<amend#{ret}>"
|
48
|
+
end
|
49
|
+
|
50
|
+
def amend_hash2mn1(yaml)
|
51
|
+
ret = amend_attrs(yaml)
|
52
|
+
ret += amend_description(yaml)
|
53
|
+
ret += amend_location(yaml)
|
54
|
+
ret += amend_classification(yaml)
|
55
|
+
"#{ret}</amend>"
|
56
|
+
end
|
57
|
+
|
58
|
+
def amend_location(yaml)
|
59
|
+
a = yaml["location"] or return ""
|
60
|
+
a.is_a?(Array) or a = [a]
|
61
|
+
ret = a.map do |x|
|
62
|
+
elem = Nokogiri::XML("<location>#{x}</location>").root
|
63
|
+
extract_localities(elem)
|
64
|
+
elem.children.to_xml
|
65
|
+
end.join("\n")
|
66
|
+
"<location>#{ret}</location>"
|
67
|
+
end
|
68
|
+
|
69
|
+
def amend_description(yaml)
|
70
|
+
a = yaml["description"] or return ""
|
71
|
+
out = adoc2xml(a, backend.to_sym)
|
72
|
+
"<description>#{out.children.to_xml}</description>"
|
73
|
+
end
|
74
|
+
|
75
|
+
def amend_classification(yaml)
|
76
|
+
a = yaml["classification"] or return ""
|
77
|
+
a.is_a?(Array) or a = [a]
|
78
|
+
a.map { |x| amend_classification1(x) }.join("\n")
|
79
|
+
end
|
80
|
+
|
81
|
+
def amend_classification1(yaml)
|
82
|
+
yaml.is_a?(Hash) or yaml = { "tag" => "default", "value" => yaml }
|
83
|
+
<<~OUT
|
84
|
+
<classification><tag>#{yaml['tag']}</tag><value>#{yaml['value']}</value></classification>
|
85
|
+
OUT
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -10,17 +10,12 @@ module Metanorma
|
|
10
10
|
Vectory::SvgMapping.new(xmldoc, @localdir).call
|
11
11
|
end
|
12
12
|
|
13
|
-
def guid?(str)
|
14
|
-
/^_[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
|
15
|
-
.match(str)
|
16
|
-
end
|
17
|
-
|
18
13
|
def svgmap_moveattrs(xmldoc)
|
19
14
|
xmldoc.xpath("//svgmap").each do |s|
|
20
15
|
f = s.at(".//figure") or next
|
21
16
|
(t = s.at("./name")) && !f.at("./name") and
|
22
17
|
f.children.first.previous = t.remove
|
23
|
-
if s["id"] &&
|
18
|
+
if s["id"] && Metanorma::Utils::guid_anchor?(f["id"])
|
24
19
|
f["id"] = s["id"]
|
25
20
|
s.delete("id")
|
26
21
|
end
|
@@ -165,11 +165,6 @@ module Metanorma
|
|
165
165
|
end
|
166
166
|
end
|
167
167
|
|
168
|
-
def guid?(str)
|
169
|
-
/^_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/
|
170
|
-
.match?(str)
|
171
|
-
end
|
172
|
-
|
173
168
|
def contenthash_id_cleanup(doc)
|
174
169
|
ids = contenthash_id_make(doc)
|
175
170
|
contenthash_id_update_refs(doc, ids)
|
@@ -177,7 +172,7 @@ module Metanorma
|
|
177
172
|
|
178
173
|
def contenthash_id_make(doc)
|
179
174
|
doc.xpath("//*[@id]").each_with_object({}) do |x, m|
|
180
|
-
next unless
|
175
|
+
next unless Metanorma::Utils::guid_anchor?(x["id"])
|
181
176
|
|
182
177
|
m[x["id"]] = contenthash(x)
|
183
178
|
x["id"] = m[x["id"]]
|
@@ -36,6 +36,7 @@ module Metanorma
|
|
36
36
|
@document_scheme = document_scheme(node)
|
37
37
|
@xrefstyle = node.attr("xrefstyle")
|
38
38
|
@source_linenums = node.attr("source-linenums-option") == "true"
|
39
|
+
@default_doctype = "standard"
|
39
40
|
end
|
40
41
|
|
41
42
|
def init_processing(node)
|
@@ -46,6 +47,7 @@ module Metanorma
|
|
46
47
|
@sourcecode_markup_start = node.attr("sourcecode-markup-start") || "{{{"
|
47
48
|
@sourcecode_markup_end = node.attr("sourcecode-markup-end") || "}}}"
|
48
49
|
@datauriimage = node.attr("data-uri-image") != "false"
|
50
|
+
@datauriattachment = node.attr("data-uri-attachment") != "false"
|
49
51
|
@blockunnumbered = (node.attr("block-unnumbered") || "").split(",")
|
50
52
|
.map(&:strip)
|
51
53
|
end
|