isodoc 1.7.3 → 1.7.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/isodoc.gemspec +7 -4
  3. data/lib/isodoc/class_utils.rb +2 -2
  4. data/lib/isodoc/convert.rb +2 -0
  5. data/lib/isodoc/function/blocks_example_note.rb +85 -79
  6. data/lib/isodoc/function/cleanup.rb +181 -175
  7. data/lib/isodoc/function/inline.rb +110 -108
  8. data/lib/isodoc/function/inline_simple.rb +55 -55
  9. data/lib/isodoc/function/lists.rb +75 -71
  10. data/lib/isodoc/function/references.rb +165 -160
  11. data/lib/isodoc/function/section.rb +140 -190
  12. data/lib/isodoc/function/section_titles.rb +82 -0
  13. data/lib/isodoc/function/table.rb +90 -87
  14. data/lib/isodoc/function/terms.rb +58 -56
  15. data/lib/isodoc/function/to_word_html.rb +3 -1
  16. data/lib/isodoc/function/utils.rb +34 -14
  17. data/lib/isodoc/html_function/comments.rb +107 -111
  18. data/lib/isodoc/html_function/footnotes.rb +68 -67
  19. data/lib/isodoc/html_function/html.rb +113 -103
  20. data/lib/isodoc/html_function/mathvariant_to_plain.rb +5 -3
  21. data/lib/isodoc/presentation_function/block.rb +73 -78
  22. data/lib/isodoc/presentation_function/concept.rb +68 -0
  23. data/lib/isodoc/presentation_function/image.rb +112 -0
  24. data/lib/isodoc/presentation_function/inline.rb +6 -39
  25. data/lib/isodoc/presentation_function/math.rb +9 -0
  26. data/lib/isodoc/presentation_function/section.rb +12 -1
  27. data/lib/isodoc/presentation_xml_convert.rb +3 -0
  28. data/lib/isodoc/version.rb +1 -1
  29. data/lib/isodoc/word_function/body.rb +176 -174
  30. data/lib/isodoc/word_function/comments.rb +117 -112
  31. data/lib/isodoc/word_function/footnotes.rb +88 -86
  32. data/lib/isodoc/word_function/inline.rb +42 -67
  33. data/lib/isodoc/word_function/postprocess_cover.rb +121 -110
  34. data/lib/isodoc/xref/xref_gen.rb +153 -150
  35. data/lib/isodoc/xslfo_convert.rb +2 -2
  36. data/lib/isodoc.rb +1 -1
  37. data/spec/assets/odf.svg +1 -4
  38. data/spec/isodoc/blocks_spec.rb +187 -32
  39. data/spec/isodoc/inline_spec.rb +300 -116
  40. data/spec/isodoc/postproc_spec.rb +38 -0
  41. data/spec/isodoc/presentation_xml_spec.rb +144 -0
  42. data/spec/isodoc/section_spec.rb +764 -0
  43. data/spec/isodoc/terms_spec.rb +116 -0
  44. metadata +63 -18
@@ -1,204 +1,209 @@
1
- module IsoDoc::Function
2
- module References
3
- # This is highly specific to ISO, but it's not a bad precedent for
4
- # references anyway; keeping here instead of in IsoDoc::Iso for now
5
- def docid_l10n(text)
6
- return text if text.nil?
7
-
8
- text.gsub(/All Parts/i, @i18n.all_parts.downcase) if @i18n.all_parts
9
- text
10
- end
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
- # TODO generate formatted ref if not present
13
- def nonstd_bibitem(list, bib, ordinal, biblio)
14
- list.p **attr_code(iso_bibitem_entry_attrs(bib, biblio)) do |ref|
15
- ids = bibitem_ref_code(bib)
16
- identifiers = render_identifier(ids)
17
- if biblio then ref_entry_code(ref, ordinal, identifiers, ids)
18
- else
19
- ref << (identifiers[0] || identifiers[1]).to_s
20
- ref << ", #{identifiers[1]}" if identifiers[0] && identifiers[1]
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
- def std_bibitem_entry(list, bib, ordinal, biblio)
28
- list.p **attr_code(iso_bibitem_entry_attrs(bib, biblio)) do |ref|
29
- identifiers = render_identifier(bibitem_ref_code(bib))
30
- if biblio then ref_entry_code(ref, ordinal, identifiers, nil)
31
- else
32
- ref << (identifiers[0] || identifiers[1]).to_s
33
- ref << ", #{identifiers[1]}" if identifiers[0] && identifiers[1]
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
- # if t is just a number, only use that ([1] Non-Standard)
42
- # else, use both ordinal, as prefix, and t
43
- def ref_entry_code(r, ordinal, t, _id)
44
- prefix_bracketed_ref(r, t[0] || "[#{ordinal}]")
45
- t[1] and r << (t[1]).to_s
46
- end
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
- def pref_ref_code(bib)
49
- bib.at(ns("./docidentifier[not(@type = 'DOI' or @type = 'metanorma' "\
50
- "or @type = 'ISSN' or @type = 'ISBN' or @type = 'rfc-anchor')]"))
51
- end
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
- # returns [metanorma, non-metanorma, DOI/ISSN/ISBN] identifiers
54
- def bibitem_ref_code(bib)
55
- id = bib.at(ns("./docidentifier[@type = 'metanorma']"))
56
- id1 = pref_ref_code(bib)
57
- id2 = bib.at(ns("./docidentifier[@type = 'DOI' or @type = 'ISSN' or "\
58
- "@type = 'ISBN']"))
59
- return [id, id1, id2] if id || id1 || id2
60
-
61
- id = Nokogiri::XML::Node.new("docidentifier", bib.document)
62
- id << "(NO ID)"
63
- [nil, id, nil]
64
- end
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
- def bracket_if_num(num)
67
- return nil if num.nil?
68
+ def bracket_if_num(num)
69
+ return nil if num.nil?
68
70
 
69
- num = num.text.sub(/^\[/, "").sub(/\]$/, "")
70
- return "[#{num}]" if /^\d+$/.match?(num)
71
+ num = num.text.sub(/^\[/, "").sub(/\]$/, "")
72
+ return "[#{num}]" if /^\d+$/.match?(num)
71
73
 
72
- num
73
- end
74
+ num
75
+ end
74
76
 
75
- def render_identifier(ident)
76
- [bracket_if_num(ident[0]),
77
- ident[1].nil? ? nil : ident[1].text.sub(/^\[/, "").sub(/\]$/, ""),
78
- ident[2].nil? ? nil : ident[2].text.sub(/^\[/, "").sub(/\]$/, "")]
79
- end
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
- def docid_prefix(prefix, docid)
82
- docid = "#{prefix} #{docid}" if prefix && !omit_docid_prefix(prefix) &&
83
- !/^#{prefix}\b/.match(docid)
84
- docid_l10n(docid)
85
- end
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
- def omit_docid_prefix(prefix)
88
- return true if prefix.nil? || prefix.empty?
89
+ def omit_docid_prefix(prefix)
90
+ return true if prefix.nil? || prefix.empty?
89
91
 
90
- %w(ISO IEC IEV ITU W3C csd metanorma repository rfc-anchor)
91
- .include? prefix
92
- end
92
+ %w(ISO IEC IEV ITU W3C csd metanorma repository rfc-anchor)
93
+ .include? prefix
94
+ end
93
95
 
94
- def date_note_process(bib, ref)
95
- date_note = bib.at(ns("./note[@type = 'Unpublished-Status']"))
96
- return if date_note.nil?
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
- date_note.children.first.replace("<p>#{date_note.content}</p>")
99
- footnote_parse(date_note, ref)
100
- end
100
+ date_note.children.first.replace("<p>#{date_note.content}</p>")
101
+ footnote_parse(date_note, ref)
102
+ end
101
103
 
102
- def iso_bibitem_entry_attrs(bib, biblio)
103
- { id: bib["id"], class: biblio ? "Biblio" : "NormRef" }
104
- end
104
+ def iso_bibitem_entry_attrs(bib, biblio)
105
+ { id: bib["id"], class: biblio ? "Biblio" : "NormRef" }
106
+ end
105
107
 
106
- def iso_title(bib)
107
- bib.at(ns("./title[@language = '#{@lang}' and @type = 'main']")) ||
108
- bib.at(ns("./title[@language = '#{@lang}']")) ||
109
- bib.at(ns("./title[@type = 'main']")) ||
110
- bib.at(ns("./title"))
111
- end
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
- # reference not to be rendered because it is deemed implicit
114
- # in the standards environment
115
- def implicit_reference(bib)
116
- bib["hidden"] == "true"
117
- end
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
- def prefix_bracketed_ref(ref, text)
120
- ref << text.to_s
121
- insert_tab(ref, 1)
122
- end
121
+ def prefix_bracketed_ref(ref, text)
122
+ ref << text.to_s
123
+ insert_tab(ref, 1)
124
+ end
123
125
 
124
- def reference_format(bib, out)
125
- if ftitle = bib.at(ns("./formattedref"))
126
- ftitle&.children&.each { |n| parse(n, out) }
127
- else
128
- out.i do |i|
129
- iso_title(bib)&.children&.each { |n| parse(n, i) }
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
- def is_standard(bib)
135
- ret = false
136
- drop = %w(metanorma DOI ISSN ISBN)
137
- bib.xpath(ns("./docidentifier")).each do |id|
138
- next if id["type"].nil? || drop.include?(id["type"])
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
- ret = true
142
+ ret = true
143
+ end
144
+ ret
141
145
  end
142
- ret
143
- end
144
146
 
145
- def biblio_list(refs, div, biblio)
146
- i = 0
147
- refs.children.each do |b|
148
- if b.name == "bibitem"
149
- next if implicit_reference(b)
150
-
151
- i += 1
152
- if is_standard(b) then std_bibitem_entry(div, b, i, biblio)
153
- else nonstd_bibitem(div, b, i, biblio)
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
- def norm_ref_xpath
162
- "//bibliography/references[@normative = 'true'] | "\
163
- "//bibliography/clause[.//references[@normative = 'true']]"
164
- end
163
+ def norm_ref_xpath
164
+ "//bibliography/references[@normative = 'true'] | "\
165
+ "//bibliography/clause[.//references[@normative = 'true']]"
166
+ end
165
167
 
166
- def norm_ref(isoxml, out, num)
167
- f = isoxml.at(ns(norm_ref_xpath)) and f["hidden"] != "true" or return num
168
- out.div do |div|
169
- num = num + 1
170
- clause_name(num, f.at(ns("./title")), div, nil)
171
- if f.name == "clause"
172
- f.elements.each { |e| parse(e, div) unless e.name == "title" }
173
- else biblio_list(f, div, false)
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
- def bibliography_xpath
180
- "//bibliography/clause[.//references]"\
181
- "[not(.//references[@normative = 'true'])] | "\
182
- "//bibliography/references[@normative = 'false']"
183
- end
182
+ def bibliography_xpath
183
+ "//bibliography/clause[.//references]"\
184
+ "[not(.//references[@normative = 'true'])] | "\
185
+ "//bibliography/references[@normative = 'false']"
186
+ end
184
187
 
185
- def bibliography(isoxml, out)
186
- f = isoxml.at(ns(bibliography_xpath)) and f["hidden"] != "true" or return
187
- page_break(out)
188
- out.div do |div|
189
- div.h1 **{ class: "Section3" } do |h1|
190
- f&.at(ns("./title"))&.children&.each { |c2| parse(c2, h1) }
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
- def bibliography_parse(node, out)
197
- node["hidden"] != true or return
198
- out.div do |div|
199
- clause_parse_title(node, div, node.at(ns("./title")), out,
200
- { class: "Section3" })
201
- biblio_list(node, div, true)
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