metanorma-standoc 1.3.29 → 1.4.0
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/.gitignore +1 -0
- data/lib/asciidoctor/standoc/base.rb +2 -25
- data/lib/asciidoctor/standoc/biblio.rng +13 -3
- data/lib/asciidoctor/standoc/blocks.rb +20 -17
- data/lib/asciidoctor/standoc/cleanup.rb +2 -0
- data/lib/asciidoctor/standoc/cleanup_block.rb +2 -2
- data/lib/asciidoctor/standoc/cleanup_section.rb +8 -125
- data/lib/asciidoctor/standoc/cleanup_terms.rb +134 -0
- data/lib/asciidoctor/standoc/datamodel/attributes_table_preprocessor.rb +57 -0
- data/lib/asciidoctor/standoc/datamodel/diagram_preprocessor.rb +102 -0
- data/lib/asciidoctor/standoc/datamodel/plantuml_renderer.rb +408 -0
- data/lib/asciidoctor/standoc/inline.rb +10 -5
- data/lib/asciidoctor/standoc/isodoc.rng +17 -1
- data/lib/asciidoctor/standoc/macros.rb +13 -8
- data/lib/asciidoctor/standoc/macros_yaml2text.rb +19 -13
- data/lib/asciidoctor/standoc/ref.rb +13 -56
- data/lib/asciidoctor/standoc/ref_sect.rb +124 -0
- data/lib/asciidoctor/standoc/section.rb +2 -46
- data/lib/asciidoctor/standoc/views/datamodel/model_representation.adoc.erb +30 -0
- data/lib/asciidoctor/standoc/views/datamodel/plantuml_representation.adoc.erb +20 -0
- data/lib/metanorma/standoc/version.rb +1 -1
- data/metanorma-standoc.gemspec +1 -1
- data/spec/asciidoctor-standoc/cleanup_spec.rb +51 -0
- data/spec/asciidoctor-standoc/datamodel/attributes_table_preprocessor_spec.rb +76 -0
- data/spec/asciidoctor-standoc/datamodel/diagram_preprocessor_spec.rb +72 -0
- data/spec/asciidoctor-standoc/inline_spec.rb +5 -1
- data/spec/asciidoctor-standoc/macros_spec.rb +50 -0
- data/spec/asciidoctor-standoc/macros_yaml2text_spec.rb +2 -1
- data/spec/asciidoctor-standoc/refs_spec.rb +0 -4
- data/spec/examples/datamodel/address_class_profile.adoc +4 -0
- data/spec/examples/datamodel/address_component_profile.adoc +4 -0
- data/spec/examples/datamodel/common_models_diagram.adoc +4 -0
- data/spec/examples/datamodel/models/models/AddressClassProfile.yml +90 -0
- data/spec/examples/datamodel/models/models/AddressComponentProfile.yml +63 -0
- data/spec/examples/datamodel/models/models/AddressComponentSpecification.yml +15 -0
- data/spec/examples/datamodel/models/models/AddressProfile.yml +36 -0
- data/spec/examples/datamodel/models/models/AttributeProfile.yml +32 -0
- data/spec/examples/datamodel/models/models/InterchangeAddressClassProfile.yml +79 -0
- data/spec/examples/datamodel/models/models/Localization copy.yml +23 -0
- data/spec/examples/datamodel/models/models/Localization.yml +23 -0
- data/spec/examples/datamodel/models/models/ProfileCompliantAddress.yml +36 -0
- data/spec/examples/datamodel/models/models/ProfileCompliantAddressComponent.yml +15 -0
- data/spec/examples/datamodel/models/models/Signature copy.yml +20 -0
- data/spec/examples/datamodel/models/models/Signature.yml +20 -0
- data/spec/examples/datamodel/models/models/TextDirectionCode copy.yml +16 -0
- data/spec/examples/datamodel/models/models/TextDirectionCode.yml +16 -0
- data/spec/examples/datamodel/models/models/Validity.yml +14 -0
- data/spec/examples/datamodel/models/models/iso19160-1/Address.yml +22 -0
- data/spec/examples/datamodel/models/models/iso19160-1/AddressComponent.yml +2 -0
- data/spec/examples/datamodel/models/style.uml.inc +37 -0
- data/spec/examples/datamodel/models/views/CommonModels.yml +9 -0
- data/spec/examples/datamodel/models/views/TopDown.yml +62 -0
- data/spec/examples/datamodel/top_down_diagram.adoc +4 -0
- data/spec/fixtures/macros_datamodel/address_class_profile.xml +149 -0
- data/spec/fixtures/macros_datamodel/address_component_profile.xml +71 -0
- data/spec/fixtures/macros_datamodel/common_models_diagram.xml +7 -0
- data/spec/fixtures/macros_datamodel/top_down_diagram.xml +7 -0
- data/spec/spec_helper.rb +13 -2
- data/spec/vcr_cassettes/dated_iso_ref_joint_iso_iec.yml +66 -66
- data/spec/vcr_cassettes/isobib_get_123.yml +36 -36
- data/spec/vcr_cassettes/isobib_get_123_2001.yml +16 -16
- data/spec/vcr_cassettes/isobib_get_124.yml +17 -17
- data/spec/vcr_cassettes/rfcbib_get_rfc8341.yml +8 -8
- data/spec/vcr_cassettes/separates_iev_citations_by_top_level_clause.yml +41 -38
- metadata +41 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1e86d9135fffb1f112db82f9d052632aa36f134a76b03ff48e65dcb841c7cbb4
|
4
|
+
data.tar.gz: ea05dff988ebaf6b51c029d99cbadd195300c3c524acd301157a335257436c01
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: beead161e217dba5841732200aa8cb897900ea90b1a449f092fe63ffe40ca59a6b904b098affd1a475723ac4663ba5dadd09fdab48b661376c4fe659360c79a4
|
7
|
+
data.tar.gz: 43b697f04165938864eab22a1d4d49613adef7ae1703995a5541018fe438f09ff21dd43e37e25ebeab9a0d514b50f64b64d2a8a47c8836b924d4578b9f076d19
|
data/.gitignore
CHANGED
@@ -15,6 +15,8 @@ module Asciidoctor
|
|
15
15
|
XML_NAMESPACE = "https://www.metanorma.org/ns/standoc".freeze
|
16
16
|
|
17
17
|
Asciidoctor::Extensions.register do
|
18
|
+
preprocessor Asciidoctor::Standoc::Datamodel::AttributesTablePreprocessor
|
19
|
+
preprocessor Asciidoctor::Standoc::Datamodel::DiagramPreprocessor
|
18
20
|
preprocessor Asciidoctor::Standoc::Yaml2TextPreprocessor
|
19
21
|
inline_macro Asciidoctor::Standoc::AltTermInlineMacro
|
20
22
|
inline_macro Asciidoctor::Standoc::DeprecatedTermInlineMacro
|
@@ -125,31 +127,6 @@ module Asciidoctor
|
|
125
127
|
i18n_init(lang, script)
|
126
128
|
end
|
127
129
|
|
128
|
-
def init_bib_caches(node)
|
129
|
-
return if @no_isobib
|
130
|
-
global = !@no_isobib_cache && !node.attr("local-cache-only")
|
131
|
-
local = node.attr("local-cache") || node.attr("local-cache-only")
|
132
|
-
local = nil if @no_isobib_cache
|
133
|
-
@bibdb = Relaton::DbCache.init_bib_caches(
|
134
|
-
local_cache: local,
|
135
|
-
flush_caches: node.attr("flush-caches"),
|
136
|
-
global_cache: global)
|
137
|
-
end
|
138
|
-
|
139
|
-
def init_iev_caches(node)
|
140
|
-
unless (@no_isobib_cache || @no_isobib)
|
141
|
-
node.attr("local-cache-only") or
|
142
|
-
@iev_globalname = global_ievcache_name
|
143
|
-
@iev_localname = local_ievcache_name(node.attr("local-cache") ||
|
144
|
-
node.attr("local-cache-only"))
|
145
|
-
if node.attr("flush-caches")
|
146
|
-
FileUtils.rm_f @iev_globalname unless @iev_globalname.nil?
|
147
|
-
FileUtils.rm_f @iev_localname unless @iev_localname.nil?
|
148
|
-
end
|
149
|
-
end
|
150
|
-
#@iev = Iev::Db.new(globalname, localname) unless @no_isobib
|
151
|
-
end
|
152
|
-
|
153
130
|
def default_fonts(node)
|
154
131
|
b = node.attr("body-font") ||
|
155
132
|
(node.attr("script") == "Hans" ? '"SimSun",serif' :
|
@@ -661,9 +661,9 @@
|
|
661
661
|
<optional>
|
662
662
|
<ref name="status"/>
|
663
663
|
</optional>
|
664
|
-
<
|
664
|
+
<zeroOrMore>
|
665
665
|
<ref name="copyright"/>
|
666
|
-
</
|
666
|
+
</zeroOrMore>
|
667
667
|
<zeroOrMore>
|
668
668
|
<ref name="docrelation"/>
|
669
669
|
</zeroOrMore>
|
@@ -1021,7 +1021,17 @@
|
|
1021
1021
|
<optional>
|
1022
1022
|
<ref name="to"/>
|
1023
1023
|
</optional>
|
1024
|
-
<
|
1024
|
+
<oneOrMore>
|
1025
|
+
<ref name="owner"/>
|
1026
|
+
</oneOrMore>
|
1027
|
+
<optional>
|
1028
|
+
<ref name="copyright_scope"/>
|
1029
|
+
</optional>
|
1030
|
+
</element>
|
1031
|
+
</define>
|
1032
|
+
<define name="copyright_scope">
|
1033
|
+
<element name="scope">
|
1034
|
+
<text/>
|
1025
1035
|
</element>
|
1026
1036
|
</define>
|
1027
1037
|
<define name="from">
|
@@ -21,15 +21,21 @@ module Asciidoctor
|
|
21
21
|
subsequence: node.attr("subsequence") )
|
22
22
|
end
|
23
23
|
|
24
|
+
def termnote_attr(node)
|
25
|
+
attr_code(id_attr(node).merge(
|
26
|
+
"keep-separate": node.attr("keep-separate")))
|
27
|
+
end
|
28
|
+
|
24
29
|
def note_attr(node)
|
25
|
-
attr_code(id_attr(node).merge(
|
30
|
+
attr_code(id_attr(node).merge(
|
31
|
+
"keep-separate": node.attr("keep-separate"),
|
32
|
+
beforeclauses: node.attr("beforeclauses") == "true" ? "true" : nil))
|
26
33
|
end
|
27
34
|
|
28
35
|
# We append each contained block to its parent
|
29
36
|
def open(node)
|
30
37
|
role = node.role || node.attr("style")
|
31
|
-
Utils::reqt_subpart(role) and
|
32
|
-
return requirement_subpart(node)
|
38
|
+
Utils::reqt_subpart(role) and return requirement_subpart(node)
|
33
39
|
result = []
|
34
40
|
node.blocks.each do |b|
|
35
41
|
result << send(b.context, b)
|
@@ -53,18 +59,16 @@ module Asciidoctor
|
|
53
59
|
|
54
60
|
# NOTE: html escaping is performed by Nokogiri
|
55
61
|
def stem(node)
|
56
|
-
stem_content = node.lines.join("\n")
|
57
62
|
noko do |xml|
|
58
63
|
xml.formula **formula_attr(node) do |s|
|
59
|
-
stem_parse(
|
64
|
+
stem_parse(node.lines.join("\n"), s, node.style.to_sym)
|
60
65
|
end
|
61
66
|
end
|
62
67
|
end
|
63
68
|
|
64
69
|
def sidebar_attrs(node)
|
65
70
|
todo_attrs(node).merge(attr_code(
|
66
|
-
from: node.attr("from"),
|
67
|
-
to: node.attr("to") || node.attr("from") ))
|
71
|
+
from: node.attr("from"), to: node.attr("to") || node.attr("from") ))
|
68
72
|
end
|
69
73
|
|
70
74
|
def sidebar(node)
|
@@ -95,7 +99,7 @@ module Asciidoctor
|
|
95
99
|
|
96
100
|
def termnote(n)
|
97
101
|
noko do |xml|
|
98
|
-
xml.termnote **
|
102
|
+
xml.termnote **termnote_attr(n) do |ex|
|
99
103
|
wrap_in_para(n, ex)
|
100
104
|
end
|
101
105
|
end.join("\n")
|
@@ -111,12 +115,11 @@ module Asciidoctor
|
|
111
115
|
|
112
116
|
def admonition_attrs(node)
|
113
117
|
name = node.attr("name")
|
114
|
-
|
115
|
-
|
116
|
-
name = t if type.casecmp(t).zero?
|
117
|
-
end
|
118
|
+
a = node.attr("type") and ["danger", "safety precautions"].each do |t|
|
119
|
+
name = t if a.casecmp(t).zero?
|
118
120
|
end
|
119
|
-
attr_code(id: Utils::anchor_or_uuid(node), type: name
|
121
|
+
attr_code(id: Utils::anchor_or_uuid(node), type: name,
|
122
|
+
beforeclauses: node.attr("beforeclauses") == "true" ? "true" : nil)
|
120
123
|
end
|
121
124
|
|
122
125
|
def admonition(node)
|
@@ -149,6 +152,8 @@ module Asciidoctor
|
|
149
152
|
end
|
150
153
|
|
151
154
|
def pseudocode_example(node)
|
155
|
+
# prevent A's and other subs inappropriate for pseudocode
|
156
|
+
node.blocks.each { |b| b.remove_sub(:replacements) }
|
152
157
|
noko do |xml|
|
153
158
|
xml.figure **id_unnum_attr(node).merge(class: "pseudocode") do |ex|
|
154
159
|
figure_title(node, ex)
|
@@ -189,8 +194,7 @@ module Asciidoctor
|
|
189
194
|
end
|
190
195
|
|
191
196
|
def para_attrs(node)
|
192
|
-
attr_code(align: node.attr("align"),
|
193
|
-
id: Utils::anchor_or_uuid(node))
|
197
|
+
attr_code(align: node.attr("align"), id: Utils::anchor_or_uuid(node))
|
194
198
|
end
|
195
199
|
|
196
200
|
def paragraph(node)
|
@@ -213,9 +217,8 @@ module Asciidoctor
|
|
213
217
|
s << m[:text]
|
214
218
|
end
|
215
219
|
end
|
216
|
-
|
220
|
+
node.attr("attribution") and
|
217
221
|
out.author { |a| a << node.attr("attribution") }
|
218
|
-
end
|
219
222
|
end
|
220
223
|
|
221
224
|
def quote(node)
|
@@ -7,6 +7,7 @@ require_relative "./cleanup_footnotes.rb"
|
|
7
7
|
require_relative "./cleanup_ref.rb"
|
8
8
|
require_relative "./cleanup_boilerplate.rb"
|
9
9
|
require_relative "./cleanup_section.rb"
|
10
|
+
require_relative "./cleanup_terms.rb"
|
10
11
|
require_relative "./cleanup_inline.rb"
|
11
12
|
require "relaton_iev"
|
12
13
|
|
@@ -39,6 +40,7 @@ module Asciidoctor
|
|
39
40
|
figure_cleanup(xmldoc)
|
40
41
|
ref_cleanup(xmldoc)
|
41
42
|
note_cleanup(xmldoc)
|
43
|
+
clausebefore_cleanup(xmldoc)
|
42
44
|
ref_dl_cleanup(xmldoc)
|
43
45
|
normref_cleanup(xmldoc)
|
44
46
|
biblio_cleanup(xmldoc)
|
@@ -147,7 +147,7 @@ module Asciidoctor
|
|
147
147
|
|
148
148
|
def requirement_inherit(x)
|
149
149
|
x.xpath("//requirement | //recommendation | //permission").each do |r|
|
150
|
-
ins = r.at("./classification") ||
|
150
|
+
ins = r.at("./classification") ||
|
151
151
|
r.at("./description | ./measurementtarget | ./specification | "\
|
152
152
|
"./verification | ./import | ./description | ./requirement | "\
|
153
153
|
"./recommendation | ./permission")
|
@@ -158,7 +158,7 @@ module Asciidoctor
|
|
158
158
|
def requirement_descriptions(x)
|
159
159
|
x.xpath("//requirement | //recommendation | //permission").each do |r|
|
160
160
|
r.children.each do |e|
|
161
|
-
unless e.element? && (Utils::reqt_subpart(e.name) ||
|
161
|
+
unless e.element? && (Utils::reqt_subpart(e.name) ||
|
162
162
|
%w(requirement recommendation permission).include?(e.name))
|
163
163
|
t = Nokogiri::XML::Element.new("description", x)
|
164
164
|
e.before(t)
|
@@ -138,133 +138,16 @@ module Asciidoctor
|
|
138
138
|
end
|
139
139
|
end
|
140
140
|
|
141
|
-
def
|
142
|
-
xmldoc.
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
t.children = a.remove
|
147
|
-
parent.replace(t)
|
148
|
-
end
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
def termdomain_cleanup(xmldoc)
|
153
|
-
xmldoc.xpath("//p/domain").each do |a|
|
154
|
-
prev = a.parent.previous
|
155
|
-
prev.next = a.remove
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
def termdomain1_cleanup(xmldoc)
|
160
|
-
xmldoc.xpath("//domain").each do |d|
|
161
|
-
defn = d.at("../definition") and
|
162
|
-
defn.previous = d.remove
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
def termdefinition_cleanup(xmldoc)
|
167
|
-
xmldoc.xpath("//term").each do |d|
|
168
|
-
first_child = d.at("./p | ./figure | ./formula") || next
|
169
|
-
t = Nokogiri::XML::Element.new("definition", xmldoc)
|
170
|
-
first_child.replace(t)
|
171
|
-
t << first_child.remove
|
172
|
-
d.xpath("./p | ./figure | ./formula").each { |n| t << n.remove }
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
def termdef_unnest_cleanup(xmldoc)
|
177
|
-
# release termdef tags from surrounding paras
|
178
|
-
nodes = xmldoc.xpath("//p/admitted | //p/deprecates")
|
179
|
-
while !nodes.empty?
|
180
|
-
nodes[0].parent.replace(nodes[0].parent.children)
|
181
|
-
nodes = xmldoc.xpath("//p/admitted | //p/deprecates")
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
def termdef_boilerplate_cleanup(xmldoc)
|
186
|
-
xmldoc.xpath("//terms/p | //terms/ul").each(&:remove)
|
187
|
-
end
|
188
|
-
|
189
|
-
def termdef_subclause_cleanup(xmldoc)
|
190
|
-
xmldoc.xpath("//terms[terms]").each { |t| t.name = "clause" }
|
191
|
-
end
|
192
|
-
|
193
|
-
def termdocsource_cleanup(xmldoc)
|
194
|
-
f = xmldoc.at("//preface | //sections")
|
195
|
-
xmldoc.xpath("//termdocsource").each do |s|
|
196
|
-
f.previous = s.remove
|
141
|
+
def clausebefore_cleanup(xmldoc)
|
142
|
+
return unless xmldoc.at("//sections")
|
143
|
+
unless ins = xmldoc.at("//sections").children.first
|
144
|
+
xmldoc.at("//sections") << " "
|
145
|
+
ins = xmldoc.at("//sections").children.first
|
197
146
|
end
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
xmldoc.xpath("//term").each do |t|
|
202
|
-
t.xpath("./termnote").each { |n| t << n.remove }
|
203
|
-
t.xpath("./termexample").each { |n| t << n.remove }
|
204
|
-
t.xpath("./termsource").each { |n| t << n.remove }
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
def termdef_from_termbase(xmldoc)
|
209
|
-
xmldoc.xpath("//term").each do |x|
|
210
|
-
if c = x.at("./origin/termref") and !x.at("./definition")
|
211
|
-
x.at("./origin").previous = fetch_termbase(c["base"], c.text)
|
212
|
-
end
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
def termdef_cleanup(xmldoc)
|
217
|
-
termdef_from_termbase(xmldoc)
|
218
|
-
termdef_unnest_cleanup(xmldoc)
|
219
|
-
termdef_stem_cleanup(xmldoc)
|
220
|
-
termdomain_cleanup(xmldoc)
|
221
|
-
termdefinition_cleanup(xmldoc)
|
222
|
-
termdomain1_cleanup(xmldoc)
|
223
|
-
termdef_boilerplate_cleanup(xmldoc)
|
224
|
-
termdef_subclause_cleanup(xmldoc)
|
225
|
-
term_children_cleanup(xmldoc)
|
226
|
-
termdocsource_cleanup(xmldoc)
|
227
|
-
end
|
228
|
-
|
229
|
-
# Indices sort after letter but before any following
|
230
|
-
# letter (x, x_m, x_1, xa); we use colon to force that sort order.
|
231
|
-
# Numbers sort *after* letters; we use thorn to force that sort order.
|
232
|
-
def symbol_key(x)
|
233
|
-
key = x.dup
|
234
|
-
key.traverse do |n|
|
235
|
-
next unless n.name == "math"
|
236
|
-
n.replace(grkletters(MathML2AsciiMath.m2a(n.to_xml)))
|
237
|
-
end
|
238
|
-
ret = Nokogiri::XML(key.to_xml)
|
239
|
-
HTMLEntities.new.decode(ret.text).
|
240
|
-
gsub(/[\[\]\{\}<>\(\)]/, "").strip.
|
241
|
-
gsub(/[[:punct]]|[_^]/, ":\\0").gsub(/`/, "").
|
242
|
-
gsub(/[0-9]+/, "þ\\0")
|
243
|
-
end
|
244
|
-
|
245
|
-
def grkletters(x)
|
246
|
-
x.gsub(/\b(alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega)\b/i, "&\\1;")
|
247
|
-
end
|
248
|
-
|
249
|
-
def extract_symbols_list(dl)
|
250
|
-
dl_out = []
|
251
|
-
dl.xpath("./dt | ./dd").each do |dtd|
|
252
|
-
if dtd.name == "dt"
|
253
|
-
dl_out << { dt: dtd.remove, key: symbol_key(dtd) }
|
254
|
-
else
|
255
|
-
dl_out.last[:dd] = dtd.remove
|
256
|
-
end
|
257
|
-
end
|
258
|
-
dl_out
|
259
|
-
end
|
260
|
-
|
261
|
-
def symbols_cleanup(docxml)
|
262
|
-
docxml.xpath("//definitions/dl").each do |dl|
|
263
|
-
dl_out = extract_symbols_list(dl)
|
264
|
-
dl_out.sort! { |a, b| a[:key] <=> b[:key] || a[:dt] <=> b[:dt] }
|
265
|
-
dl.children = dl_out.map { |d| d[:dt].to_s + d[:dd].to_s }.join("\n")
|
147
|
+
xmldoc.xpath("//*[@beforeclauses = 'true']").each do |x|
|
148
|
+
x.delete("beforeclauses")
|
149
|
+
ins.previous = x.remove
|
266
150
|
end
|
267
|
-
docxml
|
268
151
|
end
|
269
152
|
end
|
270
153
|
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
module Asciidoctor
|
2
|
+
module Standoc
|
3
|
+
module Cleanup
|
4
|
+
def termdef_stem_cleanup(xmldoc)
|
5
|
+
xmldoc.xpath("//term/p/stem").each do |a|
|
6
|
+
if a.parent.elements.size == 1 # para contains just a stem expression
|
7
|
+
t = Nokogiri::XML::Element.new("admitted", xmldoc)
|
8
|
+
parent = a.parent
|
9
|
+
t.children = a.remove
|
10
|
+
parent.replace(t)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def termdomain_cleanup(xmldoc)
|
16
|
+
xmldoc.xpath("//p/domain").each do |a|
|
17
|
+
prev = a.parent.previous
|
18
|
+
prev.next = a.remove
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def termdomain1_cleanup(xmldoc)
|
23
|
+
xmldoc.xpath("//domain").each do |d|
|
24
|
+
defn = d.at("../definition") and
|
25
|
+
defn.previous = d.remove
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def termdefinition_cleanup(xmldoc)
|
30
|
+
xmldoc.xpath("//term").each do |d|
|
31
|
+
first_child = d.at("./p | ./figure | ./formula") || next
|
32
|
+
t = Nokogiri::XML::Element.new("definition", xmldoc)
|
33
|
+
first_child.replace(t)
|
34
|
+
t << first_child.remove
|
35
|
+
d.xpath("./p | ./figure | ./formula").each { |n| t << n.remove }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def termdef_unnest_cleanup(xmldoc)
|
40
|
+
# release termdef tags from surrounding paras
|
41
|
+
nodes = xmldoc.xpath("//p/admitted | //p/deprecates")
|
42
|
+
while !nodes.empty?
|
43
|
+
nodes[0].parent.replace(nodes[0].parent.children)
|
44
|
+
nodes = xmldoc.xpath("//p/admitted | //p/deprecates")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def termdef_boilerplate_cleanup(xmldoc)
|
49
|
+
xmldoc.xpath("//terms/p | //terms/ul").each(&:remove)
|
50
|
+
end
|
51
|
+
|
52
|
+
def termdef_subclause_cleanup(xmldoc)
|
53
|
+
xmldoc.xpath("//terms[terms]").each { |t| t.name = "clause" }
|
54
|
+
end
|
55
|
+
|
56
|
+
def termdocsource_cleanup(xmldoc)
|
57
|
+
f = xmldoc.at("//preface | //sections")
|
58
|
+
xmldoc.xpath("//termdocsource").each do |s|
|
59
|
+
f.previous = s.remove
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def term_children_cleanup(xmldoc)
|
64
|
+
xmldoc.xpath("//term").each do |t|
|
65
|
+
t.xpath("./termnote").each { |n| t << n.remove }
|
66
|
+
t.xpath("./termexample").each { |n| t << n.remove }
|
67
|
+
t.xpath("./termsource").each { |n| t << n.remove }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def termdef_from_termbase(xmldoc)
|
72
|
+
xmldoc.xpath("//term").each do |x|
|
73
|
+
if c = x.at("./origin/termref") and !x.at("./definition")
|
74
|
+
x.at("./origin").previous = fetch_termbase(c["base"], c.text)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def termdef_cleanup(xmldoc)
|
80
|
+
termdef_from_termbase(xmldoc)
|
81
|
+
termdef_unnest_cleanup(xmldoc)
|
82
|
+
termdef_stem_cleanup(xmldoc)
|
83
|
+
termdomain_cleanup(xmldoc)
|
84
|
+
termdefinition_cleanup(xmldoc)
|
85
|
+
termdomain1_cleanup(xmldoc)
|
86
|
+
termdef_boilerplate_cleanup(xmldoc)
|
87
|
+
termdef_subclause_cleanup(xmldoc)
|
88
|
+
term_children_cleanup(xmldoc)
|
89
|
+
termdocsource_cleanup(xmldoc)
|
90
|
+
end
|
91
|
+
|
92
|
+
# Indices sort after letter but before any following
|
93
|
+
# letter (x, x_m, x_1, xa); we use colon to force that sort order.
|
94
|
+
# Numbers sort *after* letters; we use thorn to force that sort order.
|
95
|
+
def symbol_key(x)
|
96
|
+
key = x.dup
|
97
|
+
key.traverse do |n|
|
98
|
+
next unless n.name == "math"
|
99
|
+
n.replace(grkletters(MathML2AsciiMath.m2a(n.to_xml)))
|
100
|
+
end
|
101
|
+
ret = Nokogiri::XML(key.to_xml)
|
102
|
+
HTMLEntities.new.decode(ret.text).
|
103
|
+
gsub(/[\[\]\{\}<>\(\)]/, "").strip.
|
104
|
+
gsub(/[[:punct]]|[_^]/, ":\\0").gsub(/`/, "").
|
105
|
+
gsub(/[0-9]+/, "þ\\0")
|
106
|
+
end
|
107
|
+
|
108
|
+
def grkletters(x)
|
109
|
+
x.gsub(/\b(alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega)\b/i, "&\\1;")
|
110
|
+
end
|
111
|
+
|
112
|
+
def extract_symbols_list(dl)
|
113
|
+
dl_out = []
|
114
|
+
dl.xpath("./dt | ./dd").each do |dtd|
|
115
|
+
if dtd.name == "dt"
|
116
|
+
dl_out << { dt: dtd.remove, key: symbol_key(dtd) }
|
117
|
+
else
|
118
|
+
dl_out.last[:dd] = dtd.remove
|
119
|
+
end
|
120
|
+
end
|
121
|
+
dl_out
|
122
|
+
end
|
123
|
+
|
124
|
+
def symbols_cleanup(docxml)
|
125
|
+
docxml.xpath("//definitions/dl").each do |dl|
|
126
|
+
dl_out = extract_symbols_list(dl)
|
127
|
+
dl_out.sort! { |a, b| a[:key] <=> b[:key] || a[:dt] <=> b[:dt] }
|
128
|
+
dl.children = dl_out.map { |d| d[:dt].to_s + d[:dd].to_s }.join("\n")
|
129
|
+
end
|
130
|
+
docxml
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|