metanorma-standoc 1.10.0 → 1.10.3.1
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/asciidoctor/standoc/base.rb +0 -1
- data/lib/asciidoctor/standoc/blocks.rb +1 -1
- data/lib/asciidoctor/standoc/cleanup.rb +62 -2
- data/lib/asciidoctor/standoc/cleanup_block.rb +0 -1
- data/lib/asciidoctor/standoc/cleanup_boilerplate.rb +2 -2
- data/lib/asciidoctor/standoc/cleanup_footnotes.rb +0 -1
- data/lib/asciidoctor/standoc/cleanup_maths.rb +0 -1
- data/lib/asciidoctor/standoc/cleanup_section.rb +0 -1
- data/lib/asciidoctor/standoc/converter.rb +3 -0
- data/lib/asciidoctor/standoc/datamodel/diagram_preprocessor.rb +22 -21
- data/lib/asciidoctor/standoc/front.rb +0 -1
- data/lib/asciidoctor/standoc/front_contributor.rb +0 -1
- data/lib/asciidoctor/standoc/isodoc.rng +44 -7
- data/lib/asciidoctor/standoc/macros.rb +25 -5
- data/lib/asciidoctor/standoc/macros_plantuml.rb +3 -3
- data/lib/asciidoctor/standoc/macros_terms.rb +34 -7
- data/lib/asciidoctor/standoc/ref.rb +60 -56
- data/lib/asciidoctor/standoc/section.rb +19 -12
- data/lib/asciidoctor/standoc/term_lookup_cleanup.rb +59 -18
- data/lib/asciidoctor/standoc/utils.rb +0 -1
- data/lib/asciidoctor/standoc/validate.rb +4 -3
- data/lib/isodoc/html/html_titlepage.html +81 -0
- data/lib/isodoc/html/htmlstyle.css +983 -0
- data/lib/isodoc/html/htmlstyle.scss +714 -0
- data/lib/isodoc/html/scripts.html +71 -0
- data/lib/metanorma/standoc/processor.rb +16 -7
- data/lib/metanorma/standoc/version.rb +1 -1
- data/metanorma-standoc.gemspec +1 -1
- data/spec/asciidoctor/blocks_spec.rb +2 -2
- data/spec/asciidoctor/cleanup_sections_spec.rb +899 -864
- data/spec/asciidoctor/cleanup_spec.rb +64 -14
- data/spec/asciidoctor/macros_json2text_spec.rb +1 -1
- data/spec/asciidoctor/macros_plantuml_spec.rb +165 -104
- data/spec/asciidoctor/macros_spec.rb +396 -75
- data/spec/asciidoctor/validate_spec.rb +12 -2
- data/spec/support/shared_examples/structured_data_2_text_preprocessor.rb +34 -34
- data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +50 -50
- data/spec/vcr_cassettes/isobib_get_123.yml +12 -12
- data/spec/vcr_cassettes/isobib_get_123_1.yml +23 -23
- data/spec/vcr_cassettes/isobib_get_123_1_fr.yml +34 -34
- data/spec/vcr_cassettes/isobib_get_123_2001.yml +13 -13
- data/spec/vcr_cassettes/isobib_get_124.yml +12 -12
- data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +14 -14
- data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +46 -46
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9189fd92cd1faa176828d42a9f0e7b7b58dc995eeb945fad0d13214d41c54c0d
|
4
|
+
data.tar.gz: a6fa58d732b182153c56c04b9e83df2788abd01a497d12ed9746e990662ecec1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4c5ae33422d77c5ce51e88c2d8006a61795542949687f7ceaec0e253298f15398d1e1a3bb65314e834952cb370d44d03b3af759f8be9e51487709e5d926ac6ae
|
7
|
+
data.tar.gz: 341c38c603a0f7b0f7913605309f633e5b76e8051ea41a6205342ec5b54fb3e4fb8799198c2deb12871251e2956ef2d09cb842ca1106baea042a56094b0c891f
|
@@ -41,7 +41,7 @@ module Asciidoctor
|
|
41
41
|
def form(node)
|
42
42
|
noko do |xml|
|
43
43
|
xml.form **attr_code(
|
44
|
-
id: Metanorma::Utils::anchor_or_uuid,
|
44
|
+
id: Metanorma::Utils::anchor_or_uuid, class: node.attr("class"),
|
45
45
|
name: node.attr("name"), action: node.attr("action")
|
46
46
|
) do |f|
|
47
47
|
f << node.content
|
@@ -1,6 +1,5 @@
|
|
1
1
|
require "nokogiri"
|
2
2
|
require "pathname"
|
3
|
-
require "open-uri"
|
4
3
|
require "html2doc"
|
5
4
|
require_relative "./cleanup_block"
|
6
5
|
require_relative "./cleanup_footnotes"
|
@@ -48,6 +47,7 @@ module Asciidoctor
|
|
48
47
|
xref_cleanup(xmldoc)
|
49
48
|
concept_cleanup(xmldoc)
|
50
49
|
origin_cleanup(xmldoc)
|
50
|
+
bookmark_cleanup(xmldoc)
|
51
51
|
termdef_cleanup(xmldoc)
|
52
52
|
RelatonIev::iev_cleanup(xmldoc, @bibdb)
|
53
53
|
element_name_cleanup(xmldoc)
|
@@ -58,11 +58,11 @@ module Asciidoctor
|
|
58
58
|
mathml_cleanup(xmldoc)
|
59
59
|
script_cleanup(xmldoc)
|
60
60
|
docidentifier_cleanup(xmldoc)
|
61
|
-
bookmark_cleanup(xmldoc)
|
62
61
|
requirement_cleanup(xmldoc)
|
63
62
|
bibdata_cleanup(xmldoc)
|
64
63
|
svgmap_cleanup(xmldoc)
|
65
64
|
boilerplate_cleanup(xmldoc)
|
65
|
+
toc_cleanup(xmldoc)
|
66
66
|
smartquotes_cleanup(xmldoc)
|
67
67
|
variant_cleanup(xmldoc)
|
68
68
|
para_cleanup(xmldoc)
|
@@ -85,6 +85,30 @@ module Asciidoctor
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def smartquotes_cleanup1(xmldoc)
|
88
|
+
uninterrupt_quotes_around_xml(xmldoc)
|
89
|
+
dumb2smart_quotes(xmldoc)
|
90
|
+
end
|
91
|
+
|
92
|
+
# "abc<tag/>", def => "abc",<tag/> def
|
93
|
+
def uninterrupt_quotes_around_xml(xmldoc)
|
94
|
+
xmldoc.xpath("//*[following::text()[1]"\
|
95
|
+
"[starts-with(., '\"') or starts-with(., \"'\")]]")
|
96
|
+
.each do |x|
|
97
|
+
next if !x.ancestors("pre, tt, sourcecode, stem, figure").empty?
|
98
|
+
uninterrupt_quotes_around_xml1(x)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def uninterrupt_quotes_around_xml1(elem)
|
103
|
+
prev = elem.at(".//preceding::text()[1]") or return
|
104
|
+
/\S$/.match?(prev.text) or return
|
105
|
+
foll = elem.at(".//following::text()[1]")
|
106
|
+
m = /^(["'][[:punct:]]*)(\s|$)/.match(HTMLEntities.new.decode(foll&.text)) or return
|
107
|
+
foll.content = foll.text.sub(/^(["'][[:punct:]]*)/, "")
|
108
|
+
prev.content = "#{prev.text}#{m[1]}"
|
109
|
+
end
|
110
|
+
|
111
|
+
def dumb2smart_quotes(xmldoc)
|
88
112
|
(xmldoc.xpath("//*[child::text()]") - xmldoc.xpath(IGNORE_DUMBQUOTES))
|
89
113
|
.each do |x|
|
90
114
|
x.children.each do |n|
|
@@ -167,6 +191,42 @@ module Asciidoctor
|
|
167
191
|
end
|
168
192
|
end
|
169
193
|
end
|
194
|
+
|
195
|
+
def toc_cleanup(xmldoc)
|
196
|
+
xmldoc.xpath("//p[toc]").each do |x|
|
197
|
+
x.xpath("./toc").reverse.each do |t|
|
198
|
+
x.next = t
|
199
|
+
end
|
200
|
+
x.remove if x.text.strip.empty?
|
201
|
+
end
|
202
|
+
xmldoc.xpath("//toc").each { |t| toc_cleanup1(t, xmldoc) }
|
203
|
+
end
|
204
|
+
|
205
|
+
def toc_index(toc, xmldoc)
|
206
|
+
depths = toc.xpath("./toc-xpath").each_with_object({}) do |x, m|
|
207
|
+
m[x.text] = x["depth"]
|
208
|
+
end
|
209
|
+
depths.keys.each_with_object([]) do |key, arr|
|
210
|
+
xmldoc.xpath(key).each do |x|
|
211
|
+
arr << { text: x.children.to_xml, depth: depths[key].to_i,
|
212
|
+
target: x.xpath("(./ancestor-or-self::*/@id)[last()]")[0].text,
|
213
|
+
line: x.line }
|
214
|
+
end
|
215
|
+
end.sort_by { |a| a[:line] }
|
216
|
+
end
|
217
|
+
|
218
|
+
def toc_cleanup1(toc, xmldoc)
|
219
|
+
depth = 1
|
220
|
+
ret = ""
|
221
|
+
toc_index(toc, xmldoc).each do |x|
|
222
|
+
if depth > x[:depth] then ret += "</ul></li>" * (depth - x[:depth])
|
223
|
+
elsif depth < x[:depth] then ret += "<li><ul>" * (x[:depth] - depth)
|
224
|
+
end
|
225
|
+
ret += "<li><xref target='#{x[:target]}'>#{x[:text]}</xref></li>"
|
226
|
+
depth = x[:depth]
|
227
|
+
end
|
228
|
+
toc.children = "<ul>#{ret}</ul>"
|
229
|
+
end
|
170
230
|
end
|
171
231
|
end
|
172
232
|
end
|
@@ -158,11 +158,11 @@ module Asciidoctor
|
|
158
158
|
xmldoc.root << "<bibliography/>" and ins = xmldoc.at("bibliography")
|
159
159
|
ins = ins.add_child("<references hidden='true' normative='false'/>").first
|
160
160
|
refs.each do |x|
|
161
|
-
ins << <<~
|
161
|
+
ins << <<~BIB
|
162
162
|
<bibitem id="#{x}" type="internal">
|
163
163
|
<docidentifier type="repository">#{x.sub(/^#{prefix}_/, "#{prefix}/")}</docidentifier>
|
164
164
|
</bibitem>
|
165
|
-
|
165
|
+
BIB
|
166
166
|
end
|
167
167
|
end
|
168
168
|
|
@@ -37,6 +37,7 @@ module Asciidoctor
|
|
37
37
|
inline_macro Asciidoctor::Standoc::VariantInlineMacro
|
38
38
|
inline_macro Asciidoctor::Standoc::FootnoteBlockInlineMacro
|
39
39
|
inline_macro Asciidoctor::Standoc::TermRefInlineMacro
|
40
|
+
inline_macro Asciidoctor::Standoc::SymbolRefInlineMacro
|
40
41
|
inline_macro Asciidoctor::Standoc::IndexXrefInlineMacro
|
41
42
|
inline_macro Asciidoctor::Standoc::IndexRangeInlineMacro
|
42
43
|
inline_macro Asciidoctor::Standoc::AddMacro
|
@@ -46,6 +47,8 @@ module Asciidoctor
|
|
46
47
|
inline_macro Asciidoctor::Standoc::FormTextareaMacro
|
47
48
|
inline_macro Asciidoctor::Standoc::FormSelectMacro
|
48
49
|
inline_macro Asciidoctor::Standoc::FormOptionMacro
|
50
|
+
inline_macro Asciidoctor::Standoc::ToCInlineMacro
|
51
|
+
block_macro Metanorma::Plugin::Lutaml::LutamlDiagramBlockMacro
|
49
52
|
block Asciidoctor::Standoc::ToDoAdmonitionBlock
|
50
53
|
treeprocessor Asciidoctor::Standoc::ToDoInlineAdmonitionBlock
|
51
54
|
block Asciidoctor::Standoc::PlantUMLBlockMacro
|
@@ -1,16 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "erb"
|
4
|
+
require "asciidoctor/standoc/datamodel/plantuml_renderer"
|
5
5
|
|
6
6
|
module Asciidoctor
|
7
7
|
module Standoc
|
8
8
|
module Datamodel
|
9
9
|
class DiagramPreprocessor < Asciidoctor::Extensions::Preprocessor
|
10
|
-
BLOCK_START_REGEXP = /\{(.+?)\.\*,(.+),(.+)\}
|
11
|
-
BLOCK_END_REGEXP = /\A\{[A-Z]+\}\z
|
12
|
-
MARCO_REGEXP = /\[datamodel_diagram,([^,]+),?(.+)?\]
|
13
|
-
TEMPLATES_PATH = File.expand_path(
|
10
|
+
BLOCK_START_REGEXP = /\{(.+?)\.\*,(.+),(.+)\}/.freeze
|
11
|
+
BLOCK_END_REGEXP = /\A\{[A-Z]+\}\z/.freeze
|
12
|
+
MARCO_REGEXP = /\[datamodel_diagram,([^,]+),?(.+)?\]/.freeze
|
13
|
+
TEMPLATES_PATH = File.expand_path("../views/datamodel", __dir__).freeze
|
14
14
|
# search document for block `datamodel_diagram`
|
15
15
|
# read include derectives that goes after that in block and transform
|
16
16
|
# into plantuml block
|
@@ -33,7 +33,7 @@ module Asciidoctor
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def parse_datamodel_marco(yaml_path, include_path, document)
|
36
|
-
include_path ||= File.join(File.dirname(yaml_path),
|
36
|
+
include_path ||= File.join(File.dirname(yaml_path), "..", "models")
|
37
37
|
include_path = yaml_relative_path(include_path, document)
|
38
38
|
yaml_relative_to_doc_path = yaml_relative_path(yaml_path, document)
|
39
39
|
view_hash = YAML.safe_load(File.read(yaml_relative_to_doc_path))
|
@@ -43,7 +43,7 @@ module Asciidoctor
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def yaml_relative_path(file_path, document)
|
46
|
-
docfile = document.attributes[
|
46
|
+
docfile = document.attributes["docfile"] || "."
|
47
47
|
docfile_directory = File.dirname(docfile)
|
48
48
|
document.path_resolver.system_path(file_path, docfile_directory)
|
49
49
|
end
|
@@ -51,11 +51,11 @@ module Asciidoctor
|
|
51
51
|
def import_format(include_path, import_name, values)
|
52
52
|
include_content = File.read(File.join(
|
53
53
|
include_path,
|
54
|
-
"#{import_name}.yml"
|
55
|
-
|
54
|
+
"#{import_name}.yml",
|
55
|
+
))
|
56
56
|
content = YAML.safe_load(include_content)
|
57
57
|
if values
|
58
|
-
content[
|
58
|
+
content["skipSection"] = values["skipSection"]
|
59
59
|
end
|
60
60
|
content
|
61
61
|
end
|
@@ -63,36 +63,37 @@ module Asciidoctor
|
|
63
63
|
def format_import_directives(imports, include_path)
|
64
64
|
imports
|
65
65
|
.each_with_object({}) do |(import_name, values), res|
|
66
|
-
full_model_name = import_name.split(
|
66
|
+
full_model_name = import_name.split("/").join
|
67
67
|
content = import_format(include_path, import_name, values)
|
68
|
-
res[content[
|
68
|
+
res[content["name"] || full_model_name] = content
|
69
69
|
end.compact
|
70
70
|
end
|
71
71
|
|
72
72
|
def prepare_view_hash(view_hash, all_imports)
|
73
73
|
view_hash.merge!(
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
.merge!(
|
74
|
+
"classes" => model_type(all_imports, "class"),
|
75
|
+
"enums" => model_type(all_imports, "enum"),
|
76
|
+
"relations" => view_hash["relations"] || [],
|
77
|
+
"fidelity" => (view_hash["fidelity"] || {})
|
78
|
+
.merge!("classes" => model_type(all_imports,
|
79
|
+
"class")),
|
79
80
|
)
|
80
81
|
end
|
81
82
|
|
82
83
|
def model_type(imports, type)
|
83
84
|
imports
|
84
85
|
.select do |_name, elem|
|
85
|
-
elem[
|
86
|
+
elem["modelType"] == type
|
86
87
|
end
|
87
88
|
end
|
88
89
|
|
89
90
|
def plantuml_representations(view_hash, view_path, include_path)
|
90
91
|
yaml_directory = File.dirname(view_path)
|
91
|
-
all_imports = format_import_directives(view_hash[
|
92
|
+
all_imports = format_import_directives(view_hash["imports"],
|
92
93
|
include_path)
|
93
94
|
prepare_view_hash(view_hash, all_imports)
|
94
95
|
Asciidoctor::Datamodel::PlantumlRenderer
|
95
|
-
.new(view_hash, File.join(yaml_directory,
|
96
|
+
.new(view_hash, File.join(yaml_directory, ".."))
|
96
97
|
.render
|
97
98
|
.split("\n")
|
98
99
|
end
|
@@ -204,6 +204,18 @@
|
|
204
204
|
</zeroOrMore>
|
205
205
|
</element>
|
206
206
|
</define>
|
207
|
+
<define name="dt">
|
208
|
+
<element name="dt">
|
209
|
+
<optional>
|
210
|
+
<attribute name="id">
|
211
|
+
<data type="ID"/>
|
212
|
+
</attribute>
|
213
|
+
</optional>
|
214
|
+
<zeroOrMore>
|
215
|
+
<ref name="TextElement"/>
|
216
|
+
</zeroOrMore>
|
217
|
+
</element>
|
218
|
+
</define>
|
207
219
|
<define name="example">
|
208
220
|
<element name="example">
|
209
221
|
<attribute name="id">
|
@@ -899,7 +911,7 @@
|
|
899
911
|
</include>
|
900
912
|
<!-- end overrides -->
|
901
913
|
<define name="docsubtype">
|
902
|
-
<element name="
|
914
|
+
<element name="subdoctype">
|
903
915
|
<ref name="DocumentSubtype"/>
|
904
916
|
</element>
|
905
917
|
</define>
|
@@ -954,6 +966,16 @@
|
|
954
966
|
</define>
|
955
967
|
<define name="concept">
|
956
968
|
<element name="concept">
|
969
|
+
<optional>
|
970
|
+
<attribute name="ital">
|
971
|
+
<data type="boolean"/>
|
972
|
+
</attribute>
|
973
|
+
</optional>
|
974
|
+
<optional>
|
975
|
+
<attribute name="ref">
|
976
|
+
<data type="boolean"/>
|
977
|
+
</attribute>
|
978
|
+
</optional>
|
957
979
|
<optional>
|
958
980
|
<element name="refterm">
|
959
981
|
<zeroOrMore>
|
@@ -989,8 +1011,14 @@
|
|
989
1011
|
<ref name="imagemap"/>
|
990
1012
|
<ref name="svgmap"/>
|
991
1013
|
<ref name="inputform"/>
|
1014
|
+
<ref name="toc"/>
|
992
1015
|
</choice>
|
993
1016
|
</define>
|
1017
|
+
<define name="toc">
|
1018
|
+
<element name="toc">
|
1019
|
+
<ref name="ul"/>
|
1020
|
+
</element>
|
1021
|
+
</define>
|
994
1022
|
<define name="inputform">
|
995
1023
|
<element name="form">
|
996
1024
|
<attribute name="id">
|
@@ -998,6 +1026,9 @@
|
|
998
1026
|
</attribute>
|
999
1027
|
<attribute name="name"/>
|
1000
1028
|
<attribute name="action"/>
|
1029
|
+
<optional>
|
1030
|
+
<attribute name="class"/>
|
1031
|
+
</optional>
|
1001
1032
|
<zeroOrMore>
|
1002
1033
|
<choice>
|
1003
1034
|
<ref name="TextElement"/>
|
@@ -1229,6 +1260,12 @@
|
|
1229
1260
|
<optional>
|
1230
1261
|
<attribute name="type"/>
|
1231
1262
|
</optional>
|
1263
|
+
<optional>
|
1264
|
+
<attribute name="identifier"/>
|
1265
|
+
</optional>
|
1266
|
+
<optional>
|
1267
|
+
<attribute name="prefix"/>
|
1268
|
+
</optional>
|
1232
1269
|
<text/>
|
1233
1270
|
</define>
|
1234
1271
|
<define name="ics">
|
@@ -1490,26 +1527,26 @@
|
|
1490
1527
|
<optional>
|
1491
1528
|
<ref name="section-title"/>
|
1492
1529
|
</optional>
|
1493
|
-
<
|
1530
|
+
<choice>
|
1494
1531
|
<choice>
|
1495
1532
|
<group>
|
1496
|
-
<
|
1533
|
+
<oneOrMore>
|
1497
1534
|
<ref name="BasicBlock"/>
|
1498
|
-
</
|
1535
|
+
</oneOrMore>
|
1499
1536
|
<zeroOrMore>
|
1500
1537
|
<ref name="note"/>
|
1501
1538
|
</zeroOrMore>
|
1502
1539
|
</group>
|
1503
1540
|
<ref name="amend"/>
|
1504
1541
|
</choice>
|
1505
|
-
<
|
1542
|
+
<oneOrMore>
|
1506
1543
|
<choice>
|
1507
1544
|
<ref name="clause-subsection"/>
|
1508
1545
|
<ref name="terms"/>
|
1509
1546
|
<ref name="definitions"/>
|
1510
1547
|
</choice>
|
1511
|
-
</
|
1512
|
-
</
|
1548
|
+
</oneOrMore>
|
1549
|
+
</choice>
|
1513
1550
|
</define>
|
1514
1551
|
<define name="Annex-Section">
|
1515
1552
|
<optional>
|
@@ -2,6 +2,7 @@ require "asciidoctor/extensions"
|
|
2
2
|
require "fileutils"
|
3
3
|
require "uuidtools"
|
4
4
|
require "yaml"
|
5
|
+
require "csv"
|
5
6
|
require_relative "./macros_plantuml"
|
6
7
|
require_relative "./macros_terms"
|
7
8
|
require_relative "./macros_form"
|
@@ -75,7 +76,7 @@ module Asciidoctor
|
|
75
76
|
def supply_br(lines)
|
76
77
|
ignore = false
|
77
78
|
lines.each_with_index do |l, i|
|
78
|
-
/^(
|
79
|
+
/^(--+|====+|\|===|\.\.\.\.+|\*\*\*\*+|\+\+\+\++|````+|____\+)$/
|
79
80
|
.match(l) && (ignore = !ignore)
|
80
81
|
next if l.empty? || l.match(/ \+$/) || /^\[.*\]$/.match?(l) || ignore
|
81
82
|
next if i == lines.size - 1 ||
|
@@ -107,7 +108,7 @@ module Asciidoctor
|
|
107
108
|
if (attributes.size == 1) && attributes.key?("text")
|
108
109
|
rt = attributes["text"]
|
109
110
|
elsif (attributes.size == 2) && attributes.key?(1) &&
|
110
|
-
|
111
|
+
attributes.key?("rpbegin")
|
111
112
|
rt = attributes[1] || ""
|
112
113
|
else
|
113
114
|
rpbegin = attributes["rpbegin"]
|
@@ -143,7 +144,7 @@ module Asciidoctor
|
|
143
144
|
para.set_attr("caption", "TODO")
|
144
145
|
para.lines[0].sub!(/^TODO: /, "")
|
145
146
|
todo = Block.new(parent, :admonition, attributes: para.attributes,
|
146
|
-
|
147
|
+
source: para.lines, content_model: :compound)
|
147
148
|
parent.blocks[parent.blocks.index(para)] = todo
|
148
149
|
end
|
149
150
|
end
|
@@ -168,9 +169,11 @@ module Asciidoctor
|
|
168
169
|
def process(parent, target, attrs)
|
169
170
|
/^(?<lang>[^-]*)(-(?<script>.*))?$/ =~ target
|
170
171
|
out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
|
171
|
-
script
|
172
|
-
%{<variant lang=#{lang} script=#{script}>#{out}</variant>}
|
172
|
+
if script
|
173
|
+
%{<variant lang=#{lang} script=#{script}>#{out}</variant>}
|
174
|
+
else
|
173
175
|
%{<variant lang=#{lang}>#{out}</variant>}
|
176
|
+
end
|
174
177
|
end
|
175
178
|
end
|
176
179
|
|
@@ -209,5 +212,22 @@ module Asciidoctor
|
|
209
212
|
%{<del>#{out}</del>}
|
210
213
|
end
|
211
214
|
end
|
215
|
+
|
216
|
+
class ToCInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
|
217
|
+
use_dsl
|
218
|
+
named :toc
|
219
|
+
parse_content_as :text
|
220
|
+
using_format :short
|
221
|
+
|
222
|
+
def process(parent, _target, attrs)
|
223
|
+
out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
|
224
|
+
content = CSV.parse_line(out).map do |x|
|
225
|
+
x.sub!(/^(["'])(.+)\1/, "\\2")
|
226
|
+
m = /^(.*?)(:\d+)?$/.match(x)
|
227
|
+
%{<toc-xpath depth='#{m[2]&.sub(/:/, '') || 1}'>#{m[1]}</toc-xpath>}
|
228
|
+
end.join
|
229
|
+
"<toc>#{content}</toc>"
|
230
|
+
end
|
231
|
+
end
|
212
232
|
end
|
213
233
|
end
|