metanorma-ietf 3.3.0 → 3.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/isodoc/ietf/blocks.rb +20 -32
- data/lib/isodoc/ietf/cleanup.rb +16 -175
- data/lib/isodoc/ietf/cleanup_blocks.rb +174 -0
- data/lib/isodoc/ietf/front.rb +200 -199
- data/lib/isodoc/ietf/inline.rb +8 -7
- data/lib/isodoc/ietf/section.rb +48 -48
- data/lib/metanorma/ietf/basicdoc.rng +3 -0
- data/lib/metanorma/ietf/blocks.rb +5 -1
- data/lib/metanorma/ietf/ietf.rng +20 -1
- data/lib/metanorma/ietf/isodoc.rng +4 -1
- data/lib/metanorma/ietf/version.rb +1 -1
- data/lib/relaton/render/config.yml +2 -1
- data/lib/relaton/render/parse.rb +40 -5
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb82c80628bb536b66d81ab800e691b8ba7418613d0e3674b62f7484c2187028
|
4
|
+
data.tar.gz: 6e9756870cdc1fa2c030fc96ee568da30029337a9391262753b43b5dcb84f477
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5045596c0a83e68133982e66d2bb906fb70aa17f54443bdfcaea250465014d6b7239ce21b3266bc772ce5da7b74840791b031b1b9faedf46c014644d4b792550
|
7
|
+
data.tar.gz: 06c35297096cd876d320a625737a9243d093752415e2fa6d4f3a2e83c09c79e51279b62ddbcc36e09cf818bc1195ef41201c4b69dd573a8b31c8de4512642abf
|
data/lib/isodoc/ietf/blocks.rb
CHANGED
@@ -4,6 +4,7 @@ module IsoDoc
|
|
4
4
|
def para_attrs(node)
|
5
5
|
{ keepWithNext: node["keep-with-next"],
|
6
6
|
keepWithPrevious: node["keep-with-previous"],
|
7
|
+
indent: node["indent"],
|
7
8
|
anchor: node["id"] }
|
8
9
|
end
|
9
10
|
|
@@ -18,10 +19,9 @@ module IsoDoc
|
|
18
19
|
node.xpath(ns("./note")).each { |n| parse(n, out) }
|
19
20
|
end
|
20
21
|
|
21
|
-
# NOTE ignoring "bare" attribute, which is tantamount to "empty"
|
22
22
|
def ul_attrs(node)
|
23
|
-
{ anchor: node["id"],
|
24
|
-
|
23
|
+
{ anchor: node["id"], empty: node["nobullet"],
|
24
|
+
indent: node["indent"], bare: node["bare"],
|
25
25
|
spacing: node["spacing"] }
|
26
26
|
end
|
27
27
|
|
@@ -45,10 +45,9 @@ module IsoDoc
|
|
45
45
|
|
46
46
|
def ol_attrs(node)
|
47
47
|
{ anchor: node["id"],
|
48
|
-
spacing: node["spacing"],
|
48
|
+
spacing: node["spacing"], indent: node["indent"],
|
49
49
|
type: ol_style(node["type"]),
|
50
|
-
group: node["group"],
|
51
|
-
start: node["start"] }
|
50
|
+
group: node["group"], start: node["start"] }
|
52
51
|
end
|
53
52
|
|
54
53
|
def ol_parse(node, out)
|
@@ -58,25 +57,20 @@ module IsoDoc
|
|
58
57
|
end
|
59
58
|
|
60
59
|
def dl_attrs(node)
|
61
|
-
attr_code(anchor: node["id"],
|
62
|
-
|
63
|
-
indent: node["indent"],
|
64
|
-
spacing: node["spacing"])
|
60
|
+
attr_code(anchor: node["id"], newline: node["newline"],
|
61
|
+
indent: node["indent"], spacing: node["spacing"])
|
65
62
|
end
|
66
63
|
|
67
64
|
def dt_parse(dterm, term)
|
68
|
-
if dterm.elements.empty?
|
69
|
-
|
70
|
-
else
|
71
|
-
dterm.children.each { |n| parse(n, term) }
|
65
|
+
if dterm.elements.empty? then term << dterm.text
|
66
|
+
else dterm.children.each { |n| parse(n, term) }
|
72
67
|
end
|
73
68
|
end
|
74
69
|
|
75
70
|
def note_label(node)
|
76
71
|
n = @xrefs.get[node["id"]]
|
77
|
-
|
78
|
-
|
79
|
-
|
72
|
+
n.nil? || n[:label].nil? || n[:label].empty? and
|
73
|
+
return l10n("#{@i18n.note}: ")
|
80
74
|
l10n("#{@i18n.note} #{n[:label]}: ")
|
81
75
|
end
|
82
76
|
|
@@ -103,8 +97,7 @@ module IsoDoc
|
|
103
97
|
div.t **attr_code(anchor: node["id"], keepWithNext: "true") do |p|
|
104
98
|
lbl = if n.nil? || n[:label].nil? || n[:label].empty?
|
105
99
|
@i18n.example
|
106
|
-
else
|
107
|
-
l10n("#{@i18n.example} #{n[:label]}")
|
100
|
+
else l10n("#{@i18n.example} #{n[:label]}")
|
108
101
|
end
|
109
102
|
p << lbl
|
110
103
|
name and !lbl.nil? and p << ": "
|
@@ -155,8 +148,7 @@ module IsoDoc
|
|
155
148
|
end
|
156
149
|
|
157
150
|
def formula_where(dlist, out)
|
158
|
-
|
159
|
-
|
151
|
+
dlist or return
|
160
152
|
out.t { |p| p << @i18n.where }
|
161
153
|
parse(dlist, out)
|
162
154
|
end
|
@@ -174,15 +166,14 @@ module IsoDoc
|
|
174
166
|
formula_parse1(node, out)
|
175
167
|
formula_where(node.at(ns("./dl")), out)
|
176
168
|
node.children.each do |n|
|
177
|
-
|
178
|
-
|
169
|
+
%w(stem dl).include? n.name and next
|
179
170
|
parse(n, out)
|
180
171
|
end
|
181
172
|
end
|
182
173
|
|
183
174
|
def quote_attribution(node)
|
184
|
-
author = node
|
185
|
-
source = node
|
175
|
+
author = node.at(ns("./author"))&.text
|
176
|
+
source = node.at(ns("./source/@uri"))&.text
|
186
177
|
attr_code(quotedFrom: author, cite: source)
|
187
178
|
end
|
188
179
|
|
@@ -197,8 +188,7 @@ module IsoDoc
|
|
197
188
|
def admonition_name(node, type)
|
198
189
|
name = node&.at(ns("./name")) and return name
|
199
190
|
name = Nokogiri::XML::Node.new("name", node.document)
|
200
|
-
|
201
|
-
|
191
|
+
type && @i18n.admonition[type] or return
|
202
192
|
name << @i18n.admonition[type]&.upcase
|
203
193
|
name
|
204
194
|
end
|
@@ -230,8 +220,7 @@ module IsoDoc
|
|
230
220
|
end
|
231
221
|
|
232
222
|
def figure_name_parse(_node, div, name)
|
233
|
-
|
234
|
-
|
223
|
+
name.nil? and return
|
235
224
|
div.name do |_n|
|
236
225
|
name.children.each { |n| parse(n, div) }
|
237
226
|
end
|
@@ -242,9 +231,8 @@ module IsoDoc
|
|
242
231
|
end
|
243
232
|
|
244
233
|
def figure_parse(node, out)
|
245
|
-
|
246
|
-
|
247
|
-
|
234
|
+
node["class"] == "pseudocode" || node["type"] == "pseudocode" and
|
235
|
+
return pseudocode_parse(node, out)
|
248
236
|
@in_figure = true
|
249
237
|
out.figure **attr_code(anchor: node["id"]) do |div|
|
250
238
|
figure_name_parse(node, div, node.at(ns("./name")))
|
data/lib/isodoc/ietf/cleanup.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative "cleanup_inline"
|
2
|
+
require_relative "cleanup_blocks"
|
2
3
|
|
3
4
|
module IsoDoc
|
4
5
|
module Ietf
|
@@ -21,20 +22,32 @@ module IsoDoc
|
|
21
22
|
end
|
22
23
|
|
23
24
|
def biblio_cleanup(xmldoc)
|
25
|
+
biblio_referencegroup_cleanup(xmldoc)
|
24
26
|
biblio_abstract_cleanup(xmldoc)
|
25
27
|
biblio_date_cleanup(xmldoc)
|
26
28
|
biblio_refcontent_cleanup(xmldoc)
|
27
29
|
annotation_cleanup(xmldoc)
|
28
30
|
end
|
29
31
|
|
32
|
+
def biblio_referencegroup_cleanup(xmldoc)
|
33
|
+
xmldoc.xpath("//reference[ref-included]").each do |r|
|
34
|
+
r.name = "referencegroup"
|
35
|
+
r.elements.each do |e|
|
36
|
+
if e.name == "ref-included"
|
37
|
+
e.name = "reference"
|
38
|
+
e["anchor"] ||= "_#{UUIDTools::UUID.random_create}"
|
39
|
+
else e.remove
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
30
45
|
def biblio_date_cleanup(xmldoc)
|
31
46
|
xmldoc.xpath("//date[@cleanme]").each do |a|
|
32
47
|
a.delete("cleanme")
|
33
48
|
d = @c.decode(a.text).gsub(/–/, "-").sub(/-\d\d\d\d.*$/, "")
|
34
49
|
if attrs = date_attr(d)
|
35
|
-
attrs.each
|
36
|
-
a[k] = v
|
37
|
-
end
|
50
|
+
attrs.each { |k, v| a[k] = v }
|
38
51
|
a.children.remove
|
39
52
|
else a.remove end
|
40
53
|
end
|
@@ -67,14 +80,6 @@ module IsoDoc
|
|
67
80
|
end.join
|
68
81
|
end
|
69
82
|
|
70
|
-
def li_cleanup(xmldoc)
|
71
|
-
xmldoc.xpath("//li[t]").each do |li|
|
72
|
-
next unless li.elements.size == 1
|
73
|
-
|
74
|
-
li.children = li.elements[0].children
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
83
|
def front_cleanup(xmldoc)
|
79
84
|
xmldoc.xpath("//title").each { |s| s.children = s.text }
|
80
85
|
xmldoc.xpath("//reference/front[not(author)]").each do |f|
|
@@ -82,170 +87,6 @@ module IsoDoc
|
|
82
87
|
insert.next = "<author surname='Unknown'/>"
|
83
88
|
end
|
84
89
|
end
|
85
|
-
|
86
|
-
def table_footnote_cleanup(docxml)
|
87
|
-
docxml.xpath("//table[descendant::fn]").each do |t|
|
88
|
-
t.xpath(".//fn").each do |a|
|
89
|
-
t << "<aside>#{a.remove.children}</aside>"
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
def figure_footnote_cleanup(docxml)
|
95
|
-
docxml.xpath("//figure[descendant::fn]").each do |t|
|
96
|
-
t.xpath(".//fn").each do |a|
|
97
|
-
t << "<aside>#{a.remove.children}</aside>"
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def table_cleanup(docxml)
|
103
|
-
table_footnote_cleanup(docxml)
|
104
|
-
end
|
105
|
-
|
106
|
-
def figure_cleanup(docxml)
|
107
|
-
figure_postamble(docxml)
|
108
|
-
figure_unnest(docxml)
|
109
|
-
figure_footnote_cleanup(docxml)
|
110
|
-
figure_data_uri(docxml)
|
111
|
-
end
|
112
|
-
|
113
|
-
def figure_data_uri(docxml)
|
114
|
-
docxml.xpath("//artwork").each do |a|
|
115
|
-
%r{^data:image/svg\+xml;base64}.match?(a["src"]) or next
|
116
|
-
f = Vectory::Utils::save_dataimage(a["src"])
|
117
|
-
a.delete("src")
|
118
|
-
a.children = File.read(f).sub(%r{<\?.+\?>}, "")
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
def figure_unnest(docxml)
|
123
|
-
docxml.xpath("//figure[descendant::figure]").each do |f|
|
124
|
-
insert = f
|
125
|
-
f.xpath(".//figure").each do |a|
|
126
|
-
title = f.at("./name") and a.children.first.previous = title.remove
|
127
|
-
insert.next = a.remove
|
128
|
-
insert = insert.next_element
|
129
|
-
end
|
130
|
-
f.remove
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
def figure_postamble(docxml)
|
135
|
-
make_postamble(docxml)
|
136
|
-
move_postamble(docxml)
|
137
|
-
move_preamble(docxml)
|
138
|
-
end
|
139
|
-
|
140
|
-
def make_postamble(docxml)
|
141
|
-
docxml.xpath("//figure").each do |f|
|
142
|
-
a = f.at("./artwork | ./sourcecode") || next
|
143
|
-
name = f.at("./name")&.remove
|
144
|
-
b = a.xpath("./preceding-sibling::*")&.remove
|
145
|
-
c = a.xpath("./following-sibling::*")&.remove
|
146
|
-
a = a.remove
|
147
|
-
name and f << name
|
148
|
-
b.empty? or f << "<preamble>#{to_xml(b)}</preamble>"
|
149
|
-
a and f << a
|
150
|
-
c.empty? or f << "<postamble>#{to_xml(c)}</postamble>"
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
def move_postamble(docxml)
|
155
|
-
docxml.xpath("//postamble").each do |p|
|
156
|
-
insert = p.parent
|
157
|
-
p.remove.elements.each do |e|
|
158
|
-
insert.next = e
|
159
|
-
insert = insert.next_element
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
def move_preamble(docxml)
|
165
|
-
docxml.xpath("//preamble").each do |p|
|
166
|
-
insert = p.parent
|
167
|
-
p.remove.elements.each do |e|
|
168
|
-
insert.previous = e
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
# for markup in pseudocode
|
174
|
-
def sourcecode_cleanup(docxml)
|
175
|
-
docxml.xpath("//sourcecode").each do |s|
|
176
|
-
s.children = to_xml(s.children).gsub(%r{<br/>\n}, "\n")
|
177
|
-
.gsub(%r{\s+(<t[ >])}, "\\1").gsub(%r{</t>\s+}, "</t>")
|
178
|
-
sourcecode_remove_markup(s)
|
179
|
-
s.children = "<![CDATA[#{HTMLEntities.new.decode(to_xml(s
|
180
|
-
.children).sub(/\A\n+/, ''))}]]>"
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
def sourcecode_remove_markup(node)
|
185
|
-
node.traverse do |n|
|
186
|
-
next if n.text?
|
187
|
-
next if %w(name callout annotation note sourcecode).include? n.name
|
188
|
-
|
189
|
-
case n.name
|
190
|
-
when "br" then n.replace("\n")
|
191
|
-
when "t" then n.replace("\n\n#{n.children}")
|
192
|
-
else
|
193
|
-
n.replace(n.children)
|
194
|
-
end
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
def annotation_cleanup(docxml)
|
199
|
-
docxml.xpath("//reference").each do |r|
|
200
|
-
while r.next_element&.name == "aside"
|
201
|
-
annotation_cleanup1(r)
|
202
|
-
end
|
203
|
-
end
|
204
|
-
docxml.xpath("//references/aside").each(&:remove)
|
205
|
-
end
|
206
|
-
|
207
|
-
def annotation_cleanup1(ref)
|
208
|
-
aside = ref.next_element
|
209
|
-
aside.name = "annotation"
|
210
|
-
aside.traverse do |n|
|
211
|
-
n.name == "t" and n.replace(n.children)
|
212
|
-
end
|
213
|
-
ref << aside
|
214
|
-
end
|
215
|
-
|
216
|
-
def deflist_cleanup(docxml)
|
217
|
-
dt_cleanup(docxml)
|
218
|
-
dd_cleanup(docxml)
|
219
|
-
end
|
220
|
-
|
221
|
-
def dt_cleanup(docxml)
|
222
|
-
docxml.xpath("//dt").each do |d|
|
223
|
-
d.first_element_child&.name == "bookmark" and
|
224
|
-
d["anchor"] ||= d.first_element_child["anchor"]
|
225
|
-
d.xpath(".//t").each do |t|
|
226
|
-
d["anchor"] ||= t["anchor"]
|
227
|
-
t.replace(t.children)
|
228
|
-
end
|
229
|
-
end
|
230
|
-
end
|
231
|
-
|
232
|
-
def dd_cleanup(docxml)
|
233
|
-
docxml.xpath("//dd").each do |d|
|
234
|
-
d&.first_element_child&.name == "bookmark" and
|
235
|
-
d["anchor"] ||= d.first_element_child["anchor"]
|
236
|
-
end
|
237
|
-
end
|
238
|
-
|
239
|
-
def aside_cleanup(docxml)
|
240
|
-
docxml.xpath("//*[aside]").each do |p|
|
241
|
-
%w(section).include?(p.name) and next
|
242
|
-
insert = p
|
243
|
-
p.xpath("./aside").each do |a|
|
244
|
-
insert.next = a.remove
|
245
|
-
insert = insert.next_element
|
246
|
-
end
|
247
|
-
end
|
248
|
-
end
|
249
90
|
end
|
250
91
|
end
|
251
92
|
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
module IsoDoc
|
2
|
+
module Ietf
|
3
|
+
class RfcConvert < ::IsoDoc::Convert
|
4
|
+
def li_cleanup(xmldoc)
|
5
|
+
xmldoc.xpath("//li[t]").each do |li|
|
6
|
+
li.elements.size == 1 or next
|
7
|
+
li.children = li.elements[0].children
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def table_footnote_cleanup(docxml)
|
12
|
+
docxml.xpath("//table[descendant::fn]").each do |t|
|
13
|
+
t.xpath(".//fn").each do |a|
|
14
|
+
t << "<aside>#{a.remove.children}</aside>"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def figure_footnote_cleanup(docxml)
|
20
|
+
docxml.xpath("//figure[descendant::fn]").each do |t|
|
21
|
+
t.xpath(".//fn").each do |a|
|
22
|
+
t << "<aside>#{a.remove.children}</aside>"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def table_cleanup(docxml)
|
28
|
+
table_footnote_cleanup(docxml)
|
29
|
+
end
|
30
|
+
|
31
|
+
def figure_cleanup(docxml)
|
32
|
+
figure_postamble(docxml)
|
33
|
+
figure_unnest(docxml)
|
34
|
+
figure_footnote_cleanup(docxml)
|
35
|
+
figure_data_uri(docxml)
|
36
|
+
end
|
37
|
+
|
38
|
+
def figure_data_uri(docxml)
|
39
|
+
docxml.xpath("//artwork").each do |a|
|
40
|
+
%r{^data:image/svg\+xml;base64}.match?(a["src"]) or next
|
41
|
+
f = Vectory::Utils::save_dataimage(a["src"])
|
42
|
+
a.delete("src")
|
43
|
+
a.children = File.read(f).sub(%r{<\?.+\?>}, "")
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def figure_unnest(docxml)
|
48
|
+
docxml.xpath("//figure[descendant::figure]").each do |f|
|
49
|
+
insert = f
|
50
|
+
f.xpath(".//figure").each do |a|
|
51
|
+
title = f.at("./name") and a.children.first.previous = title.remove
|
52
|
+
insert.next = a.remove
|
53
|
+
insert = insert.next_element
|
54
|
+
end
|
55
|
+
f.remove
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def figure_postamble(docxml)
|
60
|
+
make_postamble(docxml)
|
61
|
+
move_postamble(docxml)
|
62
|
+
move_preamble(docxml)
|
63
|
+
end
|
64
|
+
|
65
|
+
def make_postamble(docxml)
|
66
|
+
docxml.xpath("//figure").each do |f|
|
67
|
+
a = f.at("./artwork | ./sourcecode") || next
|
68
|
+
name = f.at("./name")&.remove
|
69
|
+
b = a.xpath("./preceding-sibling::*")&.remove
|
70
|
+
c = a.xpath("./following-sibling::*")&.remove
|
71
|
+
a = a.remove
|
72
|
+
name and f << name
|
73
|
+
b.empty? or f << "<preamble>#{to_xml(b)}</preamble>"
|
74
|
+
a and f << a
|
75
|
+
c.empty? or f << "<postamble>#{to_xml(c)}</postamble>"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def move_postamble(docxml)
|
80
|
+
docxml.xpath("//postamble").each do |p|
|
81
|
+
insert = p.parent
|
82
|
+
p.remove.elements.each do |e|
|
83
|
+
insert.next = e
|
84
|
+
insert = insert.next_element
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def move_preamble(docxml)
|
90
|
+
docxml.xpath("//preamble").each do |p|
|
91
|
+
insert = p.parent
|
92
|
+
p.remove.elements.each do |e|
|
93
|
+
insert.previous = e
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# for markup in pseudocode
|
99
|
+
def sourcecode_cleanup(docxml)
|
100
|
+
docxml.xpath("//sourcecode").each do |s|
|
101
|
+
s.children = to_xml(s.children).gsub(%r{<br/>\n}, "\n")
|
102
|
+
.gsub(%r{\s+(<t[ >])}, "\\1").gsub(%r{</t>\s+}, "</t>")
|
103
|
+
sourcecode_remove_markup(s)
|
104
|
+
s.children = "<![CDATA[#{@c.decode(to_xml(s.children)
|
105
|
+
.sub(/\A\n+/, ''))}]]>"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def sourcecode_remove_markup(node)
|
110
|
+
node.traverse do |n|
|
111
|
+
n.text? and next
|
112
|
+
%w(name callout annotation note sourcecode).include? n.name and next
|
113
|
+
case n.name
|
114
|
+
when "br" then n.replace("\n")
|
115
|
+
when "t" then n.replace("\n\n#{n.children}")
|
116
|
+
else n.replace(n.children)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def annotation_cleanup(docxml)
|
122
|
+
docxml.xpath("//reference").each do |r|
|
123
|
+
while r.next_element&.name == "aside"
|
124
|
+
annotation_cleanup1(r)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
docxml.xpath("//references/aside").each(&:remove)
|
128
|
+
end
|
129
|
+
|
130
|
+
def annotation_cleanup1(ref)
|
131
|
+
aside = ref.next_element
|
132
|
+
aside.name = "annotation"
|
133
|
+
aside.traverse do |n|
|
134
|
+
n.name == "t" and n.replace(n.children)
|
135
|
+
end
|
136
|
+
ref << aside
|
137
|
+
end
|
138
|
+
|
139
|
+
def deflist_cleanup(docxml)
|
140
|
+
dt_cleanup(docxml)
|
141
|
+
dd_cleanup(docxml)
|
142
|
+
end
|
143
|
+
|
144
|
+
def dt_cleanup(docxml)
|
145
|
+
docxml.xpath("//dt").each do |d|
|
146
|
+
d.first_element_child&.name == "bookmark" and
|
147
|
+
d["anchor"] ||= d.first_element_child["anchor"]
|
148
|
+
d.xpath(".//t").each do |t|
|
149
|
+
d["anchor"] ||= t["anchor"]
|
150
|
+
t.replace(t.children)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def dd_cleanup(docxml)
|
156
|
+
docxml.xpath("//dd").each do |d|
|
157
|
+
d&.first_element_child&.name == "bookmark" and
|
158
|
+
d["anchor"] ||= d.first_element_child["anchor"]
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def aside_cleanup(docxml)
|
163
|
+
docxml.xpath("//*[aside]").each do |p|
|
164
|
+
%w(section).include?(p.name) and next
|
165
|
+
insert = p
|
166
|
+
p.xpath("./aside").each do |a|
|
167
|
+
insert.next = a.remove
|
168
|
+
insert = insert.next_element
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|