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.
@@ -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
- <text/>
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
- <ref name="BasicBlock"/>
197
+ <choice>
198
+ <ref name="BasicBlock"/>
199
+ <ref name="component"/>
200
+ </choice>
180
201
  </oneOrMore>
181
202
  </define>
182
203
  <define name="ObligationType">
@@ -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")) and c.name do |div|
201
- name.children.each { |n| parse(n, div) }
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
@@ -1,254 +1,199 @@
1
- module IsoDoc::Ietf
2
- class RfcConvert < ::IsoDoc::Convert
3
- def cleanup(docxml)
4
- image_cleanup(docxml)
5
- figure_cleanup(docxml)
6
- table_cleanup(docxml)
7
- footnote_cleanup(docxml)
8
- sourcecode_cleanup(docxml)
9
- annotation_cleanup(docxml)
10
- li_cleanup(docxml)
11
- deflist_cleanup(docxml)
12
- bookmark_cleanup(docxml)
13
- aside_cleanup(docxml)
14
- front_cleanup(docxml)
15
- u_cleanup(docxml)
16
- docxml
17
- end
18
-
19
- def u_cleanup(xmldoc)
20
- xmldoc.traverse do |n|
21
- next unless n.text?
22
- next unless %w(t blockquote li dd preamble td th annotation)
23
- .include? n.parent.name
24
-
25
- n.replace(n.text.gsub(/[\u0080-\uffff]/, "<u>\\0</u>"))
26
- end
27
- end
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
- def front_cleanup(xmldoc)
38
- xmldoc.xpath("//title").each { |s| s.children = s.text }
39
- xmldoc.xpath("//reference/front[not(author)]").each do |f|
40
- insert = f.at("./seriesInfo[last()]") || f.at("./title")
41
- insert.next = "<author surname='Unknown'/>"
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
- def table_footnote_cleanup(docxml)
46
- docxml.xpath("//table[descendant::fn]").each do |t|
47
- t.xpath(".//fn").each do |a|
48
- t << "<aside>#{a.remove.children}</aside>"
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
- def figure_footnote_cleanup(docxml)
54
- docxml.xpath("//figure[descendant::fn]").each do |t|
55
- t.xpath(".//fn").each do |a|
56
- t << "<aside>#{a.remove.children}</aside>"
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
- f = Metanorma::Utils::save_dataimage(a["src"])
77
- a.delete("src")
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
- def figure_unnest(docxml)
83
- docxml.xpath("//figure[descendant::figure]").each do |f|
84
- insert = f
85
- f.xpath(".//figure").each do |a|
86
- title = f.at("./name") and a.children.first.previous = title.remove
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
- def figure_postamble(docxml)
95
- make_postamble(docxml)
96
- move_postamble(docxml)
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
- def make_postamble(docxml)
101
- docxml.xpath("//figure").each do |f|
102
- a = f&.at("./artwork | ./sourcecode") || next
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
- def move_preamble(docxml)
125
- docxml.xpath("//preamble").each do |p|
126
- insert = p.parent
127
- p.remove.elements.each do |e|
128
- insert.previous = e
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
- def footnote_cleanup(docxml)
134
- fn = footnote_refs_cleanup(docxml)
135
- endnotes = make_endnotes(docxml)
136
- docxml.xpath("//section[descendant::fn] | "\
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
- def footnote_refs_cleanup(docxml)
146
- i = 0
147
- fn = {}
148
- docxml.xpath("//fnref").each do |f|
149
- unless fn[f.text]
150
- i = i + 1
151
- fn[f.text] = i.to_s
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
- unless endnotes = docxml.at("//back")
162
- docxml << "<back/>" and endnotes = docxml.at("//back")
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
- def image_cleanup(docxml)
169
- docxml.xpath("//t[descendant::artwork]").each do |t|
170
- insert = t
171
- t.xpath(".//artwork").each_with_index do |a, i|
172
- insert.next = a.dup
173
- insert = insert.next
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
- # for markup in pseudocode
180
- def sourcecode_cleanup(docxml)
181
- docxml.xpath("//sourcecode").each do |s|
182
- s.children = s.children.to_xml.gsub(%r{<br/>\n}, "\n")
183
- .gsub(%r{\s+(<t[ >])}, "\\1").gsub(%r{</t>\s+}, "</t>")
184
- sourcecode_remove_markup(s)
185
- s.children = "<![CDATA[#{HTMLEntities.new.decode(s
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
- def sourcecode_remove_markup(node)
191
- node.traverse do |n|
192
- next if n.text?
193
- next if %w(name callout annotation note sourcecode).include? n.name
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
- case n.name
196
- when "br" then n.replace("\n")
197
- when "t" then n.replace("\n\n#{n.children}")
198
- else
199
- n.replace(n.children)
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
- def annotation_cleanup(docxml)
205
- docxml.xpath("//reference").each do |r|
206
- next unless r&.next_element&.name == "aside"
152
+ def annotation_cleanup(docxml)
153
+ docxml.xpath("//reference").each do |r|
154
+ next unless r&.next_element&.name == "aside"
207
155
 
208
- aside = r.next_element
209
- aside.name = "annotation"
210
- aside.traverse do |n|
211
- n.name == "t" and n.replace(n.children)
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
- r << aside
163
+ docxml.xpath("//references/aside").each(&:remove)
214
164
  end
215
- docxml.xpath("//references/aside").each(&:remove)
216
- end
217
165
 
218
- def deflist_cleanup(docxml)
219
- dt_cleanup(docxml)
220
- dd_cleanup(docxml)
221
- end
166
+ def deflist_cleanup(docxml)
167
+ dt_cleanup(docxml)
168
+ dd_cleanup(docxml)
169
+ end
222
170
 
223
- def dt_cleanup(docxml)
224
- docxml.xpath("//dt").each do |d|
225
- d&.first_element_child&.name == "bookmark" and
226
- d["anchor"] ||= d.first_element_child["anchor"]
227
- d.xpath(".//t").each do |t|
228
- d["anchor"] ||= t["anchor"]
229
- t.replace(t.children)
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
- def dd_cleanup(docxml)
235
- docxml.xpath("//dd").each do |d|
236
- d&.first_element_child&.name == "bookmark" and
237
- d["anchor"] ||= d.first_element_child["anchor"]
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
- def aside_cleanup(docxml)
246
- docxml.xpath("//t[descendant::aside] | //table[descendant::aside] | "\
247
- "//figure[descendant::aside]").each do |p|
248
- insert = p
249
- p.xpath(".//aside").each do |a|
250
- insert.next = a.remove
251
- insert = insert.next_element
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