metanorma-ietf 2.0.10 → 2.1.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/.github/workflows/macos.yml +8 -0
- data/.github/workflows/ubuntu.yml +8 -1
- data/.github/workflows/windows.yml +8 -0
- data/Gemfile +1 -1
- data/lib/asciidoctor/ietf/biblio.rng +36 -6
- data/lib/asciidoctor/ietf/blocks.rb +7 -5
- data/lib/asciidoctor/ietf/converter.rb +3 -13
- data/lib/asciidoctor/ietf/ietf.rng +8 -2
- data/lib/asciidoctor/ietf/isodoc.rng +444 -1
- data/lib/asciidoctor/ietf/reqt.rng +23 -0
- data/lib/isodoc/ietf/blocks.rb +21 -10
- data/lib/isodoc/ietf/front.rb +13 -9
- data/lib/isodoc/ietf/inline.rb +6 -2
- data/lib/isodoc/ietf/metadata.rb +9 -17
- data/lib/isodoc/ietf/references.rb +3 -11
- data/lib/isodoc/ietf/reqt.rb +5 -0
- data/lib/isodoc/ietf/rfc_convert.rb +14 -3
- data/lib/isodoc/ietf/section.rb +16 -1
- data/lib/isodoc/ietf/table.rb +2 -2
- data/lib/isodoc/ietf/terms.rb +0 -13
- data/lib/isodoc/ietf/xref.rb +20 -0
- data/lib/metanorma/ietf/processor.rb +16 -8
- data/lib/metanorma/ietf/version.rb +1 -1
- data/metanorma-ietf.gemspec +2 -2
- metadata +11 -11
@@ -30,9 +30,22 @@
|
|
30
30
|
<data type="boolean"/>
|
31
31
|
</attribute>
|
32
32
|
</optional>
|
33
|
+
<optional>
|
34
|
+
<attribute name="number"/>
|
35
|
+
</optional>
|
33
36
|
<optional>
|
34
37
|
<attribute name="subsequence"/>
|
35
38
|
</optional>
|
39
|
+
<optional>
|
40
|
+
<attribute name="keep-with-next">
|
41
|
+
<data type="boolean"/>
|
42
|
+
</attribute>
|
43
|
+
</optional>
|
44
|
+
<optional>
|
45
|
+
<attribute name="keep-lines-together">
|
46
|
+
<data type="boolean"/>
|
47
|
+
</attribute>
|
48
|
+
</optional>
|
36
49
|
<attribute name="id">
|
37
50
|
<data type="ID"/>
|
38
51
|
</attribute>
|
@@ -141,6 +154,16 @@
|
|
141
154
|
<data type="boolean"/>
|
142
155
|
</attribute>
|
143
156
|
</optional>
|
157
|
+
<optional>
|
158
|
+
<attribute name="keep-with-next">
|
159
|
+
<data type="boolean"/>
|
160
|
+
</attribute>
|
161
|
+
</optional>
|
162
|
+
<optional>
|
163
|
+
<attribute name="keep-lines-together">
|
164
|
+
<data type="boolean"/>
|
165
|
+
</attribute>
|
166
|
+
</optional>
|
144
167
|
<oneOrMore>
|
145
168
|
<ref name="BasicBlock"/>
|
146
169
|
</oneOrMore>
|
data/lib/isodoc/ietf/blocks.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module IsoDoc::Ietf
|
2
2
|
class RfcConvert < ::IsoDoc::Convert
|
3
3
|
def para_attrs(node)
|
4
|
-
{ keepWithNext: node["
|
5
|
-
keepWithPrevious: node["
|
4
|
+
{ keepWithNext: node["keep-with-next"],
|
5
|
+
keepWithPrevious: node["keep-with-previous"],
|
6
6
|
anchor: node["id"] }
|
7
7
|
end
|
8
8
|
|
@@ -56,23 +56,25 @@ module IsoDoc::Ietf
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
def
|
59
|
+
def dl_attrs(node)
|
60
60
|
attr_code(anchor: node["id"],
|
61
61
|
newline: node["newline"],
|
62
62
|
indent: node["indent"],
|
63
63
|
spacing: node["spacing"])
|
64
64
|
end
|
65
65
|
|
66
|
-
|
66
|
+
def dt_parse(dt, term)
|
67
67
|
if dt.elements.empty?
|
68
|
-
|
68
|
+
term << dt.text
|
69
69
|
else
|
70
70
|
dt.children.each { |n| parse(n, term) }
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
74
|
def note_label(node)
|
75
|
-
|
75
|
+
n = @xrefs.get[node["id"]]
|
76
|
+
return l10n("#{@note_lbl}: ") if n.nil? || n[:label].nil? || n[:label].empty?
|
77
|
+
l10n("#{@note_lbl} #{n[:label]}: ")
|
76
78
|
end
|
77
79
|
|
78
80
|
def note_parse(node, out)
|
@@ -94,7 +96,7 @@ module IsoDoc::Ietf
|
|
94
96
|
end
|
95
97
|
|
96
98
|
def example_label(node, div, name)
|
97
|
-
n =
|
99
|
+
n = @xrefs.get[node["id"]]
|
98
100
|
div.t **attr_code(anchor: node["id"], keepWithNext: "true") do |p|
|
99
101
|
lbl = (n.nil? || n[:label].nil? || n[:label].empty?) ? @example_lbl :
|
100
102
|
l10n("#{@example_lbl} #{n[:label]}")
|
@@ -112,8 +114,8 @@ module IsoDoc::Ietf
|
|
112
114
|
div.sourcecode **attr_code(type: node["lang"], name: node["filename"],
|
113
115
|
markers: node["markers"],
|
114
116
|
src: node["src"]) do |s|
|
115
|
-
|
116
|
-
|
117
|
+
node.children.each { |x| parse(x, s) unless x.name == "name" }
|
118
|
+
end
|
117
119
|
end
|
118
120
|
end
|
119
121
|
|
@@ -144,12 +146,21 @@ module IsoDoc::Ietf
|
|
144
146
|
def formula_parse1(node, out)
|
145
147
|
out.t **attr_code(anchor: node["id"]) do |p|
|
146
148
|
parse(node.at(ns("./stem")), p)
|
147
|
-
lbl = anchor(node['id'], :label, false)
|
149
|
+
lbl = @xrefs.anchor(node['id'], :label, false)
|
148
150
|
lbl.nil? or
|
149
151
|
p << " (#{lbl})"
|
150
152
|
end
|
151
153
|
end
|
152
154
|
|
155
|
+
def formula_parse(node, out)
|
156
|
+
formula_parse1(node, out)
|
157
|
+
formula_where(node.at(ns("./dl")), out)
|
158
|
+
node.children.each do |n|
|
159
|
+
next if %w(stem dl).include? n.name
|
160
|
+
parse(n, out)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
153
164
|
def quote_attribution(node)
|
154
165
|
author = node&.at(ns("./author"))&.text
|
155
166
|
source = node&.at(ns("./source/@uri"))&.text
|
data/lib/isodoc/ietf/front.rb
CHANGED
@@ -19,16 +19,20 @@ module IsoDoc::Ietf
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def info(isoxml, out)
|
22
|
-
@meta.keywords isoxml, out
|
23
22
|
@meta.areas isoxml, out
|
24
23
|
super
|
25
24
|
end
|
26
25
|
|
26
|
+
def output_if_translit(text)
|
27
|
+
return nil if text.nil?
|
28
|
+
text.transliterate != text ? text.transliterate : nil
|
29
|
+
end
|
30
|
+
|
27
31
|
def title(isoxml, front)
|
28
32
|
title = @meta.get[:doctitle] or return
|
29
33
|
front.title title, **attr_code(abbrev: @meta.get[:docabbrev],
|
30
|
-
ascii: @meta.get[:docascii] ||
|
31
|
-
title
|
34
|
+
ascii: (@meta.get[:docascii] ||
|
35
|
+
output_if_translit(title)))
|
32
36
|
end
|
33
37
|
|
34
38
|
def seriesinfo(isoxml, front)
|
@@ -38,7 +42,7 @@ module IsoDoc::Ietf
|
|
38
42
|
|
39
43
|
def seriesinfo_attr(isoxml)
|
40
44
|
attr_code(value: @meta.get[:docnumber] || "",
|
41
|
-
asciiValue: @meta.get[:docnumber]
|
45
|
+
asciiValue: output_if_translit(@meta.get[:docnumber]),
|
42
46
|
status: @meta.get[:stage],
|
43
47
|
stream: isoxml&.at(ns("//bibdata/series[@type = 'stream']/"\
|
44
48
|
"title"))&.text)
|
@@ -83,9 +87,9 @@ module IsoDoc::Ietf
|
|
83
87
|
|
84
88
|
def pers_author_attrs1(ret, full, init, c)
|
85
89
|
full and ret.merge!(attr_code(
|
86
|
-
asciiFullname: full
|
87
|
-
asciiInitials: init
|
88
|
-
asciiSurname: c&.at(ns("./surname"))
|
90
|
+
asciiFullname: output_if_translit(full),
|
91
|
+
asciiInitials: output_if_translit(init),
|
92
|
+
asciiSurname: output_if_translit(c&.at(ns("./surname")))))
|
89
93
|
ret
|
90
94
|
end
|
91
95
|
|
@@ -114,8 +118,8 @@ module IsoDoc::Ietf
|
|
114
118
|
def organization(org, out, show)
|
115
119
|
name = org.at(ns("./name"))&.text
|
116
120
|
out.organization name, **attr_code(
|
117
|
-
showOnFrontPage: show&.text, ascii: name
|
118
|
-
asciiAbbrev: org
|
121
|
+
showOnFrontPage: show&.text, ascii: output_if_translit(name),
|
122
|
+
asciiAbbrev: output_if_translit(org.at(ns("./abbreviation"))),
|
119
123
|
abbrev: org.at(ns("./abbreviation")))
|
120
124
|
end
|
121
125
|
|
data/lib/isodoc/ietf/inline.rb
CHANGED
@@ -120,11 +120,15 @@ module IsoDoc::Ietf
|
|
120
120
|
|
121
121
|
def eref_parse(node, out)
|
122
122
|
linkend = node.children.reject { |c| %w{locality localityStack}.include? c.name }
|
123
|
+
relative = node["relative"] ||
|
124
|
+
node.at(ns(".//locality[@type = 'anchor']/referenceFrom"))&.text || ""
|
123
125
|
section = eref_clause(node.xpath(ns("./locality | ./localityStack")), nil) || ""
|
126
|
+
section = "" if relative.empty?
|
124
127
|
out.relref **attr_code(target: node["bibitemid"], section: section,
|
128
|
+
relative: relative,
|
125
129
|
displayFormat: node["displayFormat"]) do |l|
|
126
|
-
|
127
|
-
|
130
|
+
linkend.each { |n| parse(n, l) }
|
131
|
+
end
|
128
132
|
end
|
129
133
|
|
130
134
|
def eref_clause(refs, target)
|
data/lib/isodoc/ietf/metadata.rb
CHANGED
@@ -19,14 +19,6 @@ module IsoDoc
|
|
19
19
|
# = item describedby convertedfrom alternate
|
20
20
|
end
|
21
21
|
|
22
|
-
def keywords(isoxml, _out)
|
23
|
-
ret = []
|
24
|
-
isoxml.xpath(ns("//bibdata/keyword")).each do |kw|
|
25
|
-
ret << kw.text
|
26
|
-
end
|
27
|
-
set(:keywords, ret)
|
28
|
-
end
|
29
|
-
|
30
22
|
def areas(isoxml, _out)
|
31
23
|
ret = []
|
32
24
|
isoxml.xpath(ns("//bibdata/ext/area")).each do |kw|
|
@@ -45,18 +37,18 @@ module IsoDoc
|
|
45
37
|
wg(xml)
|
46
38
|
end
|
47
39
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
40
|
+
def wg(xml)
|
41
|
+
workgroups = []
|
42
|
+
xml.xpath(ns("//bibdata/ext/editorialgroup/workgroup")).each do |wg|
|
43
|
+
workgroups << wg.text
|
52
44
|
end
|
53
|
-
|
45
|
+
set(:wg, workgroups)
|
54
46
|
end
|
55
47
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
48
|
+
def doctype(isoxml, _out)
|
49
|
+
super
|
50
|
+
set(:doctype, "Rfc") if get[:doctype].nil?
|
51
|
+
end
|
60
52
|
end
|
61
53
|
end
|
62
54
|
end
|
@@ -50,8 +50,9 @@ module IsoDoc::Ietf
|
|
50
50
|
r.format nil, **attr_code(target: u.text, type: u["type"])
|
51
51
|
end
|
52
52
|
docidentifiers = b.xpath(ns("./docidentifier"))
|
53
|
-
id = bibitem_ref_code(b)
|
54
|
-
|
53
|
+
id = render_identifier(bibitem_ref_code(b))
|
54
|
+
!id[1].nil? and id[1] != "(NO ID)" and
|
55
|
+
r.refcontent id[1]
|
55
56
|
docidentifiers&.each do |u|
|
56
57
|
if %w(DOI IETF).include? u["type"]
|
57
58
|
r.seriesInfo nil, **attr_code(value: u.text, name: u["type"])
|
@@ -67,15 +68,6 @@ module IsoDoc::Ietf
|
|
67
68
|
end
|
68
69
|
end
|
69
70
|
|
70
|
-
def bibitem_ref_code(b)
|
71
|
-
id = b.at(ns("./docidentifier[not(@type = 'DOI' or @type = 'metanorma' "\
|
72
|
-
"or @type = 'ISSN' or @type = 'ISBN' or @type = 'IETF')]"))
|
73
|
-
return id if id
|
74
|
-
id = Nokogiri::XML::Node.new("docidentifier", b.document)
|
75
|
-
id << "(NO ID)"
|
76
|
-
id
|
77
|
-
end
|
78
|
-
|
79
71
|
def relaton_to_author(b, f)
|
80
72
|
auths = b.xpath(ns("./contributor[xmlns:role/@type = 'author' or "\
|
81
73
|
"xmlns:role/@type = 'editor']"))
|
data/lib/isodoc/ietf/reqt.rb
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
module IsoDoc::Ietf
|
2
2
|
class RfcConvert < ::IsoDoc::Convert
|
3
|
+
def recommendation_labels(node)
|
4
|
+
[node.at(ns("./label")), node.at(ns("./title")),
|
5
|
+
@xrefs.anchor(node['id'], :label, false)]
|
6
|
+
end
|
7
|
+
|
3
8
|
def recommendation_name(node, out, type)
|
4
9
|
label, title, lbl = recommendation_labels(node)
|
5
10
|
out.t **{ keepWithNext: "true" } do |b|
|
@@ -9,11 +9,12 @@ require_relative "./cleanup"
|
|
9
9
|
require_relative "./footnotes"
|
10
10
|
require_relative "./references"
|
11
11
|
require_relative "./section"
|
12
|
+
require_relative "./xref"
|
12
13
|
|
13
14
|
module IsoDoc::Ietf
|
14
15
|
class RfcConvert < ::IsoDoc::Convert
|
15
16
|
def convert1(docxml, filename, dir)
|
16
|
-
|
17
|
+
@xrefs.parse docxml
|
17
18
|
info docxml, nil
|
18
19
|
xml = noko do |xml|
|
19
20
|
xml.rfc **attr_code(rfc_attributes(docxml)) do |html|
|
@@ -30,6 +31,10 @@ module IsoDoc::Ietf
|
|
30
31
|
@meta = Metadata.new(lang, script, labels)
|
31
32
|
end
|
32
33
|
|
34
|
+
def xref_init(lang, script, klass, labels, options)
|
35
|
+
@xrefs = Xref.new(lang, script, klass, labels, options)
|
36
|
+
end
|
37
|
+
|
33
38
|
def extract_delims(text)
|
34
39
|
@openmathdelim = "$$"
|
35
40
|
@closemathdelim = "$$"
|
@@ -50,10 +55,15 @@ module IsoDoc::Ietf
|
|
50
55
|
end
|
51
56
|
end
|
52
57
|
|
58
|
+
def textcleanup(docxml)
|
59
|
+
passthrough_cleanup(docxml)
|
60
|
+
end
|
61
|
+
|
53
62
|
def postprocess(result, filename, dir)
|
54
|
-
result = from_xhtml(cleanup(to_xhtml(result)))
|
63
|
+
result = from_xhtml(cleanup(to_xhtml(textcleanup(result)))).
|
64
|
+
sub(/<!DOCTYPE[^>]+>\n/, "").
|
55
65
|
sub(/(<rfc[^<]+? )lang="[^"]+"/, "\\1")
|
56
|
-
File.open(
|
66
|
+
File.open(filename, "w:UTF-8") { |f| f.write(result) }
|
57
67
|
@files_to_delete.each { |f| FileUtils.rm_rf f }
|
58
68
|
end
|
59
69
|
|
@@ -66,6 +76,7 @@ module IsoDoc::Ietf
|
|
66
76
|
super
|
67
77
|
@xinclude = options[:use_xinclude] == "true"
|
68
78
|
@format = :rfc
|
79
|
+
@suffix = "rfc.xml"
|
69
80
|
end
|
70
81
|
end
|
71
82
|
end
|
data/lib/isodoc/ietf/section.rb
CHANGED
@@ -60,7 +60,8 @@ module IsoDoc::Ietf
|
|
60
60
|
{
|
61
61
|
docName: @meta.get[:doctype] == "Internet Draft" ? @meta.get[:docnumber] : nil,
|
62
62
|
number: @meta.get[:doctype].casecmp?("rfc") ? @meta.get[:docnumber] : nil,
|
63
|
-
category:
|
63
|
+
category: series2category(
|
64
|
+
docxml&.at(ns("//bibdata/series[@type = 'intended']/title"))&.text),
|
64
65
|
ipr: docxml&.at(ns("//bibdata/ext/ipr"))&.text,
|
65
66
|
obsoletes: obs,
|
66
67
|
updates: upd,
|
@@ -78,6 +79,20 @@ module IsoDoc::Ietf
|
|
78
79
|
}
|
79
80
|
end
|
80
81
|
|
82
|
+
def series2category(series)
|
83
|
+
case series&.downcase
|
84
|
+
when "standard", "std" then "std"
|
85
|
+
when "informational", "info" then "info"
|
86
|
+
when "experimental", "exp" then "exp"
|
87
|
+
when "bcp" then "bcp"
|
88
|
+
when "fyi", "info" then "info"
|
89
|
+
when "full-standard" then "std"
|
90
|
+
when "historic" then "historic"
|
91
|
+
else
|
92
|
+
"std"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
81
96
|
def xpath_comma(xpath)
|
82
97
|
return nil if xpath.empty?
|
83
98
|
xpath.map { |x| x.text }.join(", ")
|
data/lib/isodoc/ietf/table.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
module IsoDoc::Ietf
|
2
2
|
class RfcConvert < ::IsoDoc::Convert
|
3
|
-
def
|
3
|
+
def table_attrs(node)
|
4
4
|
attr_code(anchor: node["id"], align: node["align"])
|
5
5
|
end
|
6
6
|
|
7
7
|
def table_parse(node, out)
|
8
8
|
@in_table = true
|
9
|
-
out.table **
|
9
|
+
out.table **table_attrs(node) do |t|
|
10
10
|
table_title_parse(node, out)
|
11
11
|
thead_parse(node, t)
|
12
12
|
tbody_parse(node, t)
|
data/lib/isodoc/ietf/terms.rb
CHANGED
@@ -48,18 +48,5 @@ module IsoDoc::Ietf
|
|
48
48
|
|
49
49
|
def termdocsource_parse(_node, _out)
|
50
50
|
end
|
51
|
-
|
52
|
-
def termnote_anchor_names(docxml)
|
53
|
-
docxml.xpath(ns("//term[descendant::termnote]")).each do |t|
|
54
|
-
c = Counter.new
|
55
|
-
notes = t.xpath(ns(".//termnote"))
|
56
|
-
notes.each do |n|
|
57
|
-
next if n["id"].nil? || n["id"].empty?
|
58
|
-
idx = notes.size == 1 ? "" : " #{c.increment(n).print}"
|
59
|
-
@anchors[n["id"]] =
|
60
|
-
anchor_struct(idx, n, @note_xref_lbl, "note", false)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
51
|
end
|
65
52
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "isodoc"
|
2
|
+
|
3
|
+
module IsoDoc
|
4
|
+
module Ietf
|
5
|
+
class Xref < IsoDoc::Xref
|
6
|
+
def termnote_anchor_names(docxml)
|
7
|
+
docxml.xpath(ns("//term[descendant::termnote]")).each do |t|
|
8
|
+
c = IsoDoc::XrefGen::Counter.new
|
9
|
+
notes = t.xpath(ns(".//termnote"))
|
10
|
+
notes.each do |n|
|
11
|
+
next if n["id"].nil? || n["id"].empty?
|
12
|
+
idx = notes.size == 1 ? "" : " #{c.increment(n).print}"
|
13
|
+
@anchors[n["id"]] =
|
14
|
+
anchor_struct(idx, n, @labels["note_xref"], "note", false)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -48,14 +48,19 @@ module Metanorma
|
|
48
48
|
nil
|
49
49
|
end
|
50
50
|
|
51
|
+
def use_presentation_xml(ext)
|
52
|
+
false
|
53
|
+
end
|
54
|
+
|
51
55
|
def xml2rfc_present?
|
52
56
|
!which("xml2rfc").nil?
|
53
57
|
end
|
54
58
|
|
55
|
-
def output(isodoc_node, outname, format, options={})
|
59
|
+
def output(isodoc_node, inname, outname, format, options={})
|
56
60
|
case format
|
57
61
|
when :rfc
|
58
|
-
|
62
|
+
outname ||= inname.sub(/\.xml$/, ".rfc.xml")
|
63
|
+
IsoDoc::Ietf::RfcConvert.new(options).convert(inname, isodoc_node, nil, outname)
|
59
64
|
@done_rfc = true
|
60
65
|
|
61
66
|
when :txt
|
@@ -64,9 +69,10 @@ module Metanorma
|
|
64
69
|
return
|
65
70
|
end
|
66
71
|
|
67
|
-
rfcname =
|
68
|
-
output(isodoc_node,
|
72
|
+
rfcname = inname.sub(/\.xml$/, ".rfc.xml")
|
73
|
+
output(isodoc_node, inname, rfcname, :rfc, options) unless @done_rfc
|
69
74
|
|
75
|
+
outname ||= inname.sub(/\.xml$/, ".txt")
|
70
76
|
system("xml2rfc --text #{rfcname} -o #{outname}")
|
71
77
|
|
72
78
|
when :pdf
|
@@ -75,9 +81,10 @@ module Metanorma
|
|
75
81
|
return
|
76
82
|
end
|
77
83
|
|
78
|
-
rfcname =
|
79
|
-
output(isodoc_node,
|
84
|
+
rfcname = inname.sub(/\.xml$/, ".rfc.xml")
|
85
|
+
output(isodoc_node, inname, rfcname, :rfc, options) unless @done_rfc
|
80
86
|
|
87
|
+
outname ||= inname.sub(/\.xml$/, ".pdf")
|
81
88
|
system("xml2rfc --pdf #{rfcname} -o #{outname}")
|
82
89
|
|
83
90
|
when :html
|
@@ -86,9 +93,10 @@ module Metanorma
|
|
86
93
|
return
|
87
94
|
end
|
88
95
|
|
89
|
-
rfcname =
|
90
|
-
output(isodoc_node,
|
96
|
+
rfcname = inname.sub(/\.xml$/, ".rfc.xml")
|
97
|
+
output(isodoc_node, inname, rfcname, :rfc, options) unless @done_rfc
|
91
98
|
|
99
|
+
outname ||= inname.sub(/\.xml$/, ".html")
|
92
100
|
system("xml2rfc --html #{rfcname} -o #{outname}")
|
93
101
|
|
94
102
|
else
|