isodoc 1.7.3.1 → 1.7.4
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/isodoc.gemspec +1 -0
- data/lib/isodoc/convert.rb +1 -0
- data/lib/isodoc/function/blocks_example_note.rb +85 -79
- data/lib/isodoc/function/cleanup.rb +181 -175
- data/lib/isodoc/function/inline.rb +110 -108
- data/lib/isodoc/function/inline_simple.rb +55 -55
- data/lib/isodoc/function/lists.rb +75 -71
- data/lib/isodoc/function/references.rb +165 -160
- data/lib/isodoc/function/section.rb +140 -190
- data/lib/isodoc/function/section_titles.rb +82 -0
- data/lib/isodoc/function/table.rb +90 -87
- data/lib/isodoc/function/terms.rb +58 -56
- data/lib/isodoc/function/to_word_html.rb +1 -0
- data/lib/isodoc/html_function/mathvariant_to_plain.rb +5 -3
- data/lib/isodoc/presentation_function/math.rb +9 -0
- data/lib/isodoc/presentation_function/section.rb +12 -1
- data/lib/isodoc/presentation_xml_convert.rb +2 -0
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_function/body.rb +5 -5
- data/lib/isodoc/xslfo_convert.rb +2 -2
- data/spec/isodoc/blocks_spec.rb +147 -64
- data/spec/isodoc/inline_spec.rb +190 -89
- data/spec/isodoc/presentation_xml_spec.rb +84 -0
- data/spec/isodoc/section_spec.rb +639 -0
- metadata +17 -2
@@ -1,204 +1,209 @@
|
|
1
|
-
module IsoDoc
|
2
|
-
module
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
1
|
+
module IsoDoc
|
2
|
+
module Function
|
3
|
+
module References
|
4
|
+
# This is highly specific to ISO, but it's not a bad precedent for
|
5
|
+
# references anyway; keeping here instead of in IsoDoc::Iso for now
|
6
|
+
def docid_l10n(text)
|
7
|
+
return text if text.nil?
|
8
|
+
|
9
|
+
text.gsub(/All Parts/i, @i18n.all_parts.downcase) if @i18n.all_parts
|
10
|
+
text
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
13
|
+
# TODO generate formatted ref if not present
|
14
|
+
def nonstd_bibitem(list, bib, ordinal, biblio)
|
15
|
+
list.p **attr_code(iso_bibitem_entry_attrs(bib, biblio)) do |ref|
|
16
|
+
ids = bibitem_ref_code(bib)
|
17
|
+
identifiers = render_identifier(ids)
|
18
|
+
if biblio then ref_entry_code(ref, ordinal, identifiers, ids)
|
19
|
+
else
|
20
|
+
ref << (identifiers[0] || identifiers[1]).to_s
|
21
|
+
ref << ", #{identifiers[1]}" if identifiers[0] && identifiers[1]
|
22
|
+
end
|
23
|
+
ref << ", " unless biblio && !identifiers[1]
|
24
|
+
reference_format(bib, ref)
|
21
25
|
end
|
22
|
-
ref << ", " unless biblio && !identifiers[1]
|
23
|
-
reference_format(bib, ref)
|
24
26
|
end
|
25
|
-
end
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
28
|
+
def std_bibitem_entry(list, bib, ordinal, biblio)
|
29
|
+
list.p **attr_code(iso_bibitem_entry_attrs(bib, biblio)) do |ref|
|
30
|
+
identifiers = render_identifier(bibitem_ref_code(bib))
|
31
|
+
if biblio then ref_entry_code(ref, ordinal, identifiers, nil)
|
32
|
+
else
|
33
|
+
ref << (identifiers[0] || identifiers[1]).to_s
|
34
|
+
ref << ", #{identifiers[1]}" if identifiers[0] && identifiers[1]
|
35
|
+
end
|
36
|
+
date_note_process(bib, ref)
|
37
|
+
ref << ", " unless biblio && !identifiers[1]
|
38
|
+
reference_format(bib, ref)
|
34
39
|
end
|
35
|
-
date_note_process(bib, ref)
|
36
|
-
ref << ", " unless biblio && !identifiers[1]
|
37
|
-
reference_format(bib, ref)
|
38
40
|
end
|
39
|
-
end
|
40
41
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
42
|
+
# if ids is just a number, only use that ([1] Non-Standard)
|
43
|
+
# else, use both ordinal, as prefix, and ids
|
44
|
+
def ref_entry_code(ref, ordinal, ids, _id)
|
45
|
+
prefix_bracketed_ref(ref, ids[0] || "[#{ordinal}]")
|
46
|
+
ids[1] and ref << (ids[1]).to_s
|
47
|
+
end
|
47
48
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
def pref_ref_code(bib)
|
50
|
+
bib.at(ns("./docidentifier[not(@type = 'DOI' or @type = 'metanorma' "\
|
51
|
+
"or @type = 'ISSN' or @type = 'ISBN' or "\
|
52
|
+
"@type = 'rfc-anchor')]"))
|
53
|
+
end
|
52
54
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
55
|
+
# returns [metanorma, non-metanorma, DOI/ISSN/ISBN] identifiers
|
56
|
+
def bibitem_ref_code(bib)
|
57
|
+
id = bib.at(ns("./docidentifier[@type = 'metanorma']"))
|
58
|
+
id1 = pref_ref_code(bib)
|
59
|
+
id2 = bib.at(ns("./docidentifier[@type = 'DOI' or @type = 'ISSN' or "\
|
60
|
+
"@type = 'ISBN']"))
|
61
|
+
return [id, id1, id2] if id || id1 || id2
|
62
|
+
|
63
|
+
id = Nokogiri::XML::Node.new("docidentifier", bib.document)
|
64
|
+
id << "(NO ID)"
|
65
|
+
[nil, id, nil]
|
66
|
+
end
|
65
67
|
|
66
|
-
|
67
|
-
|
68
|
+
def bracket_if_num(num)
|
69
|
+
return nil if num.nil?
|
68
70
|
|
69
|
-
|
70
|
-
|
71
|
+
num = num.text.sub(/^\[/, "").sub(/\]$/, "")
|
72
|
+
return "[#{num}]" if /^\d+$/.match?(num)
|
71
73
|
|
72
|
-
|
73
|
-
|
74
|
+
num
|
75
|
+
end
|
74
76
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
77
|
+
def render_identifier(ident)
|
78
|
+
[bracket_if_num(ident[0]),
|
79
|
+
ident[1].nil? ? nil : ident[1].text.sub(/^\[/, "").sub(/\]$/, ""),
|
80
|
+
ident[2].nil? ? nil : ident[2].text.sub(/^\[/, "").sub(/\]$/, "")]
|
81
|
+
end
|
80
82
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
83
|
+
def docid_prefix(prefix, docid)
|
84
|
+
docid = "#{prefix} #{docid}" if prefix && !omit_docid_prefix(prefix) &&
|
85
|
+
!/^#{prefix}\b/.match(docid)
|
86
|
+
docid_l10n(docid)
|
87
|
+
end
|
86
88
|
|
87
|
-
|
88
|
-
|
89
|
+
def omit_docid_prefix(prefix)
|
90
|
+
return true if prefix.nil? || prefix.empty?
|
89
91
|
|
90
|
-
|
91
|
-
|
92
|
-
|
92
|
+
%w(ISO IEC IEV ITU W3C csd metanorma repository rfc-anchor)
|
93
|
+
.include? prefix
|
94
|
+
end
|
93
95
|
|
94
|
-
|
95
|
-
|
96
|
-
|
96
|
+
def date_note_process(bib, ref)
|
97
|
+
date_note = bib.at(ns("./note[@type = 'Unpublished-Status']"))
|
98
|
+
return if date_note.nil?
|
97
99
|
|
98
|
-
|
99
|
-
|
100
|
-
|
100
|
+
date_note.children.first.replace("<p>#{date_note.content}</p>")
|
101
|
+
footnote_parse(date_note, ref)
|
102
|
+
end
|
101
103
|
|
102
|
-
|
103
|
-
|
104
|
-
|
104
|
+
def iso_bibitem_entry_attrs(bib, biblio)
|
105
|
+
{ id: bib["id"], class: biblio ? "Biblio" : "NormRef" }
|
106
|
+
end
|
105
107
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
108
|
+
def iso_title(bib)
|
109
|
+
bib.at(ns("./title[@language = '#{@lang}' and @type = 'main']")) ||
|
110
|
+
bib.at(ns("./title[@language = '#{@lang}']")) ||
|
111
|
+
bib.at(ns("./title[@type = 'main']")) ||
|
112
|
+
bib.at(ns("./title"))
|
113
|
+
end
|
112
114
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
115
|
+
# reference not to be rendered because it is deemed implicit
|
116
|
+
# in the standards environment
|
117
|
+
def implicit_reference(bib)
|
118
|
+
bib["hidden"] == "true"
|
119
|
+
end
|
118
120
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
121
|
+
def prefix_bracketed_ref(ref, text)
|
122
|
+
ref << text.to_s
|
123
|
+
insert_tab(ref, 1)
|
124
|
+
end
|
123
125
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
126
|
+
def reference_format(bib, out)
|
127
|
+
if ftitle = bib.at(ns("./formattedref"))
|
128
|
+
ftitle&.children&.each { |n| parse(n, out) }
|
129
|
+
else
|
130
|
+
out.i do |i|
|
131
|
+
iso_title(bib)&.children&.each { |n| parse(n, i) }
|
132
|
+
end
|
130
133
|
end
|
131
134
|
end
|
132
|
-
end
|
133
135
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
136
|
+
def is_standard(bib)
|
137
|
+
ret = false
|
138
|
+
drop = %w(metanorma DOI ISSN ISBN)
|
139
|
+
bib.xpath(ns("./docidentifier")).each do |id|
|
140
|
+
next if id["type"].nil? || drop.include?(id["type"])
|
139
141
|
|
140
|
-
|
142
|
+
ret = true
|
143
|
+
end
|
144
|
+
ret
|
141
145
|
end
|
142
|
-
ret
|
143
|
-
end
|
144
146
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
147
|
+
def biblio_list(refs, div, biblio)
|
148
|
+
i = 0
|
149
|
+
refs.children.each do |b|
|
150
|
+
if b.name == "bibitem"
|
151
|
+
next if implicit_reference(b)
|
152
|
+
|
153
|
+
i += 1
|
154
|
+
if is_standard(b) then std_bibitem_entry(div, b, i, biblio)
|
155
|
+
else nonstd_bibitem(div, b, i, biblio)
|
156
|
+
end
|
157
|
+
else
|
158
|
+
parse(b, div) unless %w(title).include? b.name
|
154
159
|
end
|
155
|
-
else
|
156
|
-
parse(b, div) unless %w(title).include? b.name
|
157
160
|
end
|
158
161
|
end
|
159
|
-
end
|
160
162
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
163
|
+
def norm_ref_xpath
|
164
|
+
"//bibliography/references[@normative = 'true'] | "\
|
165
|
+
"//bibliography/clause[.//references[@normative = 'true']]"
|
166
|
+
end
|
165
167
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
f.
|
173
|
-
|
168
|
+
def norm_ref(isoxml, out, num)
|
169
|
+
f = isoxml.at(ns(norm_ref_xpath)) and f["hidden"] != "true" or
|
170
|
+
return num
|
171
|
+
out.div do |div|
|
172
|
+
num = num + 1
|
173
|
+
clause_name(num, f.at(ns("./title")), div, nil)
|
174
|
+
if f.name == "clause"
|
175
|
+
f.elements.each { |e| parse(e, div) unless e.name == "title" }
|
176
|
+
else biblio_list(f, div, false)
|
177
|
+
end
|
174
178
|
end
|
179
|
+
num
|
175
180
|
end
|
176
|
-
num
|
177
|
-
end
|
178
181
|
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
182
|
+
def bibliography_xpath
|
183
|
+
"//bibliography/clause[.//references]"\
|
184
|
+
"[not(.//references[@normative = 'true'])] | "\
|
185
|
+
"//bibliography/references[@normative = 'false']"
|
186
|
+
end
|
184
187
|
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
div
|
190
|
-
|
188
|
+
def bibliography(isoxml, out)
|
189
|
+
f = isoxml.at(ns(bibliography_xpath)) and f["hidden"] != "true" or
|
190
|
+
return
|
191
|
+
page_break(out)
|
192
|
+
out.div do |div|
|
193
|
+
div.h1 **{ class: "Section3" } do |h1|
|
194
|
+
f&.at(ns("./title"))&.children&.each { |c2| parse(c2, h1) }
|
195
|
+
end
|
196
|
+
biblio_list(f, div, true)
|
191
197
|
end
|
192
|
-
biblio_list(f, div, true)
|
193
198
|
end
|
194
|
-
end
|
195
199
|
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
200
|
+
def bibliography_parse(node, out)
|
201
|
+
node["hidden"] != true or return
|
202
|
+
out.div do |div|
|
203
|
+
clause_parse_title(node, div, node.at(ns("./title")), out,
|
204
|
+
{ class: "Section3" })
|
205
|
+
biblio_list(node, div, true)
|
206
|
+
end
|
202
207
|
end
|
203
208
|
end
|
204
209
|
end
|
@@ -1,251 +1,201 @@
|
|
1
|
-
|
2
|
-
module Section
|
3
|
-
def clausedelim
|
4
|
-
"."
|
5
|
-
end
|
6
|
-
|
7
|
-
def clausedelimspace(out)
|
8
|
-
insert_tab(out, 1)
|
9
|
-
end
|
10
|
-
|
11
|
-
def inline_header_title(out, _node, title)
|
12
|
-
out.span **{ class: "zzMoveToFollowing" } do |s|
|
13
|
-
s.b do |b|
|
14
|
-
title&.children&.each { |c2| parse(c2, b) }
|
15
|
-
clausedelimspace(out) if /\S/.match?(title&.text)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
# used for subclauses
|
21
|
-
def clause_parse_title(node, div, title, out, header_class = {})
|
22
|
-
return if title.nil?
|
1
|
+
require_relative "./section_titles"
|
23
2
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
"acknowledgements, introduction, foreword").size + 1
|
30
|
-
end
|
31
|
-
div.send "h#{depth}", **attr_code(header_class) do |h|
|
32
|
-
title&.children&.each { |c2| parse(c2, h) }
|
33
|
-
end
|
3
|
+
module IsoDoc
|
4
|
+
module Function
|
5
|
+
module Section
|
6
|
+
def clause_attrs(node)
|
7
|
+
{ id: node["id"] }
|
34
8
|
end
|
35
|
-
end
|
36
9
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
clause_parse_title(node, div, node.at(ns("./title")), out)
|
45
|
-
node.children.reject { |c1| c1.name == "title" }.each do |c1|
|
46
|
-
parse(c1, div)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def clause_name(_num, title, div, header_class)
|
52
|
-
header_class = {} if header_class.nil?
|
53
|
-
div.h1 **attr_code(header_class) do |h1|
|
54
|
-
if title.is_a?(String)
|
55
|
-
h1 << title
|
56
|
-
else
|
57
|
-
title&.children&.each { |c2| parse(c2, h1) }
|
10
|
+
# used for subclauses
|
11
|
+
def clause_parse(node, out)
|
12
|
+
out.div **attr_code(clause_attrs(node)) do |div|
|
13
|
+
clause_parse_title(node, div, node.at(ns("./title")), out)
|
14
|
+
node.children.reject { |c1| c1.name == "title" }.each do |c1|
|
15
|
+
parse(c1, div)
|
16
|
+
end
|
58
17
|
end
|
59
18
|
end
|
60
|
-
div.parent.at(".//h1")
|
61
|
-
end
|
62
19
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
20
|
+
def clause(isoxml, out)
|
21
|
+
isoxml.xpath(ns(middle_clause(isoxml))).each do |c|
|
22
|
+
out.div **attr_code(clause_attrs(c)) do |s|
|
23
|
+
clause_name(nil, c&.at(ns("./title")), s, nil)
|
24
|
+
c.elements.reject { |c1| c1.name == "title" }.each do |c1|
|
25
|
+
parse(c1, s)
|
26
|
+
end
|
69
27
|
end
|
70
28
|
end
|
71
29
|
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def annex_name(_annex, name, div)
|
75
|
-
return if name.nil?
|
76
30
|
|
77
|
-
|
78
|
-
|
31
|
+
def annex_attrs(node)
|
32
|
+
{ id: node["id"], class: "Section3" }
|
79
33
|
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def annex_attrs(node)
|
83
|
-
{ id: node["id"], class: "Section3" }
|
84
|
-
end
|
85
34
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
35
|
+
def annex(isoxml, out)
|
36
|
+
isoxml.xpath(ns("//annex")).each do |c|
|
37
|
+
page_break(out)
|
38
|
+
out.div **attr_code(annex_attrs(c)) do |s|
|
39
|
+
c.elements.each do |c1|
|
40
|
+
if c1.name == "title" then annex_name(c, c1, s)
|
41
|
+
else
|
42
|
+
parse(c1, s)
|
43
|
+
end
|
94
44
|
end
|
95
45
|
end
|
96
46
|
end
|
97
47
|
end
|
98
|
-
end
|
99
48
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
49
|
+
def scope(isoxml, out, num)
|
50
|
+
f = isoxml.at(ns("//clause[@type = 'scope']")) or return num
|
51
|
+
out.div **attr_code(id: f["id"]) do |div|
|
52
|
+
num = num + 1
|
53
|
+
clause_name(num, f&.at(ns("./title")), div, nil)
|
54
|
+
f.elements.each do |e|
|
55
|
+
parse(e, div) unless e.name == "title"
|
56
|
+
end
|
107
57
|
end
|
58
|
+
num
|
108
59
|
end
|
109
|
-
num
|
110
|
-
end
|
111
60
|
|
112
|
-
|
113
|
-
|
61
|
+
TERM_CLAUSE = "//sections/terms | "\
|
62
|
+
"//sections/clause[descendant::terms]".freeze
|
114
63
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
64
|
+
def terms_defs(isoxml, out, num)
|
65
|
+
f = isoxml.at(ns(TERM_CLAUSE)) or return num
|
66
|
+
out.div **attr_code(id: f["id"]) do |div|
|
67
|
+
num = num + 1
|
68
|
+
clause_name(num, f&.at(ns("./title")), div, nil)
|
69
|
+
f.elements.each do |e|
|
70
|
+
parse(e, div) unless %w{title source}.include? e.name
|
71
|
+
end
|
122
72
|
end
|
73
|
+
num
|
123
74
|
end
|
124
|
-
num
|
125
|
-
end
|
126
|
-
|
127
|
-
# subclause
|
128
|
-
def terms_parse(isoxml, out)
|
129
|
-
clause_parse(isoxml, out)
|
130
|
-
end
|
131
75
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
num = num + 1
|
136
|
-
clause_name(num, f&.at(ns("./title")) || @i18n.symbols, div, nil)
|
137
|
-
f.elements.each do |e|
|
138
|
-
parse(e, div) unless e.name == "title"
|
139
|
-
end
|
76
|
+
# subclause
|
77
|
+
def terms_parse(isoxml, out)
|
78
|
+
clause_parse(isoxml, out)
|
140
79
|
end
|
141
|
-
num
|
142
|
-
end
|
143
|
-
|
144
|
-
# subclause
|
145
|
-
def symbols_parse(isoxml, out)
|
146
|
-
isoxml.at(ns("./title")) or
|
147
|
-
isoxml.children.first.previous = "<title>#{@i18n.symbols}</title>"
|
148
|
-
clause_parse(isoxml, out)
|
149
|
-
end
|
150
80
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
81
|
+
def symbols_abbrevs(isoxml, out, num)
|
82
|
+
f = isoxml.at(ns("//sections/definitions")) or return num
|
83
|
+
out.div **attr_code(id: f["id"], class: "Symbols") do |div|
|
84
|
+
num = num + 1
|
85
|
+
clause_name(num, f&.at(ns("./title")) || @i18n.symbols, div, nil)
|
86
|
+
f.elements.each do |e|
|
87
|
+
parse(e, div) unless e.name == "title"
|
88
|
+
end
|
158
89
|
end
|
90
|
+
num
|
159
91
|
end
|
160
|
-
end
|
161
92
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
{ class: "ForewordTitle" })
|
168
|
-
f.elements.each { |e| parse(e, s) unless e.name == "title" }
|
93
|
+
# subclause
|
94
|
+
def symbols_parse(isoxml, out)
|
95
|
+
isoxml.at(ns("./title")) or
|
96
|
+
isoxml.children.first.previous = "<title>#{@i18n.symbols}</title>"
|
97
|
+
clause_parse(isoxml, out)
|
169
98
|
end
|
170
|
-
end
|
171
99
|
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
100
|
+
def introduction(isoxml, out)
|
101
|
+
f = isoxml.at(ns("//introduction")) || return
|
102
|
+
page_break(out)
|
103
|
+
out.div **{ class: "Section3", id: f["id"] } do |div|
|
104
|
+
clause_name(nil, f.at(ns("./title")), div, { class: "IntroTitle" })
|
105
|
+
f.elements.each do |e|
|
106
|
+
parse(e, div) unless e.name == "title"
|
107
|
+
end
|
180
108
|
end
|
181
109
|
end
|
182
|
-
end
|
183
110
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
111
|
+
def foreword(isoxml, out)
|
112
|
+
f = isoxml.at(ns("//foreword")) || return
|
113
|
+
page_break(out)
|
114
|
+
out.div **attr_code(id: f["id"]) do |s|
|
115
|
+
clause_name(nil, f.at(ns("./title")) || @i18n.foreword, s,
|
116
|
+
{ class: "ForewordTitle" })
|
117
|
+
f.elements.each { |e| parse(e, s) unless e.name == "title" }
|
118
|
+
end
|
190
119
|
end
|
191
|
-
end
|
192
120
|
|
193
|
-
|
194
|
-
|
195
|
-
|
121
|
+
def acknowledgements(isoxml, out)
|
122
|
+
f = isoxml.at(ns("//acknowledgements")) || return
|
123
|
+
title_attr = { class: "IntroTitle" }
|
196
124
|
page_break(out)
|
197
125
|
out.div **{ class: "Section3", id: f["id"] } do |div|
|
198
|
-
clause_name(nil, f&.at(ns("./title")), div,
|
126
|
+
clause_name(nil, f&.at(ns("./title")), div, title_attr)
|
199
127
|
f.elements.each do |e|
|
200
128
|
parse(e, div) unless e.name == "title"
|
201
129
|
end
|
202
130
|
end
|
203
131
|
end
|
204
|
-
end
|
205
132
|
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
133
|
+
def abstract(isoxml, out)
|
134
|
+
f = isoxml.at(ns("//preface/abstract")) || return
|
135
|
+
page_break(out)
|
136
|
+
out.div **attr_code(id: f["id"]) do |s|
|
137
|
+
clause_name(nil, f.at(ns("./title")), s, { class: "AbstractTitle" })
|
138
|
+
f.elements.each { |e| parse(e, s) unless e.name == "title" }
|
139
|
+
end
|
140
|
+
end
|
210
141
|
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
142
|
+
def preface(isoxml, out)
|
143
|
+
isoxml.xpath(ns("//preface/clause | //preface/references | "\
|
144
|
+
"//preface/definitions | //preface/terms")).each do |f|
|
145
|
+
page_break(out)
|
146
|
+
out.div **{ class: "Section3", id: f["id"] } do |div|
|
147
|
+
clause_name(nil, f&.at(ns("./title")), div, { class: "IntroTitle" })
|
148
|
+
f.elements.each do |e|
|
149
|
+
parse(e, div) unless e.name == "title"
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
215
154
|
|
216
|
-
|
155
|
+
def is_clause?(name)
|
156
|
+
%w(clause references definitions terms foreword introduction abstract
|
157
|
+
acknowledgements).include? name
|
217
158
|
end
|
218
|
-
end
|
219
159
|
|
220
|
-
|
221
|
-
|
160
|
+
def preface_block(isoxml, out)
|
161
|
+
p = isoxml.at(ns("//preface")) or return
|
162
|
+
p.elements.each do |e|
|
163
|
+
next if is_clause?(e.name)
|
222
164
|
|
223
|
-
|
224
|
-
|
165
|
+
parse(e, out)
|
166
|
+
end
|
225
167
|
end
|
226
|
-
end
|
227
168
|
|
228
|
-
|
229
|
-
|
169
|
+
def copyright_parse(node, out)
|
170
|
+
return if @bare
|
230
171
|
|
231
|
-
|
232
|
-
|
172
|
+
out.div **{ class: "boilerplate-copyright" } do |div|
|
173
|
+
node.children.each { |n| parse(n, div) }
|
174
|
+
end
|
233
175
|
end
|
234
|
-
end
|
235
176
|
|
236
|
-
|
237
|
-
|
177
|
+
def license_parse(node, out)
|
178
|
+
return if @bare
|
238
179
|
|
239
|
-
|
240
|
-
|
180
|
+
out.div **{ class: "boilerplate-license" } do |div|
|
181
|
+
node.children.each { |n| parse(n, div) }
|
182
|
+
end
|
241
183
|
end
|
242
|
-
end
|
243
184
|
|
244
|
-
|
245
|
-
|
185
|
+
def legal_parse(node, out)
|
186
|
+
return if @bare
|
246
187
|
|
247
|
-
|
248
|
-
|
188
|
+
out.div **{ class: "boilerplate-legal" } do |div|
|
189
|
+
node.children.each { |n| parse(n, div) }
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
def feedback_parse(node, out)
|
194
|
+
return if @bare
|
195
|
+
|
196
|
+
out.div **{ class: "boilerplate-feedback" } do |div|
|
197
|
+
node.children.each { |n| parse(n, div) }
|
198
|
+
end
|
249
199
|
end
|
250
200
|
end
|
251
201
|
end
|