metanorma-standoc 2.3.3 → 2.3.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3600598348b30b6345914445776964ddd47c134d72ce2426f268d6ecdf863763
4
- data.tar.gz: 67043f3b74753a5a27248f737587a0eb155296cefb7120076326e66d8f50ff26
3
+ metadata.gz: 62a2a480483e6cad337d48919668d1276a587c0c6173ffc7ea8cb773f605b1fb
4
+ data.tar.gz: 5a9bf620c79d8ec2993a96727f7b8c2874ee8d8c3865a5efd71941fb83ed8fc1
5
5
  SHA512:
6
- metadata.gz: 1c927432bc4937d7e7432d08d932c6681325f1dcf38179c29e0391fe9cd2e4465ccc1498424f8960ef1074f88b76c27ed4a78ceab57574e5141c77b292eca512
7
- data.tar.gz: 7633c4af6d36f23c9b4a55275421bddd5c0f3e0f285fe508c8bde3424a7af6b8f7239fd59daa637daf496c06ba0e7be71a3175992fed70901065b7435721ba40
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-weigth: 400; }
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 = (node.option?("linenums") || @source_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
- case outer
115
- when "bold"
116
- case inner
117
- when "normal" then "bold"
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(outer["mathvariant"], inner["mathvariant"])
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
- next unless docid = b.at("./docidentifier[@type = 'metanorma']")
58
- next unless /^\[\d+\]$/.match?(docid.text)
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
- return unless xmldoc.at("//xref[@hidden]")
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
- next unless t.xpath("./clause | ./references | ./terms").size == 1
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 do |x|
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
- return nil if %r{^https?://}.match?(uri)
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
- return unless text
17
-
16
+ text or return
18
17
  doc.xpath(xpath).each_with_index do |node, i|
19
- next if first && !i.zero?
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"), **{ type: "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 **{ type: "author" }
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 **{ type: type }
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}"), **{ type: "fax" }
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 **{ type: "publisher" }
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
- next if %w(path fragment refid).include?(k)
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 **{ reference: @fn_number } do |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 /&lt;([^:>&]+:)?math(\s+[^>&]+)?&gt; |
161
160
  <([^:>&]+:)?math(\s+[^>&]+)?>/x.match? text
162
161
  math = xml_encode(text)
163
- xml.stem math, **{ type: "MathML" }
162
+ xml.stem math, type: "MathML"
164
163
  elsif style == :latexmath then latex_parse(text, xml)
165
164
  else
166
- xml.stem text&.gsub(/&amp;#/, "&#"), **{ type: "AsciiMath" }
165
+ xml.stem text&.gsub(/&amp;#/, "&#"), 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 **{ type: "MathML" }
172
- xml.stem **{ type: "MathML" } do |s|
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 **{ style: node.role.sub(/^css /, "") } do |s|
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 **{ type: "publisher" }
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 **{ type: "published" } do |d|
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 **{ type: "published" } do |d|
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 **{ type: "part" } do |e|
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]+$/, ""), **{ type: "URI" }
109
- bib.uri code[:key].sub(/\.[a-zA-Z0-9]+$/, ""), **{ type: "citation" }
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], **{ type: "repository" }
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 **{ format: "application/x-isodoc+xml" } do |i|
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
- return nil if item[:ref][:match].nil?
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 ref[:code].nil? || ref[:no_year] || (@bibdb.nil? && !ref[:localfile])
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
- return ret if code.blank?
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
- pdf-owner-password pdf-allow-copy-content pdf-allow-edit-content
89
- pdf-allow-assemble-document pdf-allow-edit-annotations
90
- pdf-allow-print pdf-allow-print-hq pdf-allow-fill-in-forms
91
- pdf-allow-access-content pdf-encrypt-metadata fonts
92
- font-license-agreement)
93
- .each_with_object({}) do |x, m|
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