metanorma-ietf 2.4.3 → 2.5.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/ietf/basicdoc.rng +21 -4
- data/lib/asciidoctor/ietf/cleanup.rb +2 -0
- data/lib/asciidoctor/ietf/ietf.rng +9 -24
- data/lib/asciidoctor/ietf/isodoc.rng +446 -77
- data/lib/asciidoctor/ietf/reqt.rng +23 -2
- data/lib/isodoc/ietf/blocks.rb +3 -2
- data/lib/isodoc/ietf/cleanup.rb +148 -203
- data/lib/isodoc/ietf/cleanup_inline.rb +76 -0
- data/lib/isodoc/ietf/reqt.rb +63 -59
- data/lib/isodoc/ietf/rfc_convert.rb +2 -0
- data/lib/isodoc/ietf/terms.rb +52 -45
- data/lib/metanorma/ietf/version.rb +1 -1
- data/metanorma-ietf.gemspec +2 -4
- metadata +7 -34
@@ -58,6 +58,14 @@
|
|
58
58
|
<optional>
|
59
59
|
<attribute name="type"/>
|
60
60
|
</optional>
|
61
|
+
<optional>
|
62
|
+
<attribute name="tag"/>
|
63
|
+
</optional>
|
64
|
+
<optional>
|
65
|
+
<attribute name="multilingual-rendering">
|
66
|
+
<ref name="MultilingualRenderingType"/>
|
67
|
+
</attribute>
|
68
|
+
</optional>
|
61
69
|
<optional>
|
62
70
|
<ref name="reqtitle"/>
|
63
71
|
</optional>
|
@@ -101,7 +109,9 @@
|
|
101
109
|
</define>
|
102
110
|
<define name="label">
|
103
111
|
<element name="label">
|
104
|
-
<
|
112
|
+
<oneOrMore>
|
113
|
+
<ref name="TextElement"/>
|
114
|
+
</oneOrMore>
|
105
115
|
</element>
|
106
116
|
</define>
|
107
117
|
<define name="subject">
|
@@ -175,8 +185,19 @@
|
|
175
185
|
<data type="boolean"/>
|
176
186
|
</attribute>
|
177
187
|
</optional>
|
188
|
+
<optional>
|
189
|
+
<attribute name="tag"/>
|
190
|
+
</optional>
|
191
|
+
<optional>
|
192
|
+
<attribute name="multilingual-rendering">
|
193
|
+
<ref name="MultilingualRenderingType"/>
|
194
|
+
</attribute>
|
195
|
+
</optional>
|
178
196
|
<oneOrMore>
|
179
|
-
<
|
197
|
+
<choice>
|
198
|
+
<ref name="BasicBlock"/>
|
199
|
+
<ref name="component"/>
|
200
|
+
</choice>
|
180
201
|
</oneOrMore>
|
181
202
|
</define>
|
182
203
|
<define name="ObligationType">
|
data/lib/isodoc/ietf/blocks.rb
CHANGED
@@ -197,8 +197,9 @@ module IsoDoc
|
|
197
197
|
def review_note_parse(node, out)
|
198
198
|
out.cref **attr_code(anchor: node["id"], display: node["display"],
|
199
199
|
source: node["reviewer"]) do |c|
|
200
|
-
name = node.at(ns("./name"))
|
201
|
-
name.children.each { |n| parse(n,
|
200
|
+
if name = node.at(ns("./name"))
|
201
|
+
name.children.each { |n| parse(n, c) }
|
202
|
+
c << " "
|
202
203
|
end
|
203
204
|
node.children.each { |n| parse(n, c) unless n.name == "name" }
|
204
205
|
end
|
data/lib/isodoc/ietf/cleanup.rb
CHANGED
@@ -1,254 +1,199 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
def li_cleanup(xmldoc)
|
30
|
-
xmldoc.xpath("//li[t]").each do |li|
|
31
|
-
next unless li.elements.size == 1
|
32
|
-
|
33
|
-
li.children = li.elements[0].children
|
1
|
+
require_relative "cleanup_inline"
|
2
|
+
|
3
|
+
module IsoDoc
|
4
|
+
module Ietf
|
5
|
+
class RfcConvert < ::IsoDoc::Convert
|
6
|
+
def cleanup(docxml)
|
7
|
+
image_cleanup(docxml)
|
8
|
+
figure_cleanup(docxml)
|
9
|
+
table_cleanup(docxml)
|
10
|
+
footnote_cleanup(docxml)
|
11
|
+
sourcecode_cleanup(docxml)
|
12
|
+
annotation_cleanup(docxml)
|
13
|
+
li_cleanup(docxml)
|
14
|
+
deflist_cleanup(docxml)
|
15
|
+
bookmark_cleanup(docxml)
|
16
|
+
cref_cleanup(docxml)
|
17
|
+
aside_cleanup(docxml)
|
18
|
+
front_cleanup(docxml)
|
19
|
+
u_cleanup(docxml)
|
20
|
+
docxml
|
21
|
+
end
|
22
|
+
|
23
|
+
def li_cleanup(xmldoc)
|
24
|
+
xmldoc.xpath("//li[t]").each do |li|
|
25
|
+
next unless li.elements.size == 1
|
26
|
+
|
27
|
+
li.children = li.elements[0].children
|
28
|
+
end
|
34
29
|
end
|
35
|
-
end
|
36
30
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
31
|
+
def front_cleanup(xmldoc)
|
32
|
+
xmldoc.xpath("//title").each { |s| s.children = s.text }
|
33
|
+
xmldoc.xpath("//reference/front[not(author)]").each do |f|
|
34
|
+
insert = f.at("./seriesInfo[last()]") || f.at("./title")
|
35
|
+
insert.next = "<author surname='Unknown'/>"
|
36
|
+
end
|
42
37
|
end
|
43
|
-
end
|
44
38
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
39
|
+
def table_footnote_cleanup(docxml)
|
40
|
+
docxml.xpath("//table[descendant::fn]").each do |t|
|
41
|
+
t.xpath(".//fn").each do |a|
|
42
|
+
t << "<aside>#{a.remove.children}</aside>"
|
43
|
+
end
|
49
44
|
end
|
50
45
|
end
|
51
|
-
end
|
52
46
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
47
|
+
def figure_footnote_cleanup(docxml)
|
48
|
+
docxml.xpath("//figure[descendant::fn]").each do |t|
|
49
|
+
t.xpath(".//fn").each do |a|
|
50
|
+
t << "<aside>#{a.remove.children}</aside>"
|
51
|
+
end
|
57
52
|
end
|
58
53
|
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def table_cleanup(docxml)
|
62
|
-
table_footnote_cleanup(docxml)
|
63
|
-
end
|
64
|
-
|
65
|
-
def figure_cleanup(docxml)
|
66
|
-
figure_postamble(docxml)
|
67
|
-
figure_unnest(docxml)
|
68
|
-
figure_footnote_cleanup(docxml)
|
69
|
-
figure_data_uri(docxml)
|
70
|
-
end
|
71
|
-
|
72
|
-
def figure_data_uri(docxml)
|
73
|
-
docxml.xpath("//artwork").each do |a|
|
74
|
-
next unless %r{^data:image/svg\+xml;base64}.match?(a["src"])
|
75
54
|
|
76
|
-
|
77
|
-
|
78
|
-
a.children = File.read(f).sub(%r{<\?.+\?>}, "")
|
55
|
+
def table_cleanup(docxml)
|
56
|
+
table_footnote_cleanup(docxml)
|
79
57
|
end
|
80
|
-
end
|
81
58
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
insert.next = a.remove
|
88
|
-
insert = insert.next_element
|
89
|
-
end
|
90
|
-
f.remove
|
59
|
+
def figure_cleanup(docxml)
|
60
|
+
figure_postamble(docxml)
|
61
|
+
figure_unnest(docxml)
|
62
|
+
figure_footnote_cleanup(docxml)
|
63
|
+
figure_data_uri(docxml)
|
91
64
|
end
|
92
|
-
end
|
93
65
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
move_preamble(docxml)
|
98
|
-
end
|
66
|
+
def figure_data_uri(docxml)
|
67
|
+
docxml.xpath("//artwork").each do |a|
|
68
|
+
next unless %r{^data:image/svg\+xml;base64}.match?(a["src"])
|
99
69
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
name = f&.at("./name")&.remove
|
104
|
-
b = a&.xpath("./preceding-sibling::*")&.remove
|
105
|
-
c = a&.xpath("./following-sibling::*")&.remove
|
106
|
-
a = a.remove
|
107
|
-
name and f << name
|
108
|
-
b.empty? or f << "<preamble>#{b.to_xml}</preamble>"
|
109
|
-
a and f << a
|
110
|
-
c.empty? or f << "<postamble>#{c.to_xml}</postamble>"
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
def move_postamble(docxml)
|
115
|
-
docxml.xpath("//postamble").each do |p|
|
116
|
-
insert = p.parent
|
117
|
-
p.remove.elements.each do |e|
|
118
|
-
insert.next = e
|
119
|
-
insert = insert.next_element
|
70
|
+
f = Metanorma::Utils::save_dataimage(a["src"])
|
71
|
+
a.delete("src")
|
72
|
+
a.children = File.read(f).sub(%r{<\?.+\?>}, "")
|
120
73
|
end
|
121
74
|
end
|
122
|
-
end
|
123
75
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
76
|
+
def figure_unnest(docxml)
|
77
|
+
docxml.xpath("//figure[descendant::figure]").each do |f|
|
78
|
+
insert = f
|
79
|
+
f.xpath(".//figure").each do |a|
|
80
|
+
title = f.at("./name") and a.children.first.previous = title.remove
|
81
|
+
insert.next = a.remove
|
82
|
+
insert = insert.next_element
|
83
|
+
end
|
84
|
+
f.remove
|
129
85
|
end
|
130
86
|
end
|
131
|
-
end
|
132
87
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
"//abstract[descendant::fn]").each do |s|
|
138
|
-
s.xpath(".//fn").each do |f|
|
139
|
-
ref = f.at(".//ref") and ref.replace("[#{fn[ref.text]}] ")
|
140
|
-
endnotes << f.remove.children
|
141
|
-
end
|
88
|
+
def figure_postamble(docxml)
|
89
|
+
make_postamble(docxml)
|
90
|
+
move_postamble(docxml)
|
91
|
+
move_preamble(docxml)
|
142
92
|
end
|
143
|
-
end
|
144
93
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
94
|
+
def make_postamble(docxml)
|
95
|
+
docxml.xpath("//figure").each do |f|
|
96
|
+
a = f&.at("./artwork | ./sourcecode") || next
|
97
|
+
name = f&.at("./name")&.remove
|
98
|
+
b = a&.xpath("./preceding-sibling::*")&.remove
|
99
|
+
c = a&.xpath("./following-sibling::*")&.remove
|
100
|
+
a = a.remove
|
101
|
+
name and f << name
|
102
|
+
b.empty? or f << "<preamble>#{b.to_xml}</preamble>"
|
103
|
+
a and f << a
|
104
|
+
c.empty? or f << "<postamble>#{c.to_xml}</postamble>"
|
152
105
|
end
|
153
|
-
f.replace(" [#{fn[f.text]}]")
|
154
106
|
end
|
155
|
-
fn
|
156
|
-
end
|
157
|
-
|
158
|
-
def make_endnotes(docxml)
|
159
|
-
return unless docxml.at("//fn")
|
160
107
|
|
161
|
-
|
162
|
-
docxml
|
108
|
+
def move_postamble(docxml)
|
109
|
+
docxml.xpath("//postamble").each do |p|
|
110
|
+
insert = p.parent
|
111
|
+
p.remove.elements.each do |e|
|
112
|
+
insert.next = e
|
113
|
+
insert = insert.next_element
|
114
|
+
end
|
115
|
+
end
|
163
116
|
end
|
164
|
-
endnotes << "<section><name>Endnotes</name></section>"
|
165
|
-
docxml.at("//back/section[last()]")
|
166
|
-
end
|
167
117
|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
a.replace("[IMAGE #{i + 1}]")
|
118
|
+
def move_preamble(docxml)
|
119
|
+
docxml.xpath("//preamble").each do |p|
|
120
|
+
insert = p.parent
|
121
|
+
p.remove.elements.each do |e|
|
122
|
+
insert.previous = e
|
123
|
+
end
|
175
124
|
end
|
176
125
|
end
|
177
|
-
end
|
178
126
|
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
127
|
+
# for markup in pseudocode
|
128
|
+
def sourcecode_cleanup(docxml)
|
129
|
+
docxml.xpath("//sourcecode").each do |s|
|
130
|
+
s.children = s.children.to_xml.gsub(%r{<br/>\n}, "\n")
|
131
|
+
.gsub(%r{\s+(<t[ >])}, "\\1").gsub(%r{</t>\s+}, "</t>")
|
132
|
+
sourcecode_remove_markup(s)
|
133
|
+
s.children = "<![CDATA[#{HTMLEntities.new.decode(s
|
186
134
|
.children.to_xml.sub(/\A\n+/, ''))}]]>"
|
135
|
+
end
|
187
136
|
end
|
188
|
-
end
|
189
137
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
138
|
+
def sourcecode_remove_markup(node)
|
139
|
+
node.traverse do |n|
|
140
|
+
next if n.text?
|
141
|
+
next if %w(name callout annotation note sourcecode).include? n.name
|
194
142
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
143
|
+
case n.name
|
144
|
+
when "br" then n.replace("\n")
|
145
|
+
when "t" then n.replace("\n\n#{n.children}")
|
146
|
+
else
|
147
|
+
n.replace(n.children)
|
148
|
+
end
|
200
149
|
end
|
201
150
|
end
|
202
|
-
end
|
203
151
|
|
204
|
-
|
205
|
-
|
206
|
-
|
152
|
+
def annotation_cleanup(docxml)
|
153
|
+
docxml.xpath("//reference").each do |r|
|
154
|
+
next unless r&.next_element&.name == "aside"
|
207
155
|
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
156
|
+
aside = r.next_element
|
157
|
+
aside.name = "annotation"
|
158
|
+
aside.traverse do |n|
|
159
|
+
n.name == "t" and n.replace(n.children)
|
160
|
+
end
|
161
|
+
r << aside
|
212
162
|
end
|
213
|
-
|
163
|
+
docxml.xpath("//references/aside").each(&:remove)
|
214
164
|
end
|
215
|
-
docxml.xpath("//references/aside").each(&:remove)
|
216
|
-
end
|
217
165
|
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
166
|
+
def deflist_cleanup(docxml)
|
167
|
+
dt_cleanup(docxml)
|
168
|
+
dd_cleanup(docxml)
|
169
|
+
end
|
222
170
|
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
171
|
+
def dt_cleanup(docxml)
|
172
|
+
docxml.xpath("//dt").each do |d|
|
173
|
+
d&.first_element_child&.name == "bookmark" and
|
174
|
+
d["anchor"] ||= d.first_element_child["anchor"]
|
175
|
+
d.xpath(".//t").each do |t|
|
176
|
+
d["anchor"] ||= t["anchor"]
|
177
|
+
t.replace(t.children)
|
178
|
+
end
|
230
179
|
end
|
231
180
|
end
|
232
|
-
end
|
233
181
|
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
182
|
+
def dd_cleanup(docxml)
|
183
|
+
docxml.xpath("//dd").each do |d|
|
184
|
+
d&.first_element_child&.name == "bookmark" and
|
185
|
+
d["anchor"] ||= d.first_element_child["anchor"]
|
186
|
+
end
|
238
187
|
end
|
239
|
-
end
|
240
|
-
|
241
|
-
def bookmark_cleanup(docxml)
|
242
|
-
docxml.xpath("//bookmark").each(&:remove)
|
243
|
-
end
|
244
188
|
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
189
|
+
def aside_cleanup(docxml)
|
190
|
+
docxml.xpath("//t[descendant::aside] | //table[descendant::aside] | "\
|
191
|
+
"//figure[descendant::aside]").each do |p|
|
192
|
+
insert = p
|
193
|
+
p.xpath(".//aside").each do |a|
|
194
|
+
insert.next = a.remove
|
195
|
+
insert = insert.next_element
|
196
|
+
end
|
252
197
|
end
|
253
198
|
end
|
254
199
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module IsoDoc
|
2
|
+
module Ietf
|
3
|
+
class RfcConvert < ::IsoDoc::Convert
|
4
|
+
def u_cleanup(xmldoc)
|
5
|
+
xmldoc.traverse do |n|
|
6
|
+
next unless n.text?
|
7
|
+
next unless %w(t blockquote li dd preamble td th annotation)
|
8
|
+
.include? n.parent.name
|
9
|
+
|
10
|
+
n.replace(n.text.gsub(/[\u0080-\uffff]/, "<u>\\0</u>"))
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def footnote_cleanup(docxml)
|
15
|
+
fn = footnote_refs_cleanup(docxml)
|
16
|
+
endnotes = make_endnotes(docxml)
|
17
|
+
docxml.xpath("//section[descendant::fn] | "\
|
18
|
+
"//abstract[descendant::fn]").each do |s|
|
19
|
+
s.xpath(".//fn").each do |f|
|
20
|
+
ref = f.at(".//ref") and ref.replace("[#{fn[ref.text]}] ")
|
21
|
+
endnotes << f.remove.children
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def footnote_refs_cleanup(docxml)
|
27
|
+
i = 0
|
28
|
+
fn = {}
|
29
|
+
docxml.xpath("//fnref").each do |f|
|
30
|
+
unless fn[f.text]
|
31
|
+
i = i + 1
|
32
|
+
fn[f.text] = i.to_s
|
33
|
+
end
|
34
|
+
f.replace(" [#{fn[f.text]}]")
|
35
|
+
end
|
36
|
+
fn
|
37
|
+
end
|
38
|
+
|
39
|
+
def make_endnotes(docxml)
|
40
|
+
return unless docxml.at("//fn")
|
41
|
+
|
42
|
+
unless endnotes = docxml.at("//back")
|
43
|
+
docxml << "<back/>" and endnotes = docxml.at("//back")
|
44
|
+
end
|
45
|
+
endnotes << "<section><name>Endnotes</name></section>"
|
46
|
+
docxml.at("//back/section[last()]")
|
47
|
+
end
|
48
|
+
|
49
|
+
def image_cleanup(docxml)
|
50
|
+
docxml.xpath("//t[descendant::artwork]").each do |t|
|
51
|
+
insert = t
|
52
|
+
t.xpath(".//artwork").each_with_index do |a, i|
|
53
|
+
insert.next = a.dup
|
54
|
+
insert = insert.next
|
55
|
+
a.replace("[IMAGE #{i + 1}]")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def bookmark_cleanup(docxml)
|
61
|
+
docxml.xpath("//bookmark").each(&:remove)
|
62
|
+
end
|
63
|
+
|
64
|
+
def cref_cleanup(docxml)
|
65
|
+
docxml.xpath("//cref").each do |c|
|
66
|
+
c.xpath("./t").each do |t|
|
67
|
+
t.replace(t.children)
|
68
|
+
end
|
69
|
+
next unless %w(section abstract).include? c.parent.name
|
70
|
+
|
71
|
+
c.wrap("<t></t>")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|