metanorma-standoc 3.4.1 → 3.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3eb29c4fd8703e5cfb83ca8be2d9bf331e64ef55f79b5a0c6fbc40527aec8f6f
4
- data.tar.gz: 967a36a66206d56c88152c1ee82782a27876164319b6d30d6a6be7c54a6887e6
3
+ metadata.gz: 337c4b9070783a56e314d0e8a1855420ddb818da4bc13e9031749cfc497702d8
4
+ data.tar.gz: 04fed5ceea5cc84cf1dfad226e88c38313f405e68436eca36af1b6107e6ae25f
5
5
  SHA512:
6
- metadata.gz: e88f192913aca8f905983eaf547f8cacbdc6d74a7046e78c9ce7cbb0a958130d8ecf5598a5164cc1faa3e77080180dee4cc5025278b9a6ee8a0363c04e6f7cfc
7
- data.tar.gz: 0c90ed2192f721f0f02302808e2be444d1f81b58e853fa0db7be4c38ae198d3774f37ca6f89c6913cc008e34ed549e2d79a14fb6b2161e667824dc6c1c9f4099
6
+ metadata.gz: 345e5360ec266c640719931c35aa01cf34c11098c16308b45abd2f46a6acf933b06fda91b95c770b1bd5975df403d7b09df717ebf8e3c33ae1ce54d52dc2514a
7
+ data.tar.gz: 3c375e4e7ab47a72a5d84b7f916b7a08a742491136b35079d05e4a6598429010c1518451e69def8c080eb3f06d5375e623689e6e15c375ac42ab62435c9281ce
@@ -4,6 +4,8 @@ require_relative "boilerplate_liquid"
4
4
  module Metanorma
5
5
  module Standoc
6
6
  module Boilerplate
7
+ include ::Metanorma::Core::Boilerplate
8
+
7
9
  def norm_ref_preface(ref, isodoc)
8
10
  ins = norm_ref_boilerplate_insert_location(ref)
9
11
  ins2 = norm_ref_process_boilerplate_note(ref)
@@ -73,7 +75,10 @@ module Metanorma
73
75
 
74
76
  def boilerplate_cleanup(xmldoc)
75
77
  isodoc = boilerplate_isodoc(xmldoc) or return
78
+ had_templates = ::Metanorma::Core::Boilerplate
79
+ .docidentifier_templates?(xmldoc)
76
80
  docidentifier_boilerplate_isodoc(xmldoc, isodoc)
81
+ had_templates and refresh_isodoc_bibdata(xmldoc, isodoc)
77
82
  termdef_boilerplate_cleanup(xmldoc)
78
83
  termdef_boilerplate_insert(xmldoc, isodoc)
79
84
  unwrap_boilerplate_clauses(xmldoc, self.class::TERM_CLAUSE)
@@ -84,15 +89,28 @@ module Metanorma
84
89
  initial_boilerplate(xmldoc, isodoc)
85
90
  end
86
91
 
92
+ # Re-seed isodoc state from the now-resolved xmldoc bibdata after
93
+ # docidentifier_boilerplate_isodoc has substituted any
94
+ # +@boilerplate="true"+ Liquid templates. Standoc default just
95
+ # re-runs isodoc_bibdata_parse so any cached i18n / meta state
96
+ # picks up the resolved docidentifier values; flavors that
97
+ # populate richer derived state (e.g. metanorma-generic's
98
+ # bibdata_hash) override to refresh that too.
99
+ # See https://github.com/metanorma/metanorma/issues/558.
100
+ def refresh_isodoc_bibdata(xmldoc, _isodoc)
101
+ isodoc_bibdata_parse(xmldoc)
102
+ end
103
+
104
+ # Standoc-side wrapper around Core::Boilerplate's iterator. The
105
+ # core helper owns the loop body (substitute Liquid + Asciidoc,
106
+ # then splice the inner <p> children back); this wrapper supplies
107
+ # standoc-level kwargs from instance state so existing 2-arg
108
+ # callers do not need to thread them through.
87
109
  def docidentifier_boilerplate_isodoc(xmldoc, isodoc)
88
- xmldoc.xpath("//docidentifier[@boilerplate]").each do |d|
89
- b = d["boilerplate"] == "true"
90
- d.delete("boilerplate")
91
- b or next
92
- id = boilerplate_snippet_convert(to_xml(d.children), isodoc)
93
- p = Nokogiri::XML(id).at("//p")
94
- d.children = p ? to_xml(p&.children) : id
95
- end
110
+ super(xmldoc, isodoc,
111
+ lang: @lang, script: @script,
112
+ backend: @conv.backend&.to_sym,
113
+ flush_caches: @flush_caches, localdir: @localdir)
96
114
  end
97
115
 
98
116
  def initial_boilerplate(xml, isodoc)
@@ -186,17 +204,32 @@ module Metanorma
186
204
  end
187
205
 
188
206
  def boilerplate_file_restructure(file)
189
- ret = adoc2xml(file, @conv.backend.to_sym)
207
+ ret = adoc2xml(file, @conv.backend&.to_sym)
190
208
  boilerplate_xml_cleanup(ret)
191
209
  ret.name = "boilerplate"
192
210
  boilerplate_top_elements(ret)
193
211
  ret
194
212
  end
195
213
 
196
- def boilerplate_snippet_convert(adoc, isodoc)
197
- b = isodoc.populate_template(adoc, nil)
198
- ret = boilerplate_xml_cleanup(adoc2xml(b, @conv.backend.to_sym))
199
- @i18n.l10n(ret.children.to_xml, @lang, @script).strip
214
+ # Standoc-side wrapper around the metanorma-core helper. Existing
215
+ # 2-arg call sites supply no kwargs and inherit them all from
216
+ # instance state; core's docidentifier_boilerplate_isodoc passes
217
+ # kwargs through and they take precedence.
218
+ def boilerplate_snippet_convert(adoc, isodoc, **kwargs)
219
+ defaults = {
220
+ lang: @lang, script: @script,
221
+ backend: @conv.backend&.to_sym,
222
+ flush_caches: @flush_caches, localdir: @localdir,
223
+ }
224
+ super(adoc, isodoc, **defaults.merge(kwargs))
225
+ end
226
+
227
+ # Standoc override of the metanorma-core extension hook.
228
+ # Applies namespace cleanup and externally-sourced footnote separation
229
+ # to a Nokogiri node before the snippet is serialised back into the
230
+ # surrounding document.
231
+ def boilerplate_snippet_cleanup(node)
232
+ boilerplate_xml_cleanup(@conv.separate_numbering_footnotes(node))
200
233
  end
201
234
 
202
235
  private
@@ -9,7 +9,6 @@ require "metanorma-utils"
9
9
  require_relative "render"
10
10
  require_relative "localbib"
11
11
  require_relative "init"
12
- require_relative "isolated_converter"
13
12
  require "mn-requirements"
14
13
 
15
14
  module Asciidoctor
@@ -1,8 +1,8 @@
1
1
  require "date"
2
2
  require "pathname"
3
- require_relative "./front_contributor"
4
- require_relative "./front_ext"
5
- require_relative "./front_title"
3
+ require_relative "front_contributor"
4
+ require_relative "front_ext"
5
+ require_relative "front_title"
6
6
  require "isoics"
7
7
  require "isodoc"
8
8
 
@@ -56,14 +56,15 @@ module Metanorma
56
56
  add_noko_elem(xml, "docnumber", node.attr("docnumber"))
57
57
  end
58
58
 
59
+ def metadata_edition(node, xml)
60
+ add_noko_elem(xml, "edition", node.attr("edition"))
61
+ end
62
+
59
63
  def metadata_version(node, xml)
64
+ metadata_edition(node, xml)
60
65
  draft = metadata_version_value(node)
61
- add_noko_elem(xml, "edition", node.attr("edition"))
62
66
  draft || node.attr("revdate") or return
63
- xml.version do |v|
64
- add_noko_elem(v, "revision_date", node.attr("revdate"))
65
- add_noko_elem(v, "draft", draft)
66
- end
67
+ xml.version draft || node.attr("revdate")
67
68
  end
68
69
 
69
70
  def metadata_version_value(node)
@@ -112,6 +113,12 @@ module Metanorma
112
113
  type or next
113
114
  xml.date(type:) { |d| add_noko_elem(d, "on", date) }
114
115
  end
116
+ metadata_revdate(node, xml)
117
+ end
118
+
119
+ def metadata_revdate(node, xml)
120
+ date = node.attr("revdate") or return
121
+ xml.date(type: "updated") { |d| add_noko_elem(d, "on", date) }
115
122
  end
116
123
 
117
124
  def metadata_language(node, xml)
@@ -173,7 +180,7 @@ module Metanorma
173
180
 
174
181
  def metadata_classifications(node, xml)
175
182
  csv_split(node.attr("classification"), ",")&.each do |c|
176
- vals = c.split(/:/, 2)
183
+ vals = c.split(":", 2)
177
184
  vals.size == 1 and vals = ["default", vals[0]]
178
185
  add_noko_elem(xml, "classification", vals[1], type: vals[0])
179
186
  end
@@ -1,5 +1,5 @@
1
- require_relative "./front_organisation"
2
- require_relative "./front_committee"
1
+ require_relative "front_organisation"
2
+ require_relative "front_committee"
3
3
 
4
4
  module Metanorma
5
5
  module Standoc
@@ -105,7 +105,7 @@ module Metanorma
105
105
  class ConceptInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
106
106
  use_dsl
107
107
  named :concept
108
- match /\{\{(?<content>|.*?[^\\])\}\}/m
108
+ match /(?<!\{)\{\{(?!\{)(?<content>|.*?[^\\])\}\}(?!\})/m
109
109
  using_format :short
110
110
 
111
111
  def preprocess_attrs(target)
@@ -7,11 +7,12 @@ require "uuidtools"
7
7
  require "metanorma-core"
8
8
  require_relative "../../nokogiri/xml/builder"
9
9
  require_relative "date_utils"
10
- require_relative "isolated_converter"
11
10
 
12
11
  module Metanorma
13
12
  module Standoc
14
13
  module Utils
14
+ include ::Metanorma::Core::Boilerplate
15
+
15
16
  def convert(node, transform = nil, opts = {})
16
17
  transform ||= node.node_name
17
18
  opts.empty? ? (send transform, node) : (send transform, node, opts)
@@ -142,24 +143,13 @@ module Metanorma
142
143
  SECTION_CONTAINERS
143
144
  end
144
145
 
145
- # wrapped in <sections>
146
- def adoc2xml(text, flavour)
147
- Nokogiri::XML(text).root and return text
148
- f = @flush_caches ? ":flush-caches:\n" : ""
149
- doc = <<~ADOC
150
- = X
151
- A
152
- :semantic-metadata-headless: true
153
- :no-isobib:
154
- #{f}:novalid:
155
- :!sectids:
156
-
157
- #{text}
158
- ADOC
159
- c = isolated_asciidoctor_convert(doc, backend: flavour,
160
- header_footer: true)
161
- ret = Nokogiri::XML(c).at("//xmlns:sections")
162
- separate_numbering_footnotes(ret)
146
+ # Shadow metanorma-core's adoc2xml so the standoc converter context
147
+ # gets externally-sourced footnotes renumbered automatically
148
+ # (preserving the existing direct-caller behaviour: process_boilerplate_file
149
+ # in cleanup, header conversion in dochistory).
150
+ def adoc2xml(text, flavour, flush_caches: false, localdir: nil)
151
+ ret = super
152
+ ret.is_a?(Nokogiri::XML::Node) ? separate_numbering_footnotes(ret) : ret
163
153
  end
164
154
 
165
155
  # separate numbering of externally sourced footnotes
@@ -201,8 +191,6 @@ module Metanorma
201
191
  end
202
192
  end
203
193
 
204
- module_function :adoc2xml
205
-
206
194
  def textcleanup(result)
207
195
  text = result.flatten.map(&:rstrip) * "\n"
208
196
  text.gsub(/(?<!\s)\s+<fn /, "<fn ")
@@ -19,6 +19,6 @@ module Metanorma
19
19
  end
20
20
 
21
21
  module Standoc
22
- VERSION = "3.4.1".freeze
22
+ VERSION = "3.4.2".freeze
23
23
  end
24
24
  end
@@ -32,8 +32,8 @@ Gem::Specification.new do |spec|
32
32
  spec.add_dependency "asciidoctor", "~> 2.0.0"
33
33
  spec.add_dependency "crass", "~> 1.0.0"
34
34
  # spec.add_dependency "iev", "~> 0.3.5"
35
- spec.add_dependency "isodoc", "~> 3.5.0"
36
- spec.add_dependency "metanorma-core", "~> 0.1.2"
35
+ spec.add_dependency "isodoc", "~> 3.6.0"
36
+ spec.add_dependency "metanorma-core", "~> 0.2.0"
37
37
  spec.add_dependency "metanorma-plugin-glossarist", "~> 0.3.0"
38
38
  spec.add_dependency "metanorma-plugin-lutaml", "~> 0.7.31"
39
39
  spec.add_dependency "metanorma-plugin-plantuml", "~> 1.0.0"
@@ -41,12 +41,12 @@ Gem::Specification.new do |spec|
41
41
  spec.add_dependency "ruby-jing"
42
42
  # relaton-cli not just relaton, to avoid circular reference in metanorma
43
43
  spec.add_dependency "concurrent-ruby"
44
- spec.add_dependency "relaton-cli", "~> 2.0.0"
44
+ spec.add_dependency "png_conform", "~> 0.1.0"
45
+ spec.add_dependency "relaton-cli", "~> 2.1.0"
45
46
  spec.add_dependency "relaton-iev", "~> 2.0.0"
46
47
  spec.add_dependency "svg_conform", "~> 0.1.0"
47
- spec.add_dependency "png_conform", "~> 0.1.0"
48
48
 
49
- spec.add_development_dependency "canon", "= 0.2.3"
49
+ spec.add_development_dependency "canon" # , "= 0.2.3"
50
50
  spec.add_development_dependency "debug"
51
51
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
52
52
  spec.add_development_dependency "guard", "~> 2.14"
@@ -61,4 +61,5 @@ Gem::Specification.new do |spec|
61
61
  spec.add_development_dependency "vcr", "~> 6.1.0"
62
62
  spec.add_development_dependency "webmock"
63
63
  # spec.metadata["rubygems_mfa_required"] = "true"
64
+ spec.metadata["rubygems_mfa_required"] = "true"
64
65
  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: 3.4.1
4
+ version: 3.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-04-27 00:00:00.000000000 Z
11
+ date: 2026-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -58,28 +58,28 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 3.5.0
61
+ version: 3.6.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: 3.5.0
68
+ version: 3.6.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: metanorma-core
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 0.1.2
75
+ version: 0.2.0
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 0.1.2
82
+ version: 0.2.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: metanorma-plugin-glossarist
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -165,49 +165,49 @@ dependencies:
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
167
  - !ruby/object:Gem::Dependency
168
- name: relaton-cli
168
+ name: png_conform
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
171
  - - "~>"
172
172
  - !ruby/object:Gem::Version
173
- version: 2.0.0
173
+ version: 0.1.0
174
174
  type: :runtime
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
178
  - - "~>"
179
179
  - !ruby/object:Gem::Version
180
- version: 2.0.0
180
+ version: 0.1.0
181
181
  - !ruby/object:Gem::Dependency
182
- name: relaton-iev
182
+ name: relaton-cli
183
183
  requirement: !ruby/object:Gem::Requirement
184
184
  requirements:
185
185
  - - "~>"
186
186
  - !ruby/object:Gem::Version
187
- version: 2.0.0
187
+ version: 2.1.0
188
188
  type: :runtime
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
192
  - - "~>"
193
193
  - !ruby/object:Gem::Version
194
- version: 2.0.0
194
+ version: 2.1.0
195
195
  - !ruby/object:Gem::Dependency
196
- name: svg_conform
196
+ name: relaton-iev
197
197
  requirement: !ruby/object:Gem::Requirement
198
198
  requirements:
199
199
  - - "~>"
200
200
  - !ruby/object:Gem::Version
201
- version: 0.1.0
201
+ version: 2.0.0
202
202
  type: :runtime
203
203
  prerelease: false
204
204
  version_requirements: !ruby/object:Gem::Requirement
205
205
  requirements:
206
206
  - - "~>"
207
207
  - !ruby/object:Gem::Version
208
- version: 0.1.0
208
+ version: 2.0.0
209
209
  - !ruby/object:Gem::Dependency
210
- name: png_conform
210
+ name: svg_conform
211
211
  requirement: !ruby/object:Gem::Requirement
212
212
  requirements:
213
213
  - - "~>"
@@ -224,16 +224,16 @@ dependencies:
224
224
  name: canon
225
225
  requirement: !ruby/object:Gem::Requirement
226
226
  requirements:
227
- - - '='
227
+ - - ">="
228
228
  - !ruby/object:Gem::Version
229
- version: 0.2.3
229
+ version: '0'
230
230
  type: :development
231
231
  prerelease: false
232
232
  version_requirements: !ruby/object:Gem::Requirement
233
233
  requirements:
234
- - - '='
234
+ - - ">="
235
235
  - !ruby/object:Gem::Version
236
- version: 0.2.3
236
+ version: '0'
237
237
  - !ruby/object:Gem::Dependency
238
238
  name: debug
239
239
  requirement: !ruby/object:Gem::Requirement
@@ -498,7 +498,6 @@ files:
498
498
  - lib/metanorma/converter/front_title.rb
499
499
  - lib/metanorma/converter/init.rb
500
500
  - lib/metanorma/converter/inline.rb
501
- - lib/metanorma/converter/isolated_converter.rb
502
501
  - lib/metanorma/converter/lists.rb
503
502
  - lib/metanorma/converter/localbib.rb
504
503
  - lib/metanorma/converter/log.rb
@@ -543,7 +542,8 @@ files:
543
542
  homepage: https://github.com/metanorma/metanorma-standoc
544
543
  licenses:
545
544
  - BSD-2-Clause
546
- metadata: {}
545
+ metadata:
546
+ rubygems_mfa_required: 'true'
547
547
  post_install_message:
548
548
  rdoc_options: []
549
549
  require_paths:
@@ -1,57 +0,0 @@
1
- module Metanorma
2
- module Standoc
3
- module Utils
4
- # Create an isolated Asciidoctor conversion that doesn't interfere with
5
- # the current converter's instance variables
6
- def isolated_asciidoctor_convert(content, options = {})
7
- # Track that we're in an isolated conversion (for nested calls)
8
- @isolated_conversion_stack ||= []
9
- @isolated_conversion_stack << true
10
-
11
- begin
12
- preserved_options = extract_preserved_options(options)
13
- # Merge with isolated options to ensure clean state and skip validation
14
- isolated_options = preserved_options.merge(options).merge(
15
- attributes: (preserved_options[:attributes] || {}).merge(
16
- "novalid" => "", # Force no validation for isolated documents
17
- ),
18
- )
19
- Asciidoctor.convert(content, isolated_options)
20
- ensure
21
- @isolated_conversion_stack.pop
22
- end
23
- end
24
-
25
- private
26
-
27
- # Extract options that should be preserved from the current conversion context
28
- def extract_preserved_options(user_opt)
29
- options = {}
30
-
31
- # Preserve safe mode to maintain security context
32
- options[:safe] = user_opt[:safe] if user_opt.key?(:safe)
33
-
34
- # Preserve local directory context if not explicitly overridden
35
- @localdir && !user_opt.key?(:base_dir) and
36
- options[:base_dir] = @localdir
37
-
38
- # Preserve attributes that are safe to share
39
- user_opt[:attributes].nil? && respond_to?(:safe_shared_attributes) and
40
- options[:attributes] = safe_shared_attributes
41
-
42
- options
43
- end
44
-
45
- # Define attributes that are safe to share between converter instances
46
- def safe_shared_attributes
47
- # Only include read-only or configuration attributes
48
- # Avoid any attributes that could cause state pollution
49
- {
50
- "source-highlighter" => "html-pipeline", # Use simple highlighter
51
- "nofooter" => "",
52
- "no-header-footer" => "",
53
- }
54
- end
55
- end
56
- end
57
- end