metanorma-standoc 2.4.5 → 2.4.7

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: 8989224ddc5bb169f13c102066f005b7c72e0d6ff0cd7a2c2122ef57ed7f6923
4
- data.tar.gz: ff257fb02f7feb16d680f111ae39c8806abaff034e087659586bbd43bc34a6e5
3
+ metadata.gz: 66a2d55d6c29842acb1b636afe7cf434c1769692a4b81ddee42fe77abf706f2a
4
+ data.tar.gz: 77cc311b6679b34314274cb136807747a2e029eb7ced3bdd5830c16732a15d28
5
5
  SHA512:
6
- metadata.gz: 837c2c91f59f93374b747c23b71f5740b1e64d0e29e06d8e7e4076bb7c0ce24700b29b17434ece743d1e1fbcd7b6fa5b245526207525f2b6cbfb6c5a2be6dd29
7
- data.tar.gz: ab6f75ce5add0b40f99d47a47b123ccfc090291b5e6adb4f1c41687e541f53f111dff9fecb6c6ecb46ff5aeaee8ad0af97bd444da8f9b00525b210fa8c1d7430
6
+ metadata.gz: c65b3f99e33a4ad4452b05cc3c0d6c9e545179d50bc5e6bf8ff8a718287a3dfa2b344c233c7fb3adf1c95835aa0370910740b0262c8266f26dd9b8920ea074bc
7
+ data.tar.gz: 347dbf45508a7ab22323e24ba46abc08c1c4f1d091b17823fe941d844726774b85c0fa9c82a8399c08ac763fbb6d2cf5bb3e5e9f554e21d6e2a3e0abf39dc7e4
@@ -73,6 +73,8 @@ module Metanorma
73
73
  @sourcecode_markup_start = node.attr("sourcecode-markup-start") || "{{{"
74
74
  @sourcecode_markup_end = node.attr("sourcecode-markup-end") || "}}}"
75
75
  @datauriimage = node.attr("data-uri-image") != "false"
76
+ @blockunnumbered = (node.attr("block-unnumbered") || "").split(",")
77
+ .map(&:strip)
76
78
  end
77
79
 
78
80
  def init_reqt(node)
@@ -38,7 +38,7 @@ module Metanorma
38
38
 
39
39
  def todo_attrs(node)
40
40
  date = node.attr("date") || Date.today.iso8601.gsub(/\+.*$/, "")
41
- date += "T00:00:00Z" unless /T/.match? date
41
+ date += "T00:00:00Z" unless date.include?("T")
42
42
  attr_code(id_attr(node)
43
43
  .merge(reviewer: node.attr("reviewer") || node.attr("source") ||
44
44
  "(Unknown)",
@@ -7,6 +7,7 @@ require_relative "./cleanup_footnotes"
7
7
  require_relative "./cleanup_ref"
8
8
  require_relative "./cleanup_asciibib"
9
9
  require_relative "./cleanup_boilerplate"
10
+ require_relative "./cleanup_bibdata"
10
11
  require_relative "./cleanup_section"
11
12
  require_relative "./cleanup_terms"
12
13
  require_relative "./cleanup_symbols"
@@ -26,6 +27,8 @@ module Metanorma
26
27
  def cleanup(xmldoc)
27
28
  element_name_cleanup(xmldoc)
28
29
  passthrough_cleanup(xmldoc)
30
+ unnumbered_blocks_cleanup(xmldoc)
31
+ metadata_cleanup(xmldoc) # feeds: boilerplate_cleanup
29
32
  sections_cleanup(xmldoc) # feeds: obligations_cleanup, toc_cleanup,
30
33
  # floatingtitle_cleanup
31
34
  obligations_cleanup(xmldoc)
@@ -70,7 +73,6 @@ module Metanorma
70
73
  svgmap_cleanup(xmldoc) # feeds: img_cleanup
71
74
  boilerplate_cleanup(xmldoc)
72
75
  toc_cleanup(xmldoc)
73
- metadata_cleanup(xmldoc)
74
76
  smartquotes_cleanup(xmldoc)
75
77
  variant_cleanup(xmldoc)
76
78
  para_cleanup(xmldoc)
@@ -0,0 +1,127 @@
1
+ module Metanorma
2
+ module Standoc
3
+ module Cleanup
4
+ def bibdata_cleanup(xmldoc)
5
+ bibdata_anchor_cleanup(xmldoc)
6
+ bibdata_docidentifier_cleanup(xmldoc)
7
+ bibdata_embed_hdr_cleanup(xmldoc) # feeds bibdata_embed_id_cleanup
8
+ bibdata_embed_id_cleanup(xmldoc)
9
+ biblio_indirect_erefs(xmldoc, @internal_eref_namespaces&.uniq)
10
+ end
11
+
12
+ def bibdata_anchor_cleanup(xmldoc)
13
+ xmldoc.xpath("//bibdata//bibitem | //bibdata//note").each do |b|
14
+ b.delete("id")
15
+ end
16
+ end
17
+
18
+ def bibdata_docidentifier_cleanup(xmldoc)
19
+ ins = xmldoc.at("//bibdata/docidentifier")
20
+ xmldoc.xpath("//bibdata/docidentifier").each_with_index do |b, i|
21
+ i.zero? and next
22
+ ins.next = b.remove
23
+ ins = ins.next
24
+ end
25
+ end
26
+
27
+ def gather_indirect_erefs(xmldoc, prefix)
28
+ xmldoc.xpath("//eref[@type = '#{prefix}']")
29
+ .each_with_object({}) do |e, m|
30
+ e.delete("type")
31
+ m[e["bibitemid"]] = true
32
+ end.keys
33
+ end
34
+
35
+ def insert_indirect_biblio(xmldoc, refs, prefix)
36
+ i = xmldoc.at("bibliography") or
37
+ xmldoc.root << "<bibliography/>" and i = xmldoc.at("bibliography")
38
+ i = i.add_child("<references hidden='true' normative='false'/>").first
39
+ refs.each do |x|
40
+ i << <<~BIB
41
+ <bibitem id="#{x}" type="internal">
42
+ <docidentifier type="repository">#{x.sub(/^#{prefix}_/, "#{prefix}/")}</docidentifier>
43
+ </bibitem>
44
+ BIB
45
+ end
46
+ end
47
+
48
+ def indirect_eref_to_xref(eref, ident)
49
+ loc = eref.at("./localityStack[locality[@type = 'anchor']]")
50
+ &.remove&.text ||
51
+ eref.at("./locality[@type = 'anchor']")&.remove&.text || ident
52
+ eref.name = "xref"
53
+ eref.delete("bibitemid")
54
+ eref.delete("citeas")
55
+ eref["target"] = loc
56
+ unless eref.document.at("//*[@id = '#{loc}']")
57
+ eref.children = %(** Missing target #{loc})
58
+ eref["target"] = ident
59
+ end
60
+ end
61
+
62
+ def resolve_local_indirect_erefs(xmldoc, refs, prefix)
63
+ refs.each_with_object([]) do |r, m|
64
+ id = r.sub(/^#{prefix}_/, "")
65
+ n = xmldoc.at("//*[@id = '#{id}']")
66
+ if n&.at("./ancestor-or-self::*[@type = '#{prefix}']")
67
+ xmldoc.xpath("//eref[@bibitemid = '#{r}']").each do |e|
68
+ indirect_eref_to_xref(e, id)
69
+ end
70
+ else m << r
71
+ end
72
+ end
73
+ end
74
+
75
+ def biblio_indirect_erefs(xmldoc, prefixes)
76
+ prefixes&.each do |prefix|
77
+ refs = gather_indirect_erefs(xmldoc, prefix)
78
+ refs = resolve_local_indirect_erefs(xmldoc, refs, prefix)
79
+ refs.empty? and next
80
+ insert_indirect_biblio(xmldoc, refs, prefix)
81
+ end
82
+ end
83
+
84
+ def bibdata_embed_hdr_cleanup(xmldoc)
85
+ (@embed_hdr.nil? || @embed_hdr.empty?) and return
86
+ xmldoc.at("//bibdata") << "<relation type='derivedFrom'>" \
87
+ "#{hdr2bibitem(@embed_hdr.first)}</relation>"
88
+ end
89
+
90
+ def hdr2bibitem(hdr)
91
+ xml = Asciidoctor
92
+ .convert(hdr[:text], backend: hdr2bibitem_type(hdr),
93
+ header_footer: true)
94
+ b = Nokogiri::XML(xml).at("//xmlns:bibdata")
95
+ b.name = "bibitem"
96
+ b.delete("type")
97
+ embed_recurse(b, hdr)
98
+ b.to_xml
99
+ end
100
+
101
+ def hdr2bibitem_type(hdr)
102
+ m = /:mn-document-class: (\S+)/.match(hdr[:text])
103
+ if m then m[1].to_sym
104
+ else Processor.new.asciidoctor_backend
105
+ end
106
+ end
107
+
108
+ def embed_recurse(bibitem, node)
109
+ node[:child].map { |x| hdr2bibitem(x) }.each do |x|
110
+ bibitem << "<relation type='derivedFrom'>#{x}</relation>"
111
+ end
112
+ end
113
+
114
+ def bibdata_embed_id_cleanup(xmldoc)
115
+ @embed_id.nil? and return
116
+ bibdata = xmldoc.at("//bibdata")
117
+ @embed_id.each do |d|
118
+ bibdata = bibdata.at("./relation[@type = 'derivedFrom']/bibitem")
119
+ ident = bibdata.at("./docidentifier[@primary = 'true']") ||
120
+ bibdata.at("./docidentifier")
121
+ xmldoc.xpath("//xref[@target = '#{d}'][normalize-space(text()) = '']")
122
+ .each { |x| x << ident.text }
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -12,6 +12,7 @@ module Metanorma
12
12
  "ancestor::table or ancestor::bibdata)]"].each do |w|
13
13
  inject_id(xmldoc, w)
14
14
  end
15
+ xmldoc.xpath("//p[not(text()) and not(node())]").each(&:remove)
15
16
  end
16
17
 
17
18
  def inject_id(xmldoc, path)
@@ -67,11 +68,10 @@ module Metanorma
67
68
  # examples containing only figures become subfigures of figures
68
69
  def subfigure_cleanup(xmldoc)
69
70
  xmldoc.xpath("//example[figure]").each do |e|
70
- next unless e.elements.reject do |m|
71
+ e.elements.reject do |m|
71
72
  %w(name figure index note).include?(m.name) ||
72
73
  (m.name == "dl" && m["key"] == "true")
73
- end.empty?
74
-
74
+ end.empty? or next
75
75
  e.name = "figure"
76
76
  end
77
77
  end
@@ -100,8 +100,7 @@ module Metanorma
100
100
  # (so there was no way of making that block include the note)
101
101
  def note_cleanup(xmldoc)
102
102
  xmldoc.xpath("//note").each do |n|
103
- next if n["keep-separate"] == "true" || !n.ancestors("table").empty?
104
-
103
+ n["keep-separate"] == "true" || !n.ancestors("table").empty? and next
105
104
  prev = n.previous_element || next
106
105
  n.parent = prev if ELEMS_ALLOW_NOTES.include? prev.name
107
106
  end
@@ -129,7 +128,7 @@ module Metanorma
129
128
 
130
129
  def merge_annotations_into_sourcecode(xmldoc)
131
130
  xmldoc.xpath("//sourcecode").each do |x|
132
- while x&.next_element&.name == "annotation"
131
+ while x.next_element&.name == "annotation"
133
132
  x.next_element.parent = x
134
133
  end
135
134
  end
@@ -143,10 +142,8 @@ module Metanorma
143
142
  def sourcecode_cleanup(xmldoc)
144
143
  xmldoc.xpath("//sourcecode").each do |x|
145
144
  x.traverse do |n|
146
- next unless n.text?
147
- next unless /#{Regexp.escape(@sourcecode_markup_start)}/
148
- .match?(n.text)
149
-
145
+ n.text? or next
146
+ /#{Regexp.escape(@sourcecode_markup_start)}/.match?(n.text) or next
150
147
  n.replace(sourcecode_markup(n))
151
148
  end
152
149
  end
@@ -164,8 +161,7 @@ module Metanorma
164
161
  #{Regexp.escape(@sourcecode_markup_end)})/x)
165
162
  .each_slice(4).map.with_object([]) do |a, acc|
166
163
  acc << safe_noko(a[0], node.document)
167
- next unless a.size == 4
168
-
164
+ a.size == 4 or next
169
165
  acc << Asciidoctor.convert(
170
166
  a[2], doctype: :inline, backend: (self&.backend&.to_sym || :standoc)
171
167
  )
@@ -174,7 +170,7 @@ module Metanorma
174
170
 
175
171
  def form_cleanup(xmldoc)
176
172
  xmldoc.xpath("//select").each do |s|
177
- while s&.next_element&.name == "option"
173
+ while s.next_element&.name == "option"
178
174
  s << s.next_element
179
175
  end
180
176
  end
@@ -200,8 +196,7 @@ module Metanorma
200
196
  end
201
197
 
202
198
  def include_indexterm?(elem)
203
- return false if elem.nil?
204
-
199
+ elem.nil? and return false
205
200
  !%w(image literal sourcecode).include?(elem.name)
206
201
  end
207
202
 
@@ -234,6 +229,14 @@ module Metanorma
234
229
  s.delete("type")
235
230
  end
236
231
  end
232
+
233
+ def unnumbered_blocks_cleanup(xmldoc)
234
+ @blockunnumbered&.each do |b|
235
+ xmldoc.xpath("//#{b}").each do |e|
236
+ e["unnumbered"] ||= "true"
237
+ end
238
+ end
239
+ end
237
240
  end
238
241
  end
239
242
  end
@@ -118,132 +118,58 @@ module Metanorma
118
118
  end
119
119
 
120
120
  def boilerplate(xml, conv)
121
+ # prevent infinite recursion of asciidoc boilerplate processing
122
+ xml.at("//metanorma-extension/semantic-metadata/" \
123
+ "headless[text() = 'true']") and return nil
121
124
  file = boilerplate_file(xml)
122
- @boilerplateauthority and
123
- file = File.join(@localdir, @boilerplateauthority)
125
+ @boilerplateauthority and file = File.join(@localdir,
126
+ @boilerplateauthority)
124
127
  (!file.nil? and File.exist?(file)) or return
125
- conv.populate_template(File.read(file, encoding: "UTF-8"), nil)
126
- end
127
-
128
- def bibdata_cleanup(xmldoc)
129
- bibdata_anchor_cleanup(xmldoc)
130
- bibdata_docidentifier_cleanup(xmldoc)
131
- bibdata_embed_hdr_cleanup(xmldoc) # feeds bibdata_embed_id_cleanup
132
- bibdata_embed_id_cleanup(xmldoc)
133
- biblio_indirect_erefs(xmldoc, @internal_eref_namespaces&.uniq)
134
- end
135
-
136
- def bibdata_anchor_cleanup(xmldoc)
137
- xmldoc.xpath("//bibdata//bibitem | //bibdata//note").each do |b|
138
- b.delete("id")
139
- end
140
- end
141
-
142
- def bibdata_docidentifier_cleanup(xmldoc)
143
- ins = xmldoc.at("//bibdata/docidentifier")
144
- xmldoc.xpath("//bibdata/docidentifier").each_with_index do |b, i|
145
- i.zero? and next
146
- ins.next = b.remove
147
- ins = ins.next
148
- end
149
- end
150
-
151
- def gather_indirect_erefs(xmldoc, prefix)
152
- xmldoc.xpath("//eref[@type = '#{prefix}']")
153
- .each_with_object({}) do |e, m|
154
- e.delete("type")
155
- m[e["bibitemid"]] = true
156
- end.keys
157
- end
158
-
159
- def insert_indirect_biblio(xmldoc, refs, prefix)
160
- i = xmldoc.at("bibliography") or
161
- xmldoc.root << "<bibliography/>" and i = xmldoc.at("bibliography")
162
- i = i.add_child("<references hidden='true' normative='false'/>").first
163
- refs.each do |x|
164
- i << <<~BIB
165
- <bibitem id="#{x}" type="internal">
166
- <docidentifier type="repository">#{x.sub(/^#{prefix}_/, "#{prefix}/")}</docidentifier>
167
- </bibitem>
168
- BIB
169
- end
170
- end
171
-
172
- def indirect_eref_to_xref(eref, ident)
173
- loc = eref.at("./localityStack[locality[@type = 'anchor']]")
174
- &.remove&.text ||
175
- eref.at("./locality[@type = 'anchor']")&.remove&.text || ident
176
- eref.name = "xref"
177
- eref.delete("bibitemid")
178
- eref.delete("citeas")
179
- eref["target"] = loc
180
- unless eref.document.at("//*[@id = '#{loc}']")
181
- eref.children = %(** Missing target #{loc})
182
- eref["target"] = ident
183
- end
184
- end
185
-
186
- def resolve_local_indirect_erefs(xmldoc, refs, prefix)
187
- refs.each_with_object([]) do |r, m|
188
- id = r.sub(/^#{prefix}_/, "")
189
- n = xmldoc.at("//*[@id = '#{id}']")
190
- if n&.at("./ancestor-or-self::*[@type = '#{prefix}']")
191
- xmldoc.xpath("//eref[@bibitemid = '#{r}']").each do |e|
192
- indirect_eref_to_xref(e, id)
193
- end
194
- else m << r
195
- end
196
- end
197
- end
198
-
199
- def biblio_indirect_erefs(xmldoc, prefixes)
200
- prefixes&.each do |prefix|
201
- refs = gather_indirect_erefs(xmldoc, prefix)
202
- refs = resolve_local_indirect_erefs(xmldoc, refs, prefix)
203
- refs.empty? and next
204
- insert_indirect_biblio(xmldoc, refs, prefix)
205
- end
206
- end
207
-
208
- def bibdata_embed_hdr_cleanup(xmldoc)
209
- (@embed_hdr.nil? || @embed_hdr.empty?) and return
210
- xmldoc.at("//bibdata") << "<relation type='derivedFrom'>" \
211
- "#{hdr2bibitem(@embed_hdr.first)}</relation>"
212
- end
213
-
214
- def hdr2bibitem(hdr)
215
- xml = Asciidoctor
216
- .convert(hdr[:text], backend: hdr2bibitem_type(hdr),
217
- header_footer: true)
218
- b = Nokogiri::XML(xml).at("//xmlns:bibdata")
219
- b.name = "bibitem"
220
- b.delete("type")
221
- embed_recurse(b, hdr)
222
- b.to_xml
223
- end
224
-
225
- def hdr2bibitem_type(hdr)
226
- m = /:mn-document-class: (\S+)/.match(hdr[:text])
227
- if m then m[1].to_sym
228
- else Processor.new.asciidoctor_backend
229
- end
230
- end
231
-
232
- def embed_recurse(bibitem, node)
233
- node[:child].map { |x| hdr2bibitem(x) }.each do |x|
234
- bibitem << "<relation type='derivedFrom'>#{x}</relation>"
128
+ b = conv.populate_template(boilerplate_read(file), nil)
129
+ boilerplate_file_convert(b)
130
+ end
131
+
132
+ def boilerplate_read(file)
133
+ ret = File.read(file, encoding: "UTF-8")
134
+ /\.adoc$/.match?(file) and
135
+ ret.gsub!(/(?<!\{)(\{\{[^{}]+\}\})(?!\})/, "pass:[\\1]")
136
+ ret
137
+ end
138
+
139
+ # If Asciidoctor, convert top clauses to tags and wrap in <boilerplate>
140
+ def boilerplate_file_convert(file)
141
+ Nokogiri::XML(file).root and return file
142
+ to_xml(boilerplate_file_restructure(file))
143
+ end
144
+
145
+ # If Asciidoctor, convert top clauses to tags and wrap in <boilerplate>
146
+ def boilerplate_file_restructure(file)
147
+ ret = adoc2xml(file, backend.to_sym)
148
+ boilerplate_xml_cleanup(ret)
149
+ ret.name = "boilerplate"
150
+ boilerplate_top_elements(ret)
151
+ ret
152
+ end
153
+
154
+ # remove Metanorma namespace, so generated doc containing boilerplate
155
+ # can be queried consistently
156
+ # _\d+ anchor is assigned to titleless clauses, will clash with main doc
157
+ # instances of same
158
+ def boilerplate_xml_cleanup(xml)
159
+ ns = xml.namespace.href
160
+ xml.traverse do |n|
161
+ n.element? or next
162
+ n.namespace.href == ns and n.namespace = nil
163
+ /^_\d+$/.match?(n["id"]) and
164
+ n["id"] = "_#{UUIDTools::UUID.random_create}"
235
165
  end
236
166
  end
237
167
 
238
- def bibdata_embed_id_cleanup(xmldoc)
239
- @embed_id.nil? and return
240
- bibdata = xmldoc.at("//bibdata")
241
- @embed_id.each do |d|
242
- bibdata = bibdata.at("./relation[@type = 'derivedFrom']/bibitem")
243
- ident = bibdata.at("./docidentifier[@primary = 'true']") ||
244
- bibdata.at("./docidentifier")
245
- xmldoc.xpath("//xref[@target = '#{d}'][normalize-space(text()) = '']")
246
- .each { |x| x << ident.text }
168
+ def boilerplate_top_elements(xml)
169
+ xml.elements.each do |e|
170
+ (t = e.at("./title") and /-statement$/.match?(t.text)) or next
171
+ e.name = t.remove.text
172
+ e.keys.each { |a| e.delete(a) } # rubocop:disable Style/HashEachMethods
247
173
  end
248
174
  end
249
175
  end
@@ -5,7 +5,7 @@ module Metanorma
5
5
  class Processor < Metanorma::Processor
6
6
  class << self
7
7
  attr_reader :asciidoctor_backend
8
- end
8
+ end
9
9
 
10
10
  def initialize # rubocop:disable Lint/MissingSuper
11
11
  @short = :standoc
@@ -22,7 +22,7 @@ module Metanorma
22
22
  end
23
23
 
24
24
  def version
25
- "Metanorma::Standoc #{Metanorma::Standoc::VERSION}/"\
25
+ "Metanorma::Standoc #{Metanorma::Standoc::VERSION}/" \
26
26
  "IsoDoc #{IsoDoc::VERSION}"
27
27
  end
28
28
 
@@ -35,7 +35,7 @@ module Metanorma
35
35
 
36
36
  xml_table.colgroup do |cg|
37
37
  node.columns.each do |col|
38
- cg.col **{ width: "#{col.attr 'colpcwidth'}%" }
38
+ cg.col width: "#{col.attr 'colpcwidth'}%"
39
39
  end
40
40
  end
41
41
  end
@@ -76,6 +76,17 @@ module Metanorma
76
76
  .gsub(/&apos;/, "'")
77
77
  end
78
78
 
79
+ # wrapped in <sections>
80
+ def adoc2xml(text, flavour)
81
+ Nokogiri::XML(text).root and return text
82
+ c = Asciidoctor.convert("= X\nA\n:semantic-metadata-headless: true\n" \
83
+ ":novalid:\n\n#{text}\n",
84
+ backend: flavour, header_footer: true)
85
+ Nokogiri::XML(c).at("//xmlns:sections")
86
+ end
87
+
88
+ module_function :adoc2xml
89
+
79
90
  class EmptyAttr
80
91
  def attr(_any_attribute)
81
92
  nil
@@ -19,6 +19,6 @@ module Metanorma
19
19
  end
20
20
 
21
21
  module Standoc
22
- VERSION = "2.4.5".freeze
22
+ VERSION = "2.4.7".freeze
23
23
  end
24
24
  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.4.5
4
+ version: 2.4.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-06-05 00:00:00.000000000 Z
11
+ date: 2023-06-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor
@@ -475,6 +475,7 @@ files:
475
475
  - lib/metanorma/standoc/cleanup.rb
476
476
  - lib/metanorma/standoc/cleanup_amend.rb
477
477
  - lib/metanorma/standoc/cleanup_asciibib.rb
478
+ - lib/metanorma/standoc/cleanup_bibdata.rb
478
479
  - lib/metanorma/standoc/cleanup_block.rb
479
480
  - lib/metanorma/standoc/cleanup_boilerplate.rb
480
481
  - lib/metanorma/standoc/cleanup_footnotes.rb