metanorma-standoc 2.3.2 → 2.3.4
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 +30 -1
- data/lib/metanorma/standoc/blocks.rb +2 -1
- data/lib/metanorma/standoc/cleanup.rb +0 -1
- data/lib/metanorma/standoc/cleanup_asciibib.rb +0 -8
- data/lib/metanorma/standoc/cleanup_maths.rb +44 -80
- data/lib/metanorma/standoc/cleanup_ref.rb +33 -12
- data/lib/metanorma/standoc/cleanup_section_names.rb +2 -4
- data/lib/metanorma/standoc/front_contributor.rb +5 -5
- data/lib/metanorma/standoc/inline.rb +7 -8
- data/lib/metanorma/standoc/merge_bibitems.rb +107 -0
- data/lib/metanorma/standoc/ref.rb +9 -10
- data/lib/metanorma/standoc/ref_sect.rb +10 -1
- data/lib/metanorma/standoc/ref_utility.rb +1 -2
- data/lib/metanorma/standoc/render.rb +6 -6
- data/lib/metanorma/standoc/section.rb +2 -1
- data/lib/metanorma/standoc/spans_to_bibitem.rb +261 -0
- data/lib/metanorma/standoc/utils.rb +8 -0
- data/lib/metanorma/standoc/validate.rb +33 -10
- data/lib/metanorma/standoc/version.rb +1 -1
- metadata +4 -3
- data/lib/metanorma/standoc/cleanup_biblio.rb +0 -242
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62a2a480483e6cad337d48919668d1276a587c0c6173ffc7ea8cb773f605b1fb
|
4
|
+
data.tar.gz: 5a9bf620c79d8ec2993a96727f7b8c2874ee8d8c3865a5efd71941fb83ed8fc1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 226d8eaa68590e2dbf12917371afe5f2c4c60242397e459543da0ec3471a7a0abc7f5736e92b43f053854329f460bbc70155040bd0ae1df89efa0a62f8765d8e
|
7
|
+
data.tar.gz: 65a7c4e9794199fd48f3d18f3009a41d02ae837753d9e9e9cd41f755384f7b89f3376f5a6c9182de5f184eb4934a9fc9682b8ea708037aa315d9e243f83485bf
|
@@ -132,6 +132,35 @@ a.FootnoteRef + a.FootnoteRef:before {
|
|
132
132
|
color: red;
|
133
133
|
text-decoration: line-through; }
|
134
134
|
|
135
|
+
/* code highlighting with line numbers */
|
136
|
+
table.rouge-line-table td.rouge-gutter {
|
137
|
+
-moz-user-select: none;
|
138
|
+
-ms-user-select: none;
|
139
|
+
-webkit-user-select: none;
|
140
|
+
user-select: none;
|
141
|
+
padding-right: 1em; }
|
142
|
+
|
143
|
+
table.rouge-line-table td.rouge-code {
|
144
|
+
-moz-user-select: all;
|
145
|
+
-ms-user-select: all;
|
146
|
+
-webkit-user-select: all;
|
147
|
+
user-select: all; }
|
148
|
+
|
149
|
+
table.rouge-line-table,
|
150
|
+
table.rouge-line-table th,
|
151
|
+
table.rouge-line-table td {
|
152
|
+
width: auto;
|
153
|
+
border: none;
|
154
|
+
margin: 0;
|
155
|
+
padding: 0;
|
156
|
+
font-size: 100%; }
|
157
|
+
|
158
|
+
table.rouge-line-table pre {
|
159
|
+
margin: 0;
|
160
|
+
padding: 0;
|
161
|
+
overflow-x: visible;
|
162
|
+
font-size: 100%; }
|
163
|
+
|
135
164
|
#brochure-band {
|
136
165
|
background-color: #0AC442; }
|
137
166
|
|
@@ -734,7 +763,7 @@ table {
|
|
734
763
|
table th, table td {
|
735
764
|
padding: 1em; }
|
736
765
|
table td.header {
|
737
|
-
font-
|
766
|
+
font-weight: 400; }
|
738
767
|
|
739
768
|
p.TableTitle {
|
740
769
|
text-align: center;
|
@@ -231,7 +231,8 @@ module Metanorma
|
|
231
231
|
end
|
232
232
|
|
233
233
|
def listing_attrs(node)
|
234
|
-
linenums =
|
234
|
+
linenums = node.option?("linenums") || node.attributes[3] ||
|
235
|
+
@source_linenums
|
235
236
|
attr_code(id_attr(node).merge(keep_attrs(node)
|
236
237
|
.merge(lang: node.attr("language"),
|
237
238
|
linenums: linenums ? "true" : nil,
|
@@ -6,7 +6,6 @@ require_relative "./cleanup_table"
|
|
6
6
|
require_relative "./cleanup_footnotes"
|
7
7
|
require_relative "./cleanup_ref"
|
8
8
|
require_relative "./cleanup_asciibib"
|
9
|
-
require_relative "./cleanup_biblio"
|
10
9
|
require_relative "./cleanup_boilerplate"
|
11
10
|
require_relative "./cleanup_section"
|
12
11
|
require_relative "./cleanup_terms"
|
@@ -54,14 +54,6 @@ module Metanorma
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
def link_unwrap(para)
|
58
|
-
elems = para.elements
|
59
|
-
if elems.size == 1 && elems[0].name == "link"
|
60
|
-
para.at("./link").replace(elems[0]["target"].strip)
|
61
|
-
end
|
62
|
-
para
|
63
|
-
end
|
64
|
-
|
65
57
|
def dd_bib_extract(dtd)
|
66
58
|
return nil if dtd.children.empty?
|
67
59
|
|
@@ -110,93 +110,57 @@ module Metanorma
|
|
110
110
|
{ multiplier: :space }
|
111
111
|
end
|
112
112
|
|
113
|
+
MATHVARIANT_OVERRIDE = {
|
114
|
+
bold: { normal: "bold", italic: "bold-italic", fraktur: "bold-fraktur",
|
115
|
+
script: "bold-script", "sans-serif": "bold-sans-serif",
|
116
|
+
"sans-serif-italic": "sans-serif-bold-italic" },
|
117
|
+
italic: { normal: "italic", bod: "bold-italic",
|
118
|
+
"sans-serif": "sans-serif-italic",
|
119
|
+
"bold-sans-serif": "sans-serif-bold-italic" },
|
120
|
+
"bold-italic": { normal: "bold-italic", bold: "bold-italic",
|
121
|
+
italic: "bold-italic",
|
122
|
+
"sans-serif": "sans-serif-bold-italic",
|
123
|
+
"bold-sans-serif": "sans-serif-bold-italic",
|
124
|
+
"sans-serif-italic": "sans-serif-bold-italic" },
|
125
|
+
fraktur: { normal: "fraktur", bold: "bold-fraktur" },
|
126
|
+
"bold-fraktur": { normal: "bold-fraktur", fraktur: "bold-fraktur" },
|
127
|
+
script: { normal: "script", bold: "bold-script" },
|
128
|
+
"bold-script": { normal: "script", script: "bold-script" },
|
129
|
+
"sans-serif": { normal: "sans-serif", bold: "bold-sans-serif",
|
130
|
+
italic: "sans-serif-italic",
|
131
|
+
"bold-italic": "sans-serif-bold-italic" },
|
132
|
+
"bold-sans-serif": { normal: "bold-sans-serif", bold: "bold-sans-serif",
|
133
|
+
"sans-serif": "bold-sans-serif",
|
134
|
+
italic: "sans-serif-bold-italic",
|
135
|
+
"bold-italic": "sans-serif-bold-italic",
|
136
|
+
"sans-serif-italic": "sans-serif-bold-italic" },
|
137
|
+
"sans-serif-italic": { normal: "sans-serif-italic",
|
138
|
+
italic: "sans-serif-italic",
|
139
|
+
"sans-serif": "sans-serif-italic",
|
140
|
+
bold: "sans-serif-bold-italic",
|
141
|
+
"bold-italic": "sans-serif-bold-italic",
|
142
|
+
"sans-serif-bold": "sans-serif-bold-italic" },
|
143
|
+
"sans-serif-bold-italic": { normal: "sans-serif-bold-italic",
|
144
|
+
italic: "sans-serif-bold-italic",
|
145
|
+
"sans-serif": "sans-serif-bold-italic",
|
146
|
+
"sans-serif-italic": "sans-serif-bold-italic",
|
147
|
+
bold: "sans-serif-bold-italic",
|
148
|
+
"bold-italic": "sans-serif-bold-italic",
|
149
|
+
"sans-serif-bold": "sans-serif-bold-italic" },
|
150
|
+
}.freeze
|
151
|
+
|
113
152
|
def mathvariant_override(inner, outer)
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
when "italic" then "bold-italic"
|
119
|
-
when "fraktur" then "bold-fraktur"
|
120
|
-
when "script" then "bold-script"
|
121
|
-
when "sans-serif" then "bold-sans-serif"
|
122
|
-
when "sans-serif-italic" then "sans-serif-bold-italic"
|
123
|
-
else inner
|
124
|
-
end
|
125
|
-
when "italic"
|
126
|
-
case inner
|
127
|
-
when "normal" then "italic"
|
128
|
-
when "bold" then "bold-italic"
|
129
|
-
when "sans-serif" then "sans-serif-italic"
|
130
|
-
when "bold-sans-serif" then "sans-serif-bold-italic"
|
131
|
-
else inner
|
132
|
-
end
|
133
|
-
when "bold-italic"
|
134
|
-
case inner
|
135
|
-
when "normal", "bold", "italic" then "bold-italic"
|
136
|
-
when "sans-serif", "bold-sans-serif", "sans-serif-italic"
|
137
|
-
"sans-serif-bold-italic"
|
138
|
-
else inner
|
139
|
-
end
|
140
|
-
when "fraktur"
|
141
|
-
case inner
|
142
|
-
when "normal" then "fraktur"
|
143
|
-
when "bold" then "bold-fraktur"
|
144
|
-
else inner
|
145
|
-
end
|
146
|
-
when "bold-fraktur"
|
147
|
-
case inner
|
148
|
-
when "normal", "fraktur" then "bold-fraktur"
|
149
|
-
else inner
|
150
|
-
end
|
151
|
-
when "script"
|
152
|
-
case inner
|
153
|
-
when "normal" then "script"
|
154
|
-
when "bold" then "bold-script"
|
155
|
-
else inner
|
156
|
-
end
|
157
|
-
when "bold-script"
|
158
|
-
case inner
|
159
|
-
when "normal", "script" then "bold-script"
|
160
|
-
else inner
|
161
|
-
end
|
162
|
-
when "sans-serif"
|
163
|
-
case inner
|
164
|
-
when "normal" then "sans-serif"
|
165
|
-
when "bold" then "bold-sans-serif"
|
166
|
-
when "italic" then "sans-serif-italic"
|
167
|
-
when "bold-italic" then "sans-serif-bold-italic"
|
168
|
-
else inner
|
169
|
-
end
|
170
|
-
when "bold-sans-serif"
|
171
|
-
case inner
|
172
|
-
when "normal", "bold", "sans-serif" then "bold-sans-serif"
|
173
|
-
when "italic", "bold-italic", "sans-serif-italic"
|
174
|
-
"sans-serif-bold-italic"
|
175
|
-
else inner
|
176
|
-
end
|
177
|
-
when "sans-serif-italic"
|
178
|
-
case inner
|
179
|
-
when "normal", "italic", "sans-serif" then "sans-serif-italic"
|
180
|
-
when "bold", "bold-italic", "sans-serif-bold"
|
181
|
-
"sans-serif-bold-italic"
|
182
|
-
else inner
|
183
|
-
end
|
184
|
-
when "sans-serif-bold-italic"
|
185
|
-
case inner
|
186
|
-
when "normal", "italic", "sans-serif", "sans-serif-italic",
|
187
|
-
"bold", "bold-italic", "sans-serif-bold"
|
188
|
-
"sans-serif-bold-italic"
|
189
|
-
else inner
|
190
|
-
end
|
191
|
-
else inner
|
192
|
-
end
|
153
|
+
o = outer.to_sym
|
154
|
+
i = inner.to_sym
|
155
|
+
MATHVARIANT_OVERRIDE[o] or return inner
|
156
|
+
MATHVARIANT_OVERRIDE[o][i] || inner
|
193
157
|
end
|
194
158
|
|
195
159
|
def mathml_mathvariant(math)
|
196
160
|
math.xpath(".//*[@mathvariant]").each do |outer|
|
197
161
|
outer.xpath(".//*[@mathvariant]").each do |inner|
|
198
162
|
inner["mathvariant"] =
|
199
|
-
mathvariant_override(
|
163
|
+
mathvariant_override(inner["mathvariant"], outer["mathvariant"])
|
200
164
|
end
|
201
165
|
end
|
202
166
|
end
|
@@ -1,9 +1,36 @@
|
|
1
1
|
require "set"
|
2
2
|
require "relaton_bib"
|
3
|
+
require_relative "merge_bibitems"
|
4
|
+
require_relative "spans_to_bibitem"
|
3
5
|
|
4
6
|
module Metanorma
|
5
7
|
module Standoc
|
6
8
|
module Cleanup
|
9
|
+
def formattedref_spans(xmldoc)
|
10
|
+
xmldoc.xpath("//bibitem[formattedref//span]").each do |b|
|
11
|
+
ret = new_bibitem_from_formattedref_spans(b)
|
12
|
+
merge_bibitem_from_formattedref_spans(b, ret)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def new_bibitem_from_formattedref_spans(bib)
|
17
|
+
ret = SpansToBibitem.new(bib).convert
|
18
|
+
ret.err.each do |e|
|
19
|
+
@log.add("Bibliography", bib, e[:msg])
|
20
|
+
e[:fatal] and @fatalerror << e[:msg]
|
21
|
+
end
|
22
|
+
ret.out
|
23
|
+
end
|
24
|
+
|
25
|
+
def merge_bibitem_from_formattedref_spans(bib, new)
|
26
|
+
new["type"] and bib["type"] = new["type"]
|
27
|
+
if bib.at("./title") # there already is a fetched record here: merge
|
28
|
+
bib.children = MergeBibitems
|
29
|
+
.new(bib.to_xml, new.to_xml).merge.to_noko.children
|
30
|
+
else bib << new.children.to_xml
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
7
34
|
def biblio_reorder(xmldoc)
|
8
35
|
xmldoc.xpath("//references[@normative = 'false']").each do |r|
|
9
36
|
biblio_reorder1(r)
|
@@ -54,9 +81,8 @@ module Metanorma
|
|
54
81
|
"[not(@hidden = 'true')]").each do |r|
|
55
82
|
r.xpath("./bibitem[not(@hidden = 'true')]").each do |b|
|
56
83
|
i += 1
|
57
|
-
|
58
|
-
|
59
|
-
|
84
|
+
docid = b.at("./docidentifier[@type = 'metanorma']") or next
|
85
|
+
/^\[\d+\]$/.match?(docid.text) or next
|
60
86
|
docid.children = "[#{i}]"
|
61
87
|
end
|
62
88
|
end
|
@@ -97,8 +123,7 @@ module Metanorma
|
|
97
123
|
end
|
98
124
|
|
99
125
|
def biblio_linkonly(xmldoc)
|
100
|
-
|
101
|
-
|
126
|
+
xmldoc.at("//xref[@hidden]") or return
|
102
127
|
ins = xmldoc.at("//bibliography")
|
103
128
|
.add_child("<references hidden='true' normative='true'/>").first
|
104
129
|
refs = xmldoc.xpath("//xref[@hidden]").each_with_object([]) do |x, m|
|
@@ -122,8 +147,7 @@ module Metanorma
|
|
122
147
|
|
123
148
|
def biblio_annex(xmldoc)
|
124
149
|
xmldoc.xpath("//annex[references/references]").each do |t|
|
125
|
-
|
126
|
-
|
150
|
+
t.xpath("./clause | ./references | ./terms").size == 1 or next
|
127
151
|
r = t.at("./references")
|
128
152
|
r.xpath("./references").each { |b| b["normative"] = r["normative"] }
|
129
153
|
r.replace(r.elements)
|
@@ -140,9 +164,7 @@ module Metanorma
|
|
140
164
|
|
141
165
|
def format_ref(ref, type)
|
142
166
|
ret = Nokogiri::XML.fragment(ref)
|
143
|
-
ret.traverse
|
144
|
-
x.remove if x.name == "fn"
|
145
|
-
end
|
167
|
+
ret.traverse { |x| x.remove if x.name == "fn"}
|
146
168
|
ref = to_xml(ret)
|
147
169
|
return @isodoc.docid_prefix(type, ref) if type != "metanorma"
|
148
170
|
return "[#{ref}]" if /^\d+$/.match(ref) && !/^\[.*\]$/.match(ref)
|
@@ -191,8 +213,7 @@ module Metanorma
|
|
191
213
|
end
|
192
214
|
|
193
215
|
def read_local_bibitem_file(uri)
|
194
|
-
|
195
|
-
|
216
|
+
%r{^https?://}.match?(uri) and return nil
|
196
217
|
file = "#{@localdir}#{uri}.rxl"
|
197
218
|
File.file?(file) or file = "#{@localdir}#{uri}.xml"
|
198
219
|
File.file?(file) or return nil
|
@@ -13,11 +13,9 @@ module Metanorma
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def replace_title(doc, xpath, text, first = false)
|
16
|
-
|
17
|
-
|
16
|
+
text or return
|
18
17
|
doc.xpath(xpath).each_with_index do |node, i|
|
19
|
-
|
20
|
-
|
18
|
+
first && !i.zero? and next
|
21
19
|
title = get_or_make_title(node)
|
22
20
|
fn = title.xpath("./fn")
|
23
21
|
fn.each(&:remove)
|
@@ -39,7 +39,7 @@ module Metanorma
|
|
39
39
|
end
|
40
40
|
node.attr("pub-phone") and person.phone node.attr("pub-phone")
|
41
41
|
node.attr("pub-fax") and
|
42
|
-
person.phone node.attr("pub-fax"),
|
42
|
+
person.phone node.attr("pub-fax"), type: "fax"
|
43
43
|
node.attr("pub-email") and person.email node.attr("pub-email")
|
44
44
|
node.attr("pub-uri") and person.uri node.attr("pub-uri")
|
45
45
|
end
|
@@ -48,7 +48,7 @@ module Metanorma
|
|
48
48
|
csv_split(node.attr("publisher") || default_publisher || "")
|
49
49
|
&.each do |p|
|
50
50
|
xml.contributor do |c|
|
51
|
-
c.role
|
51
|
+
c.role type: "author"
|
52
52
|
c.organization do |a|
|
53
53
|
organization(a, p, false, node, !node.attr("publisher"))
|
54
54
|
end
|
@@ -69,13 +69,13 @@ module Metanorma
|
|
69
69
|
|
70
70
|
def personal_role(node, contrib, suffix)
|
71
71
|
type = node.attr("role#{suffix}")&.downcase || "author"
|
72
|
-
contrib.role
|
72
|
+
contrib.role type: type
|
73
73
|
end
|
74
74
|
|
75
75
|
def personal_contact(node, suffix, person)
|
76
76
|
node.attr("phone#{suffix}") and person.phone node.attr("phone#{suffix}")
|
77
77
|
node.attr("fax#{suffix}") and
|
78
|
-
person.phone node.attr("fax#{suffix}"),
|
78
|
+
person.phone node.attr("fax#{suffix}"), type: "fax"
|
79
79
|
node.attr("email#{suffix}") and person.email node.attr("email#{suffix}")
|
80
80
|
node.attr("contributor-uri#{suffix}") and
|
81
81
|
person.uri node.attr("contributor-uri#{suffix}")
|
@@ -156,7 +156,7 @@ module Metanorma
|
|
156
156
|
publishers = node.attr("publisher") || default_publisher || return
|
157
157
|
csv_split(publishers)&.each do |p|
|
158
158
|
xml.contributor do |c|
|
159
|
-
c.role
|
159
|
+
c.role type: "publisher"
|
160
160
|
c.organization do |a|
|
161
161
|
organization(a, p, true, node, !node.attr("publisher"))
|
162
162
|
end
|
@@ -49,8 +49,7 @@ module Metanorma
|
|
49
49
|
|
50
50
|
def concatenate_attributes_to_xref_text(node)
|
51
51
|
node.attributes.each_with_object([]) do |(k, v), m|
|
52
|
-
|
53
|
-
|
52
|
+
%w(path fragment refid).include?(k) and next
|
54
53
|
m << "#{k}=#{v}%"
|
55
54
|
end.map { |x| x.sub(/%+/, "%") }.join + (node.text || "")
|
56
55
|
end
|
@@ -116,7 +115,7 @@ module Metanorma
|
|
116
115
|
@fn_number ||= 0
|
117
116
|
noko do |xml|
|
118
117
|
@fn_number += 1
|
119
|
-
xml.fn
|
118
|
+
xml.fn reference: @fn_number do |fn|
|
120
119
|
fn.p { |p| p << node.text }
|
121
120
|
end
|
122
121
|
end.join
|
@@ -160,16 +159,16 @@ module Metanorma
|
|
160
159
|
if /<([^:>&]+:)?math(\s+[^>&]+)?> |
|
161
160
|
<([^:>&]+:)?math(\s+[^>&]+)?>/x.match? text
|
162
161
|
math = xml_encode(text)
|
163
|
-
xml.stem math,
|
162
|
+
xml.stem math, type: "MathML"
|
164
163
|
elsif style == :latexmath then latex_parse(text, xml)
|
165
164
|
else
|
166
|
-
xml.stem text&.gsub(/&#/, "&#"),
|
165
|
+
xml.stem text&.gsub(/&#/, "&#"), type: "AsciiMath"
|
167
166
|
end
|
168
167
|
end
|
169
168
|
|
170
169
|
def latex_parse(text, xml)
|
171
|
-
latex = latex_parse1(text) or return xml.stem
|
172
|
-
xml.stem
|
170
|
+
latex = latex_parse1(text) or return xml.stem type: "MathML"
|
171
|
+
xml.stem type: "MathML" do |s|
|
173
172
|
math = Nokogiri::XML.fragment(latex.sub(/<\?[^>]+>/, ""))
|
174
173
|
.elements[0]
|
175
174
|
math.delete("alttext")
|
@@ -209,7 +208,7 @@ module Metanorma
|
|
209
208
|
when "smallcap" then xml.smallcap { |s| s << node.text }
|
210
209
|
when "keyword" then xml.keyword { |s| s << node.text }
|
211
210
|
when /^css /
|
212
|
-
xml.span
|
211
|
+
xml.span style: node.role.sub(/^css /, "") do |s|
|
213
212
|
s << node.text
|
214
213
|
end
|
215
214
|
else
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require "metanorma-utils"
|
2
|
+
|
3
|
+
module Metanorma
|
4
|
+
module Standoc
|
5
|
+
module Cleanup
|
6
|
+
class MergeBibitems
|
7
|
+
Hash.include Metanorma::Utils::Hash
|
8
|
+
Array.include Metanorma::Utils::Array
|
9
|
+
|
10
|
+
class ::Array
|
11
|
+
def blank?
|
12
|
+
nil? || empty?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(old, new)
|
17
|
+
@old = load_bibitem(old)
|
18
|
+
@new = load_bibitem(new)
|
19
|
+
end
|
20
|
+
|
21
|
+
def load_bibitem(item)
|
22
|
+
ret = RelatonBib::XMLParser.from_xml(item)
|
23
|
+
ret.to_hash.symbolize_all_keys
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_noko
|
27
|
+
out = RelatonBib::HashConverter.hash_to_bib(@old)
|
28
|
+
Nokogiri::XML(RelatonBib::BibliographicItem.new(**out).to_xml).root
|
29
|
+
end
|
30
|
+
|
31
|
+
def merge
|
32
|
+
@old.delete(:formattedref)
|
33
|
+
merge1(@old, @new)
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
37
|
+
def merge1(old, new)
|
38
|
+
%i(link docidentifier date title series).each do |k|
|
39
|
+
merge_by_type(old, new, k, :type)
|
40
|
+
end
|
41
|
+
merge_extent(old, new)
|
42
|
+
merge_contributor(old, new)
|
43
|
+
%i(place).each do |k|
|
44
|
+
merge_simple(old, new, k)
|
45
|
+
end
|
46
|
+
merge_relations(old, new)
|
47
|
+
end
|
48
|
+
|
49
|
+
def merge_simple(old, new, field)
|
50
|
+
new[field].blank? and return
|
51
|
+
old[field] = new[field]
|
52
|
+
end
|
53
|
+
|
54
|
+
# ensure return value goes into extent[0]
|
55
|
+
def merge_extent(old, new)
|
56
|
+
old.dig(:extent, 0, :locality) and
|
57
|
+
old[:extent] = [{ locality_stack: old[:extent] }]
|
58
|
+
new.dig(:extent, 0, :locality) and
|
59
|
+
new[:extent] = [{ locality_stack: new[:extent] }]
|
60
|
+
ret = merge_by_type(old.dig(:extent, 0),
|
61
|
+
new.dig(:extent, 0), :locality_stack,
|
62
|
+
%i[locality type])
|
63
|
+
(ret && !old.dig(:extent, 0)) or return
|
64
|
+
old[:extent] ||= []
|
65
|
+
old[:extent][0] ||= {}
|
66
|
+
old[:extent][0][:locality_stack] = ret
|
67
|
+
end
|
68
|
+
|
69
|
+
def merge_contributor(old, new)
|
70
|
+
merge_by_type(old, new, :contributor, [:role, 0, :type])
|
71
|
+
end
|
72
|
+
|
73
|
+
def merge_relations(old, new)
|
74
|
+
merge_by_type(old, new, :relation, :type, recurse: true)
|
75
|
+
end
|
76
|
+
|
77
|
+
# @old.field is an array, overwrite only those array elements
|
78
|
+
# where @old.field[attribute] = @new.field[attribute]
|
79
|
+
def merge_by_type(old, new, field, attributes, opt = {})
|
80
|
+
new.nil? || new[field].blank? and return
|
81
|
+
old.nil? and return new[field]
|
82
|
+
if !old[field].is_a?(::Array) || old[field].empty?
|
83
|
+
return old[field] = new[field]
|
84
|
+
end
|
85
|
+
|
86
|
+
old[field] = merge_by_type1(old, new, field, attributes, opt)
|
87
|
+
end
|
88
|
+
|
89
|
+
def merge_by_type1(old, new, field, attributes, opt)
|
90
|
+
old1 = array_to_hash(old[field], attributes)
|
91
|
+
new1 = array_to_hash(new[field], attributes)
|
92
|
+
out = opt[:recurse] ? old1.deep_merge(new1) : old1.merge(new1)
|
93
|
+
out.each_value.with_object([]) do |v, m|
|
94
|
+
v.each { |v1| m << v1 }
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def array_to_hash(array, attributes)
|
99
|
+
array.each_with_object({}) do |k, m|
|
100
|
+
m[k.dig(*Array(attributes))] ||= []
|
101
|
+
m[k.dig(*Array(attributes))] << k
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -6,7 +6,7 @@ module Metanorma
|
|
6
6
|
def iso_publisher(bib, code)
|
7
7
|
code.sub(/ .*$/, "").split("/").each do |abbrev|
|
8
8
|
bib.contributor do |c|
|
9
|
-
c.role
|
9
|
+
c.role type: "publisher"
|
10
10
|
c.organization do |org|
|
11
11
|
organization(org, abbrev, true)
|
12
12
|
end
|
@@ -33,7 +33,7 @@ module Metanorma
|
|
33
33
|
else
|
34
34
|
xml.bibitem **attr_code(ref_attributes(item[:ref][:match])) do |t|
|
35
35
|
isorefrender1(t, item[:ref][:match], item[:ref][:year])
|
36
|
-
item[:ref][:year] and t.date
|
36
|
+
item[:ref][:year] and t.date type: "published" do |d|
|
37
37
|
set_date_range(d, item[:ref][:year])
|
38
38
|
end
|
39
39
|
iso_publisher(t, item[:ref][:match][:code])
|
@@ -56,7 +56,7 @@ module Metanorma
|
|
56
56
|
def isorefmatches2_1(xml, match)
|
57
57
|
xml.bibitem **attr_code(ref_attributes(match)) do |t|
|
58
58
|
isorefrender1(t, match, "--")
|
59
|
-
t.date
|
59
|
+
t.date type: "published" do |d|
|
60
60
|
d.on "--"
|
61
61
|
end
|
62
62
|
iso_publisher(t, match[:code])
|
@@ -97,7 +97,7 @@ module Metanorma
|
|
97
97
|
p << (match[:fn]).to_s
|
98
98
|
end
|
99
99
|
end
|
100
|
-
t.extent
|
100
|
+
t.extent type: "part" do |e|
|
101
101
|
e.referenceFrom "all"
|
102
102
|
end
|
103
103
|
end
|
@@ -105,21 +105,21 @@ module Metanorma
|
|
105
105
|
|
106
106
|
def refitem_render1(match, code, bib)
|
107
107
|
if code[:type] == "path"
|
108
|
-
bib.uri code[:key].sub(/\.[a-zA-Z0-9]+$/, ""),
|
109
|
-
bib.uri code[:key].sub(/\.[a-zA-Z0-9]+$/, ""),
|
108
|
+
bib.uri code[:key].sub(/\.[a-zA-Z0-9]+$/, ""), type: "URI"
|
109
|
+
bib.uri code[:key].sub(/\.[a-zA-Z0-9]+$/, ""), type: "citation"
|
110
110
|
end
|
111
111
|
# code[:id].sub!(/[:-](19|20)[0-9][0-9]$/, "")
|
112
112
|
docid(bib, match[:usrlbl]) if match[:usrlbl]
|
113
113
|
docid(bib, /^\d+$/.match?(code[:id]) ? "[#{code[:id]}]" : code[:id])
|
114
114
|
code[:type] == "repo" and
|
115
|
-
bib.docidentifier code[:key],
|
115
|
+
bib.docidentifier code[:key], type: "repository"
|
116
116
|
end
|
117
117
|
|
118
118
|
def refitem_render(xml, match, code)
|
119
119
|
xml.bibitem **attr_code(id: match[:anchor],
|
120
120
|
suppress_identifier: code[:dropid],
|
121
121
|
hidden: code[:hidden]) do |t|
|
122
|
-
t.formattedref
|
122
|
+
t.formattedref format: "application/x-isodoc+xml" do |i|
|
123
123
|
i << ref_normalise_no_format(match[:text])
|
124
124
|
end
|
125
125
|
yr_match = /[:-](?<year>(?:19|20)[0-9][0-9])\b/.match(code[:id])
|
@@ -156,8 +156,7 @@ module Metanorma
|
|
156
156
|
end
|
157
157
|
|
158
158
|
def refitemout(item, xml)
|
159
|
-
|
160
|
-
|
159
|
+
item[:ref][:match].nil? and return nil
|
161
160
|
item[:doc] or return refitem_render(xml, item[:ref][:match],
|
162
161
|
item[:ref][:analyse_code])
|
163
162
|
use_retrieved_relaton(item, xml)
|
@@ -85,8 +85,13 @@ module Metanorma
|
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
|
+
def fetchable_ref_code?(ref)
|
89
|
+
ref[:code].nil? || ref[:code].empty? || ref[:no_year] ||
|
90
|
+
(@bibdb.nil? && !ref[:localfile])
|
91
|
+
end
|
92
|
+
|
88
93
|
def fetch_ref_async(ref, idx, res)
|
89
|
-
if
|
94
|
+
if fetchable_ref_code?(ref)
|
90
95
|
res << [ref, idx, nil]
|
91
96
|
elsif ref[:localfile]
|
92
97
|
res << [ref, idx, @local_bibdb.get(ref[:code], ref[:localfile])]
|
@@ -115,12 +120,16 @@ module Metanorma
|
|
115
120
|
end
|
116
121
|
end
|
117
122
|
|
123
|
+
# supply title if missing;
|
124
|
+
# add title with spans in it as formattedref, to emend bibitem with later
|
118
125
|
def emend_biblio_title(xml, code, title)
|
119
126
|
unless xml.at("/bibitem/title[text()]")
|
120
127
|
@log.add("Bibliography", nil,
|
121
128
|
"ERROR: No title retrieved for #{code}")
|
122
129
|
xml.root << "<title>#{title || '(MISSING TITLE)'}</title>"
|
123
130
|
end
|
131
|
+
/<span class=/.match?(title) and
|
132
|
+
xml.root << "<formattedref>#{title}</formattedref>"
|
124
133
|
end
|
125
134
|
|
126
135
|
def emend_biblio_usrlbl(xml, usrlbl)
|
@@ -110,8 +110,7 @@ module Metanorma
|
|
110
110
|
# dropid(code) | # (repo|path):(key,code) | local-file(source,? key)
|
111
111
|
def analyse_ref_code(code)
|
112
112
|
ret = { id: code }
|
113
|
-
|
114
|
-
|
113
|
+
code.nil? || code.empty? and return ret
|
115
114
|
analyse_ref_numeric(
|
116
115
|
analyse_ref_repo_path(
|
117
116
|
analyse_ref_dropid(
|
@@ -85,12 +85,12 @@ module Metanorma
|
|
85
85
|
|
86
86
|
def pdf_extract_attributes(node)
|
87
87
|
pdf_options = %w(pdf-encrypt pdf-encryption-length pdf-user-password
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
88
|
+
pdf-owner-password pdf-allow-copy-content
|
89
|
+
pdf-allow-edit-content pdf-allow-fill-in-forms
|
90
|
+
pdf-allow-assemble-document pdf-allow-edit-annotations
|
91
|
+
pdf-allow-print pdf-allow-print-hq
|
92
|
+
pdf-allow-access-content pdf-encrypt-metadata fonts
|
93
|
+
font-license-agreement).each_with_object({}) do |x, m|
|
94
94
|
m[x.gsub(/-/, "").to_i] = node.attr(x)
|
95
95
|
end
|
96
96
|
|