isodoc 1.7.3 → 1.7.6
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 +7 -4
- data/lib/isodoc/class_utils.rb +2 -2
- data/lib/isodoc/convert.rb +2 -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 +3 -1
- data/lib/isodoc/function/utils.rb +34 -14
- data/lib/isodoc/html_function/comments.rb +107 -111
- data/lib/isodoc/html_function/footnotes.rb +68 -67
- data/lib/isodoc/html_function/html.rb +113 -103
- data/lib/isodoc/html_function/mathvariant_to_plain.rb +5 -3
- data/lib/isodoc/presentation_function/block.rb +73 -78
- data/lib/isodoc/presentation_function/concept.rb +68 -0
- data/lib/isodoc/presentation_function/image.rb +112 -0
- data/lib/isodoc/presentation_function/inline.rb +6 -39
- 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 +3 -0
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_function/body.rb +176 -174
- data/lib/isodoc/word_function/comments.rb +117 -112
- data/lib/isodoc/word_function/footnotes.rb +88 -86
- data/lib/isodoc/word_function/inline.rb +42 -67
- data/lib/isodoc/word_function/postprocess_cover.rb +121 -110
- data/lib/isodoc/xref/xref_gen.rb +153 -150
- data/lib/isodoc/xslfo_convert.rb +2 -2
- data/lib/isodoc.rb +1 -1
- data/spec/assets/odf.svg +1 -4
- data/spec/isodoc/blocks_spec.rb +187 -32
- data/spec/isodoc/inline_spec.rb +300 -116
- data/spec/isodoc/postproc_spec.rb +38 -0
- data/spec/isodoc/presentation_xml_spec.rb +144 -0
- data/spec/isodoc/section_spec.rb +764 -0
- data/spec/isodoc/terms_spec.rb +116 -0
- metadata +63 -18
@@ -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
|