metanorma-standoc 1.10.0 → 1.10.1
Sign up to get free protection for your applications and to get access to all the features.
- 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 +1 -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 +1 -0
- data/lib/asciidoctor/standoc/front.rb +0 -1
- data/lib/asciidoctor/standoc/front_contributor.rb +0 -1
- data/lib/asciidoctor/standoc/isodoc.rng +32 -7
- data/lib/asciidoctor/standoc/macros.rb +7 -5
- data/lib/asciidoctor/standoc/macros_plantuml.rb +3 -3
- data/lib/asciidoctor/standoc/macros_terms.rb +34 -7
- data/lib/asciidoctor/standoc/section.rb +19 -12
- data/lib/asciidoctor/standoc/term_lookup_cleanup.rb +58 -17
- 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/spec/asciidoctor/cleanup_spec.rb +12 -12
- data/spec/asciidoctor/macros_json2text_spec.rb +1 -1
- data/spec/asciidoctor/macros_spec.rb +228 -75
- data/spec/asciidoctor/validate_spec.rb +12 -2
- 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 +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f5a985aefd39dadc19549ad39c23e0849bac873ea5883e50762ca911c8bd3aad
|
4
|
+
data.tar.gz: b7560f906a1e50fc4032f3261a44d1edcb2e691872b3e85d14a0363d7668b575
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 437c04558d97c828a200ca21668a0e74e7e9fe5b5581ab759955f9ada241a0a87ccfddf114b7bd616430107e5869ce785c547715d627a08b87e35a30237b0516
|
7
|
+
data.tar.gz: 11d70602d2bd7733e9daab869ec22e3bf58ff6397378b38734711d46cb8f6e04b25e5b5fbcd3b5cd1e36b8e58a1061c92a87502fab945ea8a8c573205e25b126
|
@@ -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,7 +58,6 @@ 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)
|
@@ -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
|
@@ -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>
|
@@ -998,6 +1020,9 @@
|
|
998
1020
|
</attribute>
|
999
1021
|
<attribute name="name"/>
|
1000
1022
|
<attribute name="action"/>
|
1023
|
+
<optional>
|
1024
|
+
<attribute name="class"/>
|
1025
|
+
</optional>
|
1001
1026
|
<zeroOrMore>
|
1002
1027
|
<choice>
|
1003
1028
|
<ref name="TextElement"/>
|
@@ -1490,26 +1515,26 @@
|
|
1490
1515
|
<optional>
|
1491
1516
|
<ref name="section-title"/>
|
1492
1517
|
</optional>
|
1493
|
-
<
|
1518
|
+
<choice>
|
1494
1519
|
<choice>
|
1495
1520
|
<group>
|
1496
|
-
<
|
1521
|
+
<oneOrMore>
|
1497
1522
|
<ref name="BasicBlock"/>
|
1498
|
-
</
|
1523
|
+
</oneOrMore>
|
1499
1524
|
<zeroOrMore>
|
1500
1525
|
<ref name="note"/>
|
1501
1526
|
</zeroOrMore>
|
1502
1527
|
</group>
|
1503
1528
|
<ref name="amend"/>
|
1504
1529
|
</choice>
|
1505
|
-
<
|
1530
|
+
<oneOrMore>
|
1506
1531
|
<choice>
|
1507
1532
|
<ref name="clause-subsection"/>
|
1508
1533
|
<ref name="terms"/>
|
1509
1534
|
<ref name="definitions"/>
|
1510
1535
|
</choice>
|
1511
|
-
</
|
1512
|
-
</
|
1536
|
+
</oneOrMore>
|
1537
|
+
</choice>
|
1513
1538
|
</define>
|
1514
1539
|
<define name="Annex-Section">
|
1515
1540
|
<optional>
|
@@ -75,7 +75,7 @@ module Asciidoctor
|
|
75
75
|
def supply_br(lines)
|
76
76
|
ignore = false
|
77
77
|
lines.each_with_index do |l, i|
|
78
|
-
/^(
|
78
|
+
/^(--+|====+|\|===|\.\.\.\.+|\*\*\*\*+|\+\+\+\++|````+|____\+)$/
|
79
79
|
.match(l) && (ignore = !ignore)
|
80
80
|
next if l.empty? || l.match(/ \+$/) || /^\[.*\]$/.match?(l) || ignore
|
81
81
|
next if i == lines.size - 1 ||
|
@@ -107,7 +107,7 @@ module Asciidoctor
|
|
107
107
|
if (attributes.size == 1) && attributes.key?("text")
|
108
108
|
rt = attributes["text"]
|
109
109
|
elsif (attributes.size == 2) && attributes.key?(1) &&
|
110
|
-
|
110
|
+
attributes.key?("rpbegin")
|
111
111
|
rt = attributes[1] || ""
|
112
112
|
else
|
113
113
|
rpbegin = attributes["rpbegin"]
|
@@ -143,7 +143,7 @@ module Asciidoctor
|
|
143
143
|
para.set_attr("caption", "TODO")
|
144
144
|
para.lines[0].sub!(/^TODO: /, "")
|
145
145
|
todo = Block.new(parent, :admonition, attributes: para.attributes,
|
146
|
-
|
146
|
+
source: para.lines, content_model: :compound)
|
147
147
|
parent.blocks[parent.blocks.index(para)] = todo
|
148
148
|
end
|
149
149
|
end
|
@@ -168,9 +168,11 @@ module Asciidoctor
|
|
168
168
|
def process(parent, target, attrs)
|
169
169
|
/^(?<lang>[^-]*)(-(?<script>.*))?$/ =~ target
|
170
170
|
out = Asciidoctor::Inline.new(parent, :quoted, attrs["text"]).convert
|
171
|
-
script
|
172
|
-
%{<variant lang=#{lang} script=#{script}>#{out}</variant>}
|
171
|
+
if script
|
172
|
+
%{<variant lang=#{lang} script=#{script}>#{out}</variant>}
|
173
|
+
else
|
173
174
|
%{<variant lang=#{lang}>#{out}</variant>}
|
175
|
+
end
|
174
176
|
end
|
175
177
|
end
|
176
178
|
|
@@ -12,7 +12,6 @@ module Asciidoctor
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
raise "PlantUML not installed"
|
15
|
-
nil
|
16
15
|
end
|
17
16
|
|
18
17
|
def self.run(umlfile, outfile)
|
@@ -59,7 +58,7 @@ module Asciidoctor
|
|
59
58
|
Tempfile.open(["plantuml", ".pml"], encoding: "utf-8") do |f|
|
60
59
|
f.write(src)
|
61
60
|
[f, File.join(File.dirname(f.path),
|
62
|
-
|
61
|
+
"#{fn || File.basename(f.path, '.pml')}.png")]
|
63
62
|
end
|
64
63
|
end
|
65
64
|
|
@@ -81,7 +80,8 @@ module Asciidoctor
|
|
81
80
|
def abort(parent, reader, attrs, msg)
|
82
81
|
warn msg
|
83
82
|
attrs["language"] = "plantuml"
|
84
|
-
create_listing_block parent, reader.source,
|
83
|
+
create_listing_block parent, reader.source,
|
84
|
+
(attrs.reject { |k, _v| k == 1 })
|
85
85
|
end
|
86
86
|
|
87
87
|
def process(parent, reader, attrs)
|
@@ -46,7 +46,20 @@ module Asciidoctor
|
|
46
46
|
|
47
47
|
def process(_parent, _target, attrs)
|
48
48
|
termref = attrs["termxref"] || attrs["name"]
|
49
|
-
"<concept><termxref>#{attrs['name']}</termxref>"\
|
49
|
+
"<concept type='term'><termxref>#{attrs['name']}</termxref>"\
|
50
|
+
"<renderterm>#{termref}</renderterm><xrefrender/></concept>"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class SymbolRefInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
|
55
|
+
use_dsl
|
56
|
+
named :symbol
|
57
|
+
name_positional_attributes "name", "termxref"
|
58
|
+
using_format :short
|
59
|
+
|
60
|
+
def process(_parent, _target, attrs)
|
61
|
+
termref = attrs["termxref"] || attrs["name"]
|
62
|
+
"<concept type='symbol'><termxref>#{attrs['name']}</termxref>"\
|
50
63
|
"<renderterm>#{termref}</renderterm><xrefrender/></concept>"
|
51
64
|
end
|
52
65
|
end
|
@@ -68,24 +81,38 @@ module Asciidoctor
|
|
68
81
|
def preprocess_attrs(target)
|
69
82
|
m = /^(?<id><<.+?>>)?(?<rest>.*)$/.match(target)
|
70
83
|
ret = { id: m[:id]&.sub(/^<</, "")&.sub(/>>$/, "") }
|
71
|
-
m2 = /^(?<rest
|
72
|
-
|
73
|
-
|
84
|
+
if m2 = /^(?<rest>.*?)(?<opt>,option=.+)$/.match(m[:rest].sub(/^,/, ""))
|
85
|
+
ret[:opt] = CSV.parse_line(m2[:opt].sub(/^,option=/, "")
|
86
|
+
.sub(/^"(.+)"$/, "\\1").sub(/^'(.+)'$/, "\\1"))
|
87
|
+
attrs = CSV.parse_line(m2[:rest]) || []
|
88
|
+
else
|
89
|
+
attrs = CSV.parse_line(m[:rest].sub(/^,/, "")) || []
|
90
|
+
end
|
74
91
|
ret.merge(term: attrs[0], word: attrs[1] || attrs[0],
|
75
92
|
xrefrender: attrs[2])
|
76
93
|
end
|
77
94
|
|
95
|
+
def generate_attrs(opts)
|
96
|
+
ret = ""
|
97
|
+
opts.include?("noital") and ret += " ital='false'"
|
98
|
+
opts.include?("noref") and ret += " ref='false'"
|
99
|
+
opts.include?("ital") and ret += " ital='true'"
|
100
|
+
opts.include?("ref") and ret += " ref='true'"
|
101
|
+
ret
|
102
|
+
end
|
103
|
+
|
78
104
|
def process(parent, target, _attrs)
|
79
105
|
attrs = preprocess_attrs(target)
|
80
106
|
termout = Asciidoctor::Inline.new(parent, :quoted, attrs[:term]).convert
|
81
107
|
wordout = Asciidoctor::Inline.new(parent, :quoted, attrs[:word]).convert
|
82
108
|
xrefout = Asciidoctor::Inline.new(parent, :quoted,
|
83
109
|
attrs[:xrefrender]).convert
|
84
|
-
attrs[:
|
110
|
+
optout = generate_attrs(attrs[:opt] || [])
|
111
|
+
attrs[:id] and return "<concept#{optout} key='#{attrs[:id]}'><refterm>"\
|
85
112
|
"#{termout}</refterm><renderterm>#{wordout}</renderterm>"\
|
86
113
|
"<xrefrender>#{xrefout}</xrefrender></concept>"
|
87
|
-
"<concept><termxref>#{termout}</termxref><renderterm
|
88
|
-
"</renderterm><xrefrender>#{xrefout}</xrefrender></concept>"
|
114
|
+
"<concept#{optout}><termxref>#{termout}</termxref><renderterm>"\
|
115
|
+
"#{wordout}</renderterm><xrefrender>#{xrefout}</xrefrender></concept>"
|
89
116
|
end
|
90
117
|
end
|
91
118
|
end
|
@@ -12,7 +12,7 @@ module Asciidoctor
|
|
12
12
|
def sectiontype1(node)
|
13
13
|
node&.attr("heading")&.downcase ||
|
14
14
|
node.title.gsub(%r{<index>.*?</index>}m, "").gsub(/<[^>]+>/, "")
|
15
|
-
|
15
|
+
.strip.downcase
|
16
16
|
end
|
17
17
|
|
18
18
|
def sectiontype(node, level = true)
|
@@ -21,6 +21,7 @@ module Asciidoctor
|
|
21
21
|
return ret1 if "symbols and abbreviated terms" == ret1
|
22
22
|
return nil unless !level || node.level == 1
|
23
23
|
return nil if @seen_headers.include? ret
|
24
|
+
|
24
25
|
@seen_headers << ret
|
25
26
|
ret1
|
26
27
|
end
|
@@ -48,11 +49,14 @@ module Asciidoctor
|
|
48
49
|
script: node.attributes["script"],
|
49
50
|
number: node.attributes["number"],
|
50
51
|
type: node.attributes["type"],
|
51
|
-
annex: ( (
|
52
|
-
node.level == 1
|
53
|
-
|
54
|
-
|
52
|
+
annex: (if (node.attr("style") == "appendix" || node.role == "appendix") &&
|
53
|
+
node.level == 1
|
54
|
+
true
|
55
|
+
end),
|
56
|
+
preface: (
|
57
|
+
node.role == "preface" || node.attr("style") == "preface" ? true : nil) }
|
55
58
|
return ret unless node.attributes["change"]
|
59
|
+
|
56
60
|
ret.merge(change: node.attributes["change"],
|
57
61
|
path: node.attributes["path"],
|
58
62
|
path_end: node.attributes["path_end"],
|
@@ -75,7 +79,7 @@ module Asciidoctor
|
|
75
79
|
symbols_parse(symbols_attrs(node, a), xml, node)
|
76
80
|
when "acknowledgements"
|
77
81
|
acknowledgements_parse(a, xml, node)
|
78
|
-
when "bibliography"
|
82
|
+
when "bibliography"
|
79
83
|
bibliography_parse(a, xml, node)
|
80
84
|
else
|
81
85
|
if @term_def then term_def_subclause_parse(a, xml, node)
|
@@ -88,9 +92,9 @@ module Asciidoctor
|
|
88
92
|
bibliography_parse(a, xml, node)
|
89
93
|
elsif node.attr("style") == "bibliography"
|
90
94
|
bibliography_parse(a, xml, node)
|
91
|
-
elsif node.attr("style") == "abstract"
|
95
|
+
elsif node.attr("style") == "abstract"
|
92
96
|
abstract_parse(a, xml, node)
|
93
|
-
elsif node.attr("style") == "index"
|
97
|
+
elsif node.attr("style") == "index"
|
94
98
|
indexsect_parse(a, xml, node)
|
95
99
|
elsif node.attr("style") == "appendix" && node.level == 1
|
96
100
|
annex_parse(a, xml, node)
|
@@ -102,10 +106,13 @@ module Asciidoctor
|
|
102
106
|
end
|
103
107
|
|
104
108
|
def set_obligation(attrs, node)
|
105
|
-
attrs[:obligation] = node.attributes.has_key?("obligation")
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
+
attrs[:obligation] = if node.attributes.has_key?("obligation")
|
110
|
+
node.attr("obligation")
|
111
|
+
elsif node.parent.attributes.has_key?("obligation")
|
112
|
+
node.parent.attr("obligation")
|
113
|
+
else
|
114
|
+
"normative"
|
115
|
+
end
|
109
116
|
end
|
110
117
|
|
111
118
|
def preamble(node)
|
@@ -6,13 +6,14 @@ module Asciidoctor
|
|
6
6
|
class TermLookupCleanup
|
7
7
|
AUTOMATIC_GENERATED_ID_REGEXP = /\A_/.freeze
|
8
8
|
EXISTING_TERM_REGEXP = /\Aterm-/.freeze
|
9
|
+
EXISTING_SYMBOL_REGEXP = /\Asymbol-/.freeze
|
9
10
|
|
10
11
|
attr_reader :xmldoc, :termlookup, :log
|
11
12
|
|
12
13
|
def initialize(xmldoc, log)
|
13
14
|
@xmldoc = xmldoc
|
14
15
|
@log = log
|
15
|
-
@termlookup = {}
|
16
|
+
@termlookup = { term: {}, symbol: {} }
|
16
17
|
@idhash = {}
|
17
18
|
end
|
18
19
|
|
@@ -20,13 +21,20 @@ module Asciidoctor
|
|
20
21
|
@idhash = populate_idhash
|
21
22
|
@termlookup = replace_automatic_generated_ids_terms
|
22
23
|
set_termxref_tags_target
|
24
|
+
concept_cleanup
|
23
25
|
end
|
24
26
|
|
25
27
|
private
|
26
28
|
|
29
|
+
def concept_cleanup
|
30
|
+
xmldoc.xpath("//concept").each do |n|
|
31
|
+
n.delete("type")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
27
35
|
def populate_idhash
|
28
36
|
xmldoc.xpath("//*[@id]").each_with_object({}) do |n, mem|
|
29
|
-
next unless /^term-/.match?(n["id"])
|
37
|
+
next unless /^(term|symbol)-/.match?(n["id"])
|
30
38
|
|
31
39
|
mem[n["id"]] = true
|
32
40
|
end
|
@@ -35,7 +43,7 @@ module Asciidoctor
|
|
35
43
|
def set_termxref_tags_target
|
36
44
|
xmldoc.xpath("//termxref").each do |node|
|
37
45
|
target = normalize_ref_id(node.text)
|
38
|
-
if termlookup[target].nil?
|
46
|
+
if termlookup[:term][target].nil? && termlookup[:symbol][target].nil?
|
39
47
|
remove_missing_ref(node, target)
|
40
48
|
next
|
41
49
|
end
|
@@ -46,6 +54,14 @@ module Asciidoctor
|
|
46
54
|
end
|
47
55
|
|
48
56
|
def remove_missing_ref(node, target)
|
57
|
+
if node.at("../concept[@type = 'symbol']")
|
58
|
+
remove_missing_ref_symbol(node, target)
|
59
|
+
else
|
60
|
+
remove_missing_ref_term(node, target)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def remove_missing_ref_term(node, target)
|
49
65
|
log.add("AsciiDoc Input", node,
|
50
66
|
%(Error: Term reference in `term[#{target}]` missing: \
|
51
67
|
"#{target}" is not defined in document))
|
@@ -58,39 +74,64 @@ module Asciidoctor
|
|
58
74
|
"not resolved via ID <tt>#{target}</tt>"
|
59
75
|
end
|
60
76
|
|
77
|
+
def remove_missing_ref_symbol(node, target)
|
78
|
+
log.add("AsciiDoc Input", node,
|
79
|
+
%(Error: Symbol reference in `symbol[#{target}]` missing: \
|
80
|
+
"#{target}" is not defined in document))
|
81
|
+
node.name = "strong"
|
82
|
+
node.at("../xrefrender").remove
|
83
|
+
display = node&.at("../renderterm")&.remove&.children
|
84
|
+
display = [] if display.nil? || display&.to_xml == node.text
|
85
|
+
d = display.empty? ? "" : ", display <tt>#{display.to_xml}</tt>"
|
86
|
+
node.children = "symbol <tt>#{node.text}</tt>#{d} "\
|
87
|
+
"not resolved via ID <tt>#{target}</tt>"
|
88
|
+
end
|
89
|
+
|
61
90
|
def modify_ref_node(node, target)
|
62
91
|
node.name = "xref"
|
63
|
-
|
92
|
+
s = termlookup[:symbol][target]
|
93
|
+
t = termlookup[:term][target]
|
94
|
+
type = node.parent["type"]
|
95
|
+
if type == "term" || !type && t
|
96
|
+
node["target"] = t
|
97
|
+
elsif type == "symbol" || !type && s
|
98
|
+
node["target"] = s
|
99
|
+
end
|
64
100
|
end
|
65
101
|
|
66
102
|
def replace_automatic_generated_ids_terms
|
67
|
-
xmldoc.xpath("//term").each.with_object({}) do |
|
68
|
-
normalize_id_and_memorize(
|
103
|
+
r = xmldoc.xpath("//term").each.with_object({}) do |n, res|
|
104
|
+
normalize_id_and_memorize(n, res, "./preferred", "term")
|
105
|
+
end
|
106
|
+
s = xmldoc.xpath("//definitions//dt").each.with_object({}) do |n, res|
|
107
|
+
normalize_id_and_memorize(n, res, ".", "symbol")
|
69
108
|
end
|
109
|
+
{ term: r, symbol: s }
|
70
110
|
end
|
71
111
|
|
72
|
-
def normalize_id_and_memorize(
|
73
|
-
term_text = normalize_ref_id(
|
74
|
-
unless AUTOMATIC_GENERATED_ID_REGEXP.match(
|
75
|
-
|
76
|
-
|
112
|
+
def normalize_id_and_memorize(node, res_table, text_selector, prefix)
|
113
|
+
term_text = normalize_ref_id(node.at(text_selector).text)
|
114
|
+
unless AUTOMATIC_GENERATED_ID_REGEXP.match(node["id"]).nil? &&
|
115
|
+
!node["id"].nil?
|
116
|
+
id = unique_text_id(term_text, prefix)
|
117
|
+
node["id"] = id
|
77
118
|
@idhash[id] = true
|
78
119
|
end
|
79
|
-
res_table[term_text] =
|
120
|
+
res_table[term_text] = node["id"]
|
80
121
|
end
|
81
122
|
|
82
123
|
def normalize_ref_id(text)
|
83
124
|
text.downcase.gsub(/[[:space:]]/, "-")
|
84
125
|
end
|
85
126
|
|
86
|
-
def unique_text_id(text)
|
87
|
-
unless @idhash["
|
88
|
-
return "
|
127
|
+
def unique_text_id(text, prefix)
|
128
|
+
unless @idhash["#{prefix}-#{text}"]
|
129
|
+
return "#{prefix}-#{text}"
|
89
130
|
end
|
90
131
|
|
91
132
|
(1..Float::INFINITY).lazy.each do |index|
|
92
|
-
unless @idhash["
|
93
|
-
break("
|
133
|
+
unless @idhash["#{prefix}-#{text}-#{index}"]
|
134
|
+
break("#{prefix}-#{text}-#{index}")
|
94
135
|
end
|
95
136
|
end
|
96
137
|
end
|