metanorma-standoc 2.8.4 → 2.8.6

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: 77911b09eea6861ff4b3614ba4de12829fd8955161d1aa8b8e917778ed9d3ac4
4
- data.tar.gz: 11c749162a35a458a4cfa4c963a68a6e24f535c1fc4e943599966459612078ca
3
+ metadata.gz: 26ef7eeadddd66ca86125ae72f91a3e920057ad5ed1e8f0e1e5670f831355d0b
4
+ data.tar.gz: e1d1e42f6d4962d11ab86421fec3fc2877480e33fdac9aabcc4bd478fd3cc2df
5
5
  SHA512:
6
- metadata.gz: 24a4fb2005f50f620eaba63e869c86939066445938c74ea3c6df18c6b7a18f7d42cf1997b0ae50dd4adbe7d6bd03f2b4bec6270fb9f41676d4e94e97626160da
7
- data.tar.gz: 5cb4f03fa198dd33054e7e81cbc8de074b8cd05a73cee3de4e68ec7e596db08ae17d46c2b1dd8837e2959789f9cfbf80c5ba00e1cc2709c30b26703a052eef3e
6
+ metadata.gz: 4a014a7cbc4f3665f07322713d0edad6dbd42301eb3b0e548a78efd116f7c6da4b7359db4f26e3cbc50315cdbdad99169997493fa792000b6f36e63c49c8ace1
7
+ data.tar.gz: 25f39be9f0df10ecdfaea29ecdf2e1cf8a50789f80fce1cf6fa71cd23beb1a69f6b890e2ca69527bc486091631281cce5926f3b3ec743bdbbfb24b9c7d195264
@@ -31,10 +31,11 @@ module Metanorma
31
31
 
32
32
  def inline_anchor_xref_attrs(node)
33
33
  text = concatenate_attributes_to_xref_text(node)
34
- m = inline_anchor_xref_match(text)
35
34
  t = node.target.gsub(/^#/, "").gsub(%r{(\.xml|\.adoc)(#.*$)}, "\\2")
36
- m.nil? and return { target: t, type: "inline", text: text }
37
- inline_anchor_xref_attrs1(m, t, text)
35
+ attrs, text = inline_anchor_xref_match(text)
36
+ attrs.empty? and
37
+ return { target: t, type: "inline", text: text, style: @xrefstyle }
38
+ inline_anchor_xref_attrs1(attrs, t, text)
38
39
  end
39
40
 
40
41
  def concatenate_attributes_to_xref_text(node)
@@ -44,20 +45,29 @@ module Metanorma
44
45
  end.map { |x| x.sub(/%+/, "%") }.join + (node.text || "")
45
46
  end
46
47
 
47
- def inline_anchor_xref_attrs1(match, target, text)
48
- { target: target, hidden: match[:hidden],
49
- type: match[:fn].nil? ? "inline" : "footnote",
50
- case: match[:case]&.sub(/%$/, ""),
51
- style: match[:style] || @xrefstyle,
52
- droploc: match[:drop].nil? && match[:drop2].nil? ? nil : true,
53
- text: inline_anchor_xref_text(match, text) }
48
+ def inline_anchor_xref_attrs1(attrs, target, text)
49
+ { target: target, hidden: attrs["hidden"],
50
+ type: attrs.key?("fn") ? "footnote" : "inline",
51
+ case: %w(capital lowercase).detect { |x| attrs.key?(x) },
52
+ label: attrs["label"],
53
+ style: attrs["style"] || @xrefstyle,
54
+ droploc: attrs.key?("droploc") ? true : nil,
55
+ text: text }.compact
54
56
  end
55
57
 
58
+ XREF_ATTRS = "hidden|style|droploc|capital|lowercase|label".freeze
59
+
56
60
  def inline_anchor_xref_match(text)
57
- /^(?:hidden%(?<hidden>[^,]+),?)?
58
- (?:style=(?<style>[^%]+)%)?
59
- (?<drop>droploc%)?(?<case>capital%|lowercase%)?(?<drop2>droploc%)?
60
- (?<fn>fn:?\s*)?(?<text>.*)$/x.match text
61
+ attrs = {}
62
+ while m = /^(#{XREF_ATTRS})(=[^%]+)?%(.*)$/o.match(text)
63
+ text = m[3]
64
+ attrs[m[1]] = m[2]&.sub(/^=/, "")
65
+ end
66
+ if m = /^(fn:?\s*)(\S.*)?$/.match(text)
67
+ text = m[2]
68
+ attrs["fn"] = ""
69
+ end
70
+ [attrs, text]
61
71
  end
62
72
 
63
73
  def inline_anchor_xref_text(match, text)
@@ -8,6 +8,7 @@ require "fileutils"
8
8
  require "metanorma-utils"
9
9
  require_relative "render"
10
10
  require_relative "localbib"
11
+ require_relative "init"
11
12
  require "mn-requirements"
12
13
 
13
14
  module Metanorma
@@ -27,115 +28,6 @@ module Metanorma
27
28
  self.class::XML_NAMESPACE
28
29
  end
29
30
 
30
- def init(node)
31
- init_vars
32
- init_misc(node)
33
- init_processing(node)
34
- init_reqt(node)
35
- init_toc(node)
36
- init_output(node) # feeds init_biblio
37
- init_i18n(node)
38
- init_biblio(node)
39
- @metadata_attrs = metadata_attrs(node)
40
- end
41
-
42
- def init_vars
43
- @fn_number ||= 0
44
- @refids = Set.new
45
- @anchor_alias = {}
46
- @anchors = {}
47
- @internal_eref_namespaces = []
48
- @seen_headers = []
49
- @seen_headers_canonical = []
50
- @embed_hdr = []
51
- @reqt_model = nil
52
- @preface = true
53
- end
54
-
55
- def init_misc(node)
56
- @doctype = doctype(node)
57
- @draft = node.attributes.has_key?("draft")
58
- @index_terms = node.attr("index-terms")
59
- @boilerplateauthority = node.attr("boilerplate-authority")
60
- @embed_hdr = node.attr("embed_hdr")
61
- @embed_id = node.attr("embed_id")
62
- @document_scheme = node.attr("document-scheme")
63
- @xrefstyle = node.attr("xrefstyle")
64
- @source_linenums = node.attr("source-linenums-option") == "true"
65
- end
66
-
67
- def init_processing(node)
68
- @novalid = node.attr("novalid")
69
- @smartquotes = node.attr("smartquotes") != "false"
70
- @keepasciimath = node.attr("mn-keep-asciimath") &&
71
- node.attr("mn-keep-asciimath") != "false"
72
- @sourcecode_markup_start = node.attr("sourcecode-markup-start") || "{{{"
73
- @sourcecode_markup_end = node.attr("sourcecode-markup-end") || "}}}"
74
- @datauriimage = node.attr("data-uri-image") != "false"
75
- @blockunnumbered = (node.attr("block-unnumbered") || "").split(",")
76
- .map(&:strip)
77
- end
78
-
79
- def init_reqt(node)
80
- @default_requirement_model = node.attr("requirements-model") ||
81
- default_requirement_model
82
- @reqt_models = requirements_processor
83
- .new({ default: @default_requirement_model })
84
- end
85
-
86
- def init_toc(node)
87
- @htmltoclevels = node.attr("toclevels-html") ||
88
- node.attr("htmltoclevels") ||
89
- node.attr("toclevels") || toc_default[:html_levels]
90
- @doctoclevels = node.attr("toclevels-doc") ||
91
- node.attr("doctoclevels") || node.attr("toclevels") ||
92
- toc_default[:word_levels]
93
- @pdftoclevels = node.attr("toclevels-pdf") ||
94
- node.attr("toclevels") || toc_default[:pdf_levels]
95
- @toclevels = node.attr("toclevels") || toc_default[:html_levels]
96
- @tocfigures = node.attr("toc-figures")
97
- @toctables = node.attr("toc-tables")
98
- @tocrecommendations = node.attr("toc-recommendations")
99
- end
100
-
101
- def toc_default
102
- { word_levels: 2, html_levels: 2, pdf_levels: 2 }
103
- end
104
-
105
- def init_output(node)
106
- @fontheader = default_fonts(node)
107
- @files_to_delete = []
108
- @filename = if node.attr("docfile")
109
- File.basename(node.attr("docfile"))&.gsub(/\.adoc$/, "")
110
- else ""
111
- end
112
- @localdir = Metanorma::Utils::localdir(node)
113
- @output_dir = outputdir node
114
- end
115
-
116
- def init_i18n(node)
117
- @lang = node.attr("language") || "en"
118
- @script = node.attr("script") ||
119
- Metanorma::Utils.default_script(node.attr("language"))
120
- @locale = node.attr("locale")
121
- @isodoc = isodoc(@lang, @script, @locale, node.attr("i18nyaml"))
122
- @i18n = @isodoc.i18n
123
- end
124
-
125
- def init_biblio(node)
126
- @no_isobib_cache = node.attr("no-isobib-cache")
127
- @no_isobib = node.attr("no-isobib")
128
- @bibdb = nil
129
- init_bib_caches(node)
130
- init_iev_caches(node)
131
- @local_bibdb =
132
- ::Metanorma::Standoc::LocalBiblio.new(node, @localdir, self)
133
- end
134
-
135
- def requirements_processor
136
- Metanorma::Requirements
137
- end
138
-
139
31
  def document(node)
140
32
  ret = document1(node)
141
33
  clean_exit
@@ -233,7 +125,7 @@ module Metanorma
233
125
  end
234
126
 
235
127
  def metadata_attrs(node)
236
- node.attributes.each_with_object([]) do |(k, v), ret|
128
+ out = node.attributes.each_with_object([]) do |(k, v), ret|
237
129
  %w(presentation semantic).each do |t|
238
130
  /^#{t}-metadata-/.match?(k) or next
239
131
  k = k.sub(/^#{t}-metadata-/, "")
@@ -242,6 +134,17 @@ module Metanorma
242
134
  end
243
135
  end
244
136
  end.join
137
+ out + document_scheme_metadata(node)
138
+ end
139
+
140
+ def document_scheme_metadata(node)
141
+ a = document_scheme(node) or return ""
142
+ "<presentation-metadata><name>document-scheme</name>" \
143
+ "<value>#{a}</value></presentation-metadata>"
144
+ end
145
+
146
+ def document_scheme(node)
147
+ node.attr("document-scheme")
245
148
  end
246
149
 
247
150
  private
@@ -208,7 +208,9 @@
208
208
  </define>
209
209
  <define name="roledescription">
210
210
  <element name="description">
211
- <ref name="FormattedString"/>
211
+ <oneOrMore>
212
+ <ref name="TextElement"/>
213
+ </oneOrMore>
212
214
  </element>
213
215
  </define>
214
216
  <define name="person">
@@ -333,7 +335,9 @@
333
335
  </define>
334
336
  <define name="affiliationdescription">
335
337
  <element name="description">
336
- <ref name="FormattedString"/>
338
+ <oneOrMore>
339
+ <ref name="TextElement"/>
340
+ </oneOrMore>
337
341
  </element>
338
342
  </define>
339
343
  <define name="organization">
@@ -897,7 +901,9 @@
897
901
  </define>
898
902
  <define name="formattedref">
899
903
  <element name="formattedref">
900
- <ref name="FormattedString"/>
904
+ <oneOrMore>
905
+ <ref name="TextElement"/>
906
+ </oneOrMore>
901
907
  </element>
902
908
  </define>
903
909
  <define name="license">
@@ -942,7 +948,9 @@
942
948
  <optional>
943
949
  <attribute name="type"/>
944
950
  </optional>
945
- <ref name="FormattedString"/>
951
+ <zeroOrMore>
952
+ <ref name="TextElement"/>
953
+ </zeroOrMore>
946
954
  </define>
947
955
  <!-- TitleType = ( "alternative" | "original" | "unofficial" | "subtitle" | "main" ) -->
948
956
  <define name="TypedUri">
@@ -1042,7 +1050,9 @@
1042
1050
  <optional>
1043
1051
  <attribute name="script"/>
1044
1052
  </optional>
1045
- <text/>
1053
+ <oneOrMore>
1054
+ <ref name="TextElement"/>
1055
+ </oneOrMore>
1046
1056
  </element>
1047
1057
  </define>
1048
1058
  <define name="docnumber">
@@ -1267,12 +1277,16 @@
1267
1277
  <optional>
1268
1278
  <attribute name="type"/>
1269
1279
  </optional>
1270
- <ref name="FormattedString"/>
1280
+ <oneOrMore>
1281
+ <ref name="TextElement"/>
1282
+ </oneOrMore>
1271
1283
  </element>
1272
1284
  </define>
1273
1285
  <define name="bibabstract">
1274
1286
  <element name="abstract">
1275
- <ref name="FormattedString"/>
1287
+ <oneOrMore>
1288
+ <ref name="TextElement"/>
1289
+ </oneOrMore>
1276
1290
  </element>
1277
1291
  </define>
1278
1292
  <define name="copyright">
@@ -1377,7 +1391,9 @@
1377
1391
  </attribute>
1378
1392
  <optional>
1379
1393
  <element name="description">
1380
- <ref name="FormattedString"/>
1394
+ <oneOrMore>
1395
+ <ref name="TextElement"/>
1396
+ </oneOrMore>
1381
1397
  </element>
1382
1398
  </optional>
1383
1399
  <element name="bibitem">
@@ -36,7 +36,8 @@ module Metanorma
36
36
 
37
37
  def figure_attrs(node)
38
38
  attr_code(id_unnum_attrs(node).merge(keep_attrs(node))
39
- .merge(class: node.attr("class")))
39
+ .merge(class: node.attr("class"),
40
+ width: node.attr("width")))
40
41
  end
41
42
 
42
43
  def image(node)
@@ -1,10 +1,10 @@
1
1
  require "vectory"
2
+ require "crass"
2
3
 
3
4
  module Metanorma
4
5
  module Standoc
5
6
  module Cleanup
6
7
  def svgmap_cleanup(xmldoc)
7
- svg_uniqueids(xmldoc)
8
8
  svgmap_moveattrs(xmldoc)
9
9
  svgmap_populate(xmldoc)
10
10
  Vectory::SvgMapping.new(xmldoc, @localdir).call
@@ -31,8 +31,7 @@ module Metanorma
31
31
  def svgmap_moveattrs1(svgmap, figure)
32
32
  %w(unnumbered number subsequence keep-with-next
33
33
  keep-lines-together tag multilingual-rendering).each do |a|
34
- next if figure[a] || !svgmap[a]
35
-
34
+ figure[a] || !svgmap[a] and next
36
35
  figure[a] = svgmap[a]
37
36
  svgmap.delete(a)
38
37
  end
@@ -44,7 +43,7 @@ module Metanorma
44
43
  s.children.remove
45
44
  f = s1.at(".//figure") and s << f
46
45
  s1.xpath(".//li").each do |li|
47
- t = li&.at(".//eref | .//link | .//xref") or next
46
+ t = li.at(".//eref | .//link | .//xref") or next
48
47
  href = t.xpath("./following-sibling::node()")
49
48
  href.empty? or
50
49
  s << %[<target href="#{svgmap_target(href)}">#{t.to_xml}</target>]
@@ -54,8 +53,7 @@ module Metanorma
54
53
 
55
54
  def svgmap_target(nodeset)
56
55
  nodeset.each do |n|
57
- next unless n.name == "link"
58
-
56
+ n.name == "link" or next
59
57
  n.children = n["target"]
60
58
  end
61
59
  nodeset.text.sub(/^[,; ]/, "").strip
@@ -70,22 +68,51 @@ module Metanorma
70
68
  end
71
69
  end
72
70
  end
73
- svg_uniqueids(xmldoc)
71
+ svg_cleanup(xmldoc)
74
72
  xmldoc
75
73
  end
76
74
 
77
- def read_in_if_svg(img, localdir)
78
- return false unless img["src"]
75
+ def svg_cleanup(xmldoc)
76
+ svg_uniqueids(xmldoc)
77
+ svg_classupdate(xmldoc)
78
+ end
79
79
 
80
+ def read_in_if_svg(img, localdir)
81
+ img["src"] or return false
80
82
  path = Vectory::Utils.svgmap_rewrite0_path(img["src"], localdir)
81
83
  File.file?(path) or return false
82
84
  types = MIME::Types.type_for(path) or return false
83
85
  types.first == "image/svg+xml" or return false
84
86
  svg = File.read(path, encoding: "utf-8") or return false
85
- img.replace(Nokogiri::XML(svg).root)
87
+ img.children = (Nokogiri::XML(svg).root)
86
88
  true
87
89
  end
88
90
 
91
+ def svg_classupdate(xmldoc)
92
+ xmldoc.xpath("//m:svg[m:style]", "m" => SVG_NS)
93
+ .each_with_index do |s, i|
94
+ svg_classupdate1(s, s.at("./m:style", "m" => SVG_NS), i)
95
+ end
96
+ end
97
+
98
+ def svg_classupdate1(svg, style, idx)
99
+ tree = Crass.parse(style.text)
100
+ tree.each { |n| svg_suffix_css_style(n, idx) }
101
+ style.children = Crass::Parser.stringify(tree)
102
+ svg.xpath(".//*[@class]").each do |n|
103
+ n["class"] = n["class"].split(/\s+/)
104
+ .map { |x| "#{x}_inject_#{idx}" }.join(" ")
105
+ end
106
+ end
107
+
108
+ def svg_suffix_css_style(node, idx)
109
+ node[:node] == :style_rule && /\./.match?(node[:selector][:value]) or
110
+ return
111
+ v = node[:selector][:value]
112
+ .gsub(/([^.\s]*\.\S+)/, "\\1_inject_#{idx}")
113
+ node[:selector] = Crass.parse("#{v} {}").first[:selector]
114
+ end
115
+
89
116
  IRI_TAG_PROPERTIES_MAP = {
90
117
  clipPath: ["clip-path"],
91
118
  "color-profile": nil,
@@ -112,13 +139,12 @@ module Metanorma
112
139
 
113
140
  def svg_iri_properties(id_elems)
114
141
  iri_tag_names = id_elems.each_with_object([]) do |e, m|
115
- IRI_TAG_PROPERTIES_MAP.key?(e.name.to_sym) and m = m << e.name
142
+ IRI_TAG_PROPERTIES_MAP.key?(e.name.to_sym) and m << e.name
116
143
  end.uniq
117
144
  iri_properties = iri_tag_names.each_with_object([]) do |t, m|
118
145
  (IRI_TAG_PROPERTIES_MAP[t.to_sym] || [t]).each { |t1| m = m << t1 }
119
146
  end.uniq
120
- return [] if iri_properties.empty?
121
-
147
+ iri_properties.empty? and return []
122
148
  iri_properties << "style"
123
149
  end
124
150
 
@@ -133,8 +159,7 @@ module Metanorma
133
159
 
134
160
  def svg_uniqueids2(svg, iri_properties, idx, ids)
135
161
  svg.traverse do |e|
136
- next unless e.element?
137
-
162
+ e.element? or next
138
163
  if e.name == "style"
139
164
  svg_styleupdate(e, idx, ids)
140
165
  elsif !e.attributes.empty?
@@ -159,8 +184,7 @@ module Metanorma
159
184
 
160
185
  def svg_attrupdate(elem, iri_properties, idx, ids)
161
186
  iri_properties.each do |p|
162
- next unless elem[p]
163
-
187
+ elem[p] or next
164
188
  elem[p] = svg_update_url(elem[p], idx, ids)
165
189
  end
166
190
  end
@@ -168,17 +192,15 @@ module Metanorma
168
192
  def svg_linkupdate(elem, idx, ids)
169
193
  %w(xlink:href href).each do |ref|
170
194
  iri = elem[ref]&.strip
171
- next unless /^#/.match?(iri)
172
- next unless ids[iri.sub(/^#/, "")]
173
-
195
+ /^#/.match?(iri) or next
196
+ ids[iri.sub(/^#/, "")] or next
174
197
  elem[ref] += "_inject_#{idx}"
175
198
  end
176
199
  end
177
200
 
178
201
  def svg_idupdate(elem, idx, ids)
179
- return unless elem["id"]
180
- return unless ids[elem["id"]]
181
-
202
+ elem["id"] or return
203
+ ids[elem["id"]] or return
182
204
  elem["id"] += "_inject_#{idx}"
183
205
  end
184
206
  end
@@ -97,8 +97,7 @@ module Metanorma
97
97
  def make_annexes(xml)
98
98
  xml.xpath("//*[@annex]").each do |y|
99
99
  y.delete("annex")
100
- next if y.name == "annex" || !y.ancestors("annex").empty?
101
-
100
+ y.name == "annex" || !y.ancestors("annex").empty? and next
102
101
  y.wrap("<annex/>")
103
102
  y.parent["id"] = "_#{UUIDTools::UUID.random_create}"
104
103
  y.parent["obligation"] = y["obligation"]
@@ -117,8 +116,7 @@ module Metanorma
117
116
 
118
117
  def sections_level_cleanup(xml)
119
118
  m = maxlevel(xml)
120
- return if m < 6
121
-
119
+ m < 6 and return
122
120
  m.downto(6).each do |l|
123
121
  xml.xpath("//clause[@level = '#{l}']").each do |c|
124
122
  c.delete("level")
@@ -173,7 +171,7 @@ module Metanorma
173
171
  r["obligation"] = "normative" unless r["obligation"]
174
172
  end
175
173
  xml.xpath(Utils::SUBCLAUSE_XPATH).each do |r|
176
- o = r&.at("./ancestor::*/@obligation")&.text and r["obligation"] = o
174
+ o = r.at("./ancestor::*/@obligation")&.text and r["obligation"] = o
177
175
  end
178
176
  end
179
177
 
@@ -183,8 +181,7 @@ module Metanorma
183
181
  end
184
182
 
185
183
  def preface_clausebefore_cleanup(xmldoc)
186
- return unless xmldoc.at("//preface")
187
-
184
+ xmldoc.at("//preface") or return
188
185
  ins = insert_before(xmldoc, "//preface")
189
186
  xmldoc.xpath("//preface//*[@beforeclauses = 'true']").each do |x|
190
187
  x.delete("beforeclauses")
@@ -232,9 +229,8 @@ module Metanorma
232
229
  loop do
233
230
  found = false
234
231
  xmldoc.xpath("//floating-title").each do |t|
235
- next unless t.next_element.nil?
236
- next if %w(sections annex preface).include? t.parent.name
237
-
232
+ t.next_element.nil? or next
233
+ %w(sections annex preface).include? t.parent.name and next
238
234
  t.parent.next = t
239
235
  found = true
240
236
  end
@@ -16,22 +16,32 @@ module Metanorma
16
16
  text or return
17
17
  doc.xpath(xpath).each_with_index do |node, i|
18
18
  first && !i.zero? and next
19
+ node["keeptitle"] == "true" and next
19
20
  title = get_or_make_title(node)
20
- fn = title.xpath("./fn | ./bookmark")
21
- fn.each(&:remove)
22
- title.children = text
23
- fn.each { |n| title << n }
21
+ set_title_with_footnotes(title, text)
24
22
  end
25
23
  end
26
24
 
25
+ def set_title_with_footnotes(title, text)
26
+ fn = title.xpath("./fn | ./bookmark | ./index")
27
+ fn.each(&:remove)
28
+ title.children = text
29
+ fn.each { |n| title << n }
30
+ end
31
+
27
32
  def sections_names_cleanup(xml)
28
33
  replace_title(xml, "//clause[@type = 'scope']", @i18n&.scope)
34
+ sections_names_pref_cleanup(xml)
35
+ section_names_refs_cleanup(xml)
36
+ section_names_terms_cleanup(xml)
37
+ xml.xpath("//*[@keeptitle]").each { |s| s.delete("keeptitle") }
38
+ end
39
+
40
+ def sections_names_pref_cleanup(xml)
29
41
  replace_title(xml, "//preface//abstract", @i18n&.abstract)
30
42
  replace_title(xml, "//foreword", @i18n&.foreword)
31
43
  replace_title(xml, "//introduction", @i18n&.introduction)
32
44
  replace_title(xml, "//acknowledgements", @i18n&.acknowledgements)
33
- section_names_refs_cleanup(xml)
34
- section_names_terms_cleanup(xml)
35
45
  end
36
46
 
37
47
  def section_names_refs_cleanup(xml)
@@ -82,11 +92,8 @@ module Metanorma
82
92
  @i18n&.termsdefsymbolsabbrev, true)
83
93
  replace_title(xml, "//terms#{NO_SYMABBR} | //clause[.//terms]#{NO_SYMABBR}",
84
94
  @i18n&.termsdefsymbolsabbrev, true)
85
- replace_title(
86
- xml,
87
- "//terms[not(.//definitions)] | //clause[.//terms][not(.//definitions)]",
88
- @i18n&.termsdef, true
89
- )
95
+ replace_title(xml, "//terms[not(.//definitions)] | //clause[.//terms][not(.//definitions)]",
96
+ @i18n&.termsdef, true)
90
97
  end
91
98
 
92
99
  # do not auto-name terms sections if there are terms subclauses
@@ -76,9 +76,8 @@ module Metanorma
76
76
  def extract_localities_update_text(match)
77
77
  ret = match[:text]
78
78
  re = to_regex(LOCALITY_REGEX_VALUE_ONLY_STR)
79
- if re.match?(ret) && match[:punct] == ";"
79
+ re.match?(ret) && match[:punct] == ";" and
80
80
  ret.sub!(%r{^(#{CONN_REGEX_STR})}o, "\\1#{match[:locality]}=")
81
- end
82
81
  ret
83
82
  end
84
83
 
@@ -93,15 +92,13 @@ module Metanorma
93
92
  end
94
93
 
95
94
  def fill_in_eref_connectives(elem)
96
- return if elem.xpath("./localityStack").size < 2
97
-
95
+ elem.xpath("./localityStack").size < 2 and return
98
96
  elem.xpath("./localityStack[not(@connective)]").each do |l|
99
97
  n = l.next_element
100
98
  l["connective"] = if n && n.name == "localityStack" &&
101
99
  n["connective"] == "to"
102
100
  "from"
103
- else "and"
104
- end
101
+ else "and" end
105
102
  end
106
103
  end
107
104
 
@@ -193,9 +190,8 @@ module Metanorma
193
190
  def xref_parse_compound_locations(locations)
194
191
  l = locations.map { |y| y.split("!", 2) }
195
192
  l.map.with_index do |y, i|
196
- if y.size == 1
193
+ y.size == 1 and
197
194
  y.unshift(l.dig(i + 1, 0) == "to" ? "from" : "and")
198
- end
199
195
  y
200
196
  end
201
197
  end
@@ -209,8 +205,7 @@ module Metanorma
209
205
  def xref_cleanup1(xmldoc)
210
206
  xmldoc.xpath("//xref").each do |x|
211
207
  %r{:(?!//)}.match?(x["target"]) and xref_to_internal_eref(x)
212
- next unless x.name == "xref"
213
-
208
+ x.name == "xref" or next
214
209
  if refid? x["target"]
215
210
  xref_to_eref(x, "eref")
216
211
  elsif @anchor_alias[x["target"]] then xref_alias(x)
@@ -10,7 +10,7 @@ module Metanorma
10
10
  module Front
11
11
  def metadata_id(node, xml)
12
12
  id = node.attr("docidentifier") || metadata_id_build(node)
13
- xml.docidentifier id
13
+ xml.docidentifier id, primary: "true"
14
14
  end
15
15
 
16
16
  def metadata_id_build(node)
@@ -0,0 +1,114 @@
1
+ module Metanorma
2
+ module Standoc
3
+ module Base
4
+ def init(node)
5
+ init_vars
6
+ init_misc(node)
7
+ init_processing(node)
8
+ init_reqt(node)
9
+ init_toc(node)
10
+ init_output(node) # feeds init_biblio
11
+ init_i18n(node)
12
+ init_biblio(node)
13
+ @metadata_attrs = metadata_attrs(node)
14
+ end
15
+
16
+ def init_vars
17
+ @fn_number ||= 0
18
+ @refids = Set.new
19
+ @anchor_alias = {}
20
+ @anchors = {}
21
+ @internal_eref_namespaces = []
22
+ @seen_headers = []
23
+ @seen_headers_canonical = []
24
+ @embed_hdr = []
25
+ @reqt_model = nil
26
+ @preface = true
27
+ end
28
+
29
+ def init_misc(node)
30
+ @doctype = doctype(node)
31
+ @draft = node.attributes.has_key?("draft")
32
+ @index_terms = node.attr("index-terms")
33
+ @boilerplateauthority = node.attr("boilerplate-authority")
34
+ @embed_hdr = node.attr("embed_hdr")
35
+ @embed_id = node.attr("embed_id")
36
+ @document_scheme = node.attr("document-scheme")
37
+ @xrefstyle = node.attr("xrefstyle")
38
+ @source_linenums = node.attr("source-linenums-option") == "true"
39
+ end
40
+
41
+ def init_processing(node)
42
+ @novalid = node.attr("novalid")
43
+ @smartquotes = node.attr("smartquotes") != "false"
44
+ @keepasciimath = node.attr("mn-keep-asciimath") &&
45
+ node.attr("mn-keep-asciimath") != "false"
46
+ @sourcecode_markup_start = node.attr("sourcecode-markup-start") || "{{{"
47
+ @sourcecode_markup_end = node.attr("sourcecode-markup-end") || "}}}"
48
+ @datauriimage = node.attr("data-uri-image") != "false"
49
+ @blockunnumbered = (node.attr("block-unnumbered") || "").split(",")
50
+ .map(&:strip)
51
+ end
52
+
53
+ def init_reqt(node)
54
+ @default_requirement_model = node.attr("requirements-model") ||
55
+ default_requirement_model
56
+ @reqt_models = requirements_processor
57
+ .new({ default: @default_requirement_model })
58
+ end
59
+
60
+ def init_toc(node)
61
+ @htmltoclevels = node.attr("toclevels-html") ||
62
+ node.attr("htmltoclevels") ||
63
+ node.attr("toclevels") || toc_default[:html_levels]
64
+ @doctoclevels = node.attr("toclevels-doc") ||
65
+ node.attr("doctoclevels") || node.attr("toclevels") ||
66
+ toc_default[:word_levels]
67
+ @pdftoclevels = node.attr("toclevels-pdf") ||
68
+ node.attr("toclevels") || toc_default[:pdf_levels]
69
+ @toclevels = node.attr("toclevels") || toc_default[:html_levels]
70
+ @tocfigures = node.attr("toc-figures")
71
+ @toctables = node.attr("toc-tables")
72
+ @tocrecommendations = node.attr("toc-recommendations")
73
+ end
74
+
75
+ def toc_default
76
+ { word_levels: 2, html_levels: 2, pdf_levels: 2 }
77
+ end
78
+
79
+ def init_output(node)
80
+ @fontheader = default_fonts(node)
81
+ @files_to_delete = []
82
+ @filename = if node.attr("docfile")
83
+ File.basename(node.attr("docfile"))&.gsub(/\.adoc$/, "")
84
+ else ""
85
+ end
86
+ @localdir = Metanorma::Utils::localdir(node)
87
+ @output_dir = outputdir node
88
+ end
89
+
90
+ def init_i18n(node)
91
+ @lang = node.attr("language") || "en"
92
+ @script = node.attr("script") ||
93
+ Metanorma::Utils.default_script(node.attr("language"))
94
+ @locale = node.attr("locale")
95
+ @isodoc = isodoc(@lang, @script, @locale, node.attr("i18nyaml"))
96
+ @i18n = @isodoc.i18n
97
+ end
98
+
99
+ def init_biblio(node)
100
+ @no_isobib_cache = node.attr("no-isobib-cache")
101
+ @no_isobib = node.attr("no-isobib")
102
+ @bibdb = nil
103
+ init_bib_caches(node)
104
+ init_iev_caches(node)
105
+ @local_bibdb =
106
+ ::Metanorma::Standoc::LocalBiblio.new(node, @localdir, self)
107
+ end
108
+
109
+ def requirements_processor
110
+ Metanorma::Requirements
111
+ end
112
+ end
113
+ end
114
+ end
@@ -30,7 +30,7 @@ module Metanorma
30
30
  results = Plurimath::Math.parse(lxm_input, "latex")
31
31
  .to_mathml(display_style: block)
32
32
  if results.nil?
33
- @log.add("Math", nil,
33
+ @log.add("Maths", nil,
34
34
  "latexmlmath failed to process equation:\n#{lxm_input}",
35
35
  severity: 1)
36
36
  return
@@ -156,44 +156,7 @@
156
156
  </define>
157
157
  <define name="xref">
158
158
  <element name="xref">
159
- <attribute name="target">
160
- <data type="string">
161
- <param name="pattern">\i\c*|\c+#\c+</param>
162
- </data>
163
- </attribute>
164
- <optional>
165
- <attribute name="to">
166
- <data type="string">
167
- <param name="pattern">\i\c*|\c+#\c+</param>
168
- </data>
169
- </attribute>
170
- </optional>
171
- <optional>
172
- <attribute name="type">
173
- <ref name="ReferenceFormat"/>
174
- </attribute>
175
- </optional>
176
- <optional>
177
- <attribute name="alt"/>
178
- </optional>
179
- <optional>
180
- <attribute name="case">
181
- <choice>
182
- <value>capital</value>
183
- <value>lowercase</value>
184
- </choice>
185
- </attribute>
186
- </optional>
187
- <optional>
188
- <attribute name="droploc">
189
- <data type="boolean"/>
190
- </attribute>
191
- </optional>
192
- <optional>
193
- <attribute name="style">
194
- <ref name="XrefStyleType"/>
195
- </attribute>
196
- </optional>
159
+ <ref name="XrefAttributes"/>
197
160
  <ref name="XrefBody"/>
198
161
  </element>
199
162
  </define>
@@ -407,23 +370,7 @@
407
370
  </define>
408
371
  <define name="figure">
409
372
  <element name="figure">
410
- <attribute name="id">
411
- <data type="ID"/>
412
- </attribute>
413
- <optional>
414
- <attribute name="unnumbered">
415
- <data type="boolean"/>
416
- </attribute>
417
- </optional>
418
- <optional>
419
- <attribute name="number"/>
420
- </optional>
421
- <optional>
422
- <attribute name="subsequence"/>
423
- </optional>
424
- <optional>
425
- <attribute name="class"/>
426
- </optional>
373
+ <ref name="FigureAttributes"/>
427
374
  <ref name="BlockAttributes"/>
428
375
  <optional>
429
376
  <ref name="tname"/>
@@ -2450,6 +2397,49 @@
2450
2397
  </zeroOrMore>
2451
2398
  </element>
2452
2399
  </define>
2400
+ <define name="XrefAttributes">
2401
+ <attribute name="target">
2402
+ <data type="string">
2403
+ <param name="pattern">\i\c*|\c+#\c+</param>
2404
+ </data>
2405
+ </attribute>
2406
+ <optional>
2407
+ <attribute name="to">
2408
+ <data type="string">
2409
+ <param name="pattern">\i\c*|\c+#\c+</param>
2410
+ </data>
2411
+ </attribute>
2412
+ </optional>
2413
+ <optional>
2414
+ <attribute name="type">
2415
+ <ref name="ReferenceFormat"/>
2416
+ </attribute>
2417
+ </optional>
2418
+ <optional>
2419
+ <attribute name="alt"/>
2420
+ </optional>
2421
+ <optional>
2422
+ <attribute name="case">
2423
+ <choice>
2424
+ <value>capital</value>
2425
+ <value>lowercase</value>
2426
+ </choice>
2427
+ </attribute>
2428
+ </optional>
2429
+ <optional>
2430
+ <attribute name="droploc">
2431
+ <data type="boolean"/>
2432
+ </attribute>
2433
+ </optional>
2434
+ <optional>
2435
+ <attribute name="style">
2436
+ <ref name="XrefStyleType"/>
2437
+ </attribute>
2438
+ </optional>
2439
+ <optional>
2440
+ <attribute name="label"/>
2441
+ </optional>
2442
+ </define>
2453
2443
  <define name="XrefBody">
2454
2444
  <zeroOrMore>
2455
2445
  <ref name="XrefTarget"/>
@@ -2528,6 +2518,28 @@
2528
2518
  <attribute name="columns"/>
2529
2519
  </optional>
2530
2520
  </define>
2521
+ <define name="FigureAttributes">
2522
+ <attribute name="id">
2523
+ <data type="ID"/>
2524
+ </attribute>
2525
+ <optional>
2526
+ <attribute name="unnumbered">
2527
+ <data type="boolean"/>
2528
+ </attribute>
2529
+ </optional>
2530
+ <optional>
2531
+ <attribute name="number"/>
2532
+ </optional>
2533
+ <optional>
2534
+ <attribute name="subsequence"/>
2535
+ </optional>
2536
+ <optional>
2537
+ <attribute name="class"/>
2538
+ </optional>
2539
+ <optional>
2540
+ <attribute name="width"/>
2541
+ </optional>
2542
+ </define>
2531
2543
  <start>
2532
2544
  <ref name="standard-document"/>
2533
2545
  </start>
@@ -27,7 +27,7 @@ module Metanorma
27
27
  attrs.size > 1 && attrs.size < 5 and return true
28
28
  e = "invalid index \"#{target}\" cross-reference: wrong number of " \
29
29
  "attributes in `index:#{target}[#{attrs.values.join(',')}]`"
30
- parent.converter.log.add("Index", parent, e, severity: 0)
30
+ parent.converter.log.add("Crossreferences", parent, e, severity: 0)
31
31
  false
32
32
  end
33
33
 
@@ -201,7 +201,13 @@ module Metanorma
201
201
  using_format :short
202
202
 
203
203
  def process(parent, _target, attrs)
204
- create_anchor(parent, "hidden%#{attrs['text']}",
204
+ t = attrs["text"]
205
+ t = if /,/.match?(t)
206
+ t.sub(/,/, "%")
207
+ else
208
+ "#{t}%"
209
+ end
210
+ create_anchor(parent, "hidden=#{t}",
205
211
  type: :xref, target: "_#{UUIDTools::UUID.random_create}")
206
212
  end
207
213
  end
@@ -213,8 +213,7 @@ module Metanorma
213
213
  end
214
214
 
215
215
  def init_bib_caches(node)
216
- return if @no_isobib
217
-
216
+ @no_isobib and return
218
217
  global = !@no_isobib_cache && !node.attr("local-cache-only")
219
218
  local = node.attr("local-cache") || node.attr("local-cache-only")
220
219
  local = nil if @no_isobib_cache
@@ -10,9 +10,8 @@ module Metanorma
10
10
  @norm_ref = false
11
11
 
12
12
  def sectiontype1(node)
13
- return "abstract" if node.attr("style") == "abstract"
14
-
15
- node&.attr("heading")&.downcase ||
13
+ node.attr("style") == "abstract" and return "abstract"
14
+ node.attr("heading")&.downcase ||
16
15
  node.title
17
16
  .gsub(%r{<index>.*?</index>}m, "")
18
17
  .gsub(%r{<fn[^>]*>.*?</fn>}m, "")
@@ -25,7 +24,7 @@ module Metanorma
25
24
  ret = sectiontype1(node)
26
25
  ret1 = preface_main_filter(sectiontype_streamline(ret), node)
27
26
  ret1 == "symbols and abbreviated terms" and return ret1
28
- !level || node.level == 1 or return nil
27
+ !level || node.level == 1 || node.attr("heading") or return nil
29
28
  @seen_headers.include? ret and return nil
30
29
  @seen_headers << ret unless ret1.nil?
31
30
  @seen_headers_canonical << ret1 unless ret1.nil?
@@ -59,9 +58,12 @@ module Metanorma
59
58
  ["normative references", "terms and definitions", "scope",
60
59
  "symbols and abbreviated terms", "clause", "bibliography"].freeze
61
60
 
62
- def start_main_section(ret, node)
63
- return if node.role == "preface" || node.attr("style") == "preface"
61
+ def role_style(node, value)
62
+ node.role == value || node.attr("style") == value
63
+ end
64
64
 
65
+ def start_main_section(ret, node)
66
+ role_style(node, "preface") and return
65
67
  @preface = false if self.class::MAIN_CLAUSE_NAMES.include?(ret)
66
68
  @preface = false if self.class::PREFACE_CLAUSE_NAMES
67
69
  .intersection(@seen_headers_canonical + [ret]).empty?
@@ -79,29 +81,20 @@ module Metanorma
79
81
  end
80
82
 
81
83
  def section_attributes(node)
82
- ret = { id: Metanorma::Utils::anchor_or_uuid(node),
83
- language: node.attributes["language"],
84
- script: node.attributes["script"],
85
- number: node.attributes["number"],
86
- "branch-number": node.attributes["branch-number"],
87
- type: node.attributes["type"],
88
- annex: (if (node.attr("style") == "appendix" ||
89
- node.role == "appendix") &&
90
- node.level == 1
91
- true
92
- end),
93
- tag: node&.attr("tag"),
94
- "multilingual-rendering": node&.attr("multilingual-rendering"),
95
- colophon: (if node.role == "colophon" ||
96
- node.attr("style") == "colophon"
97
- true
98
- end),
99
- preface: (if node.role == "preface" ||
100
- node.attr("style") == "preface"
101
- true
102
- end) }
103
- return ret unless node.attributes["change"]
84
+ ret =
85
+ { id: Metanorma::Utils::anchor_or_uuid(node),
86
+ annex: role_style(node, "appendix") && node.level == 1 ? true : nil,
87
+ colophon: role_style(node, "colophon") ? true : nil,
88
+ preface: role_style(node, "preface") ? true : nil }
89
+ %w(language script number branch-number type tag keeptitle
90
+ multilingual-rendering).each do |k|
91
+ a = node.attr(k) and ret[k.to_sym] = a
92
+ end
93
+ section_attributes_change(node, ret).compact
94
+ end
104
95
 
96
+ def section_attributes_change(node, ret)
97
+ node.attributes["change"] or return ret
105
98
  ret.merge(change: node.attributes["change"],
106
99
  path: node.attributes["path"],
107
100
  path_end: node.attributes["path_end"],
@@ -5,8 +5,6 @@ module Metanorma
5
5
  # Intelligent term lookup xml modifier
6
6
  class TermLookupCleanup
7
7
  AUTO_GEN_ID_REGEXP = /\A_/.freeze
8
- EXISTING_TERM_REGEXP = /\Aterm-/.freeze
9
- EXISTING_SYMBOL_REGEXP = /\Asymbol-/.freeze
10
8
 
11
9
  attr_reader :xmldoc, :lookup, :log
12
10
 
@@ -61,13 +59,12 @@ module Metanorma
61
59
  def related_cleanup
62
60
  xmldoc.xpath("//related").each do |n|
63
61
  refterm = n.at("./refterm") or next
62
+ repl = "<preferred><expression>" \
63
+ "<name>#{refterm.children.to_xml}</name></expression></preferred>"
64
64
  lookup = norm_ref_id_text(refterm.text.strip)
65
65
  p = @lookup[:sec2prim][lookup] and refterm.children = @c.encode(p)
66
66
  p || @lookup[:term][lookup] and
67
- refterm.replace(<<~XML,
68
- <preferred><expression><name>#{refterm.children.to_xml}</name></expression></preferred>
69
- XML
70
- )
67
+ refterm.replace(repl)
71
68
  end
72
69
  end
73
70
 
@@ -96,7 +93,7 @@ module Metanorma
96
93
  def remove_missing_ref?(node)
97
94
  node.at("../eref | ../termref") and return false
98
95
  xref = node.at("../xref") or return true
99
- xref["target"] && !xref["target"]&.empty? and return false
96
+ xref["target"] && !xref["target"].empty? and return false
100
97
  xref.remove # if xref supplied by user, we won't delete
101
98
  true
102
99
  end
@@ -251,8 +248,7 @@ module Metanorma
251
248
  end
252
249
 
253
250
  def unique_text_id(text, prefix)
254
- @idhash["#{prefix}-#{text}"] or
255
- return "#{prefix}-#{text}"
251
+ @idhash["#{prefix}-#{text}"] or return "#{prefix}-#{text}"
256
252
  (1..Float::INFINITY).lazy.each do |index|
257
253
  @idhash["#{prefix}-#{text}-#{index}"] or
258
254
  break("#{prefix}-#{text}-#{index}")
@@ -53,7 +53,7 @@ module Metanorma
53
53
  orig = ""
54
54
  a and orig += "\n\tAsciimath original: #{@c.decode(a.children.to_xml)}"
55
55
  l and orig += "\n\tLatexmath original: #{@c.decode(l.children.to_xml)}"
56
- @log.add("Mathematics", elem,
56
+ @log.add("Maths", elem,
57
57
  "Invalid MathML: #{math}\n #{error}#{orig}", severity: 0)
58
58
  end
59
59
 
@@ -83,7 +83,7 @@ module Metanorma
83
83
  outer.name == "figure" && inner.name == "figure" and return
84
84
  err =
85
85
  "There is an instance of #{inner.name} nested within #{outer.name}"
86
- @log.add("Syntax", inner, err)
86
+ @log.add("Style", inner, err)
87
87
  nested_asset_xref_report(outer, inner, doc)
88
88
  end
89
89
 
@@ -21,14 +21,14 @@ module Metanorma
21
21
  if callouts.size != annotations.size && !annotations.empty?
22
22
  err = "mismatch of callouts (#{callouts.size}) and annotations " \
23
23
  "(#{annotations.size})"
24
- @log.add("AsciiDoc Input", elem, err, severity: 0)
24
+ @log.add("Crossreferences", elem, err, severity: 0)
25
25
  end
26
26
  end
27
27
 
28
28
  def style_warning(node, msg, text = nil)
29
29
  w = msg
30
30
  w += ": #{text}" if text
31
- @log.add("Metanorma XML Style Warning", node, w)
31
+ @log.add("Style", node, w)
32
32
  end
33
33
 
34
34
  def asset_title_style(root)
@@ -61,7 +61,7 @@ module Metanorma
61
61
  docid = b.at("./docidentifier[@type = 'metanorma']") or next
62
62
  /^\[\d+\]$/.match?(docid.text) or next
63
63
  @log.add("Bibliography", b,
64
- "Numeric reference in normative references", severity: 0)
64
+ "Numeric reference in normative references", severity: 1)
65
65
  end
66
66
  end
67
67
  end
@@ -19,6 +19,6 @@ module Metanorma
19
19
  end
20
20
 
21
21
  module Standoc
22
- VERSION = "2.8.4".freeze
22
+ VERSION = "2.8.6".freeze
23
23
  end
24
24
  end
@@ -30,6 +30,7 @@ Gem::Specification.new do |spec|
30
30
 
31
31
  spec.add_dependency "addressable", "~> 2.8.0"
32
32
  spec.add_dependency "asciidoctor", "~> 2.0.0"
33
+ spec.add_dependency "crass", "~> 1.0.0"
33
34
  spec.add_dependency "iev", "~> 0.3.0"
34
35
  spec.add_dependency "isodoc", "~> 2.9.0"
35
36
  spec.add_dependency "metanorma", ">= 1.6.0"
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.8.4
4
+ version: 2.8.6
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-03-04 00:00:00.000000000 Z
11
+ date: 2024-03-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 2.0.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: crass
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.0.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.0.0
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: iev
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -503,6 +517,7 @@ files:
503
517
  - lib/metanorma/standoc/front.rb
504
518
  - lib/metanorma/standoc/front_contributor.rb
505
519
  - lib/metanorma/standoc/front_organisation.rb
520
+ - lib/metanorma/standoc/init.rb
506
521
  - lib/metanorma/standoc/inline.rb
507
522
  - lib/metanorma/standoc/isodoc-compile.rng
508
523
  - lib/metanorma/standoc/isodoc.rng