metanorma-standoc 2.9.0 → 2.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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