isodoc 1.7.3.1 → 1.7.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) 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/spec/assets/odf.svg +1 -4
  37. data/spec/isodoc/blocks_spec.rb +187 -32
  38. data/spec/isodoc/inline_spec.rb +300 -116
  39. data/spec/isodoc/postproc_spec.rb +38 -0
  40. data/spec/isodoc/presentation_xml_spec.rb +144 -0
  41. data/spec/isodoc/section_spec.rb +764 -0
  42. data/spec/isodoc/terms_spec.rb +116 -0
  43. metadata +63 -18
@@ -1,251 +1,201 @@
1
- module IsoDoc::Function
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
- if node["inline-header"] == "true"
25
- inline_header_title(out, node, title)
26
- else
27
- depth = if title && title["depth"] then title["depth"]
28
- else node.ancestors("clause, annex, terms, references, definitions, "\
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
- def clause_attrs(node)
38
- { id: node["id"] }
39
- end
40
-
41
- # used for subclauses
42
- def clause_parse(node, out)
43
- out.div **attr_code(clause_attrs(node)) do |div|
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
- def clause(isoxml, out)
64
- isoxml.xpath(ns(middle_clause(isoxml))).each do |c|
65
- out.div **attr_code(clause_attrs(c)) do |s|
66
- clause_name(nil, c&.at(ns("./title")), s, nil)
67
- c.elements.reject { |c1| c1.name == "title" }.each do |c1|
68
- parse(c1, s)
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
- div.h1 **{ class: "Annex" } do |t|
78
- name.children.each { |c2| parse(c2, t) }
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
- def annex(isoxml, out)
87
- isoxml.xpath(ns("//annex")).each do |c|
88
- page_break(out)
89
- out.div **attr_code(annex_attrs(c)) do |s|
90
- c.elements.each do |c1|
91
- if c1.name == "title" then annex_name(c, c1, s)
92
- else
93
- parse(c1, s)
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
- def scope(isoxml, out, num)
101
- f = isoxml.at(ns("//clause[@type = 'scope']")) or return num
102
- out.div **attr_code(id: f["id"]) do |div|
103
- num = num + 1
104
- clause_name(num, f&.at(ns("./title")), div, nil)
105
- f.elements.each do |e|
106
- parse(e, div) unless e.name == "title"
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
- TERM_CLAUSE = "//sections/terms | "\
113
- "//sections/clause[descendant::terms]".freeze
61
+ TERM_CLAUSE = "//sections/terms | "\
62
+ "//sections/clause[descendant::terms]".freeze
114
63
 
115
- def terms_defs(isoxml, out, num)
116
- f = isoxml.at(ns(TERM_CLAUSE)) or return num
117
- out.div **attr_code(id: f["id"]) do |div|
118
- num = num + 1
119
- clause_name(num, f&.at(ns("./title")), div, nil)
120
- f.elements.each do |e|
121
- parse(e, div) unless %w{title source}.include? e.name
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
- def symbols_abbrevs(isoxml, out, num)
133
- f = isoxml.at(ns("//sections/definitions")) or return num
134
- out.div **attr_code(id: f["id"], class: "Symbols") do |div|
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
- def introduction(isoxml, out)
152
- f = isoxml.at(ns("//introduction")) || return
153
- page_break(out)
154
- out.div **{ class: "Section3", id: f["id"] } do |div|
155
- clause_name(nil, f.at(ns("./title")), div, { class: "IntroTitle" })
156
- f.elements.each do |e|
157
- parse(e, div) unless e.name == "title"
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
- def foreword(isoxml, out)
163
- f = isoxml.at(ns("//foreword")) || return
164
- page_break(out)
165
- out.div **attr_code(id: f["id"]) do |s|
166
- clause_name(nil, f.at(ns("./title")) || @i18n.foreword, s,
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
- def acknowledgements(isoxml, out)
173
- f = isoxml.at(ns("//acknowledgements")) || return
174
- title_attr = { class: "IntroTitle" }
175
- page_break(out)
176
- out.div **{ class: "Section3", id: f["id"] } do |div|
177
- clause_name(nil, f&.at(ns("./title")), div, title_attr)
178
- f.elements.each do |e|
179
- parse(e, div) unless e.name == "title"
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
- def abstract(isoxml, out)
185
- f = isoxml.at(ns("//preface/abstract")) || return
186
- page_break(out)
187
- out.div **attr_code(id: f["id"]) do |s|
188
- clause_name(nil, f.at(ns("./title")), s, { class: "AbstractTitle" })
189
- f.elements.each { |e| parse(e, s) unless e.name == "title" }
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
- def preface(isoxml, out)
194
- isoxml.xpath(ns("//preface/clause | //preface/references | "\
195
- "//preface/definitions | //preface/terms")).each do |f|
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, { class: "IntroTitle" })
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
- def is_clause?(name)
207
- %w(clause references definitions terms foreword introduction abstract
208
- acknowledgements).include? name
209
- end
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
- def preface_block(isoxml, out)
212
- p = isoxml.at(ns("//preface")) or return
213
- p.elements.each do |e|
214
- next if is_clause?(e.name)
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
- parse(e, out)
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
- def copyright_parse(node, out)
221
- return if @bare
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
- out.div **{ class: "boilerplate-copyright" } do |div|
224
- node.children.each { |n| parse(n, div) }
165
+ parse(e, out)
166
+ end
225
167
  end
226
- end
227
168
 
228
- def license_parse(node, out)
229
- return if @bare
169
+ def copyright_parse(node, out)
170
+ return if @bare
230
171
 
231
- out.div **{ class: "boilerplate-license" } do |div|
232
- node.children.each { |n| parse(n, div) }
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
- def legal_parse(node, out)
237
- return if @bare
177
+ def license_parse(node, out)
178
+ return if @bare
238
179
 
239
- out.div **{ class: "boilerplate-legal" } do |div|
240
- node.children.each { |n| parse(n, div) }
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
- def feedback_parse(node, out)
245
- return if @bare
185
+ def legal_parse(node, out)
186
+ return if @bare
246
187
 
247
- out.div **{ class: "boilerplate-feedback" } do |div|
248
- node.children.each { |n| parse(n, div) }
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
@@ -0,0 +1,82 @@
1
+ module IsoDoc
2
+ module Function
3
+ module Section
4
+ def clausedelim
5
+ "."
6
+ end
7
+
8
+ def clausedelimspace(out)
9
+ insert_tab(out, 1)
10
+ end
11
+
12
+ def inline_header_title(out, _node, title)
13
+ out.span **{ class: "zzMoveToFollowing" } do |s|
14
+ s.b do |b|
15
+ title&.children&.each { |c2| parse(c2, b) }
16
+ clausedelimspace(out) if /\S/.match?(title&.text)
17
+ end
18
+ end
19
+ end
20
+
21
+ # used for subclauses
22
+ def clause_parse_title(node, div, title, out, header_class = {})
23
+ return if title.nil?
24
+
25
+ if node["inline-header"] == "true"
26
+ inline_header_title(out, node, title)
27
+ else
28
+ clause_parse_title1(node, div, title, out, header_class)
29
+ end
30
+ end
31
+
32
+ def clause_parse_title1(node, div, title, _out, header_class = {})
33
+ depth = clause_title_depth(node, title)
34
+ div.send "h#{depth}", **attr_code(header_class) do |h|
35
+ title&.children&.each { |c2| parse(c2, h) }
36
+ clause_parse_subtitle(title, h)
37
+ end
38
+ end
39
+
40
+ def clause_title_depth(node, title)
41
+ depth = node.ancestors("clause, annex, terms, references, "\
42
+ "definitions, acknowledgements, introduction, "\
43
+ "foreword").size + 1
44
+ depth = title["depth"] if title && title["depth"]
45
+ depth
46
+ end
47
+
48
+ def clause_parse_subtitle(title, heading)
49
+ if var = title&.at("./following-sibling::xmlns:variant-title"\
50
+ "[@type = 'sub']")&.remove
51
+ heading.br nil
52
+ heading.br nil
53
+ var.children.each { |c2| parse(c2, heading) }
54
+ end
55
+ end
56
+
57
+ def clause_name(_num, title, div, header_class)
58
+ header_class = {} if header_class.nil?
59
+ div.h1 **attr_code(header_class) do |h1|
60
+ if title.is_a?(String)
61
+ h1 << title
62
+ else
63
+ title&.children&.each { |c2| parse(c2, h1) }
64
+ clause_parse_subtitle(title, h1)
65
+ end
66
+ end
67
+ div.parent.at(".//h1")
68
+ end
69
+
70
+ def annex_name(_annex, name, div)
71
+ return if name.nil?
72
+
73
+ div.h1 **{ class: "Annex" } do |t|
74
+ name.children.each { |c2| parse(c2, t) }
75
+ clause_parse_subtitle(name, t)
76
+ end
77
+ end
78
+
79
+ def variant_title(_node, _out); end
80
+ end
81
+ end
82
+ end