metanorma-standoc 2.9.0 → 2.9.2

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: 629fbf02985b771b385ed63f1ebcfecbd7f5031d1f476b5a5902e1b930b15a77
4
- data.tar.gz: d89624a478853541b6cb07fe76b126f0e3e78001ac43ab63907d67481a3b05cf
3
+ metadata.gz: afbcf21ea1b8e99868178616c755a4dcef811f631326c65f6835ad491d1f2835
4
+ data.tar.gz: 9d3499adf6025521d2683f4456e64b1cd27dd63722c231de8fab7aa47fe79973
5
5
  SHA512:
6
- metadata.gz: 6aa6a1c220c69aae4eb245b2d744d03356a30ed89bfe94c8c316415934041899fa0a68e2b86fe4b026ac294cede284f4d4ff1977eecb4272914ceb4ab2b7f87f
7
- data.tar.gz: 26f1f58f773930cdf01d08c9c09aaa4e0f2e31392746cfb199cfb629299ec4500a9dd4e62bc999b9a5b65bea8ee568076431b82de79d323dfe654b891ffafc7f
6
+ metadata.gz: 46a8beb31cb6230dccdcdb36352dd05e705a3114d0b1b6e04b46b1a445aa1fe30249426c81be8a441f615c95fe633cc078bd70c030616cdc25ff4c50eb45ab76
7
+ data.tar.gz: 300aeca29fa514e88535c4f60577f9a6e83446f195b76e7e15029ae912d0beb06c0f6f028b098e4662ab53fbf83fc8e675a920ef7c3269f1e501afa835ba127f
@@ -34,7 +34,7 @@ module Metanorma
34
34
  t = node.target.gsub(/^#/, "").gsub(%r{(\.xml|\.adoc)(#.*$)}, "\\2")
35
35
  attrs, text = inline_anchor_xref_match(text)
36
36
  attrs.empty? and
37
- return { target: t, type: "inline", text: text, style: @xrefstyle }
37
+ return { target: t, type: "inline", text:, style: @xrefstyle }
38
38
  inline_anchor_xref_attrs1(attrs, t, text)
39
39
  end
40
40
 
@@ -46,13 +46,13 @@ module Metanorma
46
46
  end
47
47
 
48
48
  def inline_anchor_xref_attrs1(attrs, target, text)
49
- { target: target, hidden: attrs["hidden"],
49
+ { target:, hidden: attrs["hidden"],
50
50
  type: attrs.key?("fn") ? "footnote" : "inline",
51
51
  case: %w(capital lowercase).detect { |x| attrs.key?(x) },
52
52
  label: attrs["label"],
53
53
  style: attrs["style"] || @xrefstyle,
54
54
  droploc: attrs.key?("droploc") ? true : nil,
55
- text: text }.compact
55
+ text: }.compact
56
56
  end
57
57
 
58
58
  XREF_ATTRS = "hidden|style|droploc|capital|lowercase|label".freeze
@@ -130,7 +130,7 @@ module Metanorma
130
130
  %w(presentation semantic).each do |t|
131
131
  /^#{t}-metadata-/.match?(k) or next
132
132
  k = k.sub(/^#{t}-metadata-/, "")
133
- csv_split(v, ",")&.each do |c|
133
+ quoted_csv_split(v)&.each do |c|
134
134
  ret << "<#{t}-metadata><#{k}>#{c}</#{k}></#{t}-metadata>"
135
135
  end
136
136
  end
@@ -90,7 +90,7 @@ module Metanorma
90
90
  )) do |ex|
91
91
  wrap_in_para(node, ex)
92
92
  end
93
- end.join("\n")
93
+ end.join("")
94
94
  end
95
95
 
96
96
  def example(node)
@@ -128,7 +128,7 @@ module Metanorma
128
128
  figure_title(node, ex)
129
129
  wrap_in_para(node, ex)
130
130
  end
131
- end.join("\n")
131
+ end.join("")
132
132
  end
133
133
 
134
134
  def example_attrs(node)
@@ -141,7 +141,7 @@ module Metanorma
141
141
  node.title.nil? or ex.name { |name| name << node.title }
142
142
  wrap_in_para(node, ex)
143
143
  end
144
- end.join("\n")
144
+ end.join("")
145
145
  end
146
146
 
147
147
  def para_attrs(node)
@@ -158,7 +158,7 @@ module Metanorma
158
158
  xml.p **para_attrs(node) do |xml_t|
159
159
  xml_t << node.content
160
160
  end
161
- end.join("\n")
161
+ end.join("")
162
162
  end
163
163
 
164
164
  def quote_attrs(node)
@@ -183,7 +183,7 @@ module Metanorma
183
183
  quote_attribution(node, q)
184
184
  wrap_in_para(node, q)
185
185
  end
186
- end.join("\n")
186
+ end.join("")
187
187
  end
188
188
 
189
189
  def listing_attrs(node)
@@ -26,7 +26,7 @@ module Metanorma
26
26
  node.title.nil? or ex.name { |name| name << node.title }
27
27
  wrap_in_para(node, ex)
28
28
  end
29
- end.join("\n")
29
+ end.join("")
30
30
  end
31
31
 
32
32
  def figure_title(node, out)
@@ -32,7 +32,7 @@ module Metanorma
32
32
  xml.review **sidebar_attrs(node) do |r|
33
33
  wrap_in_para(node, r)
34
34
  end
35
- end.join("\n")
35
+ end.join("")
36
36
  end
37
37
 
38
38
  def todo_attrs(node)
@@ -41,7 +41,7 @@ module Metanorma
41
41
  attr_code(id_attr(node)
42
42
  .merge(reviewer: node.attr("reviewer") || node.attr("source") ||
43
43
  "(Unknown)",
44
- date: date, type: "todo"))
44
+ date:, type: "todo"))
45
45
  end
46
46
 
47
47
  def todo(node)
@@ -49,7 +49,7 @@ module Metanorma
49
49
  xml.review **todo_attrs(node) do |r|
50
50
  wrap_in_para(node, r)
51
51
  end
52
- end.join("\n")
52
+ end.join("")
53
53
  end
54
54
 
55
55
  def termnote(node)
@@ -57,7 +57,7 @@ module Metanorma
57
57
  xml.termnote **termnote_attrs(node) do |ex|
58
58
  wrap_in_para(node, ex)
59
59
  end
60
- end.join("\n")
60
+ end.join("")
61
61
  end
62
62
 
63
63
  def note(node)
@@ -67,7 +67,7 @@ module Metanorma
67
67
  xml.note **note_attrs(node) do |c|
68
68
  wrap_in_para(node, c)
69
69
  end
70
- end.join("\n")
70
+ end.join("")
71
71
  end
72
72
 
73
73
  def boilerplate_note(node)
@@ -101,7 +101,7 @@ module Metanorma
101
101
  node.title.nil? or a.name { |name| name << node.title }
102
102
  wrap_in_para(node, a)
103
103
  end
104
- end.join("\n")
104
+ end.join("")
105
105
  end
106
106
 
107
107
  def admonition_alternatives(node)
@@ -64,6 +64,7 @@ module Metanorma
64
64
  bookmark_cleanup(xmldoc)
65
65
  termdef_cleanup(xmldoc) # feeds: relaton_iev_cleanup, term_index_cleanup
66
66
  relaton_iev_cleanup(xmldoc)
67
+ relaton_log_cleanup(xmldoc)
67
68
  element_name_cleanup(xmldoc)
68
69
  term_index_cleanup(xmldoc)
69
70
  bpart_cleanup(xmldoc)
@@ -97,6 +98,20 @@ module Metanorma
97
98
  end
98
99
  end
99
100
 
101
+ RELATON_SEVERITIES =
102
+ { "INFO": 3, "WARN": 2, "ERROR": 1, "FATAL": 0,
103
+ "UNKNOWN": 3 }.freeze
104
+
105
+ def relaton_log_cleanup(_xmldoc)
106
+ @relaton_log or return
107
+ @relaton_log.rewind
108
+ @relaton_log.string.split(/(?<=})\n(?={)/).each do |l|
109
+ e = JSON.parse(l)
110
+ @log.add("Relaton", e["key"], e["message"],
111
+ severity: RELATON_SEVERITIES[e["severity"].to_sym])
112
+ end
113
+ end
114
+
100
115
  def docidentifier_cleanup(xmldoc); end
101
116
 
102
117
  TEXT_ELEMS =
@@ -36,7 +36,7 @@ module Metanorma
36
36
 
37
37
  def extract_notes_from_biblio(refs)
38
38
  refs.xpath("./bibitem").each do |r|
39
- r.xpath("./note[@appended]").reverse.each do |n|
39
+ r.xpath("./note[@appended]").reverse_each do |n|
40
40
  n.delete("appended")
41
41
  r.next = n
42
42
  end
@@ -147,34 +147,38 @@ module Metanorma
147
147
 
148
148
  def save_attachment(path, bib)
149
149
  init_attachments
150
+ path = File.join(@localdir, path)
150
151
  valid_attachment?(path, bib) or return ""
151
152
  f = File.basename(path)
152
153
  File.exist?(File.join(@attachmentsdir, f)) and
153
154
  f += "_#{UUIDTools::UUID.random_create}"
154
- ret = File.join(@attachmentsdir, f)
155
- FileUtils.cp(path, ret)
156
- datauri_attachment(ret, bib.document)
157
- ret
155
+ out_fld = File.join(@attachmentsdir, f)
156
+ FileUtils.cp(path, out_fld)
157
+ datauri_attachment(out_fld, bib.document)
158
+ File.join(@attachmentsfld, f)
158
159
  end
159
160
 
160
161
  def datauri_attachment(path, doc)
161
162
  @datauriattachment or return
162
- n = add_misc_container(doc)
163
+ m = add_misc_container(doc)
163
164
  f = File.basename(path)
164
- d = Vectory::Utils.datauri(path)
165
- n << "<attachment name='#{f}'>#{d}</attachment>"
165
+ d = Vectory::Utils::datauri(path, @localdir)
166
+ m << "<attachment name='#{f}'/>"
167
+ m.last_element_child << d
166
168
  end
167
169
 
168
170
  def valid_attachment?(path, bib)
169
171
  File.exist?(path) and return true
170
- @log.add("Bibliography", bib, "Attachment #{path} does not exist",
172
+ p = Pathname.new(path).cleanpath
173
+ @log.add("Bibliography", bib, "Attachment #{p} does not exist",
171
174
  severity: 0)
172
175
  false
173
176
  end
174
177
 
175
178
  def init_attachments
176
179
  @attachmentsdir and return
177
- @attachmentsdir = File.join(@output_dir, "_#{@filename}_attachments")
180
+ @attachmentsfld = "_#{@filename}_attachments"
181
+ @attachmentsdir = File.join(@output_dir, @attachmentsfld)
178
182
  FileUtils.rm_rf(@attachmentsdir)
179
183
  FileUtils.mkdir_p(@attachmentsdir)
180
184
  end
@@ -163,7 +163,7 @@ module Metanorma
163
163
  acc << safe_noko(a[0], node.document)
164
164
  a.size == 4 or next
165
165
  acc << Asciidoctor.convert(
166
- a[2], doctype: :inline, backend: (self&.backend&.to_sym || :standoc)
166
+ a[2], doctype: :inline, backend: self&.backend&.to_sym || :standoc
167
167
  )
168
168
  end.join
169
169
  end
@@ -1,4 +1,3 @@
1
- require "set"
2
1
  require "relaton_bib"
3
2
  require_relative "merge_bibitems"
4
3
  require_relative "spans_to_bibitem"
@@ -18,7 +17,7 @@ module Metanorma
18
17
  bib = sort_biblio(refs.xpath("./bibitem"))
19
18
  insert = refs.at("./bibitem")&.previous_element
20
19
  refs.xpath("./bibitem").each(&:remove)
21
- bib.reverse.each do |b|
20
+ bib.reverse_each do |b|
22
21
  (insert and insert.next = b.to_xml) or
23
22
  refs.children.first.add_previous_sibling b.to_xml
24
23
  end
@@ -16,9 +16,7 @@ module Metanorma
16
16
  end
17
17
 
18
18
  def move_clauses_into_preface(xml, preface)
19
- xml.xpath("//*[@preface]").each do |c|
20
- to_preface(preface, c)
21
- end
19
+ xml.xpath("//*[@preface]").each { |c| to_preface(preface, c) }
22
20
  end
23
21
 
24
22
  def to_preface(preface, clause)
@@ -202,10 +200,9 @@ module Metanorma
202
200
  end
203
201
 
204
202
  # only move clausebefore notes at the very end of preface
205
- def endofpreface_clausebefore(xmldoc, ins)
206
- xmldoc.xpath("//preface//*[@beforeclauses = 'true']").reverse
207
- .each do |x|
208
- textafter = xmldoc.xpath("//preface//*") & x.xpath("./following::*")
203
+ def endofpreface_clausebefore(xml, ins)
204
+ xml.xpath("//preface//*[@beforeclauses = 'true']").reverse.each do |x|
205
+ textafter = xml.xpath("//preface//*") & x.xpath("./following::*")
209
206
  textafter.text.strip.empty? or break
210
207
  x.delete("beforeclauses")
211
208
  ins.previous = x.remove
@@ -241,9 +238,8 @@ module Metanorma
241
238
  def floating_title_preface2sections(xmldoc)
242
239
  t = xmldoc.at("//preface/floating-title") or return
243
240
  s = xmldoc.at("//sections")
244
- unless t.next_element
241
+ t.next_element or
245
242
  s.children.first.previous = t.remove
246
- end
247
243
  end
248
244
  end
249
245
  end
@@ -35,7 +35,7 @@ module Metanorma
35
35
 
36
36
  IGNORE_QUOTES_ELEMENTS =
37
37
  %w(pre tt sourcecode stem asciimath figure bibdata passthrough
38
- identifier presentation-metadata semantic-metadata).freeze
38
+ identifier metanorma-extension).freeze
39
39
 
40
40
  def uninterrupt_quotes_around_xml_skip(elem)
41
41
  !(/\A['"]/.match?(elem.text) &&
@@ -95,10 +95,9 @@ module Metanorma
95
95
  elem.xpath("./localityStack").size < 2 and return
96
96
  elem.xpath("./localityStack[not(@connective)]").each do |l|
97
97
  n = l.next_element
98
- l["connective"] = if n && n.name == "localityStack" &&
99
- n["connective"] == "to"
100
- "from"
101
- else "and" end
98
+ l["connective"] = "and"
99
+ n && n.name == "localityStack" && n["connective"] == "to" and
100
+ l["connective"] = "from"
102
101
  end
103
102
  end
104
103
 
@@ -111,8 +110,7 @@ module Metanorma
111
110
  elem.name = name
112
111
  elem["bibitemid"] = elem["target"]
113
112
  if ref = @anchors&.dig(elem["target"], :xref)
114
- t = @anchors.dig(elem["target"], :id, elem["style"]) and
115
- ref = t
113
+ t = @anchors.dig(elem["target"], :id, elem["style"]) and ref = t
116
114
  elem["citeas"] = @c.decode(ref)
117
115
  else xref_to_eref1(elem)
118
116
  end
@@ -141,9 +139,7 @@ module Metanorma
141
139
  e.name = "erefstack"
142
140
  e.delete("bibitemid")
143
141
  e.delete("citeas")
144
- e.xpath("./eref").each do |e1|
145
- e1["type"] = e["type"]
146
- end
142
+ e.xpath("./eref").each { |e1| e1["type"] = e["type"] }
147
143
  e.delete("type")
148
144
  end
149
145
  end
@@ -219,7 +215,7 @@ module Metanorma
219
215
  unless a.size < 2 || a[0].empty? || a[1].empty?
220
216
  elem["target"] = "#{a[0]}_#{a[1]}"
221
217
  a.size > 2 and
222
- elem.children = %{anchor="#{a[2..-1].join}",#{elem.children&.text}}
218
+ elem.children = %{anchor="#{a[2..].join}",#{elem.children&.text}}
223
219
  elem["type"] = a[0]
224
220
  @internal_eref_namespaces << a[0]
225
221
  xref_to_eref(elem, "eref")
@@ -49,6 +49,7 @@ module Metanorma
49
49
  @sourcecode_markup_end = node.attr("sourcecode-markup-end") || "}}}"
50
50
  @datauriimage = node.attr("data-uri-image") != "false"
51
51
  @datauriattachment = node.attr("data-uri-attachment") != "false"
52
+ @dataurimaxsize = node.attr("data-uri-maxsize")&.to_i || 13981013
52
53
  @blockunnumbered = (node.attr("block-unnumbered") || "").split(",")
53
54
  .map(&:strip)
54
55
  end
@@ -102,6 +103,7 @@ module Metanorma
102
103
  def init_biblio(node)
103
104
  @no_isobib_cache = node.attr("no-isobib-cache")
104
105
  @no_isobib = node.attr("no-isobib")
106
+ init_bib_log
105
107
  @bibdb = nil
106
108
  init_bib_caches(node)
107
109
  init_iev_caches(node)
@@ -109,6 +111,14 @@ module Metanorma
109
111
  ::Metanorma::Standoc::LocalBiblio.new(node, @localdir, self)
110
112
  end
111
113
 
114
+ def init_bib_log
115
+ @relaton_log = StringIO.new
116
+ relaton_logger = Relaton::Logger::Log
117
+ .new(@relaton_log, levels: %i(info warn error fatal unknown),
118
+ formatter: Relaton::Logger::FormatterJSON)
119
+ Relaton.logger_pool[:my_logger] = relaton_logger
120
+ end
121
+
112
122
  def init_math(node)
113
123
  @keepasciimath = node.attr("mn-keep-asciimath") &&
114
124
  node.attr("mn-keep-asciimath") != "false"
@@ -43,21 +43,21 @@ module Metanorma
43
43
  if /&lt;([^:>&]+:)?math(\s+[^>&]+)?&gt; |
44
44
  <([^:>&]+:)?math(\s+[^>&]+)?>/x.match? text
45
45
  math = xml_encode(text)
46
- xml.stem type: "MathML", block: block do |s|
46
+ xml.stem(type: "MathML", block:) do |s|
47
47
  s << math
48
48
  end
49
49
  elsif style == :latexmath then latex_parse(text, xml, block)
50
50
  else
51
- xml.stem text&.gsub("&amp;#", "&#"), type: "AsciiMath", block: block
51
+ xml.stem text&.gsub("&amp;#", "&#"), type: "AsciiMath", block:
52
52
  end
53
53
  end
54
54
 
55
55
  def latex_parse(text, xml, block)
56
56
  latex = latex_parse1(text, block) or
57
- return xml.stem type: "MathML", block: block
58
- xml.stem type: "MathML", block: block do |s|
57
+ return xml.stem(type: "MathML", block:)
58
+ xml.stem(type: "MathML", block:) do |s|
59
59
  math = Nokogiri::XML.fragment(latex.sub(/<\?[^>]+>/, ""))
60
- .elements[0]
60
+ .elements[0]
61
61
  math.delete("alttext")
62
62
  s.parent.children = math
63
63
  s << "<latexmath>#{text}</latexmath>"
@@ -17,7 +17,7 @@
17
17
  these elements; we just want one namespace for any child grammars
18
18
  of this.
19
19
  -->
20
- <!-- VERSION v1.3.2 -->
20
+ <!-- VERSION v1.3.3 -->
21
21
  <grammar xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
22
22
  <include href="reqt.rng"/>
23
23
  <include href="basicdoc.rng">
@@ -331,9 +331,9 @@
331
331
  <zeroOrMore>
332
332
  <ref name="table-note"/>
333
333
  </zeroOrMore>
334
- <optional>
334
+ <zeroOrMore>
335
335
  <ref name="source"/>
336
- </optional>
336
+ </zeroOrMore>
337
337
  </define>
338
338
  <define name="FigureAttr">
339
339
  <optional>
@@ -380,9 +380,9 @@
380
380
  <zeroOrMore>
381
381
  <ref name="note"/>
382
382
  </zeroOrMore>
383
- <optional>
383
+ <zeroOrMore>
384
384
  <ref name="source"/>
385
- </optional>
385
+ </zeroOrMore>
386
386
  </define>
387
387
  <define name="source">
388
388
  <element name="source">
@@ -41,7 +41,7 @@ module Metanorma
41
41
  list_caption(node, xml_ul)
42
42
  node.items.each { |item| ul_li(xml_ul, item) }
43
43
  end
44
- end.join("\n")
44
+ end.join("")
45
45
  end
46
46
 
47
47
  def olist_style(style)
@@ -67,7 +67,7 @@ module Metanorma
67
67
  list_caption(node, xml_ol)
68
68
  node.items.each { |item| li(xml_ol, item) }
69
69
  end
70
- end.join("\n")
70
+ end.join("")
71
71
  end
72
72
 
73
73
  def dt(terms, xml_dl)
@@ -107,7 +107,7 @@ module Metanorma
107
107
  dd(dd, xml_dl)
108
108
  end
109
109
  end
110
- end.join("\n")
110
+ end.join("")
111
111
  end
112
112
 
113
113
  def colist(node)
@@ -117,7 +117,7 @@ module Metanorma
117
117
  xml_li.p { |p| p << item.text }
118
118
  end
119
119
  end
120
- end.join("\n")
120
+ end.join("")
121
121
  end
122
122
 
123
123
  def list_caption(node, out)
@@ -53,13 +53,19 @@ module Metanorma
53
53
  class NamedEscapePreprocessor < Asciidoctor::Extensions::Preprocessor
54
54
  def process(document, reader)
55
55
  c = HTMLEntities.new
56
+ p = Metanorma::Utils::LineStatus.new
56
57
  lines = reader.lines.map do |l|
57
- l.split(/(&[A-Za-z][^&;]*;)/).map do |s|
58
- /^&[A-Za-z]/.match?(s) ? c.encode(c.decode(s), :hexadecimal) : s
59
- end.join
58
+ p.process(l)
59
+ p.pass ? l : convert(l, c)
60
60
  end
61
61
  ::Asciidoctor::PreprocessorReader.new document, lines
62
62
  end
63
+
64
+ def convert(line, esc)
65
+ line.split(/(&[A-Za-z][^&;]*;)/).map do |s|
66
+ /^&[A-Za-z]/.match?(s) ? esc.encode(esc.decode(s), :hexadecimal) : s
67
+ end.join
68
+ end
63
69
  end
64
70
 
65
71
  class ColumnBreakBlockMacro < Asciidoctor::Extensions::BlockMacroProcessor
@@ -75,51 +81,16 @@ module Metanorma
75
81
  # Not using TreeProcessor because that is still too close to
76
82
  # inline expressions being processed on access (e.g. titles)
77
83
  class LinkProtectPreprocessor < Asciidoctor::Extensions::Preprocessor
78
- def init
79
- pass = true # process as passthrough: init = true until
80
- # hit end of doc header
81
- is_delim = false # current line is a no-substititon block delimiter
82
- pass_delim = false # current line is a passthrough delimiter
83
- delimln = "" # delimiter line of current block(s);
84
- # init value looks for end of doc header
85
- { pass: pass, is_delim: is_delim, pass_delim: pass_delim,
86
- delimln: delimln }
87
- end
88
-
89
84
  def process(document, reader)
90
- p = init
85
+ p = Metanorma::Utils::LineStatus.new
91
86
  lines = reader.lines.map do |t|
92
- p = pass_status(p, t.rstrip)
93
- !p[:pass] && t.include?(":") and t = inlinelinkmacro(inlinelink(t))
87
+ p.process(t)
88
+ !p.pass && t.include?(":") and t = inlinelinkmacro(inlinelink(t))
94
89
  t
95
90
  end
96
91
  ::Asciidoctor::PreprocessorReader.new document, lines
97
92
  end
98
93
 
99
- def pass_status(status, text)
100
- text == "++++" && !status[:delimln] and status[:pass] = !status[:pass]
101
- status[:midline_docattr] && !/^:[^ :]+: /.match?(text) and
102
- status[:midline_docattr] = false
103
- if (status[:is_delim] && /^(-+|\*+|=+|_+)$/.match?(text)) ||
104
- (!status[:is_delim] && !status[:delimln] && /^-----*$|^\.\.\.\.\.*$/.match?(text))
105
- status[:delimln] = text
106
- status[:pass] = true
107
- elsif status[:pass_delim]
108
- status[:delimln] = "" # end of paragraph for paragraph with [pass]
109
- elsif status[:delimln] && text == status[:delimln]
110
- status[:pass] = false
111
- status[:delimln] = nil
112
- elsif /^:[^ :]+: /.match?(text) &&
113
- (status[:prev_line].empty? || status[:midline_docattr])
114
- status[:pass] = true
115
- status[:midline_docattr] = true
116
- end
117
- status[:is_delim] = /^\[(source|listing|literal|pass)\b/.match?(text)
118
- status[:pass_delim] = /^\[(pass)\b/.match?(text)
119
- status[:prev_line] = text.strip
120
- status
121
- end
122
-
123
94
  PASS_INLINE_MACROS = %w(pass pass-format identifier std-link stem)
124
95
  .join("|").freeze
125
96
 
@@ -133,7 +104,7 @@ module Metanorma
133
104
  \\[.*?(?<!\\\\)\\] # [ ... ] not preceded by \\
134
105
  )
135
106
  REGEX
136
- PASS_INLINE_MACRO_RX = /#{PASS_INLINE_MACRO_STR}/xo.freeze
107
+ PASS_INLINE_MACRO_RX = /#{PASS_INLINE_MACRO_STR}/xo
137
108
 
138
109
  def pass_inline_split(text)
139
110
  text.split(PASS_INLINE_MACRO_RX).each.map do |x|
@@ -143,7 +114,7 @@ module Metanorma
143
114
 
144
115
  # InlineLinkRx = %r((^|link:|#{CG_BLANK}|&lt;|[>\(\)\[\];"'])(\\?(?:https?|file|ftp|irc)://)(?:([^\s\[\]]+)\[(|#{CC_ALL}*?[^\\])\]|([^\s\[\]<]*([^\s,.?!\[\]<\)]))))m
145
116
  #
146
- InlineLinkRx = %r((^|(?<![-\\])\blink:(?!\+)|\p{Blank}|&lt;|[<>\(\)\[\];"'])((?:https?|file|ftp|irc)://)(?:([^\s\[\]]+)(?:(\[(|.*?[^\\])\])|([^\s\[\]<]*([^\s,.?!\[\]<\)])))))m.freeze
117
+ InlineLinkRx = %r((^|(?<![-\\])\blink:(?!\+)|\p{Blank}|&lt;|[<>\(\)\[\];"'])((?:https?|file|ftp|irc)://)(?:([^\s\[\]]+)(?:(\[(|.*?[^\\])\])|([^\s\[\]<]*([^\s,.?!\[\]<\)])))))m
147
118
 
148
119
  def inlinelink(text)
149
120
  text.include?("://") or return text
@@ -173,7 +144,7 @@ module Metanorma
173
144
  (|[^:\\s\\[][^\\s\\[]*) # link: ... up to [
174
145
  (\\[(|.*?[^\\\\])\\]) # [ ... ], no ]
175
146
  REGEX
176
- InlineLinkMacroRx = /#{InlineLinkMacroRx1}/x.freeze
147
+ InlineLinkMacroRx = /#{InlineLinkMacroRx1}/x
177
148
 
178
149
  def inlinelinkmacro(text)
179
150
  (text.include?("[") &&
@@ -37,18 +37,19 @@ module Metanorma
37
37
  def process(doc, reader)
38
38
  reader.eof? and return reader
39
39
  r = ::Asciidoctor::PreprocessorNoIfdefsReader.new doc, reader.lines
40
+ p = Metanorma::Utils::LineStatus.new
40
41
  lines = r.readlines
41
42
  headings = lines.grep(/^== /).map(&:strip)
42
43
  ret = lines.each_with_object(embed_acc(doc, r)) do |line, m|
43
- process_line(line, m, headings)
44
+ process_line(line, m, headings, p)
44
45
  end
45
46
  return_to_document(doc, ret)
46
47
  end
47
48
 
48
49
  def embed_acc(doc, reader)
49
50
  { lines: [], hdr: [], id: [],
50
- orig: doc, doc: doc, file: nil, path: nil,
51
- reader: reader, prev: nil }
51
+ orig: doc, doc:, file: nil, path: nil,
52
+ reader:, prev: nil }
52
53
  end
53
54
 
54
55
  # presupposes single embed
@@ -93,13 +94,14 @@ module Metanorma
93
94
 
94
95
  def update_embeds(lines, acc, emb)
95
96
  lines.empty? or
96
- acc << { file: emb[:file], path: emb[:path], lines: lines }
97
+ acc << { file: emb[:file], path: emb[:path], lines: }
97
98
  [[], acc]
98
99
  end
99
100
 
100
- def process_line(line, acc, headings)
101
- if /^embed::/.match?(line)
102
- e = embed(line, acc, headings)
101
+ def process_line(line, acc, headings, status)
102
+ status.process(line)
103
+ if !status.pass && /^embed::/.match?(line)
104
+ e = embed(line, acc, headings, status)
103
105
  acc = process_embed(acc, e, acc[:prev])
104
106
  else
105
107
  acc[:lines] << line
@@ -148,7 +150,7 @@ module Metanorma
148
150
  end
149
151
  end
150
152
 
151
- def embed(line, acc, headings)
153
+ def embed(line, acc, headings, status)
152
154
  fname, inc_path = filename(line, acc)
153
155
  lines = filter_sections(read(inc_path), headings)
154
156
  n = Asciidoctor::Document
@@ -158,12 +160,12 @@ module Metanorma
158
160
  .merge(file: fname, path: inc_path, orig: acc[:orig])
159
161
  ret[:hdr] or
160
162
  raise "Embedding an incomplete document with no header: #{ret[:path]}"
161
- embed_recurse(ret, n, r, headings)
163
+ embed_recurse(ret, n, r, headings, status)
162
164
  end
163
165
 
164
- def embed_recurse(ret, doc, reader, headings)
166
+ def embed_recurse(ret, doc, reader, headings, status)
165
167
  ret1 = ret[:lines].each_with_object(embed_acc(doc, reader)) do |line, m|
166
- process_line(line, m, headings)
168
+ process_line(line, m, headings, status)
167
169
  end
168
170
  ret.merge(
169
171
  { lines: ret1[:lines], id: ret[:id] + ret1[:id],
@@ -172,7 +174,7 @@ module Metanorma
172
174
  end
173
175
 
174
176
  def strip_header(lines)
175
- return { lines: lines, hdr: nil } unless !lines.empty? &&
177
+ return { lines:, hdr: nil } unless !lines.empty? &&
176
178
  lines.first.start_with?("= ")
177
179
 
178
180
  skip = true
@@ -27,7 +27,7 @@ module Metanorma
27
27
  def isorefmatchescode(match, _item)
28
28
  code = analyse_ref_code(match[:code])
29
29
  yr = norm_year(match[:year])
30
- { code: match[:code], year: yr, match: match,
30
+ { code: match[:code], year: yr, match:,
31
31
  title: match[:text], usrlbl: match[:usrlbl] || code[:usrlabel],
32
32
  analyse_code: code, lang: @lang || :all }
33
33
  end
@@ -47,7 +47,7 @@ module Metanorma
47
47
  def isorefmatches2code(match, _item)
48
48
  code = analyse_ref_code(match[:code])
49
49
  { code: match[:code], no_year: true, lang: @lang || :all,
50
- note: match[:fn], year: nil, match: match, analyse_code: code,
50
+ note: match[:fn], year: nil, match:, analyse_code: code,
51
51
  title: match[:text], usrlbl: match[:usrlbl] || code[:usrlabel] }
52
52
  end
53
53
 
@@ -77,7 +77,7 @@ module Metanorma
77
77
  code = analyse_ref_code(match[:code])
78
78
  yr = norm_year(match[:year])
79
79
  hasyr = !yr.nil? && yr != "--"
80
- { code: match[:code], match: match, yr: yr, hasyr: hasyr,
80
+ { code: match[:code], match:, yr:, hasyr:,
81
81
  year: hasyr ? yr : nil, lang: @lang || :all,
82
82
  all_parts: true, no_year: yr == "--",
83
83
  title: match[:text], usrlbl: match[:usrlbl] || code[:usrlabel] }
@@ -162,11 +162,11 @@ module Metanorma
162
162
  def refitem1code(_item, match)
163
163
  code = analyse_ref_code(match[:code])
164
164
  ((code[:id] && code[:numeric]) || code[:nofetch]) and
165
- return { code: nil, match: match, analyse_code: code,
165
+ return { code: nil, match:, analyse_code: code,
166
166
  hidden: code[:hidden] }
167
167
  { code: code[:id], analyse_code: code, localfile: code[:localfile],
168
168
  year: (m = refitem1yr(code[:id])) ? m[:year] : nil,
169
- title: match[:text], match: match, hidden: code[:hidden],
169
+ title: match[:text], match:, hidden: code[:hidden],
170
170
  usrlbl: match[:usrlbl] || code[:usrlabel], lang: @lang || :all }
171
171
  end
172
172
 
@@ -187,29 +187,26 @@ module Metanorma
187
187
  ISO_REF =
188
188
  %r{^<ref\sid="(?<anchor>[^"]+)">
189
189
  \[(?<usrlbl>\([^)]+\))?(?<code>(?:ISO|IEC)[^0-9]*\s[0-9-]+|IEV)
190
- (?::(?<year>[0-9][0-9-]+))?\]</ref>,?\s*(?<text>.*)$}xm.freeze
190
+ (?::(?<year>[0-9][0-9-]+))?\]</ref>,?\s*(?<text>.*)$}xm
191
191
 
192
192
  ISO_REF_NO_YEAR =
193
193
  %r{^<ref\sid="(?<anchor>[^"]+)">
194
194
  \[(?<usrlbl>\([^)]+\))?(?<code>(?:ISO|IEC)[^0-9]*\s[0-9-]+):
195
- (?:--|&\#821[12];)\]</ref>,?\s*
195
+ (?:--|–|—|&\#821[12];)\]</ref>,?\s*
196
196
  (?:<fn[^>]*>\s*<p>(?<fn>[^\]]+)</p>\s*</fn>)?,?\s?(?<text>.*)$}xm
197
- .freeze
198
197
 
199
198
  ISO_REF_ALL_PARTS =
200
199
  %r{^<ref\sid="(?<anchor>[^"]+)">
201
200
  \[(?<usrlbl>\([^)]+\))?(?<code>(?:ISO|IEC)[^0-9]*\s[0-9]+)
202
- (?::(?<year>--|&\#821[12];|[0-9][0-9-]+))?\s
201
+ (?::(?<year>--|–|—|&\#821[12];|[0-9][0-9-]+))?\s
203
202
  \(all\sparts\)\]</ref>,?\s*
204
- (?:<fn[^>]*>\s*<p>(?<fn>[^\]]+)</p>\s*</fn>,?\s?)?(?<text>.*)$}xm.freeze
203
+ (?:<fn[^>]*>\s*<p>(?<fn>[^\]]+)</p>\s*</fn>,?\s?)?(?<text>.*)$}xm
205
204
 
206
205
  NON_ISO_REF = %r{^<ref\sid="(?<anchor>[^"]+)">
207
206
  \[(?<usrlbl>\([^)]+\))?(?<code>.+?)\]</ref>,?\s*(?<text>.*)$}xm
208
- .freeze
209
207
 
210
208
  NON_ISO_REF1 = %r{^<ref\sid="(?<anchor>[^"]+)">
211
209
  (?<usrlbl>\([^)]+\))?(?<code>.+?)</ref>,?\s*(?<text>.*)$}xm
212
- .freeze
213
210
 
214
211
  def reference1_matches(item)
215
212
  matched = ISO_REF.match item
@@ -40,7 +40,7 @@ module Metanorma
40
40
  def reference_queue(results, size)
41
41
  (1..size).each.with_object([]) do |_, m|
42
42
  ref, i, doc = results.pop
43
- m[i.to_i] = { ref: ref }
43
+ m[i.to_i] = { ref: }
44
44
  if doc.is_a?(RelatonBib::RequestError)
45
45
  @log.add("Bibliography", nil, "Could not retrieve #{ref[:code]}: " \
46
46
  "no access to online site", severity: 1)
@@ -69,7 +69,7 @@ module Metanorma
69
69
 
70
70
  def merge_publishers(base, add)
71
71
  ins = base.at("//contributor[last()]") || base.children[-1]
72
- add.xpath("//contributor[role/@type = 'publisher']").reverse.each do |p|
72
+ add.xpath("//contributor[role/@type = 'publisher']").reverse_each do |p|
73
73
  ins.next = p
74
74
  end
75
75
  end
@@ -80,14 +80,14 @@ module Metanorma
80
80
  v.at("//docidentifier[@primary = 'true']") or
81
81
  v.at("//docidentifier")["primary"] = true
82
82
  end
83
- add.xpath("//docidentifier").reverse.each do |p|
83
+ add.xpath("//docidentifier").reverse_each do |p|
84
84
  ins.next = p
85
85
  end
86
86
  end
87
87
 
88
88
  def merge_urls(base, add)
89
89
  ins = base.at("./uri[last()]") || base.at("./title[last()]")
90
- add.xpath("./uri").reverse.each do |p|
90
+ add.xpath("./uri").reverse_each do |p|
91
91
  ins.next = p
92
92
  end
93
93
  end
@@ -122,16 +122,14 @@ module Metanorma
122
122
  end
123
123
 
124
124
  def local_ievcache_name(cachename)
125
- return nil if cachename.nil?
126
-
125
+ cachename.nil? and return nil
127
126
  cachename += "_iev" unless cachename.empty?
128
127
  cachename = "iev" if cachename.empty?
129
128
  "#{cachename}/cache"
130
129
  end
131
130
 
132
131
  def fetch_ref(xml, code, year, **opts)
133
- return nil if opts[:no_year]
134
-
132
+ opts[:no_year] and return nil
135
133
  code = code.sub(/^\([^)]+\)/, "")
136
134
  hit = fetch_ref1(code, year, opts) or return nil
137
135
  xml.parent.add_child(smart_render_xml(hit, code, opts))
@@ -200,8 +200,8 @@ module Metanorma
200
200
 
201
201
  MALFORMED_REF = <<~REF.freeze
202
202
  no anchor on reference, markup may be malformed: see
203
- https://www.metanorma.com/author/topics/document-format/bibliography/ ,
204
- https://www.metanorma.com/author/iso/topics/markup/#bibliographies
203
+ https://www.metanorma.org/author/topics/sections/bibliography/ ,
204
+ https://www.metanorma.org/author/iso/topics/markup/#bibliographies
205
205
  REF
206
206
 
207
207
  def ref_normalise(ref)
@@ -16,8 +16,7 @@ module Metanorma
16
16
  .gsub(%r{<index>.*?</index>}m, "")
17
17
  .gsub(%r{<fn[^>]*>.*?</fn>}m, "")
18
18
  .gsub(/<[^>]+>/, "")
19
- .strip.downcase
20
- .sub(/\.$/, "")
19
+ .strip.downcase.sub(/\.$/, "")
21
20
  end
22
21
 
23
22
  def sectiontype(node, level = true)
@@ -41,7 +40,8 @@ module Metanorma
41
40
  "terms, definitions and abbreviated terms"
42
41
  "terms and definitions"
43
42
  when "symbols and abbreviated terms",
44
- "symbols", "abbreviated terms", "abbreviations"
43
+ "symbols", "abbreviated terms", "abbreviations",
44
+ "symbols and abbreviations"
45
45
  "symbols and abbreviated terms"
46
46
  when "acknowledgements", "acknowledgments"
47
47
  "acknowledgements"
@@ -170,7 +170,7 @@ module Metanorma
170
170
  seen_xref = Nokogiri::XML.fragment(matched[:xref])
171
171
  add_term_source(node, xml_t, seen_xref, matched)
172
172
  end
173
- end.join("\n")
173
+ end.join("")
174
174
  end
175
175
 
176
176
  def termdefinition(node)
@@ -178,7 +178,7 @@ module Metanorma
178
178
  xml.definition **attr_code(type: node.attr("type")) do |d|
179
179
  d << node.content
180
180
  end
181
- end.join("\n")
181
+ end.join("")
182
182
  end
183
183
  end
184
184
  end
@@ -48,7 +48,6 @@ module Metanorma
48
48
  def mathml_sanitise(math)
49
49
  math.to_xml(encoding: "US-ASCII").gsub(/ xmlns=["'][^"']+["']/, "")
50
50
  .gsub(%r{<[^:/>]+:}, "<").gsub(%r{</[^:/>]+:}, "</")
51
- # .gsub(/&#([^;]+);/) { |x| "&#x#{$1.to_i.to_s(16)};" }
52
51
  end
53
52
 
54
53
  def math_validate_error(math, elem, error)
@@ -133,7 +132,7 @@ module Metanorma
133
132
  doc.xpath(WILDCARD_ATTRS, "m" => SVG_NS).each do |n|
134
133
  n.elements.each do |e|
135
134
  e.traverse do |e1|
136
- e1.element? and e1.each { |k, _v| e1.delete(k) }
135
+ e1.element? and e1.each { |k, _v| e1.delete(k) } # rubocop:disable Style/HashEachMethods
137
136
  end
138
137
  end
139
138
  end
@@ -143,6 +142,7 @@ module Metanorma
143
142
 
144
143
  def image_validate(doc)
145
144
  image_exists(doc)
145
+ image_toobig(doc)
146
146
  png_validate(doc)
147
147
  end
148
148
 
@@ -183,6 +183,18 @@ module Metanorma
183
183
  "Corrupt PNG image detected: #{e.message}")
184
184
  end
185
185
 
186
+ TOO_BIG_IMG_ERR = <<~ERR.freeze
187
+ Image too large for Data URI encoding: disable Data URI encoding (`:data-uri-image: false`), or set `:data-uri-maxsize: 0`
188
+ ERR
189
+
190
+ def image_toobig(doc)
191
+ @dataurimaxsize.zero? and return
192
+ doc.xpath("//image").each do |i|
193
+ i["src"].size > @dataurimaxsize and
194
+ @log.add("Images", i.parent, TOO_BIG_IMG_ERR, severity: 0)
195
+ end
196
+ end
197
+
186
198
  def validate(doc)
187
199
  content_validate(doc)
188
200
  schema_validate(formattedstr_strip(doc.dup),
@@ -19,6 +19,6 @@ module Metanorma
19
19
  end
20
20
 
21
21
  module Standoc
22
- VERSION = "2.9.0".freeze
22
+ VERSION = "2.9.2".freeze
23
23
  end
24
24
  end
@@ -32,11 +32,12 @@ Gem::Specification.new do |spec|
32
32
  spec.add_dependency "asciidoctor", "~> 2.0.0"
33
33
  spec.add_dependency "crass", "~> 1.0.0"
34
34
  spec.add_dependency "iev", "~> 0.3.0"
35
- spec.add_dependency "isodoc", "~> 2.10.2"
35
+ spec.add_dependency "isodoc", "~> 2.10.5"
36
36
  spec.add_dependency "metanorma", ">= 1.6.0"
37
37
  spec.add_dependency "metanorma-plugin-datastruct", "~> 0.3.0"
38
38
  spec.add_dependency "metanorma-plugin-glossarist", "~> 0.2.0"
39
39
  spec.add_dependency "metanorma-plugin-lutaml", "~> 0.7.0"
40
+ spec.add_dependency "metanorma-utils", "~> 1.9.0"
40
41
  spec.add_dependency "ruby-jing"
41
42
  # relaton-cli not just relaton, to avoid circular reference in metanorma
42
43
  spec.add_dependency "asciimath2unitsml", "~> 0.4.0"
@@ -58,5 +59,6 @@ Gem::Specification.new do |spec|
58
59
  spec.add_development_dependency "timecop", "~> 0.9"
59
60
  spec.add_development_dependency "vcr", "~> 6.1.0"
60
61
  spec.add_development_dependency "webmock"
62
+ spec.add_development_dependency "xml-c14n"
61
63
  # spec.metadata["rubygems_mfa_required"] = "true"
62
64
  end
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.9.0
4
+ version: 2.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-07-08 00:00:00.000000000 Z
11
+ date: 2024-08-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 2.10.2
75
+ version: 2.10.5
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 2.10.2
82
+ version: 2.10.5
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: metanorma
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
138
  version: 0.7.0
139
+ - !ruby/object:Gem::Dependency
140
+ name: metanorma-utils
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 1.9.0
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 1.9.0
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: ruby-jing
141
155
  requirement: !ruby/object:Gem::Requirement
@@ -402,6 +416,20 @@ dependencies:
402
416
  - - ">="
403
417
  - !ruby/object:Gem::Version
404
418
  version: '0'
419
+ - !ruby/object:Gem::Dependency
420
+ name: xml-c14n
421
+ requirement: !ruby/object:Gem::Requirement
422
+ requirements:
423
+ - - ">="
424
+ - !ruby/object:Gem::Version
425
+ version: '0'
426
+ type: :development
427
+ prerelease: false
428
+ version_requirements: !ruby/object:Gem::Requirement
429
+ requirements:
430
+ - - ">="
431
+ - !ruby/object:Gem::Version
432
+ version: '0'
405
433
  description: |
406
434
  metanorma-standoc realises standards following the Metanorma standoc model
407
435