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 +4 -4
- data/lib/metanorma/cleanup/boilerplate.rb +46 -13
- data/lib/metanorma/converter/base.rb +0 -1
- data/lib/metanorma/converter/front.rb +16 -9
- data/lib/metanorma/converter/front_contributor.rb +2 -2
- data/lib/metanorma/converter/macros_terms.rb +1 -1
- data/lib/metanorma/converter/utils.rb +9 -21
- data/lib/metanorma/converter/version.rb +1 -1
- data/metanorma-standoc.gemspec +6 -5
- metadata +22 -22
- data/lib/metanorma/converter/isolated_converter.rb +0 -57
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 337c4b9070783a56e314d0e8a1855420ddb818da4bc13e9031749cfc497702d8
|
|
4
|
+
data.tar.gz: 04fed5ceea5cc84cf1dfad226e88c38313f405e68436eca36af1b6107e6ae25f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
|
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
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
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
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
require "date"
|
|
2
2
|
require "pathname"
|
|
3
|
-
require_relative "
|
|
4
|
-
require_relative "
|
|
5
|
-
require_relative "
|
|
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
|
|
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(
|
|
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
|
|
@@ -105,7 +105,7 @@ module Metanorma
|
|
|
105
105
|
class ConceptInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
|
|
106
106
|
use_dsl
|
|
107
107
|
named :concept
|
|
108
|
-
match
|
|
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
|
-
#
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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 ")
|
data/metanorma-standoc.gemspec
CHANGED
|
@@ -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.
|
|
36
|
-
spec.add_dependency "metanorma-core", "~> 0.
|
|
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 "
|
|
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.
|
|
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-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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:
|
|
168
|
+
name: png_conform
|
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
|
170
170
|
requirements:
|
|
171
171
|
- - "~>"
|
|
172
172
|
- !ruby/object:Gem::Version
|
|
173
|
-
version:
|
|
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:
|
|
180
|
+
version: 0.1.0
|
|
181
181
|
- !ruby/object:Gem::Dependency
|
|
182
|
-
name: relaton-
|
|
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.
|
|
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.
|
|
194
|
+
version: 2.1.0
|
|
195
195
|
- !ruby/object:Gem::Dependency
|
|
196
|
-
name:
|
|
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.
|
|
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.
|
|
208
|
+
version: 2.0.0
|
|
209
209
|
- !ruby/object:Gem::Dependency
|
|
210
|
-
name:
|
|
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
|
|
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
|
|
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
|