metanorma-ietf 2.4.2 → 2.5.0.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.
@@ -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 if %w(author organization street city region code country
23
- postalLine email seriesInfo title%).include? n.parent
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