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
@@ -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
|
@@ -1,116 +1,119 @@
|
|
1
|
-
module IsoDoc
|
2
|
-
module
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
module IsoDoc
|
2
|
+
module Function
|
3
|
+
module Table
|
4
|
+
def table_title_parse(node, out)
|
5
|
+
name = node.at(ns("./name")) or return
|
6
|
+
out.p **{ class: "TableTitle", style: "text-align:center;" } do |p|
|
7
|
+
name&.children&.each { |n| parse(n, p) }
|
8
|
+
end
|
7
9
|
end
|
8
|
-
end
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
def thead_parse(node, table)
|
12
|
+
thead = node.at(ns("./thead"))
|
13
|
+
if thead
|
14
|
+
table.thead do |h|
|
15
|
+
thead.element_children.each_with_index do |n, i|
|
16
|
+
tr_parse(n, h, i, thead.element_children.size, true)
|
17
|
+
end
|
16
18
|
end
|
17
19
|
end
|
18
20
|
end
|
19
|
-
end
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
def tbody_parse(node, table)
|
23
|
+
tbody = node.at(ns("./tbody")) || return
|
24
|
+
table.tbody do |h|
|
25
|
+
tbody.element_children.each_with_index do |n, i|
|
26
|
+
tr_parse(n, h, i, tbody.element_children.size, false)
|
27
|
+
end
|
26
28
|
end
|
27
29
|
end
|
28
|
-
end
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
def tfoot_parse(node, table)
|
32
|
+
tfoot = node.at(ns("./tfoot"))
|
33
|
+
if tfoot
|
34
|
+
table.tfoot do |h|
|
35
|
+
tfoot.element_children.each_with_index do |n, i|
|
36
|
+
tr_parse(n, h, i, tfoot.element_children.size, false)
|
37
|
+
end
|
36
38
|
end
|
37
39
|
end
|
38
40
|
end
|
39
|
-
end
|
40
41
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
42
|
+
def table_attrs(node)
|
43
|
+
width = node["width"] ? "width:#{node['width']};" : nil
|
44
|
+
attr_code(
|
45
|
+
id: node["id"],
|
46
|
+
class: "MsoISOTable",
|
47
|
+
style: "border-width:1px;border-spacing:0;"\
|
48
|
+
"#{width}#{keep_style(node)}",
|
49
|
+
title: node["alt"],
|
50
|
+
)
|
51
|
+
end
|
50
52
|
|
51
|
-
|
52
|
-
|
53
|
+
def tcaption(node, table)
|
54
|
+
return unless node["summary"]
|
53
55
|
|
54
|
-
|
55
|
-
|
56
|
-
|
56
|
+
table.caption do |c|
|
57
|
+
c.span **{ style: "display:none" } do |s|
|
58
|
+
s << node["summary"]
|
59
|
+
end
|
57
60
|
end
|
58
61
|
end
|
59
|
-
end
|
60
62
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
63
|
+
def colgroup(node, table)
|
64
|
+
colgroup = node.at(ns("./colgroup")) or return
|
65
|
+
table.colgroup do |cg|
|
66
|
+
colgroup.xpath(ns("./col")).each do |c|
|
67
|
+
cg.col **{ style: "width: #{c['width']};" }
|
68
|
+
end
|
66
69
|
end
|
67
70
|
end
|
68
|
-
end
|
69
71
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
72
|
+
def table_parse(node, out)
|
73
|
+
@in_table = true
|
74
|
+
table_title_parse(node, out)
|
75
|
+
out.table **table_attrs(node) do |t|
|
76
|
+
tcaption(node, t)
|
77
|
+
colgroup(node, t)
|
78
|
+
thead_parse(node, t)
|
79
|
+
tbody_parse(node, t)
|
80
|
+
tfoot_parse(node, t)
|
81
|
+
(dl = node.at(ns("./dl"))) && parse(dl, out)
|
82
|
+
node.xpath(ns("./note")).each { |n| parse(n, out) }
|
83
|
+
end
|
84
|
+
@in_table = false
|
85
|
+
# out.p { |p| p << " " }
|
81
86
|
end
|
82
|
-
@in_table = false
|
83
|
-
# out.p { |p| p << " " }
|
84
|
-
end
|
85
87
|
|
86
|
-
|
88
|
+
SW = "solid windowtext".freeze
|
87
89
|
|
88
|
-
|
89
|
-
|
90
|
-
|
90
|
+
# def make_tr_attr(td, row, totalrows, cols, totalcols, header)
|
91
|
+
# border-left:#{col.zero? ? "#{SW} 1.5pt;" : "none;"}
|
92
|
+
# border-right:#{SW} #{col == totalcols && !header ? "1.5" : "1.0"}pt;
|
91
93
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
94
|
+
def make_tr_attr(cell, row, totalrows, header)
|
95
|
+
style = cell.name == "th" ? "font-weight:bold;" : ""
|
96
|
+
cell["align"] and style += "text-align:#{cell['align']};"
|
97
|
+
cell["valign"] and style += "vertical-align:#{cell['valign']};"
|
98
|
+
rowmax = cell["rowspan"] ? row + cell["rowspan"].to_i - 1 : row
|
99
|
+
style += <<~STYLE
|
100
|
+
border-top:#{row.zero? ? "#{SW} 1.5pt;" : 'none;'}
|
101
|
+
border-bottom:#{SW} #{rowmax == totalrows ? '1.5' : '1.0'}pt;
|
102
|
+
STYLE
|
103
|
+
header and scope = (cell["colspan"] ? "colgroup" : "col")
|
104
|
+
!header && cell.name == "th" and
|
105
|
+
scope = (cell["rowspan"] ? "rowgroup" : "row")
|
106
|
+
{ rowspan: cell["rowspan"], colspan: cell["colspan"],
|
107
|
+
style: style.gsub(/\n/, ""), scope: scope }
|
108
|
+
end
|
107
109
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
110
|
+
def tr_parse(node, out, ord, totalrows, header)
|
111
|
+
out.tr do |r|
|
112
|
+
node.elements.each do |td|
|
113
|
+
attrs = make_tr_attr(td, ord, totalrows - 1, header)
|
114
|
+
r.send td.name, **attr_code(attrs) do |entry|
|
115
|
+
td.children.each { |n| parse(n, entry) }
|
116
|
+
end
|
114
117
|
end
|
115
118
|
end
|
116
119
|
end
|
@@ -1,77 +1,79 @@
|
|
1
|
-
module IsoDoc
|
2
|
-
module
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
module IsoDoc
|
2
|
+
module Function
|
3
|
+
module Terms
|
4
|
+
def definition_parse(node, out)
|
5
|
+
node.children.each { |n| parse(n, out) }
|
6
|
+
end
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
def modification_parse(node, out)
|
9
|
+
out << "[MODIFICATION]"
|
10
|
+
para = node.at(ns("./p"))
|
11
|
+
para.children.each { |n| parse(n, out) }
|
12
|
+
end
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
def deprecated_term_parse(node, out)
|
15
|
+
out.p **{ class: "DeprecatedTerms", style: "text-align:left;" } do |p|
|
16
|
+
p << l10n("#{@i18n.deprecated}: ")
|
17
|
+
node.children.each { |c| parse(c, p) }
|
18
|
+
end
|
17
19
|
end
|
18
|
-
end
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
21
|
+
def admitted_term_parse(node, out)
|
22
|
+
out.p **{ class: "AltTerms", style: "text-align:left;" } do |p|
|
23
|
+
node.children.each { |c| parse(c, p) }
|
24
|
+
end
|
23
25
|
end
|
24
|
-
end
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
|
27
|
+
def term_parse(node, out)
|
28
|
+
out.p **{ class: "Terms", style: "text-align:left;" } do |p|
|
29
|
+
node.children.each { |c| parse(c, p) }
|
30
|
+
end
|
29
31
|
end
|
30
|
-
end
|
31
32
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
33
|
+
def para_then_remainder(first, node, para, div)
|
34
|
+
if first.name == "p"
|
35
|
+
first.children.each { |n| parse(n, para) }
|
36
|
+
node.elements.drop(1).each { |n| parse(n, div) }
|
37
|
+
else
|
38
|
+
node.elements.each { |n| parse(n, div) }
|
39
|
+
end
|
38
40
|
end
|
39
|
-
end
|
40
41
|
|
41
|
-
|
42
|
-
|
43
|
-
|
42
|
+
def termnote_delim
|
43
|
+
l10n(": ")
|
44
|
+
end
|
44
45
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
46
|
+
def termnote_parse(node, out)
|
47
|
+
name = node&.at(ns("./name"))&.remove
|
48
|
+
out.div **note_attrs(node) do |div|
|
49
|
+
div.p do |p|
|
50
|
+
if name
|
51
|
+
name.children.each { |n| parse(n, p) }
|
52
|
+
p << termnote_delim
|
53
|
+
end
|
54
|
+
para_then_remainder(node.first_element_child, node, p, div)
|
52
55
|
end
|
53
|
-
para_then_remainder(node.first_element_child, node, p, div)
|
54
56
|
end
|
55
57
|
end
|
56
|
-
end
|
57
58
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
59
|
+
def termref_parse(node, out)
|
60
|
+
out.p do |p|
|
61
|
+
p << "[TERMREF]"
|
62
|
+
node.children.each { |n| parse(n, p) }
|
63
|
+
p << "[/TERMREF]"
|
64
|
+
end
|
63
65
|
end
|
64
|
-
end
|
65
66
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
67
|
+
def termdef_parse(node, out)
|
68
|
+
name = node&.at(ns("./name"))&.remove
|
69
|
+
out.p **{ class: "TermNum", id: node["id"] } do |p|
|
70
|
+
name&.children&.each { |n| parse(n, p) }
|
71
|
+
end
|
72
|
+
set_termdomain("")
|
73
|
+
node.children.each { |n| parse(n, out) }
|
70
74
|
end
|
71
|
-
set_termdomain("")
|
72
|
-
node.children.each { |n| parse(n, out) }
|
73
|
-
end
|
74
75
|
|
75
|
-
|
76
|
+
def termdocsource_parse(_node, _out); end
|
77
|
+
end
|
76
78
|
end
|
77
79
|
end
|
@@ -233,6 +233,7 @@ module IsoDoc
|
|
233
233
|
when "option" then option_parse(node, out)
|
234
234
|
when "textarea" then textarea_parse(node, out)
|
235
235
|
when "toc" then toc_parse(node, out)
|
236
|
+
when "variant-title" then variant_title(node, out)
|
236
237
|
else error_parse(node, out)
|
237
238
|
end
|
238
239
|
end
|
@@ -41,6 +41,7 @@ module IsoDoc
|
|
41
41
|
def convert
|
42
42
|
docxml.xpath("//m:math", MATHML).each do |elem|
|
43
43
|
next if nothing_to_style(elem)
|
44
|
+
|
44
45
|
mathml1(elem)
|
45
46
|
end
|
46
47
|
docxml
|
@@ -49,7 +50,8 @@ module IsoDoc
|
|
49
50
|
private
|
50
51
|
|
51
52
|
def nothing_to_style(elem)
|
52
|
-
!elem.at("./*[@mathvariant][not(@mathvariant = 'normal')]
|
53
|
+
!elem.at("./*[@mathvariant][not(@mathvariant = 'normal')]"\
|
54
|
+
"[not(@mathvariant = 'italic')]")
|
53
55
|
end
|
54
56
|
|
55
57
|
def mathml1(base_elem)
|
@@ -58,7 +60,7 @@ module IsoDoc
|
|
58
60
|
.merge(MATHVARIANT_TO_PLANE_MAPPINGS)
|
59
61
|
.each_pair do |mathvariant_list, plain_font|
|
60
62
|
base_elem.xpath(mathvariant_xpath(mathvariant_list)).each do |elem|
|
61
|
-
|
63
|
+
to_plane(elem, plain_font)
|
62
64
|
end
|
63
65
|
end
|
64
66
|
end
|
@@ -69,7 +71,7 @@ module IsoDoc
|
|
69
71
|
.join
|
70
72
|
end
|
71
73
|
|
72
|
-
def
|
74
|
+
def to_plane(elem, font)
|
73
75
|
elem.traverse do |n|
|
74
76
|
next unless n.text?
|
75
77
|
|