metanorma-standoc 2.0.4 → 2.0.5

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: 48ca241528c217b9b563a2d3f6f2e13b52f2fa24e679ca2de431ebde8d10fb98
4
- data.tar.gz: f6b70cd60a959376474a35ef4d364f69f9e15fd6582a53571a71cec995d90a01
3
+ metadata.gz: 219579e1dcc116cb03bfddaa5d11819180d7e5b8b306f499335a39a61c2e8075
4
+ data.tar.gz: 7d8c958d3ae1e834d5e8a93c8ee3c8ebb4040e4dcee899f1bc66c87e538cdad7
5
5
  SHA512:
6
- metadata.gz: f175a4b49b2aa24d8c8b566a6929401f1a61fb217cf2ee03b506d93482a086afb7b09c85e7c6d88c93d1ef57d41e5a79dc6122bf41624842118dfa75759823b4
7
- data.tar.gz: c395e93a7f1d3c03c63f1063f1689beb3e1725b81d26b2b38769038d491e8fade8462ab1b2f3b6324eede90c7e03b1473ce40873b903fd3859852436d69e7a9a
6
+ metadata.gz: a4925a6bbee7f29186d5a98cd90a51c647b4443b383f5b09e714554c1bc12da5f88c7c7143236077d96ea3685f2885c4057f245c687a5404d9f6c77489ea8063
7
+ data.tar.gz: 3644084092782115188b9240f0e8dc68e4ef4b2bb663e5e4270214ab861018ec3a3c4bfd082fbb49f9134af62e714acb309fa774d7ebeaac85a4b20444ef5ef9
@@ -26,29 +26,40 @@ module Metanorma
26
26
  end
27
27
 
28
28
  def init(node)
29
+ init_vars
30
+ init_misc(node)
31
+ init_processing(node)
32
+ init_toc(node)
33
+ init_output(node)
34
+ init_i18n(node)
35
+ init_biblio(node)
36
+ @metadata_attrs = metadata_attrs(node)
37
+ end
38
+
39
+ def init_vars
29
40
  @fn_number ||= 0
30
- @draft = false
31
41
  @refids = Set.new
32
42
  @anchors = {}
33
43
  @internal_eref_namespaces = []
34
44
  @seen_headers = []
45
+ @embed_hdr = []
46
+ end
47
+
48
+ def init_misc(node)
35
49
  @draft = node.attributes.has_key?("draft")
50
+ @index_terms = node.attr("index-terms")
51
+ @boilerplateauthority = node.attr("boilerplate-authority")
52
+ @embed_hdr = node.attr("embed_hdr")
53
+ end
54
+
55
+ def init_processing(node)
36
56
  @novalid = node.attr("novalid")
37
57
  @smartquotes = node.attr("smartquotes") != "false"
38
58
  @keepasciimath = node.attr("mn-keep-asciimath") &&
39
59
  node.attr("mn-keep-asciimath") != "false"
40
- @index_terms = node.attr("index-terms")
41
60
  @sourcecode_markup_start = node.attr("sourcecode-markup-start") || "{{{"
42
61
  @sourcecode_markup_end = node.attr("sourcecode-markup-end") || "}}}"
43
62
  @datauriimage = node.attr("data-uri-image") != "false"
44
- @boilerplateauthority = node.attr("boilerplate-authority")
45
- @sourcecode_markup_start = node.attr("sourcecode-markup-start") || "{{{"
46
- @sourcecode_markup_end = node.attr("sourcecode-markup-end") || "}}}"
47
- init_toc(node)
48
- init_output(node)
49
- init_i18n(node)
50
- init_biblio(node)
51
- @metadata_attrs = metadata_attrs(node)
52
63
  end
53
64
 
54
65
  def init_toc(node)
@@ -188,7 +188,7 @@ module Metanorma
188
188
 
189
189
  def quote_attribution(node, out)
190
190
  if node.attr("citetitle")
191
- m = /^(?<cite>[^,]+)(,(?<text>.*$))?$/m.match node.attr("citetitle")
191
+ m = /^(?<cite>[^,]+)(?:,(?<text>.*$))?$/m.match node.attr("citetitle")
192
192
  out.source **attr_code(target: m[:cite], type: "inline") do |s|
193
193
  s << m[:text]
194
194
  end
@@ -1,53 +1,56 @@
1
1
  module Metanorma
2
2
  module Standoc
3
3
  module Cleanup
4
- def change_clauses(x)
5
- x.xpath("//clause[@change]").each do |c|
6
- a = create_amend(c)
4
+ def change_clauses(docxml)
5
+ docxml.xpath("//clause[@change]").each do |c|
6
+ create_amend(c)
7
7
  end
8
8
  end
9
9
 
10
- def create_amend(c)
11
- a = c.add_child("<amend id='_#{UUIDTools::UUID.random_create}'/>").first
12
- c.elements.each do |e|
10
+ def create_amend(clause)
11
+ a = clause.add_child("<amend id='_#{UUIDTools::UUID.random_create}'/>")
12
+ .first
13
+ clause.elements.each do |e|
13
14
  e.parent = a unless %w(amend title).include? e.name
14
15
  end
15
- create_amend1(c, a)
16
+ create_amend1(clause, a)
16
17
  end
17
18
 
18
- def create_amend1(c, a)
19
- create_amend2(c, a)
20
- d = a.at("./description")
19
+ def create_amend1(clause, amend)
20
+ create_amend2(clause, amend)
21
+ d = amend.at("./description")
21
22
  d.xpath(".//autonumber").each { |e| d.previous = e }
22
- d.xpath(".//p[normalize-space(.)='']").each { |e| e.remove }
23
- move_attrs_to_amend(c, a)
24
- a
23
+ d.xpath(".//p[normalize-space(.)='']").each(&:remove)
24
+ move_attrs_to_amend(clause, amend)
25
+ amend
25
26
  end
26
27
 
27
- def create_amend2(c, a)
28
- q = a.at("./quote") and q.name = "newcontent"
28
+ def create_amend2(_clause, amend)
29
+ q = amend.at("./quote") and q.name = "newcontent"
29
30
  if q.nil?
30
- a.children = "<description>#{a.children.to_xml}</description>"
31
- else
32
- pre = q&.xpath("./preceding-sibling::*")&.remove
33
- post = q&.xpath("./following-sibling::*")&.remove
34
- pre.empty? or a << "<description>#{pre.to_xml}</description>"
35
- a << q.remove
36
- post.empty? or a << "<description>#{post.to_xml}</description>"
31
+ amend.children = "<description>#{amend.children.to_xml}</description>"
32
+ return
37
33
  end
34
+ pre = q&.xpath("./preceding-sibling::*")&.remove
35
+ post = q&.xpath("./following-sibling::*")&.remove
36
+ pre.empty? or amend << "<description>#{pre.to_xml}</description>"
37
+ amend << q.remove
38
+ post.empty? or amend << "<description>#{post.to_xml}</description>"
38
39
  end
39
40
 
40
- def move_attrs_to_amend(c, a)
41
+ def move_attrs_to_amend(clause, amend)
41
42
  %w(change path path_end title).each do |e|
42
- next unless c[e]
43
- a[e] = c[e]
44
- c.delete(e)
43
+ next unless clause[e]
44
+
45
+ amend[e] = clause[e]
46
+ clause.delete(e)
45
47
  end
46
- return unless a["locality"]
47
- loc = a.children.add_previous_sibling("<location/>")
48
- extract_localities1(loc, a["locality"])
48
+ return unless amend["locality"]
49
+
50
+ loc = amend.children.add_previous_sibling("<location/>")
51
+ extract_localities1(loc, amend["locality"])
49
52
  loc1 = loc.at("./localityStack") and loc.replace(loc1.elements)
50
- a.delete("locality")
53
+ amend.delete("locality")
51
54
  end
52
55
  end
53
56
  end
@@ -133,6 +133,7 @@ module Metanorma
133
133
  def bibdata_cleanup(xmldoc)
134
134
  bibdata_anchor_cleanup(xmldoc)
135
135
  bibdata_docidentifier_cleanup(xmldoc)
136
+ bibdata_embed_hdr_cleanup(xmldoc)
136
137
  biblio_indirect_erefs(xmldoc, @internal_eref_namespaces&.uniq)
137
138
  end
138
139
 
@@ -190,8 +191,8 @@ module Metanorma
190
191
  def resolve_local_indirect_erefs(xmldoc, refs, prefix)
191
192
  refs.each_with_object([]) do |r, m|
192
193
  id = r.sub(/^#{prefix}_/, "")
193
- if n = xmldoc.at("//*[@id = '#{id}']") and
194
- n.at("./ancestor-or-self::*[@type = '#{prefix}']")
194
+ n = xmldoc.at("//*[@id = '#{id}']")
195
+ if n&.at("./ancestor-or-self::*[@type = '#{prefix}']")
195
196
  xmldoc.xpath("//eref[@bibitemid = '#{r}']").each do |e|
196
197
  indirect_eref_to_xref(e, id)
197
198
  end
@@ -208,6 +209,29 @@ module Metanorma
208
209
  insert_indirect_biblio(xmldoc, refs, prefix)
209
210
  end
210
211
  end
212
+
213
+ def bibdata_embed_hdr_cleanup(xmldoc)
214
+ return if @embed_hdr.nil? || @embed_hdr.empty?
215
+
216
+ embed_recurse(xmldoc.at("//bibdata"), @embed_hdr.first)
217
+ end
218
+
219
+ def hdr2bibitem(hdr)
220
+ xml = Asciidoctor
221
+ .convert(hdr[:text], backend: Processor.new.asciidoctor_backend,
222
+ header_footer: true)
223
+ b = Nokogiri::XML(xml).at("//xmlns:bibdata")
224
+ b.name = "bibitem"
225
+ b.delete("type")
226
+ embed_recurse(b, hdr)
227
+ b.to_xml
228
+ end
229
+
230
+ def embed_recurse(bibitem, node)
231
+ node[:child].map { |x| hdr2bibitem(x) }.each do |x|
232
+ bibitem << "<relation type='derivedFrom'>#{x}</relation>"
233
+ end
234
+ end
211
235
  end
212
236
  end
213
237
  end
@@ -15,16 +15,21 @@ module Metanorma
15
15
  end
16
16
  end
17
17
 
18
+ # do not accept implicit id
18
19
  def validate_ref_dl(bib, clause)
19
20
  id = bib["id"]
20
- # do not accept implicit id
21
21
  id ||= clause["id"] unless /^_/.match?(clause["id"])
22
22
  unless id
23
23
  @log.add("Anchors", clause,
24
- "The following reference is missing an anchor:\n#{clause.to_xml}")
24
+ "The following reference is missing an anchor:\n"\
25
+ "#{clause.to_xml}")
25
26
  return
26
27
  end
27
28
  @refids << id
29
+ validate_ref_dl1(bib, id, clause)
30
+ end
31
+
32
+ def validate_ref_dl1(bib, id, clause)
28
33
  bib["title"] or
29
34
  @log.add("Bibliography", clause, "Reference #{id} is missing a title")
30
35
  bib["docid"] or
@@ -9,12 +9,6 @@ module Metanorma
9
9
  </passthrough>}mx) { HTMLEntities.new.decode($1) }
10
10
  end
11
11
 
12
- IGNORE_DUMBQUOTES =
13
- "//pre | //pre//* | //tt | //tt//* | "\
14
- "//sourcecode | //sourcecode//* | //bibdata//* | //stem | "\
15
- "//stem//* | //figure[@class = 'pseudocode'] | "\
16
- "//figure[@class = 'pseudocode']//*".freeze
17
-
18
12
  def smartquotes_cleanup(xmldoc)
19
13
  xmldoc.xpath("//date").each { |d| Metanorma::Utils::endash_date(d) }
20
14
  if @smartquotes then smartquotes_cleanup1(xmldoc)
@@ -31,14 +25,21 @@ module Metanorma
31
25
  def uninterrupt_quotes_around_xml(xmldoc)
32
26
  xmldoc.traverse do |n|
33
27
  next unless n.text? && n&.previous&.element?
34
- next unless /^['"]/.match?(n.text)
35
- next unless n.previous.ancestors("pre, tt, sourcecode, stem, figure")
36
- .empty?
28
+ next if uninterrupt_quotes_around_xml_skip(n)
37
29
 
38
30
  uninterrupt_quotes_around_xml1(n.previous)
39
31
  end
40
32
  end
41
33
 
34
+ def uninterrupt_quotes_around_xml_skip(elem)
35
+ !(/^['"]/.match?(elem.text) &&
36
+ elem.previous.ancestors("pre, tt, sourcecode, stem, figure, bibdata")
37
+ .empty? &&
38
+ ((elem.previous.text.strip.empty? &&
39
+ !empty_tag_with_text_content?(elem.previous)) ||
40
+ elem.previous.name == "index"))
41
+ end
42
+
42
43
  def uninterrupt_quotes_around_xml1(elem)
43
44
  prev = elem.at(".//preceding::text()[1]") or return
44
45
  /\S$/.match?(prev.text) or return
@@ -49,19 +50,40 @@ module Metanorma
49
50
  prev.content = "#{prev.text}#{m[1]}"
50
51
  end
51
52
 
52
- def dumb2smart_quotes(xmldoc)
53
- (xmldoc.xpath("//*[child::text()]") - xmldoc.xpath(IGNORE_DUMBQUOTES))
54
- .each do |x|
55
- x.children.each do |n|
56
- next unless n.text?
53
+ def block?(elem)
54
+ %w(title name variant-title clause figure annex example introduction
55
+ foreword acknowledgements note li th td dt dd p quote label
56
+ abstract preferred admitted related deprecates field-of-application
57
+ usage-info expression pronunciation grammar-value domain
58
+ definition termnote termexample modification description
59
+ newcontent floating-title).include? elem.name
60
+ end
57
61
 
58
- /[-'"(<>]|\.\.|\dx/.match(n) or next
62
+ def empty_tag_with_text_content?(elem)
63
+ %w(eref xref termref link).include? elem.name
64
+ end
59
65
 
60
- n.replace(Metanorma::Utils::smartformat(n.text))
61
- end
66
+ def dumb2smart_quotes(xmldoc)
67
+ prev = ""
68
+ xmldoc.traverse do |x|
69
+ block?(x) and prev = ""
70
+ empty_tag_with_text_content?(x) and prev = "dummy"
71
+ next unless x.text?
72
+
73
+ x.ancestors("pre, tt, sourcecode, stem, figure, bibdata").empty? and
74
+ dumb2smart_quotes1(x, prev)
75
+ prev = x.text if x.ancestors("index").empty?
62
76
  end
63
77
  end
64
78
 
79
+ def dumb2smart_quotes1(curr, prev)
80
+ /[-'"(<>]|\.\.|\dx/.match?(curr.text) or return
81
+
82
+ /^["']/.match?(curr.text) && prev.match?(/\S$/) and
83
+ curr.content = curr.text.sub(/^"/, "”").sub(/"’"/, "‘")
84
+ curr.replace(Metanorma::Utils::smartformat(curr.text))
85
+ end
86
+
65
87
  def dumbquote_cleanup(xmldoc)
66
88
  xmldoc.traverse do |n|
67
89
  next unless n.text?
@@ -92,7 +92,7 @@ module Metanorma
92
92
  end
93
93
 
94
94
  class << self
95
- attr_accessor :_file
95
+ attr_accessor :_file, :embed_hdr
96
96
  end
97
97
 
98
98
  def self.inherited(konv) # rubocop:disable Lint/MissingSuper
@@ -140,7 +140,7 @@ module Metanorma
140
140
  parse_content_as :text
141
141
 
142
142
  def process(parent, target, attrs)
143
- /^(?<lang>[^-]*)(-(?<script>.*))?$/ =~ target
143
+ /^(?<lang>[^-]*)(?:-(?<script>.*))?$/ =~ target
144
144
  out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
145
145
  if script
146
146
  %{<variant lang=#{lang} script=#{script}>#{out}</variant>}
@@ -5,13 +5,24 @@ module Metanorma
5
5
  return reader if reader.eof?
6
6
 
7
7
  lines = reader.readlines
8
- while !lines.grep(/^embed::/).empty?
9
- headings = lines.grep(/^== /).map(&:strip)
10
- lines = lines.map do |line|
11
- /^embed::/.match?(line) ? embed(line, doc, reader, headings) : line
12
- end.flatten
8
+ headings = lines.grep(/^== /).map(&:strip)
9
+ ret = lines.each_with_object({ lines: [], hdr: [] }) do |line, m|
10
+ process1(line, m, doc, reader, headings)
13
11
  end
14
- ::Asciidoctor::Reader.new lines
12
+ #doc.converter.embed_hdr = ret[:hdr]
13
+ doc.attributes["embed_hdr"] = ret[:hdr]
14
+ ::Asciidoctor::Reader.new ret[:lines].flatten
15
+ end
16
+
17
+ def process1(line, acc, doc, reader, headings)
18
+ if /^embed::/.match?(line)
19
+ e = embed(line, doc, reader, headings)
20
+ acc[:lines] << e[:lines]
21
+ acc[:hdr] << e[:hdr]
22
+ else
23
+ acc[:lines] << line
24
+ end
25
+ acc
15
26
  end
16
27
 
17
28
  def filename(line, doc, reader)
@@ -27,26 +38,36 @@ module Metanorma
27
38
  end
28
39
  end
29
40
 
41
+ def read(inc_path)
42
+ ::File.open inc_path, "r" do |fd|
43
+ readlines_safe(fd).map(&:chomp)
44
+ end
45
+ end
46
+
30
47
  def embed(line, doc, reader, headings)
31
48
  inc_path = filename(line, doc, reader) or return line
32
49
  lines = filter_sections(read(inc_path), headings)
33
50
  doc = Asciidoctor::Document.new [], { safe: :safe }
34
51
  reader = ::Asciidoctor::PreprocessorReader.new doc, lines
35
- strip_header(reader.read_lines)
52
+ ret = strip_header(reader.read_lines)
53
+ embed_recurse(ret, doc, reader, headings)
36
54
  end
37
55
 
38
- def read(inc_path)
39
- ::File.open inc_path, "r" do |fd|
40
- readlines_safe(fd).map(&:chomp)
56
+ def embed_recurse(ret, doc, reader, headings)
57
+ ret1 = ret[:lines].each_with_object({ lines: [], hdr: [] }) do |line, m|
58
+ process1(line, m, doc, reader, headings)
41
59
  end
60
+ { lines: ret1[:lines],
61
+ hdr: { text: ret[:hdr].join("\n"), child: ret1[:hdr] } }
42
62
  end
43
63
 
44
64
  def strip_header(lines)
45
- return lines unless !lines.empty? && lines.first.start_with?("= ")
65
+ return { lines: lines, hdr: nil } unless !lines.empty? &&
66
+ lines.first.start_with?("= ")
46
67
 
47
68
  skip = true
48
- lines.each_with_object([]) do |l, m|
49
- m << l unless skip
69
+ lines.each_with_object({ hdr: [], lines: [] }) do |l, m|
70
+ m[skip ? :hdr : :lines] << l
50
71
  skip = false if !/\S/.match?(l)
51
72
  end
52
73
  end
@@ -22,9 +22,10 @@ module Metanorma
22
22
  para.set_attr("name", "todo")
23
23
  para.set_attr("caption", "TODO")
24
24
  para.lines[0].sub!(/^TODO: /, "")
25
- todo = Asciidoctor::Block.new(parent, :admonition, attributes: para.attributes,
26
- source: para.lines,
27
- content_model: :compound)
25
+ todo = Asciidoctor::Block
26
+ .new(parent, :admonition, attributes: para.attributes,
27
+ source: para.lines,
28
+ content_model: :compound)
28
29
  parent.blocks[parent.blocks.index(para)] = todo
29
30
  end
30
31
  end
@@ -3,6 +3,10 @@ require "metanorma/processor"
3
3
  module Metanorma
4
4
  module Standoc
5
5
  class Processor < Metanorma::Processor
6
+ class << self
7
+ attr_reader :asciidoctor_backend
8
+ end
9
+
6
10
  def initialize # rubocop:disable Lint/MissingSuper
7
11
  @short = :standoc
8
12
  @input_format = :asciidoc
@@ -22,7 +26,8 @@ module Metanorma
22
26
  end
23
27
 
24
28
  def html_path(file)
25
- File.join(File.dirname(__FILE__), "..", "..", "isodoc", "html", file)
29
+ File.join(File.dirname(__FILE__), "..", "..", "isodoc", "html",
30
+ file)
26
31
  end
27
32
 
28
33
  def output(isodoc_node, inname, outname, format, options = {})
@@ -121,7 +121,7 @@ module Metanorma
121
121
  t.formattedref **{ format: "application/x-isodoc+xml" } do |i|
122
122
  i << ref_normalise_no_format(match[:text])
123
123
  end
124
- yr_match = /[:-](?<year>(19|20)[0-9][0-9])\b/.match(code[:id])
124
+ yr_match = /[:-](?<year>(?:19|20)[0-9][0-9])\b/.match(code[:id])
125
125
  refitem_render1(match, code, t)
126
126
  docnumber(t, code[:id]) unless /^\d+$|^\(.+\)$/.match?(code[:id])
127
127
  conditional_date(t, yr_match || match, false)
@@ -149,7 +149,7 @@ module Metanorma
149
149
  end
150
150
 
151
151
  def refitem1yr(code)
152
- yr_match = /[:-](?<year>(19|20)[0-9][0-9])\b/.match(code)
152
+ yr_match = /[:-](?<year>(?:19|20)[0-9][0-9])\b/.match(code)
153
153
  yr_match ? yr_match[:year] : nil
154
154
  end
155
155
 
@@ -163,20 +163,20 @@ module Metanorma
163
163
 
164
164
  ISO_REF =
165
165
  %r{^<ref\sid="(?<anchor>[^"]+)">
166
- \[(?<usrlbl>\([^)]+\))?(?<code>(ISO|IEC)[^0-9]*\s[0-9-]+|IEV)
167
- (:(?<year>[0-9][0-9-]+))?\]</ref>,?\s*(?<text>.*)$}xm.freeze
166
+ \[(?<usrlbl>\([^)]+\))?(?<code>(?:ISO|IEC)[^0-9]*\s[0-9-]+|IEV)
167
+ (?::(?<year>[0-9][0-9-]+))?\]</ref>,?\s*(?<text>.*)$}xm.freeze
168
168
 
169
169
  ISO_REF_NO_YEAR =
170
170
  %r{^<ref\sid="(?<anchor>[^"]+)">
171
- \[(?<usrlbl>\([^)]+\))?(?<code>(ISO|IEC)[^0-9]*\s[0-9-]+):
172
- (--|&\#821[12];)\]</ref>,?\s*
173
- (<fn[^>]*>\s*<p>(?<fn>[^\]]+)</p>\s*</fn>)?,?\s?(?<text>.*)$}xm
171
+ \[(?<usrlbl>\([^)]+\))?(?<code>(?:ISO|IEC)[^0-9]*\s[0-9-]+):
172
+ (?:--|&\#821[12];)\]</ref>,?\s*
173
+ (?:<fn[^>]*>\s*<p>(?<fn>[^\]]+)</p>\s*</fn>)?,?\s?(?<text>.*)$}xm
174
174
  .freeze
175
175
 
176
176
  ISO_REF_ALL_PARTS =
177
177
  %r{^<ref\sid="(?<anchor>[^"]+)">
178
- \[(?<usrlbl>\([^)]+\))?(?<code>(ISO|IEC)[^0-9]*\s[0-9]+)
179
- (:(?<year>--|&\#821[12];|[0-9][0-9-]+))?\s
178
+ \[(?<usrlbl>\([^)]+\))?(?<code>(?:ISO|IEC)[^0-9]*\s[0-9]+)
179
+ (?::(?<year>--|&\#821[12];|[0-9][0-9-]+))?\s
180
180
  \(all\sparts\)\]</ref>,?\s*
181
181
  (<fn[^>]*>\s*<p>(?<fn>[^\]]+)</p>\s*</fn>,?\s?)?(?<text>.*)$}xm.freeze
182
182
 
@@ -2,7 +2,7 @@ module Metanorma
2
2
  module Standoc
3
3
  module Refs
4
4
  def set_date_range(date, text)
5
- matched = /^(?<from>[0-9]+)(-+(?<to>[0-9]+))?$/.match text
5
+ matched = /^(?<from>[0-9]+)(?:-+(?<to>[0-9]+))?$/.match text
6
6
  return unless matched[:from]
7
7
 
8
8
  if matched[:to]
@@ -113,10 +113,11 @@ module Metanorma
113
113
  { id: match[:anchor], type: "standard" }
114
114
  end
115
115
 
116
- MALFORMED_REF =
117
- "no anchor on reference, markup may be malformed: see "\
118
- "https://www.metanorma.com/author/topics/document-format/bibliography/ , "\
119
- "https://www.metanorma.com/author/iso/topics/markup/#bibliographies".freeze
116
+ MALFORMED_REF = <<~REF.freeze
117
+ no anchor on reference, markup may be malformed: see
118
+ https://www.metanorma.com/author/topics/document-format/bibliography/ ,
119
+ https://www.metanorma.com/author/iso/topics/markup/#bibliographies
120
+ REF
120
121
 
121
122
  def ref_normalise(ref)
122
123
  ref.gsub(/&amp;amp;/, "&amp;").gsub(%r{^<em>(.*)</em>}, "\\1")
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true.
2
2
  require "metanorma/standoc/utils"
3
3
 
4
-
5
4
  module Metanorma
6
5
  module Standoc
7
6
  # Intelligent term lookup xml modifier
@@ -110,15 +109,15 @@ module Metanorma
110
109
  if type == "term" || ((!type || node.parent.name == "related") && t)
111
110
  node["target"] = t
112
111
  elsif type == "symbol" ||
113
- ((!type || node.parent.name == "related") && s)
112
+ ((!type || node.parent.name == "related") && s)
114
113
  node["target"] = s
115
114
  end
116
115
  end
117
116
 
118
117
  def replace_automatic_generated_ids_terms
119
118
  r = xmldoc.xpath("//term").each.with_object({}) do |n, res|
120
- normalize_id_and_memorize(n, res, "./preferred//name",
121
- "term")
119
+ normalize_id_and_memorize(n, res, "./preferred//name", "term")
120
+ normalize_id_and_memorize(n, res, "./admitted//name", "term")
122
121
  end
123
122
  s = xmldoc.xpath("//definitions//dt").each.with_object({}) do |n, res|
124
123
  normalize_id_and_memorize(n, res, ".", "symbol")
@@ -127,11 +126,13 @@ module Metanorma
127
126
  end
128
127
 
129
128
  def pref_secondary2primary
129
+ term = ""
130
130
  xmldoc.xpath("//term").each.with_object({}) do |n, res|
131
131
  n.xpath("./preferred//name").each_with_index do |p, i|
132
132
  i.zero? and term = p.text
133
133
  i.positive? and res[p.text] = term
134
134
  end
135
+ n.xpath("./admitted//name").each { |p| res[p.text] = term }
135
136
  end
136
137
  end
137
138
 
@@ -141,7 +142,7 @@ module Metanorma
141
142
  end
142
143
 
143
144
  def normalize_id_and_memorize_init(node, res_table, text_selector, prefix)
144
- term_text = normalize_ref_id(node.at(text_selector))
145
+ term_text = normalize_ref_id(node.at(text_selector)) or return
145
146
  unless AUTOMATIC_GENERATED_ID_REGEXP.match(node["id"]).nil? &&
146
147
  !node["id"].nil?
147
148
  id = unique_text_id(term_text, prefix)
@@ -160,6 +161,8 @@ module Metanorma
160
161
  end
161
162
 
162
163
  def normalize_ref_id(term)
164
+ return nil if term.nil?
165
+
163
166
  t = term.dup
164
167
  t.xpath(".//index").map(&:remove)
165
168
  Metanorma::Utils::to_ncname(t.text.strip.downcase
@@ -49,9 +49,79 @@ module Metanorma
49
49
  iev_validate(doc.root)
50
50
  concept_validate(doc, "concept", "refterm")
51
51
  concept_validate(doc, "related", "preferred//name")
52
+ table_validate(doc)
52
53
  @fatalerror.empty? or clean_abort(@fatalerror.join("\n"), doc.to_xml)
53
54
  end
54
55
 
56
+ def table_validate(doc)
57
+ doc.xpath("//table[colgroup]").each do |t|
58
+ maxrowcols_validate(t, t.xpath("./colgroup/col").size)
59
+ end
60
+ doc.xpath("//table[.//*[@colspan] | .//*[@rowspan]]").each do |t|
61
+ maxrowcols_validate(t, max_td_count(t))
62
+ end
63
+ end
64
+
65
+ def max_td_count(table)
66
+ max = 0
67
+ table.xpath(".//tr").each do |tr|
68
+ n = tr.xpath("./td | ./th").size
69
+ max < n and max = n
70
+ end
71
+ max
72
+ end
73
+
74
+ def maxrowcols_validate(table, maxcols)
75
+ cells2d = table.xpath(".//tr").each_with_object([]) { |_r, m| m << {} }
76
+ table.xpath(".//tr").each_with_index do |tr, r|
77
+ curr = 0
78
+ tr.xpath("./td | ./th").each do |td|
79
+ curr = maxcols_validate1(td, r, curr, cells2d, maxcols)
80
+ end
81
+ end
82
+ maxrows_validate(table, cells2d)
83
+ end
84
+
85
+ # code doesn't actually do anything, since Asciidoctor refuses to generate
86
+ # table with inconsistent column count
87
+ def maxcols_validate1(tcell, row, curr, cells2d, maxcols)
88
+ rs = tcell&.attr("rowspan")&.to_i || 1
89
+ cs = tcell&.attr("colspan")&.to_i || 1
90
+ curr = table_tracker_update(cells2d, row, curr, rs, cs)
91
+ maxcols_check(curr + cs - 1, maxcols, tcell)
92
+ curr + cs
93
+ end
94
+
95
+ def table_tracker_update(cells2d, row, curr, rowspan, colspan)
96
+ cells2d[row] ||= {}
97
+ while cells2d[row][curr]
98
+ curr += 1
99
+ end
100
+ (row..(row + rowspan - 1)).each do |y2|
101
+ cells2d[y2] ||= {}
102
+ (curr..(curr + colspan - 1)).each { |x2| cells2d[y2][x2] = 1 }
103
+ end
104
+ curr
105
+ end
106
+
107
+ def maxrows_validate(table, cells2d)
108
+ if cells2d.any? { |x| x.size != cells2d.first.size }
109
+ @log.add("Table", table,
110
+ "Table rows in table are inconsistent: check rowspan")
111
+ @fatalerror << "Table rows in table are inconsistent: check rowspan"
112
+ end
113
+ end
114
+
115
+ # if maxcols or maxrows negative, do not check them
116
+ def maxcols_check(col, maxcols, tcell)
117
+ if maxcols.positive? && col > maxcols
118
+ @log.add("Table", tcell, "Table exceeds maximum number of columns "\
119
+ "defined (#{maxcols})")
120
+ @fatalerror << "Table exceeds maximum number of columns defined "\
121
+ "(#{maxcols})"
122
+ end
123
+ end
124
+
55
125
  def norm_ref_validate(doc)
56
126
  found = false
57
127
  doc.xpath("//references[@normative = 'true']/bibitem").each do |b|
@@ -71,10 +141,9 @@ module Metanorma
71
141
  next if doc.at("//term[@id = '#{x['target']}']")
72
142
  next if doc.at("//definitions//dt[@id = '#{x['target']}']")
73
143
 
74
- ref = x&.at("../#{refterm}")&.text
75
144
  @log.add("Anchors", x,
76
- "#{tag.capitalize} #{ref} is pointing to "\
77
- "#{x['target']}, which is not a term or symbol")
145
+ "#{tag.capitalize} #{x&.at("../#{refterm}")&.text} is "\
146
+ "pointing to #{x['target']}, which is not a term or symbol")
78
147
  found = true
79
148
  end
80
149
  found and
@@ -122,23 +191,23 @@ module Metanorma
122
191
 
123
192
  SVG_NS = "http://www.w3.org/2000/svg".freeze
124
193
 
194
+ WILDCARD_ATTRS =
195
+ "//*[@format] | //stem | //bibdata//description | "\
196
+ "//formattedref | //bibdata//note | //bibdata/abstract | "\
197
+ "//bibitem/abstract | //bibitem/note | //misc-container".freeze
198
+
125
199
  # RelaxNG cannot cope well with wildcard attributes. So we strip
126
200
  # any attributes from FormattedString instances (which can contain
127
201
  # xs:any markup, and are signalled with @format) before validation.
128
202
  def formattedstr_strip(doc)
129
- doc.xpath("//*[@format] | //stem | //bibdata//description | "\
130
- "//formattedref | //bibdata//note | //bibdata/abstract | "\
131
- "//bibitem/abstract | //bibitem/note | //misc-container",
132
- "m" => SVG_NS).each do |n|
203
+ doc.xpath(WILDCARD_ATTRS, "m" => SVG_NS).each do |n|
133
204
  n.elements.each do |e|
134
205
  e.traverse do |e1|
135
206
  e1.element? and e1.each { |k, _v| e1.delete(k) }
136
207
  end
137
208
  end
138
209
  end
139
- doc.xpath("//m:svg", "m" => SVG_NS).each do |n|
140
- n.replace("<svg/>")
141
- end
210
+ doc.xpath("//m:svg", "m" => SVG_NS).each { |n| n.replace("<svg/>") }
142
211
  doc
143
212
  end
144
213
 
@@ -19,6 +19,6 @@ module Metanorma
19
19
  end
20
20
 
21
21
  module Standoc
22
- VERSION = "2.0.4".freeze
22
+ VERSION = "2.0.5".freeze
23
23
  end
24
24
  end
@@ -29,7 +29,7 @@ Gem::Specification.new do |spec|
29
29
  spec.add_dependency "asciidoctor", "~> 2.0.0"
30
30
  spec.add_dependency "iev", "~> 0.3.0"
31
31
  spec.add_dependency "isodoc", "~> 2.0.0"
32
- spec.add_dependency "metanorma-plugin-datastruct"
32
+ spec.add_dependency "metanorma-plugin-datastruct", "~> 0.2.0"
33
33
  spec.add_dependency "metanorma-plugin-lutaml"
34
34
  spec.add_dependency "ruby-jing"
35
35
  # relaton-cli not just relaton, to avoid circular reference in metanorma
@@ -52,6 +52,6 @@ Gem::Specification.new do |spec|
52
52
  spec.add_development_dependency "sassc", "2.4.0"
53
53
  spec.add_development_dependency "simplecov", "~> 0.15"
54
54
  spec.add_development_dependency "timecop", "~> 0.9"
55
- spec.add_development_dependency "vcr", "~> 5.0.0"
55
+ spec.add_development_dependency "vcr", "~> 6.1.0"
56
56
  spec.add_development_dependency "webmock"
57
57
  end
data/spec/assets/a2.adoc CHANGED
@@ -1,8 +1,10 @@
1
- = X
2
- A
1
+ = A2
2
+ A2
3
3
 
4
4
  == Clause 2
5
5
 
6
6
  X
7
7
 
8
8
  embed::spec/assets/a3.adoc[]
9
+
10
+ embed::spec/assets/a3a.adoc[]
data/spec/assets/a3.adoc CHANGED
@@ -1,5 +1,5 @@
1
- = X
2
- A
1
+ = A3
2
+ A3
3
3
 
4
4
  == Clause 3
5
5
 
@@ -0,0 +1,7 @@
1
+ = A3a
2
+ A3a
3
+
4
+ == Clause 3a
5
+
6
+ X
7
+
@@ -9,13 +9,21 @@ RSpec.describe Metanorma::Standoc do
9
9
  == "Quotation" A's
10
10
 
11
11
  '24:00:00'.
12
+
13
+ _emphasis_ *strong* `monospace` "double quote" 'single quote'
12
14
  INPUT
13
15
  output = <<~OUTPUT
14
- #{BLANK_HDR}
16
+ #{BLANK_HDR}
15
17
  <sections>
16
18
  <clause id="_" inline-header="false" obligation="normative">
17
19
  <title>“Quotation” A’s</title>
18
20
  <p id='_'>‘24:00:00’.</p>
21
+ <p id='_'>
22
+ <em>emphasis</em>
23
+ <strong>strong</strong>
24
+ <tt>monospace</tt>
25
+ “double quote” ‘single quote’
26
+ </p>
19
27
  </clause>
20
28
  </sections>
21
29
  </standard-document>
@@ -149,6 +157,10 @@ RSpec.describe Metanorma::Standoc do
149
157
  input = <<~INPUT
150
158
  #{ASCIIDOC_BLANK_HDR}
151
159
 
160
+ "*word*",
161
+
162
+ "link:http://example.com[]",
163
+
152
164
  "((ppt))",
153
165
 
154
166
  "((ppm))", "((ppt))"
@@ -160,16 +172,16 @@ RSpec.describe Metanorma::Standoc do
160
172
  ....
161
173
  INPUT
162
174
  output = <<~OUTPUT
163
- #{BLANK_HDR}
164
- <sections>
165
- <p id='_'>
166
- &#8220;ppt&#8221;,
175
+ #{BLANK_HDR}
176
+ <sections>
177
+ <p id='_'>“<strong>word</strong>”,</p>
178
+ <p id='_'>“<link target='http://example.com'/>”,</p>
179
+ <p id='_'>&#8220;ppt&#8221;,
167
180
  <index>
168
181
  <primary>ppt</primary>
169
182
  </index>
170
183
  </p>
171
- <p id='_'>
172
- &#8220;ppm&#8221;,
184
+ <p id='_'>&#8220;ppm&#8221;,
173
185
  <index>
174
186
  <primary>ppm</primary>
175
187
  </index>
@@ -178,12 +190,11 @@ RSpec.describe Metanorma::Standoc do
178
190
  <primary>ppt</primary>
179
191
  </index>
180
192
  </p>
181
- <p id='_'>
182
- &#8220;ppm
193
+ <p id='_'>&#8220;ppm
183
194
  <index>
184
195
  <primary>ppm</primary>
185
196
  </index>
186
- &#8220;&#160;
197
+ &#8221;&#160;
187
198
  </p>
188
199
  <figure id='_'>
189
200
  <pre id='_'>((ppm))",</pre>
@@ -3,6 +3,7 @@ require "relaton_iec"
3
3
  require "fileutils"
4
4
 
5
5
  RSpec.describe Metanorma::Standoc do
6
+ =begin
6
7
  it "processes term and designation metadata and term sources" do
7
8
  input = <<~INPUT
8
9
  #{ASCIIDOC_BLANK_HDR}
@@ -180,8 +181,9 @@ RSpec.describe Metanorma::Standoc do
180
181
  expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
181
182
  .to be_equivalent_to xmlpp(output)
182
183
  end
183
-
184
- it "permits multiple preferred terms, and treats them as synonyms in concepts" do
184
+ =end
185
+ it "permits multiple preferred terms and admitted terms, "\
186
+ "and treats them as synonyms in concepts" do
185
187
  input = <<~INPUT
186
188
  #{ASCIIDOC_BLANK_HDR}
187
189
  == Terms and Definitions
@@ -209,6 +211,9 @@ RSpec.describe Metanorma::Standoc do
209
211
  {{First Designation}}
210
212
 
211
213
  {{Second Designation}}
214
+
215
+ {{Third Designation}}
216
+
212
217
  INPUT
213
218
  output = <<~OUTPUT
214
219
  #{BLANK_HDR}
@@ -279,11 +284,18 @@ RSpec.describe Metanorma::Standoc do
279
284
  </p>
280
285
  <p id='_'>
281
286
  <concept>
282
- <refterm>Second Designation</refterm>
287
+ <refterm>First Designation</refterm>
283
288
  <renderterm>Second Designation</renderterm>
284
289
  <xref target='term-first-designation'/>
285
290
  </concept>
286
291
  </p>
292
+ <p id='_'>
293
+ <concept>
294
+ <refterm>First Designation</refterm>
295
+ <renderterm>Third Designation</renderterm>
296
+ <xref target='term-first-designation'/>
297
+ </concept>
298
+ </p>
287
299
  </clause>
288
300
  </sections>
289
301
  </standard-document>
@@ -1364,8 +1364,70 @@ RSpec.describe Metanorma::Standoc do
1364
1364
  embed::spec/assets/a1.adoc[]
1365
1365
  INPUT
1366
1366
  output = <<~OUTPUT
1367
- #{BLANK_HDR}
1368
- <sections>
1367
+ <standard-document xmlns='https://www.metanorma.org/ns/standoc' type='semantic' version='#{Metanorma::Standoc::VERSION}'>
1368
+ <bibdata type='standard'>
1369
+ <title language='en' format='text/plain'>Document title</title>
1370
+ <language>en</language>
1371
+ <script>Latn</script>
1372
+ <status>
1373
+ <stage>published</stage>
1374
+ </status>
1375
+ <copyright>
1376
+ <from>2022</from>
1377
+ </copyright>
1378
+ <ext>
1379
+ <doctype>article</doctype>
1380
+ </ext>
1381
+ <relation type='derivedFrom'>
1382
+ <bibitem>
1383
+ <title language='en' format='text/plain'>A2</title>
1384
+ <language>en</language>
1385
+ <script>Latn</script>
1386
+ <status>
1387
+ <stage>published</stage>
1388
+ </status>
1389
+ <copyright>
1390
+ <from>2022</from>
1391
+ </copyright>
1392
+ <ext>
1393
+ <doctype>article</doctype>
1394
+ </ext>
1395
+ <relation type='derivedFrom'>
1396
+ <bibitem>
1397
+ <title language='en' format='text/plain'>A3</title>
1398
+ <language>en</language>
1399
+ <script>Latn</script>
1400
+ <status>
1401
+ <stage>published</stage>
1402
+ </status>
1403
+ <copyright>
1404
+ <from>2022</from>
1405
+ </copyright>
1406
+ <ext>
1407
+ <doctype>article</doctype>
1408
+ </ext>
1409
+ </bibitem>
1410
+ </relation>
1411
+ <relation type='derivedFrom'>
1412
+ <bibitem>
1413
+ <title language='en' format='text/plain'>A3a</title>
1414
+ <language>en</language>
1415
+ <script>Latn</script>
1416
+ <status>
1417
+ <stage>published</stage>
1418
+ </status>
1419
+ <copyright>
1420
+ <from>2022</from>
1421
+ </copyright>
1422
+ <ext>
1423
+ <doctype>article</doctype>
1424
+ </ext>
1425
+ </bibitem>
1426
+ </relation>
1427
+ </bibitem>
1428
+ </relation>
1429
+ </bibdata>
1430
+ <sections>
1369
1431
  <clause id='clause1' inline-header='false' obligation='normative'>
1370
1432
  <title>Clause</title>
1371
1433
  </clause>
@@ -1381,6 +1443,10 @@ RSpec.describe Metanorma::Standoc do
1381
1443
  <title>Clause 3</title>
1382
1444
  <p id='_'>X</p>
1383
1445
  </clause>
1446
+ <clause id='_' inline-header='false' obligation='normative'>
1447
+ <title>Clause 3a</title>
1448
+ <p id='_'>X</p>
1449
+ </clause>
1384
1450
  <clause id='_' inline-header='false' obligation='normative'>
1385
1451
  <title>Clause 4</title>
1386
1452
  <p id='_'>X</p>
@@ -478,6 +478,114 @@ RSpec.describe Metanorma::Standoc do
478
478
  expect(File.exist?("test.xml")).to be false
479
479
  end
480
480
 
481
+ it "does not warn and abort if columns and rows not out of bounds" do
482
+ FileUtils.rm_f "test.xml"
483
+ FileUtils.rm_f "test.err"
484
+ begin
485
+ input = <<~INPUT
486
+ = Document title
487
+ Author
488
+ :docfile: test.adoc
489
+ :nodoc:
490
+
491
+ == Clause
492
+
493
+ [cols="1,1,1,1"]
494
+ |===
495
+ 3.2+| a | a
496
+
497
+ | a
498
+ | a | a | a | a
499
+ |===
500
+ INPUT
501
+ expect { Asciidoctor.convert(input, *OPTIONS) }.not_to raise_error(SystemExit)
502
+ rescue SystemExit
503
+ end
504
+ expect(File.read("test.err"))
505
+ .not_to include "Table exceeds maximum number of columns defined"
506
+ expect(File.read("test.err"))
507
+ .not_to include "Table rows in table are inconsistent: check rowspan"
508
+ end
509
+
510
+ xit "warns and aborts if columns out of bounds against colgroup" do
511
+ FileUtils.rm_f "test.xml"
512
+ FileUtils.rm_f "test.err"
513
+ begin
514
+ input = <<~INPUT
515
+ = Document title
516
+ Author
517
+ :docfile: test.adoc
518
+ :nodoc:
519
+
520
+ [cols="1,1,1,1"]
521
+ |===
522
+ 5+| a
523
+
524
+ | a 4+| a
525
+ | a | a |a |a
526
+ |===
527
+ INPUT
528
+ expect { Asciidoctor.convert(input, *OPTIONS) }.to raise_error(SystemExit)
529
+ rescue SystemExit
530
+ end
531
+ expect(File.read("test.err"))
532
+ .to include "Table exceeds maximum number of columns defined (4)"
533
+ expect(File.read("test.err"))
534
+ .not_to include "Table rows in table are inconsistent: check rowspan"
535
+ end
536
+
537
+ xit "warns and aborts if columns out of bounds against cell count per row" do
538
+ FileUtils.rm_f "test.xml"
539
+ FileUtils.rm_f "test.err"
540
+ begin
541
+ input = <<~INPUT
542
+ = Document title
543
+ Author
544
+ :docfile: test.adoc
545
+ :nodoc:
546
+
547
+ |===
548
+ 2.3+| a | a
549
+
550
+ | a | a | a
551
+ | a | a | a
552
+ |===
553
+ INPUT
554
+ expect { Asciidoctor.convert(input, *OPTIONS) }.to raise_error(SystemExit)
555
+ rescue SystemExit
556
+ end
557
+ expect(File.read("test.err"))
558
+ .to include "Table exceeds maximum number of columns defined (3)"
559
+ expect(File.read("test.err"))
560
+ .not_to include "Table rows in table are inconsistent: check rowspan"
561
+ end
562
+
563
+ it "warns and aborts if rows out of bounds" do
564
+ FileUtils.rm_f "test.xml"
565
+ FileUtils.rm_f "test.err"
566
+ begin
567
+ input = <<~INPUT
568
+ = Document title
569
+ Author
570
+ :docfile: test.adoc
571
+ :nodoc:
572
+
573
+ |===
574
+ .4+| a | a | a | a
575
+
576
+ | a | a | a
577
+ | a | a | a
578
+ |===
579
+ INPUT
580
+ expect { Asciidoctor.convert(input, *OPTIONS) }.to raise_error(SystemExit)
581
+ rescue SystemExit
582
+ end
583
+ expect(File.read("test.err"))
584
+ .not_to include "Table exceeds maximum number of columns defined"
585
+ expect(File.read("test.err"))
586
+ .to include "Table rows in table are inconsistent: check rowspan"
587
+ end
588
+
481
589
  it "err file succesfully created for docfile path" do
482
590
  FileUtils.rm_rf "test"
483
591
  FileUtils.mkdir_p "test"
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.0.4
4
+ version: 2.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-07 00:00:00.000000000 Z
11
+ date: 2022-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor
@@ -56,16 +56,16 @@ dependencies:
56
56
  name: metanorma-plugin-datastruct
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: 0.2.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: 0.2.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: metanorma-plugin-lutaml
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -352,14 +352,14 @@ dependencies:
352
352
  requirements:
353
353
  - - "~>"
354
354
  - !ruby/object:Gem::Version
355
- version: 5.0.0
355
+ version: 6.1.0
356
356
  type: :development
357
357
  prerelease: false
358
358
  version_requirements: !ruby/object:Gem::Requirement
359
359
  requirements:
360
360
  - - "~>"
361
361
  - !ruby/object:Gem::Version
362
- version: 5.0.0
362
+ version: 6.1.0
363
363
  - !ruby/object:Gem::Dependency
364
364
  name: webmock
365
365
  requirement: !ruby/object:Gem::Requirement
@@ -518,6 +518,7 @@ files:
518
518
  - spec/assets/a1.adoc
519
519
  - spec/assets/a2.adoc
520
520
  - spec/assets/a3.adoc
521
+ - spec/assets/a3a.adoc
521
522
  - spec/assets/a4.adoc
522
523
  - spec/assets/boilerplate.xml
523
524
  - spec/assets/codes.yml
@@ -643,7 +644,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
643
644
  - !ruby/object:Gem::Version
644
645
  version: '0'
645
646
  requirements: []
646
- rubygems_version: 3.2.32
647
+ rubygems_version: 3.3.9
647
648
  signing_key:
648
649
  specification_version: 4
649
650
  summary: metanorma-standoc realises standards following the Metanorma standoc model