isodoc 1.0.20 → 1.0.21
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/lib/isodoc/base_style/reset.scss +3 -0
- data/lib/isodoc/function/blocks.rb +7 -52
- data/lib/isodoc/function/blocks_example.rb +53 -0
- data/lib/isodoc/function/cleanup.rb +29 -0
- data/lib/isodoc/function/lists.rb +5 -0
- data/lib/isodoc/function/references.rb +6 -15
- data/lib/isodoc/function/section.rb +3 -0
- data/lib/isodoc/function/table.rb +2 -1
- data/lib/isodoc/function/xref_gen.rb +1 -133
- data/lib/isodoc/function/xref_gen_seq.rb +154 -0
- data/lib/isodoc/html_function/footnotes.rb +2 -1
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_function/body.rb +18 -2
- data/lib/isodoc/word_function/footnotes.rb +2 -1
- data/lib/isodoc/word_function/postprocess.rb +9 -0
- data/lib/isodoc/word_function/table.rb +1 -0
- data/spec/isodoc/blocks_spec.rb +116 -8
- data/spec/isodoc/cleanup_spec.rb +178 -0
- data/spec/isodoc/lists_spec.rb +96 -0
- data/spec/isodoc/postproc_spec.rb +122 -0
- data/spec/isodoc/section_spec.rb +32 -2
- data/spec/isodoc/table_spec.rb +25 -9
- data/spec/isodoc/xref_spec.rb +105 -17
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ced8fa4ff249bf78fce24da52269e4745261f432e59c7a18fddfaf4ecc01d8f
|
4
|
+
data.tar.gz: 39f693b7397daa3ad71af07fa7133ec086aab0f39a2e090e79537be6091736d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9d2086e3ca34a2478c59550edb4a76371e4e8fa46c92fc5b988c35ff8efc25ddffa2674861eed07bcea3f7bbe352bf2cdeee69ff1a5b67d50bdd76291d3c2fda
|
7
|
+
data.tar.gz: e0228c717670ed147bdaa4f0300274d51d127c28029b7c004961e258567ec293eb145accf70993fde00cc21ab6c67bffc70d140eb987309c99545061f7b43b37
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require_relative "blocks_example"
|
2
|
+
|
1
3
|
module IsoDoc::Function
|
2
4
|
module Blocks
|
3
5
|
@annotation = false
|
@@ -51,7 +53,7 @@ module IsoDoc::Function
|
|
51
53
|
end
|
52
54
|
|
53
55
|
def figure_key(out)
|
54
|
-
out.p do |p|
|
56
|
+
out.p **{ style: "page-break-after:avoid;"} do |p|
|
55
57
|
p.b { |b| b << @key_lbl }
|
56
58
|
end
|
57
59
|
end
|
@@ -80,56 +82,6 @@ module IsoDoc::Function
|
|
80
82
|
@in_figure = false
|
81
83
|
end
|
82
84
|
|
83
|
-
def example_label(node, div, name)
|
84
|
-
n = get_anchors[node["id"]]
|
85
|
-
div.p **{ class: "example-title" } do |p|
|
86
|
-
lbl = (n.nil? || n[:label].nil? || n[:label].empty?) ? @example_lbl :
|
87
|
-
l10n("#{@example_lbl} #{n[:label]}")
|
88
|
-
p << lbl
|
89
|
-
name and !lbl.nil? and p << " — "
|
90
|
-
name and name.children.each { |n| parse(n, div) }
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
EXAMPLE_TBL_ATTR =
|
95
|
-
{ class: "example_label", style: "width:82.8pt;padding:0 0 0 0;\
|
96
|
-
margin-left:0pt;vertical-align:top;" }.freeze
|
97
|
-
|
98
|
-
# used if we are boxing examples
|
99
|
-
def example_div_parse(node, out)
|
100
|
-
out.div **attr_code(id: node["id"], class: "example") do |div|
|
101
|
-
example_label(node, div, node.at(ns("./name")))
|
102
|
-
node.children.each do |n|
|
103
|
-
parse(n, div) unless n.name == "name"
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
def example_table_attr(node)
|
109
|
-
attr_code(id: node["id"], class: "example",
|
110
|
-
style: "border-collapse:collapse;border-spacing:0;" )
|
111
|
-
end
|
112
|
-
|
113
|
-
EXAMPLE_TD_ATTR =
|
114
|
-
{ style: "vertical-align:top;padding:0;", class: "example" }.freeze
|
115
|
-
|
116
|
-
def example_table_parse(node, out)
|
117
|
-
out.table **example_table_attr(node) do |t|
|
118
|
-
t.tr do |tr|
|
119
|
-
tr.td **EXAMPLE_TBL_ATTR do |td|
|
120
|
-
example_label(node, td, node.at(ns("./name")))
|
121
|
-
end
|
122
|
-
tr.td **EXAMPLE_TD_ATTR do |td|
|
123
|
-
node.children.each { |n| parse(n, td) unless n.name == "name" }
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
def example_parse(node, out)
|
130
|
-
example_div_parse(node, out)
|
131
|
-
end
|
132
|
-
|
133
85
|
def sourcecode_name_parse(node, div, name)
|
134
86
|
lbl = anchor(node['id'], :label, false)
|
135
87
|
lbl = nil if labelled_ancestor(node)
|
@@ -197,8 +149,11 @@ module IsoDoc::Function
|
|
197
149
|
|
198
150
|
def formula_where(dl, out)
|
199
151
|
return unless dl
|
200
|
-
out.p { |p|
|
152
|
+
out.p **{ style: "page-break-after:avoid;"} do |p|
|
153
|
+
p << @where_lbl
|
154
|
+
end
|
201
155
|
parse(dl, out)
|
156
|
+
out.parent.at("./dl")["class"] = "formula_dl"
|
202
157
|
end
|
203
158
|
|
204
159
|
def formula_parse1(node, out)
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module IsoDoc::Function
|
2
|
+
module Blocks
|
3
|
+
def example_label(node, div, name)
|
4
|
+
n = get_anchors[node["id"]]
|
5
|
+
div.p **{ class: "example-title" } do |p|
|
6
|
+
lbl = (n.nil? || n[:label].nil? || n[:label].empty?) ? @example_lbl :
|
7
|
+
l10n("#{@example_lbl} #{n[:label]}")
|
8
|
+
p << lbl
|
9
|
+
name and !lbl.nil? and p << " — "
|
10
|
+
name and name.children.each { |n| parse(n, div) }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
EXAMPLE_TBL_ATTR =
|
15
|
+
{ class: "example_label", style: "width:82.8pt;padding:0 0 0 0;\
|
16
|
+
margin-left:0pt;vertical-align:top;" }.freeze
|
17
|
+
|
18
|
+
# used if we are boxing examples
|
19
|
+
def example_div_parse(node, out)
|
20
|
+
out.div **attr_code(id: node["id"], class: "example") do |div|
|
21
|
+
example_label(node, div, node.at(ns("./name")))
|
22
|
+
node.children.each do |n|
|
23
|
+
parse(n, div) unless n.name == "name"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def example_table_attr(node)
|
29
|
+
attr_code(id: node["id"], class: "example",
|
30
|
+
style: "border-collapse:collapse;border-spacing:0;" )
|
31
|
+
end
|
32
|
+
|
33
|
+
EXAMPLE_TD_ATTR =
|
34
|
+
{ style: "vertical-align:top;padding:0;", class: "example" }.freeze
|
35
|
+
|
36
|
+
def example_table_parse(node, out)
|
37
|
+
out.table **example_table_attr(node) do |t|
|
38
|
+
t.tr do |tr|
|
39
|
+
tr.td **EXAMPLE_TBL_ATTR do |td|
|
40
|
+
example_label(node, td, node.at(ns("./name")))
|
41
|
+
end
|
42
|
+
tr.td **EXAMPLE_TD_ATTR do |td|
|
43
|
+
node.children.each { |n| parse(n, td) unless n.name == "name" }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def example_parse(node, out)
|
50
|
+
example_div_parse(node, out)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -19,6 +19,33 @@ module IsoDoc::Function
|
|
19
19
|
admonition_cleanup(docxml)
|
20
20
|
end
|
21
21
|
|
22
|
+
def table_long_strings_cleanup(docxml)
|
23
|
+
docxml.xpath("//td | //th").each do |d|
|
24
|
+
d.traverse do |n|
|
25
|
+
next unless n.text?
|
26
|
+
n.replace(break_up_long_strings(n.text))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def break_up_long_strings(t)
|
32
|
+
t.split(/(?=\s)/).map do |w|
|
33
|
+
(/^\s*$/.match(t) or w.size < 30) ? w :
|
34
|
+
w.scan(/.{,30}/).map do |w1|
|
35
|
+
(w1.size < 30) ? w1 : break_up_long_strings1(w1)
|
36
|
+
end.join
|
37
|
+
end.join
|
38
|
+
end
|
39
|
+
|
40
|
+
def break_up_long_strings1(w1)
|
41
|
+
s = w1.split(%r{(?<=[,.?+;/=])})
|
42
|
+
if s.size == 1 then w1 + " "
|
43
|
+
else
|
44
|
+
s[-1] = " " + s[-1]
|
45
|
+
s.join
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
22
49
|
def admonition_cleanup(docxml)
|
23
50
|
docxml.xpath("//div[@class = 'Admonition'][title]").each do |d|
|
24
51
|
title = d.at("./title")
|
@@ -65,6 +92,7 @@ module IsoDoc::Function
|
|
65
92
|
# since it is in diagram
|
66
93
|
def figure_cleanup(docxml)
|
67
94
|
docxml.xpath(FIGURE_WITH_FOOTNOTES).each do |f|
|
95
|
+
next unless f.at(".//aside[not(ancestor::p[@class = 'FigureTitle'])]")
|
68
96
|
key = figure_get_or_make_dl(f)
|
69
97
|
f.xpath(".//aside").each do |aside|
|
70
98
|
figure_aside_process(f, aside, key)
|
@@ -156,6 +184,7 @@ module IsoDoc::Function
|
|
156
184
|
def table_cleanup(docxml)
|
157
185
|
table_footnote_cleanup(docxml)
|
158
186
|
table_note_cleanup(docxml)
|
187
|
+
table_long_strings_cleanup(docxml)
|
159
188
|
docxml
|
160
189
|
end
|
161
190
|
|
@@ -43,6 +43,11 @@ module IsoDoc::Function
|
|
43
43
|
|
44
44
|
def li_parse(node, out)
|
45
45
|
out.li **attr_code(id: node["id"]) do |li|
|
46
|
+
if node["uncheckedcheckbox"] == "true"
|
47
|
+
li << '<span class="zzMoveToFollowing"><input type="checkbox" checked="checked"/></span>'
|
48
|
+
elsif node["checkedcheckbox"] == "true"
|
49
|
+
li << '<span class="zzMoveToFollowing"><input type="checkbox"/></span>'
|
50
|
+
end
|
46
51
|
node.children.each { |n| parse(n, li) }
|
47
52
|
end
|
48
53
|
end
|
@@ -131,13 +131,13 @@ module IsoDoc::Function
|
|
131
131
|
|
132
132
|
def biblio_list(f, div, biblio)
|
133
133
|
i = 0
|
134
|
-
f.
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
134
|
+
f.children.each do |b|
|
135
|
+
if b.name == "bibitem"
|
136
|
+
i += 1
|
137
|
+
(is_standard(b)) ? std_bibitem_entry(div, b, i, biblio) :
|
138
|
+
nonstd_bibitem(div, b, i, biblio)
|
139
139
|
else
|
140
|
-
|
140
|
+
parse(b, div) unless %w(title).include? b.name
|
141
141
|
end
|
142
142
|
end
|
143
143
|
end
|
@@ -149,9 +149,6 @@ module IsoDoc::Function
|
|
149
149
|
out.div do |div|
|
150
150
|
num = num + 1
|
151
151
|
clause_name(num, @normref_lbl, div, nil)
|
152
|
-
f.elements.reject do |e|
|
153
|
-
%w(reference title bibitem note).include? e.name
|
154
|
-
end.each { |e| parse(e, div) }
|
155
152
|
biblio_list(f, div, false)
|
156
153
|
end
|
157
154
|
num
|
@@ -165,9 +162,6 @@ module IsoDoc::Function
|
|
165
162
|
page_break(out)
|
166
163
|
out.div do |div|
|
167
164
|
div.h1 @bibliography_lbl, **{ class: "Section3" }
|
168
|
-
f.elements.reject do |e|
|
169
|
-
%w(reference title bibitem note).include? e.name
|
170
|
-
end.each { |e| parse(e, div) }
|
171
165
|
biblio_list(f, div, true)
|
172
166
|
end
|
173
167
|
end
|
@@ -178,9 +172,6 @@ module IsoDoc::Function
|
|
178
172
|
anchor(node['id'], :label, false) and
|
179
173
|
clause_parse_title(node, div, node.at(ns("./title")), out) or
|
180
174
|
div.h2 title, **{ class: "Section3" }
|
181
|
-
node.elements.reject do |e|
|
182
|
-
%w(reference title bibitem note).include? e.name
|
183
|
-
end.each { |e| parse(e, div) }
|
184
175
|
biblio_list(node, div, true)
|
185
176
|
end
|
186
177
|
end
|
@@ -20,6 +20,7 @@ module IsoDoc::Function
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
+
# used for subclauses
|
23
24
|
def clause_parse_title(node, div, c1, out)
|
24
25
|
if node["inline-header"] == "true"
|
25
26
|
inline_header_title(out, node, c1)
|
@@ -33,6 +34,7 @@ module IsoDoc::Function
|
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
37
|
+
# used for subclauses
|
36
38
|
def clause_parse(node, out)
|
37
39
|
out.div **attr_code(id: node["id"]) do |div|
|
38
40
|
clause_parse_title(node, div, node.at(ns("./title")), out)
|
@@ -84,6 +86,7 @@ module IsoDoc::Function
|
|
84
86
|
isoxml.xpath(ns("//annex")).each do |c|
|
85
87
|
page_break(out)
|
86
88
|
out.div **attr_code(id: c["id"], class: "Section3") do |s|
|
89
|
+
annex_name(c, nil, s) unless c.at(ns("./title"))
|
87
90
|
c.elements.each do |c1|
|
88
91
|
if c1.name == "title" then annex_name(c, c1, s)
|
89
92
|
else
|
@@ -45,10 +45,11 @@ module IsoDoc::Function
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def make_table_attr(node)
|
48
|
+
width = node["width"] ? "width:#{node['width']};" : nil
|
48
49
|
attr_code(
|
49
50
|
id: node["id"],
|
50
51
|
class: "MsoISOTable",
|
51
|
-
style: "border-width:1px;border-spacing:0
|
52
|
+
style: "border-width:1px;border-spacing:0;#{width}",
|
52
53
|
title: node["alt"]
|
53
54
|
)
|
54
55
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require_relative "xref_counter"
|
2
2
|
require_relative "xref_anchor"
|
3
|
+
require_relative "xref_gen_seq"
|
3
4
|
|
4
5
|
module IsoDoc::Function
|
5
6
|
module XrefGen
|
@@ -124,138 +125,5 @@ module IsoDoc::Function
|
|
124
125
|
example_anchor_names(docxml.xpath(ns(SECTIONS_XPATH)))
|
125
126
|
list_anchor_names(docxml.xpath(ns(SECTIONS_XPATH)))
|
126
127
|
end
|
127
|
-
|
128
|
-
def sequential_figure_names(clause)
|
129
|
-
c = Counter.new
|
130
|
-
j = 0
|
131
|
-
clause.xpath(ns(".//figure | .//sourcecode[not(ancestor::example)]")).each do |t|
|
132
|
-
if t.parent.name == "figure" then j += 1
|
133
|
-
else
|
134
|
-
j = 0
|
135
|
-
c.increment(t)
|
136
|
-
end
|
137
|
-
label = c.print + (j.zero? ? "" : "-#{j}")
|
138
|
-
next if t["id"].nil? || t["id"].empty?
|
139
|
-
@anchors[t["id"]] =
|
140
|
-
anchor_struct(label, nil, @figure_lbl, "figure", t["unnumbered"])
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
def sequential_table_names(clause)
|
145
|
-
c = Counter.new
|
146
|
-
clause.xpath(ns(".//table")).each do |t|
|
147
|
-
next if t["id"].nil? || t["id"].empty?
|
148
|
-
@anchors[t["id"]] = anchor_struct(c.increment(t).print, nil,
|
149
|
-
@table_lbl, "table", t["unnumbered"])
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
def sequential_formula_names(clause)
|
154
|
-
c = Counter.new
|
155
|
-
clause.xpath(ns(".//formula")).each do |t|
|
156
|
-
next if t["id"].nil? || t["id"].empty?
|
157
|
-
@anchors[t["id"]] =
|
158
|
-
anchor_struct(c.increment(t).print, t,
|
159
|
-
t["inequality"] ? @inequality_lbl : @formula_lbl,
|
160
|
-
"formula", t["unnumbered"])
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
FIRST_LVL_REQ = "[not(ancestor::permission or ancestor::requirement or "\
|
165
|
-
"ancestor::recommendation)]".freeze
|
166
|
-
|
167
|
-
def sequential_permission_names(clause, klass, label)
|
168
|
-
c = Counter.new
|
169
|
-
clause.xpath(ns(".//#{klass}#{FIRST_LVL_REQ}")).each do |t|
|
170
|
-
next if t["id"].nil? || t["id"].empty?
|
171
|
-
id = c.increment(t).print
|
172
|
-
@anchors[t["id"]] = anchor_struct(id, t, label, klass, t["unnumbered"])
|
173
|
-
sequential_permission_names2(t, id)
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
def sequential_permission_names2(t, id)
|
178
|
-
sequential_permission_names1(t, id, "permission", @permission_lbl)
|
179
|
-
sequential_permission_names1(t, id, "requirement", @requirement_lbl)
|
180
|
-
sequential_permission_names1(t, id, "recommendation", @recommendation_lbl)
|
181
|
-
end
|
182
|
-
|
183
|
-
def sequential_permission_names1(block, lbl, klass, label)
|
184
|
-
c = Counter.new
|
185
|
-
block.xpath(ns("./#{klass}")).each do |t|
|
186
|
-
next if t["id"].nil? || t["id"].empty?
|
187
|
-
id = "#{lbl}#{hierfigsep}#{c.increment(t).print}"
|
188
|
-
@anchors[t["id"]] = anchor_struct(id, t, label, klass, t["unnumbered"])
|
189
|
-
sequential_permission_names2(t, id)
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
def sequential_asset_names(clause)
|
194
|
-
sequential_table_names(clause)
|
195
|
-
sequential_figure_names(clause)
|
196
|
-
sequential_formula_names(clause)
|
197
|
-
sequential_permission_names(clause, "permission", @permission_lbl)
|
198
|
-
sequential_permission_names(clause, "requirement", @requirement_lbl)
|
199
|
-
sequential_permission_names(clause, "recommendation", @recommendation_lbl)
|
200
|
-
end
|
201
|
-
|
202
|
-
def hierarchical_figure_names(clause, num)
|
203
|
-
c = Counter.new
|
204
|
-
j = 0
|
205
|
-
clause.xpath(ns(".//figure | .//sourcecode[not(ancestor::example)]")).each do |t|
|
206
|
-
if t.parent.name == "figure" then j += 1
|
207
|
-
else
|
208
|
-
j = 0
|
209
|
-
c.increment(t)
|
210
|
-
end
|
211
|
-
label = "#{num}#{hiersep}#{c.print}" +
|
212
|
-
(j.zero? ? "" : "#{hierfigsep}#{j}")
|
213
|
-
next if t["id"].nil? || t["id"].empty?
|
214
|
-
@anchors[t["id"]] = anchor_struct(label, nil, @figure_lbl, "figure",
|
215
|
-
t["unnumbered"])
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
def hierarchical_table_names(clause, num)
|
220
|
-
c = Counter.new
|
221
|
-
clause.xpath(ns(".//table")).each do |t|
|
222
|
-
next if t["id"].nil? || t["id"].empty?
|
223
|
-
@anchors[t["id"]] =
|
224
|
-
anchor_struct("#{num}#{hiersep}#{c.increment(t).print}",
|
225
|
-
nil, @table_lbl, "table", t["unnumbered"])
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
def hierarchical_asset_names(clause, num)
|
230
|
-
hierarchical_table_names(clause, num)
|
231
|
-
hierarchical_figure_names(clause, num)
|
232
|
-
hierarchical_formula_names(clause, num)
|
233
|
-
hierarchical_permission_names(clause, num, "permission", @permission_lbl)
|
234
|
-
hierarchical_permission_names(clause, num, "requirement",
|
235
|
-
@requirement_lbl)
|
236
|
-
hierarchical_permission_names(clause, num, "recommendation",
|
237
|
-
@recommendation_lbl)
|
238
|
-
end
|
239
|
-
|
240
|
-
def hierarchical_formula_names(clause, num)
|
241
|
-
c = Counter.new
|
242
|
-
clause.xpath(ns(".//formula")).each do |t|
|
243
|
-
next if t["id"].nil? || t["id"].empty?
|
244
|
-
@anchors[t["id"]] =
|
245
|
-
anchor_struct("#{num}#{hiersep}#{c.increment(t).print}", t,
|
246
|
-
t["inequality"] ? @inequality_lbl : @formula_lbl,
|
247
|
-
"formula", t["unnumbered"])
|
248
|
-
end
|
249
|
-
end
|
250
|
-
|
251
|
-
def hierarchical_permission_names(clause, num, klass, label)
|
252
|
-
c = Counter.new
|
253
|
-
clause.xpath(ns(".//#{klass}#{FIRST_LVL_REQ}")).each do |t|
|
254
|
-
next if t["id"].nil? || t["id"].empty?
|
255
|
-
id = "#{num}#{hiersep}#{c.increment(t).print}"
|
256
|
-
@anchors[t["id"]] = anchor_struct(id, t, label, klass, t["unnumbered"])
|
257
|
-
sequential_permission_names2(t, id)
|
258
|
-
end
|
259
|
-
end
|
260
128
|
end
|
261
129
|
end
|