metanorma-standoc 2.2.7 → 2.3.0
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 +6 -0
- data/lib/metanorma/standoc/base.rb +8 -3
- data/lib/metanorma/standoc/basicdoc.rng +3 -0
- data/lib/metanorma/standoc/biblio-standoc.rng +1 -1
- data/lib/metanorma/standoc/blocks.rb +1 -0
- data/lib/metanorma/standoc/blocks_notes.rb +5 -0
- data/lib/metanorma/standoc/cleanup_biblio.rb +47 -9
- data/lib/metanorma/standoc/cleanup_boilerplate.rb +2 -1
- data/lib/metanorma/standoc/cleanup_section_names.rb +3 -3
- data/lib/metanorma/standoc/cleanup_xref.rb +6 -5
- data/lib/metanorma/standoc/isodoc.rng +2 -1
- data/lib/metanorma/standoc/localbib.rb +77 -0
- data/lib/metanorma/standoc/macros_terms.rb +24 -34
- data/lib/metanorma/standoc/ref.rb +11 -6
- data/lib/metanorma/standoc/ref_sect.rb +34 -12
- data/lib/metanorma/standoc/ref_utility.rb +15 -3
- data/lib/metanorma/standoc/render.rb +2 -2
- data/lib/metanorma/standoc/reqt.rb +3 -2
- data/lib/metanorma/standoc/section.rb +3 -2
- data/lib/metanorma/standoc/validate.rb +1 -2
- data/lib/metanorma/standoc/version.rb +1 -1
- data/metanorma-standoc.gemspec +1 -1
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 95723e2c2f2095e87fcc969fafc1372b8297cd68b4376ce49b50e8bbd3b993b5
|
4
|
+
data.tar.gz: ad570f41788f288d281b419d72eb1026b046e7d4f35260281ccd09138c181ebd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 135b01bb780350e849b3dd5dc7edac3600a1a75fcfdc336b904ca67dfac219923e5c697e5d05b4871ac827194cb582aadb0abcdcfb84280f024a3b7c75c0881f
|
7
|
+
data.tar.gz: e8a1dbe9aeaced49888d73b237c13a8531471c567c7d5ff4278e8cd38d0cdb171bc6c5f3ff824e2df57e7e8bb9e8dd0ff493df6ca16e5c1efda7364e4f692364
|
@@ -263,6 +263,12 @@ body {
|
|
263
263
|
padding-left: 30px; }
|
264
264
|
#toc .h3, #toc > ul > :is(.h1, .h2, .h3, .h4, .h5, .h6) .h3 {
|
265
265
|
padding-left: 50px; }
|
266
|
+
#toc .h4, #toc > ul > :is(.h1, .h2, .h3, .h4, .h5, .h6) .h4 {
|
267
|
+
padding-left: 70px; }
|
268
|
+
#toc .h5, #toc > ul > :is(.h1, .h2, .h3, .h4, .h5, .h6) .h5 {
|
269
|
+
padding-left: 90px; }
|
270
|
+
#toc .h6, #toc > ul > :is(.h1, .h2, .h3, .h4, .h5, .h6) .h6 {
|
271
|
+
padding-left: 110px; }
|
266
272
|
#toc .toc-active, #toc li:hover, #toc > ul > :is(.h1, .h2, .h3, .h4, .h5, .h6) .toc-active, #toc > ul > :is(.h1, .h2, .h3, .h4, .h5, .h6) li:hover {
|
267
273
|
background: #C70039;
|
268
274
|
box-shadow: inset -5px 0px 10px -5px #C70039 !important; }
|
@@ -9,6 +9,7 @@ require "fileutils"
|
|
9
9
|
require "metanorma-utils"
|
10
10
|
require "isodoc/xslfo_convert"
|
11
11
|
require_relative "render"
|
12
|
+
require_relative "localbib"
|
12
13
|
require "mn-requirements"
|
13
14
|
|
14
15
|
module Metanorma
|
@@ -18,6 +19,8 @@ module Metanorma
|
|
18
19
|
XML_NAMESPACE = "https://www.metanorma.org/ns/standoc".freeze
|
19
20
|
FONTS_MANIFEST = "fonts-manifest".freeze
|
20
21
|
|
22
|
+
attr_accessor :log, :fatalerror
|
23
|
+
|
21
24
|
def xml_root_tag
|
22
25
|
self.class::XML_ROOT_TAG
|
23
26
|
end
|
@@ -32,7 +35,7 @@ module Metanorma
|
|
32
35
|
init_processing(node)
|
33
36
|
init_reqt(node)
|
34
37
|
init_toc(node)
|
35
|
-
init_output(node)
|
38
|
+
init_output(node) # feeds init_biblio
|
36
39
|
init_i18n(node)
|
37
40
|
init_biblio(node)
|
38
41
|
@metadata_attrs = metadata_attrs(node)
|
@@ -96,6 +99,7 @@ module Metanorma
|
|
96
99
|
end
|
97
100
|
@localdir = Metanorma::Utils::localdir(node)
|
98
101
|
@output_dir = outputdir node
|
102
|
+
@fatalerror = []
|
99
103
|
end
|
100
104
|
|
101
105
|
def init_i18n(node)
|
@@ -113,6 +117,8 @@ module Metanorma
|
|
113
117
|
@bibdb = nil
|
114
118
|
init_bib_caches(node)
|
115
119
|
init_iev_caches(node)
|
120
|
+
@local_bibdb =
|
121
|
+
::Metanorma::Standoc::LocalBiblio.new(node, @localdir, self)
|
116
122
|
end
|
117
123
|
|
118
124
|
def requirements_processor
|
@@ -226,8 +232,7 @@ module Metanorma
|
|
226
232
|
def outputdir(node)
|
227
233
|
if node.attr("output_dir").nil_or_empty?
|
228
234
|
Metanorma::Utils::localdir(node)
|
229
|
-
else
|
230
|
-
File.join(node.attr("output_dir"), "")
|
235
|
+
else File.join(node.attr("output_dir"), "")
|
231
236
|
end
|
232
237
|
end
|
233
238
|
end
|
@@ -37,6 +37,7 @@ module Metanorma
|
|
37
37
|
reqt_subpart?(role) and return requirement_subpart(node)
|
38
38
|
role == "form" and return form(node)
|
39
39
|
role == "definition" and return termdefinition(node)
|
40
|
+
role == "boilerplate" and return boilerplate_note(node)
|
40
41
|
result = []
|
41
42
|
node.blocks.each { |b| result << send(b.context, b) }
|
42
43
|
result
|
@@ -71,6 +71,11 @@ module Metanorma
|
|
71
71
|
end.join("\n")
|
72
72
|
end
|
73
73
|
|
74
|
+
def boilerplate_note(node)
|
75
|
+
node.set_attr("type", "boilerplate")
|
76
|
+
note(node)
|
77
|
+
end
|
78
|
+
|
74
79
|
def admonition_attrs(node)
|
75
80
|
attr_code(keep_attrs(node).merge(id_attr(node)
|
76
81
|
.merge(admonition_core_attrs(node)
|
@@ -66,6 +66,8 @@ module Metanorma
|
|
66
66
|
name: span[:val] }
|
67
67
|
when "surname", "initials", "givenname", "formatted-initials"
|
68
68
|
ret[:contrib] = spans_preprocess_contrib(span, ret[:contrib])
|
69
|
+
when "fullname"
|
70
|
+
ret[:contrib] = spans_preprocess_fullname(span, ret[:contrib])
|
69
71
|
when "organization"
|
70
72
|
ret[:contrib] = spans_preprocess_org(span, ret[:contrib])
|
71
73
|
when "in_surname", "in_initials", "in_givenname",
|
@@ -74,11 +76,18 @@ module Metanorma
|
|
74
76
|
span[:key].sub!(/^in_/, "")
|
75
77
|
ret[:in][:contrib] =
|
76
78
|
spans_preprocess_contrib(span, ret[:in][:contrib])
|
79
|
+
when "in_fullname"
|
80
|
+
ret[:in][:contrib] ||= []
|
81
|
+
span[:key].sub!(/^in_/, "")
|
82
|
+
ret[:in][:contrib] =
|
83
|
+
spans_preprocess_fullname(span, ret[:in][:contrib])
|
77
84
|
when "in_organization"
|
78
85
|
ret[:in][:contrib] ||= []
|
79
86
|
span[:key].sub!(/^in_/, "")
|
80
87
|
ret[:in][:contrib] =
|
81
88
|
spans_preprocess_org(span, ret[:in][:contrib])
|
89
|
+
else
|
90
|
+
warn "unrecognised `span:#{span["key"]}`"
|
82
91
|
end
|
83
92
|
end
|
84
93
|
|
@@ -100,7 +109,12 @@ module Metanorma
|
|
100
109
|
|
101
110
|
spans_preprocess_new_contrib?(span, contrib) and
|
102
111
|
contrib << { role: span[:type] || "author", entity: "person" }
|
103
|
-
contrib[-1][span[:key].to_sym]
|
112
|
+
if span[:key] == "givenname" && contrib[-1][span[:key].to_sym]
|
113
|
+
contrib[-1][span[:key].to_sym] =
|
114
|
+
Array(contrib[-1][span[:key].to_sym]) + span[:val]
|
115
|
+
else
|
116
|
+
contrib[-1][span[:key].to_sym] = span[:val]
|
117
|
+
end
|
104
118
|
contrib
|
105
119
|
end
|
106
120
|
|
@@ -112,6 +126,19 @@ module Metanorma
|
|
112
126
|
contrib[-1][:role] != (span[:type] || "author")
|
113
127
|
end
|
114
128
|
|
129
|
+
def spans_preprocess_fullname(span, contrib)
|
130
|
+
name = span[:val].gsub(/\.(?=\p{Alpha})/, ". ").split(/ /)
|
131
|
+
out = { role: span[:type] || "author", entity: "person",
|
132
|
+
surname: name[-1] }
|
133
|
+
if name.size > 1 && name[0..-2].all? { |x| /\.$/.match?(x) }
|
134
|
+
out[:"formatted-initials"] = name[0..-2].join(" ")
|
135
|
+
else
|
136
|
+
out[:givenname] = name[0..-2]
|
137
|
+
end
|
138
|
+
contrib << out
|
139
|
+
contrib
|
140
|
+
end
|
141
|
+
|
115
142
|
def spans_preprocess_org(span, contrib)
|
116
143
|
contrib << { role: span[:type] || "author", entity: "organization",
|
117
144
|
name: span[:val] }
|
@@ -122,7 +149,7 @@ module Metanorma
|
|
122
149
|
ret = ""
|
123
150
|
spans[:title] and ret += "<title>#{spans[:title]}</title>"
|
124
151
|
ret += spans_to_bibitem_docid(spans)
|
125
|
-
spans[:contrib].each { |s| ret += span_to_contrib(s) }
|
152
|
+
spans[:contrib].each { |s| ret += span_to_contrib(s, spans[:title]) }
|
126
153
|
spans[:series] and
|
127
154
|
ret += "<series><title>#{spans[:series]}</title></series>"
|
128
155
|
spans[:pubplace] and ret += "<place>#{spans[:pubplace]}</place>"
|
@@ -152,16 +179,18 @@ module Metanorma
|
|
152
179
|
{ volume: "volume", issue: "issue", pages: "page" }.each do |k, v|
|
153
180
|
spans[k]&.each { |s| ret += span_to_extent(s, v) }
|
154
181
|
end
|
155
|
-
ret
|
182
|
+
return "" if ret.empty?
|
183
|
+
|
184
|
+
"<extent>#{ret}</extent>"
|
156
185
|
end
|
157
186
|
|
158
187
|
def span_to_extent(span, key)
|
159
188
|
values = span.split(/[-–]/)
|
160
|
-
ret = "<
|
189
|
+
ret = "<locality type='#{key}'>" \
|
161
190
|
"<referenceFrom>#{values[0]}</referenceFrom>"
|
162
191
|
values[1] and
|
163
192
|
ret += "<referenceTo>#{values[1]}</referenceTo>"
|
164
|
-
"#{ret}</locality
|
193
|
+
"#{ret}</locality>"
|
165
194
|
end
|
166
195
|
|
167
196
|
def span_to_docid(span, key)
|
@@ -172,19 +201,28 @@ module Metanorma
|
|
172
201
|
end
|
173
202
|
end
|
174
203
|
|
175
|
-
def span_to_contrib(span)
|
204
|
+
def span_to_contrib(span, title)
|
176
205
|
e = if span[:entity] == "organization"
|
177
206
|
"<organization><name>#{span[:name]}</name></organization>"
|
178
|
-
else span_to_person(span)
|
207
|
+
else span_to_person(span, title)
|
179
208
|
end
|
180
209
|
"<contributor><role type='#{span[:role]}'/>#{e}</contributor>"
|
181
210
|
end
|
182
211
|
|
183
|
-
def
|
212
|
+
def validate_span_to_person(span, title)
|
213
|
+
span[:surname] and return
|
214
|
+
msg = "Missing surname: issue with bibliographic markup " \
|
215
|
+
"in \"#{title}\": #{span}"
|
216
|
+
@log.add("Bibliography", nil, msg)
|
217
|
+
@fatalerror << msg
|
218
|
+
end
|
219
|
+
|
220
|
+
def span_to_person(span, title)
|
221
|
+
validate_span_to_person(span, title)
|
184
222
|
pre = (span[:"formatted-initials"] and
|
185
223
|
"<formatted-initials>" \
|
186
224
|
"#{span[:"formatted-initials"]}</formatted-initials>") ||
|
187
|
-
"<forename>#{
|
225
|
+
Array(span[:givenname]).map { |x| "<forename>#{x}</forename>" }.join
|
188
226
|
"<person><name>#{pre}<surname>#{span[:surname]}</surname></name>" \
|
189
227
|
"</person>"
|
190
228
|
end
|
@@ -89,7 +89,8 @@ module Metanorma
|
|
89
89
|
|
90
90
|
def termdef_boilerplate_insert(xmldoc, isodoc, once = false)
|
91
91
|
xmldoc.xpath(self.class::TERM_CLAUSE).each do |f|
|
92
|
-
next if f.at("./clause[@type = 'boilerplate']"
|
92
|
+
next if f.at("./clause[@type = 'boilerplate'] | " \
|
93
|
+
"./note[@type = 'boilerplate']")
|
93
94
|
|
94
95
|
term_defs_boilerplate(f.at("./title"),
|
95
96
|
xmldoc.xpath(".//termdocsource"),
|
@@ -44,11 +44,11 @@ module Metanorma
|
|
44
44
|
end
|
45
45
|
|
46
46
|
NO_SYMABBR = "[.//definitions[not(@type)]]".freeze
|
47
|
-
SYMABBR = "[.//definitions[@type = 'symbols']]"\
|
47
|
+
SYMABBR = "[.//definitions[@type = 'symbols']]" \
|
48
48
|
"[.//definitions[@type = 'abbreviated_terms']]".freeze
|
49
|
-
SYMnoABBR = "[.//definitions[@type = 'symbols']]"\
|
49
|
+
SYMnoABBR = "[.//definitions[@type = 'symbols']]" \
|
50
50
|
"[not(.//definitions[@type = 'abbreviated_terms'])]".freeze
|
51
|
-
ABBRnoSYM = "[.//definitions[@type = 'abbreviated_terms']]"\
|
51
|
+
ABBRnoSYM = "[.//definitions[@type = 'abbreviated_terms']]" \
|
52
52
|
"[not(.//definitions[@type = 'symbols'])]".freeze
|
53
53
|
|
54
54
|
def section_names_terms_cleanup(xml)
|
@@ -20,10 +20,11 @@ module Metanorma
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def extract_localities(elem)
|
23
|
-
|
23
|
+
elem.children.empty? and return
|
24
|
+
f = elem.children.first
|
24
25
|
f.text? or return
|
25
26
|
head = f.remove.text
|
26
|
-
tail = elem.children
|
27
|
+
tail = elem.children.remove
|
27
28
|
extract_localities1(elem, head)
|
28
29
|
tail and elem << tail
|
29
30
|
end
|
@@ -76,8 +77,8 @@ module Metanorma
|
|
76
77
|
elem["citeas"] = ""
|
77
78
|
xref_to_eref1(elem)
|
78
79
|
end
|
79
|
-
elem.delete("target")
|
80
|
-
extract_localities(elem)
|
80
|
+
elem.delete("target").delete("style")
|
81
|
+
extract_localities(elem)
|
81
82
|
end
|
82
83
|
|
83
84
|
def xref_to_eref1(elem)
|
@@ -208,7 +209,7 @@ module Metanorma
|
|
208
209
|
@log.add("Crossreferences", x,
|
209
210
|
"#{x['bibitemid']} does not have a corresponding anchor " \
|
210
211
|
"ID in the bibliography!")
|
211
|
-
|
212
|
+
extract_localities(x)
|
212
213
|
end
|
213
214
|
end
|
214
215
|
end
|
@@ -1152,7 +1152,7 @@
|
|
1152
1152
|
<data type="boolean"/>
|
1153
1153
|
</attribute>
|
1154
1154
|
</optional>
|
1155
|
-
<ref name="
|
1155
|
+
<ref name="ReducedBibliographicItem"/>
|
1156
1156
|
</element>
|
1157
1157
|
</define>
|
1158
1158
|
<define name="image" combine="choice">
|
@@ -2653,6 +2653,7 @@
|
|
2653
2653
|
<value>full</value>
|
2654
2654
|
<value>short</value>
|
2655
2655
|
<value>id</value>
|
2656
|
+
<value>modspec</value>
|
2656
2657
|
</choice>
|
2657
2658
|
</define>
|
2658
2659
|
<define name="erefTypeWithConnective">
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require "relaton_bib"
|
2
|
+
|
3
|
+
module Metanorma
|
4
|
+
module Standoc
|
5
|
+
class LocalBiblio
|
6
|
+
def initialize(node, localdir, parent)
|
7
|
+
@file_bibdb = {}
|
8
|
+
@localdir = localdir
|
9
|
+
@parent = parent
|
10
|
+
read_files(node)
|
11
|
+
end
|
12
|
+
|
13
|
+
def read_files(node)
|
14
|
+
if node.attr("relaton-data-source")
|
15
|
+
init_file_bibdb1(node.attr("relaton-data-source"), "default")
|
16
|
+
else
|
17
|
+
node.attributes.each do |k, v|
|
18
|
+
/^relaton-data-source-.+/.match?(k) or next
|
19
|
+
init_file_bibdb1(v, k.sub(/^relaton-data-source-/, ""))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def init_file_bibdb_config(defn, key)
|
25
|
+
/=/.match?(defn) or defn = "file=#{defn}"
|
26
|
+
values = defn.split(",").map { |item| item.split /\s*=\s*/ }.to_h
|
27
|
+
values["key"] = key
|
28
|
+
values["format"] ||= "bibtex" # all we currently suppoort
|
29
|
+
values
|
30
|
+
end
|
31
|
+
|
32
|
+
def init_file_bibdb1(defn, key)
|
33
|
+
v = init_file_bibdb_config(defn, key)
|
34
|
+
r = read_file(v)
|
35
|
+
@file_bibdb[v["key"]] =
|
36
|
+
case v["format"]
|
37
|
+
when "bibtex"
|
38
|
+
RelatonBib::BibtexParser.from_bibtex(r)
|
39
|
+
else
|
40
|
+
format_error(v)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def read_file(config)
|
45
|
+
f = File.join(@localdir, config["file"])
|
46
|
+
File.exist?(f) or return file_error(config)
|
47
|
+
File.read(f)
|
48
|
+
end
|
49
|
+
|
50
|
+
def file_error(config)
|
51
|
+
msg = "Cannot process file #{config['file']} for local relaton " \
|
52
|
+
"data source #{config['key']}"
|
53
|
+
@parent.fatalerror << msg
|
54
|
+
@parent.log.add("Bibliography", nil, msg)
|
55
|
+
""
|
56
|
+
end
|
57
|
+
|
58
|
+
def format_error(config)
|
59
|
+
msg = "Cannot process format #{config['format']} for local relaton " \
|
60
|
+
"data source #{config['key']}"
|
61
|
+
@parent.fatalerror << msg
|
62
|
+
@parent.log.add("Bibliography", nil, msg)
|
63
|
+
{}
|
64
|
+
end
|
65
|
+
|
66
|
+
def get(id, file = default)
|
67
|
+
ret = @file_bibdb.dig(file, id) and return ret
|
68
|
+
|
69
|
+
msg = "Cannot find reference #{id} for local relaton " \
|
70
|
+
"data source #{file}"
|
71
|
+
@parent.fatalerror << msg
|
72
|
+
@parent.log.add("Bibliography", nil, msg)
|
73
|
+
Nokogiri::XML("<bibitem/>")
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -74,7 +74,7 @@ module Metanorma
|
|
74
74
|
|
75
75
|
def process(_parent, _target, attrs)
|
76
76
|
termref = attrs["termxref"] || attrs["name"]
|
77
|
-
"<concept type='term'><termxref>#{attrs['name']}</termxref>"\
|
77
|
+
"<concept type='term'><termxref>#{attrs['name']}</termxref>" \
|
78
78
|
"<renderterm>#{termref}</renderterm><xrefrender/></concept>"
|
79
79
|
end
|
80
80
|
end
|
@@ -87,7 +87,7 @@ module Metanorma
|
|
87
87
|
|
88
88
|
def process(_parent, _target, attrs)
|
89
89
|
termref = attrs["termxref"] || attrs["name"]
|
90
|
-
"<concept type='symbol'><termxref>#{attrs['name']}</termxref>"\
|
90
|
+
"<concept type='symbol'><termxref>#{attrs['name']}</termxref>" \
|
91
91
|
"<renderterm>#{termref}</renderterm><xrefrender/></concept>"
|
92
92
|
end
|
93
93
|
end
|
@@ -113,50 +113,40 @@ module Metanorma
|
|
113
113
|
.match(m[:rest].sub(/^,/, ""))
|
114
114
|
ret[:opt] = CSV.parse_line(m2[:opt].sub(/^,opt(ion)?s=/, "")
|
115
115
|
.sub(/^"(.+)"$/m, "\\1").sub(/^'(.+)'$/m, "\\1"))
|
116
|
-
|
117
|
-
|
118
|
-
rescue StandardError
|
119
|
-
raise "error processing #{m2[:rest]} as CSV"
|
120
|
-
end
|
121
|
-
else
|
122
|
-
begin
|
123
|
-
attrs = CSV.parse_line(m[:rest].sub(/^,/, "")) || []
|
124
|
-
rescue StandardError
|
125
|
-
raise "error processing #{m[:rest]} as CSV"
|
126
|
-
end
|
116
|
+
attrs = preprocess_attrs_csv(m2[:rest])
|
117
|
+
else attrs = preprocess_attrs_csv(m[:rest])
|
127
118
|
end
|
128
119
|
attrs.map! { |x| x.gsub(/\s+/, " ") }
|
129
120
|
ret.merge(term: attrs[0], word: attrs[1] || attrs[0],
|
130
121
|
render: attrs[2])
|
131
122
|
end
|
132
123
|
|
124
|
+
def preprocess_attrs_csv(line)
|
125
|
+
CSV.parse_line(line.sub(/^,/, "")) || []
|
126
|
+
rescue StandardError
|
127
|
+
raise "error processing #{line} as CSV"
|
128
|
+
end
|
129
|
+
|
133
130
|
def generate_attrs(opts)
|
134
131
|
ret = ""
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
opts.include?("nolinkmention") and ret += " linkmention='false'"
|
140
|
-
opts.include?("linkmention") and ret += " linkmention='true'"
|
141
|
-
opts.include?("nolinkref") and ret += " linkref='false'"
|
142
|
-
opts.include?("linkref") and ret += " linkref='true'"
|
132
|
+
%w(ital ref linkmention linkref).each do |x|
|
133
|
+
opts.include?("no#{x}") and ret += " #{x}='false'"
|
134
|
+
opts.include?(x) and ret += " #{x}='true'"
|
135
|
+
end
|
143
136
|
ret
|
144
137
|
end
|
145
138
|
|
146
139
|
def process(parent, target, _attrs)
|
147
140
|
attrs = preprocess_attrs(target)
|
148
|
-
term =
|
149
|
-
|
150
|
-
|
151
|
-
attrs[:word]).convert
|
152
|
-
xref = Asciidoctor::Inline.new(parent, :quoted,
|
153
|
-
attrs[:render]).convert
|
141
|
+
term, word, render = %i(term word render).each_with_object([]) do |x, m|
|
142
|
+
m << Asciidoctor::Inline.new(parent, :quoted, attrs[x]).convert
|
143
|
+
end
|
154
144
|
opt = generate_attrs(attrs[:opt] || [])
|
155
|
-
if attrs[:id] then "<concept#{opt} key='#{attrs[:id]}'><refterm>"\
|
156
|
-
"#{term}</refterm><renderterm>#{word}</renderterm>"\
|
157
|
-
"<xrefrender>#{
|
158
|
-
else "<concept#{opt}><termxref>#{term}</termxref><renderterm>"\
|
159
|
-
"#{word}</renderterm><xrefrender>#{
|
145
|
+
if attrs[:id] then "<concept#{opt} key='#{attrs[:id]}'><refterm>" \
|
146
|
+
"#{term}</refterm><renderterm>#{word}</renderterm>" \
|
147
|
+
"<xrefrender>#{render}</xrefrender></concept>"
|
148
|
+
else "<concept#{opt}><termxref>#{term}</termxref><renderterm>" \
|
149
|
+
"#{word}</renderterm><xrefrender>#{render}</xrefrender></concept>"
|
160
150
|
end
|
161
151
|
rescue StandardError => e
|
162
152
|
raise("processing {{#{target}}}: #{e.message}")
|
@@ -182,9 +172,9 @@ module Metanorma
|
|
182
172
|
out = preprocess_attrs(attrs["text"])
|
183
173
|
term = Asciidoctor::Inline.new(parent, :quoted,
|
184
174
|
out[:term]).convert
|
185
|
-
if out[:id] then "<related type='#{target}' key='#{out[:id]}'>"\
|
175
|
+
if out[:id] then "<related type='#{target}' key='#{out[:id]}'>" \
|
186
176
|
"<refterm>#{term}</refterm></related>"
|
187
|
-
else "<related type='#{target}'><termxref>#{term}</termxref>"\
|
177
|
+
else "<related type='#{target}'><termxref>#{term}</termxref>" \
|
188
178
|
"<xrefrender>#{term}</xrefrender></related>"
|
189
179
|
end
|
190
180
|
rescue StandardError => e
|
@@ -42,10 +42,9 @@ module Metanorma
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def isorefmatches2code(match)
|
45
|
-
{ code: match[:code], no_year: true,
|
45
|
+
{ code: match[:code], no_year: true, lang: (@lang || :all),
|
46
46
|
note: match[:fn], year: nil, match: match,
|
47
|
-
title: match[:text], usrlbl: match[:usrlbl]
|
48
|
-
lang: (@lang || :all) }
|
47
|
+
title: match[:text], usrlbl: match[:usrlbl] }
|
49
48
|
end
|
50
49
|
|
51
50
|
def isorefmatches2out(item, xml)
|
@@ -145,7 +144,7 @@ module Metanorma
|
|
145
144
|
return { code: nil, match: match, analyse_code: code,
|
146
145
|
hidden: code[:hidden] }
|
147
146
|
year = refitem1yr(code[:id])
|
148
|
-
{ code: code[:id], analyse_code: code,
|
147
|
+
{ code: code[:id], analyse_code: code, localfile: code[:localfile],
|
149
148
|
year: year,
|
150
149
|
title: match[:text], match: match, hidden: code[:hidden],
|
151
150
|
usrlbl: match[:usrlbl], lang: (@lang || :all) }
|
@@ -221,7 +220,13 @@ module Metanorma
|
|
221
220
|
refs = node.items.each_with_object([]) do |b, m|
|
222
221
|
m << reference1code(b.text, node)
|
223
222
|
end
|
224
|
-
reference_populate(refs)
|
223
|
+
reference_populate(reference_normalise(refs))
|
224
|
+
end
|
225
|
+
|
226
|
+
def reference_normalise(refs)
|
227
|
+
refs.each do |r|
|
228
|
+
r[:code] = @c.decode(r[:code]).gsub(/\u2009\u2014\u2009/, " -- ")
|
229
|
+
end
|
225
230
|
end
|
226
231
|
|
227
232
|
def reference_populate(refs)
|
@@ -239,7 +244,7 @@ module Metanorma
|
|
239
244
|
ref, i, doc = results.pop
|
240
245
|
m[i.to_i] = { ref: ref }
|
241
246
|
if doc.is_a?(RelatonBib::RequestError)
|
242
|
-
@log.add("Bibliography", nil, "Could not retrieve #{ref[:code]}: "\
|
247
|
+
@log.add("Bibliography", nil, "Could not retrieve #{ref[:code]}: " \
|
243
248
|
"no access to online site")
|
244
249
|
else m[i.to_i][:doc] = doc
|
245
250
|
end
|
@@ -69,41 +69,63 @@ module Metanorma
|
|
69
69
|
return nil if opts[:no_year]
|
70
70
|
|
71
71
|
code = code.sub(/^\([^)]+\)/, "")
|
72
|
-
hit =
|
73
|
-
return nil if hit.nil?
|
74
|
-
|
72
|
+
hit = fetch_ref1(code, year, opts) or return nil
|
75
73
|
xml.parent.add_child(smart_render_xml(hit, code, opts))
|
76
74
|
xml
|
77
75
|
rescue RelatonBib::RequestError
|
78
|
-
@log.add("Bibliography", nil, "Could not retrieve #{code}: "\
|
76
|
+
@log.add("Bibliography", nil, "Could not retrieve #{code}: " \
|
79
77
|
"no access to online site")
|
80
78
|
nil
|
81
79
|
end
|
82
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
|
+
|
83
88
|
def fetch_ref_async(ref, idx, res)
|
84
|
-
if ref[:code].nil? || ref[:no_year] || @bibdb.nil?
|
89
|
+
if ref[:code].nil? || ref[:no_year] || (@bibdb.nil? && !ref[:localfile])
|
85
90
|
res << [ref, idx, nil]
|
86
|
-
|
87
|
-
@
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
+
elsif ref[:localfile]
|
92
|
+
res << [ref, idx, @local_bibdb.get(ref[:code], ref[:localfile])]
|
93
|
+
else fetch_ref_async1(ref, idx, res)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def fetch_ref_async1(ref, idx, res)
|
98
|
+
@bibdb.fetch_async(ref[:code], ref[:year], ref) do |doc|
|
99
|
+
res << [ref, idx, doc]
|
91
100
|
end
|
92
101
|
end
|
93
102
|
|
94
103
|
def emend_biblio(xml, code, title, usrlbl)
|
104
|
+
emend_biblio_id(xml, code)
|
105
|
+
emend_biblio_title(xml, code, title)
|
106
|
+
emend_biblio_usrlbl(xml, usrlbl)
|
107
|
+
end
|
108
|
+
|
109
|
+
def emend_biblio_id(xml, code)
|
95
110
|
unless xml.at("/bibitem/docidentifier[not(@type = 'DOI')][text()]")
|
96
111
|
@log.add("Bibliography", nil,
|
97
112
|
"ERROR: No document identifier retrieved for #{code}")
|
98
113
|
xml.root << "<docidentifier>#{code}</docidentifier>"
|
99
114
|
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def emend_biblio_title(xml, code, title)
|
100
118
|
unless xml.at("/bibitem/title[text()]")
|
101
119
|
@log.add("Bibliography", nil,
|
102
120
|
"ERROR: No title retrieved for #{code}")
|
103
121
|
xml.root << "<title>#{title || '(MISSING TITLE)'}</title>"
|
104
122
|
end
|
105
|
-
|
106
|
-
|
123
|
+
end
|
124
|
+
|
125
|
+
def emend_biblio_usrlbl(xml, usrlbl)
|
126
|
+
usrlbl or return
|
127
|
+
xml.at("/bibitem/docidentifier").next =
|
128
|
+
"<docidentifier type='metanorma'>#{mn_code(usrlbl)}</docidentifier>"
|
107
129
|
end
|
108
130
|
|
109
131
|
def smart_render_xml(xml, code, opts)
|
@@ -62,6 +62,14 @@ module Metanorma
|
|
62
62
|
.sub(/^dropid\((.+)\)$/, "\\1")
|
63
63
|
.sub(/^hidden\((.+)\)$/, "\\1")
|
64
64
|
.sub(/^nofetch\((.+)\)$/, "\\1")
|
65
|
+
.sub(/^local-file\((.+)\)$/, "\\1")
|
66
|
+
end
|
67
|
+
|
68
|
+
def analyse_ref_localfile(ret)
|
69
|
+
m = /^local-file\((?:(?<source>[^,]+),\s*)?(?<id>.+)\)$/.match(ret[:id])
|
70
|
+
m or return ret
|
71
|
+
|
72
|
+
ret.merge(id: m[:id], localfile: (m[:source] || "default"))
|
65
73
|
end
|
66
74
|
|
67
75
|
def analyse_ref_nofetch(ret)
|
@@ -98,15 +106,19 @@ module Metanorma
|
|
98
106
|
end
|
99
107
|
|
100
108
|
# ref id = (usrlbl)code[:-]year
|
101
|
-
# code =
|
102
|
-
#
|
109
|
+
# code = \[? number \]? | ident | nofetch(code) | hidden(code) |
|
110
|
+
# dropid(code) | # (repo|path):(key,code) | local-file(source,? key)
|
103
111
|
def analyse_ref_code(code)
|
104
112
|
ret = { id: code }
|
105
113
|
return ret if code.blank?
|
106
114
|
|
107
115
|
analyse_ref_numeric(
|
108
116
|
analyse_ref_repo_path(
|
109
|
-
analyse_ref_dropid(
|
117
|
+
analyse_ref_dropid(
|
118
|
+
analyse_ref_hidden(
|
119
|
+
analyse_ref_nofetch(analyse_ref_localfile(ret)),
|
120
|
+
),
|
121
|
+
),
|
110
122
|
),
|
111
123
|
)
|
112
124
|
end
|
@@ -19,7 +19,7 @@ module Metanorma
|
|
19
19
|
datauriimage: node.attr("data-uri-image") != "false",
|
20
20
|
htmltoclevels: node.attr("htmltoclevels") || node.attr("toclevels"),
|
21
21
|
doctoclevels: node.attr("doctoclevels") || node.attr("toclevels"),
|
22
|
-
|
22
|
+
breakupurlsintables: node.attr("break-up-urls-in-tables"),
|
23
23
|
suppressasciimathdup: node.attr("suppress-asciimath-dup"),
|
24
24
|
bare: node.attr("bare"),
|
25
25
|
sectionsplit: node.attr("sectionsplit"),
|
@@ -63,7 +63,7 @@ module Metanorma
|
|
63
63
|
olstyle: node.attr("olstyle"),
|
64
64
|
htmltoclevels: node.attr("htmltoclevels") || node.attr("toclevels"),
|
65
65
|
doctoclevels: node.attr("doctoclevels") || node.attr("toclevels"),
|
66
|
-
|
66
|
+
breakupurlsintables: node.attr("break-up-urls-in-tables"),
|
67
67
|
suppressasciimathdup: node.attr("suppress-asciimath-dup"),
|
68
68
|
bare: node.attr("bare"),
|
69
69
|
baseassetpath: node.attr("base-asset-path"),
|
@@ -34,8 +34,9 @@ module Metanorma
|
|
34
34
|
|
35
35
|
def requirement_validate(docxml)
|
36
36
|
docxml.xpath("//requirement | //recommendation | //permission")
|
37
|
-
.
|
38
|
-
@reqt_models.model(r["model"]).validate(r, @log)
|
37
|
+
.each_with_object([]) do |r, m|
|
38
|
+
ret = @reqt_models.model(r["model"]).validate(r, @log)
|
39
|
+
ret.each { |x| m << x }
|
39
40
|
end
|
40
41
|
end
|
41
42
|
end
|
@@ -60,8 +60,9 @@ module Metanorma
|
|
60
60
|
"symbols and abbreviated terms", "clause", "bibliography"].freeze
|
61
61
|
|
62
62
|
def start_main_section(ret, node)
|
63
|
-
|
64
|
-
|
63
|
+
return if node.role == "preface" || node.attr("style") == "preface"
|
64
|
+
|
65
|
+
@preface = false if self.class::MAIN_CLAUSE_NAMES.include?(ret)
|
65
66
|
@preface = false if self.class::PREFACE_CLAUSE_NAMES
|
66
67
|
.intersection(@seen_headers_canonical + [ret]).empty?
|
67
68
|
end
|
@@ -43,7 +43,6 @@ module Metanorma
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def content_validate(doc)
|
46
|
-
@fatalerror = []
|
47
46
|
xref_validate(doc)
|
48
47
|
section_validate(doc)
|
49
48
|
norm_ref_validate(doc)
|
@@ -52,7 +51,7 @@ module Metanorma
|
|
52
51
|
concept_validate(doc, "concept", "refterm")
|
53
52
|
concept_validate(doc, "related", "preferred//name")
|
54
53
|
table_validate(doc)
|
55
|
-
requirement_validate(doc)
|
54
|
+
@fatalerror += requirement_validate(doc)
|
56
55
|
image_validate(doc)
|
57
56
|
@fatalerror.empty? or
|
58
57
|
clean_abort(@fatalerror.join("\n"), doc)
|
data/metanorma-standoc.gemspec
CHANGED
@@ -30,7 +30,7 @@ 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.
|
33
|
+
spec.add_dependency "isodoc", "~> 2.4.0"
|
34
34
|
spec.add_dependency "metanorma"
|
35
35
|
spec.add_dependency "metanorma-plugin-datastruct", "~> 0.2.0"
|
36
36
|
spec.add_dependency "metanorma-plugin-lutaml"
|
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
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-12-05 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.
|
47
|
+
version: 2.4.0
|
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.
|
54
|
+
version: 2.4.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: metanorma
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -503,6 +503,7 @@ files:
|
|
503
503
|
- lib/metanorma/standoc/isodoc-compile.rng
|
504
504
|
- lib/metanorma/standoc/isodoc.rng
|
505
505
|
- lib/metanorma/standoc/lists.rb
|
506
|
+
- lib/metanorma/standoc/localbib.rb
|
506
507
|
- lib/metanorma/standoc/macros.rb
|
507
508
|
- lib/metanorma/standoc/macros_embed.rb
|
508
509
|
- lib/metanorma/standoc/macros_form.rb
|
@@ -548,7 +549,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
548
549
|
- !ruby/object:Gem::Version
|
549
550
|
version: '0'
|
550
551
|
requirements: []
|
551
|
-
rubygems_version: 3.3.
|
552
|
+
rubygems_version: 3.3.26
|
552
553
|
signing_key:
|
553
554
|
specification_version: 4
|
554
555
|
summary: metanorma-standoc realises standards following the Metanorma standoc model
|