isodoc 0.5.8 → 0.5.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.tb.yml +20 -10
- data/lib/isodoc/blocks.rb +13 -13
- data/lib/isodoc/cleanup.rb +19 -3
- data/lib/isodoc/comments.rb +1 -1
- data/lib/isodoc/convert.rb +2 -0
- data/lib/isodoc/footnotes.rb +4 -2
- data/lib/isodoc/html.rb +28 -10
- data/lib/isodoc/i18n-en.yaml +9 -0
- data/lib/isodoc/i18n-fr.yaml +12 -3
- data/lib/isodoc/i18n-zh-Hans.yaml +10 -1
- data/lib/isodoc/i18n.rb +9 -2
- data/lib/isodoc/inline.rb +5 -6
- data/lib/isodoc/iso2wordhtml.rb +9 -6
- data/lib/isodoc/lists.rb +7 -5
- data/lib/isodoc/metadata.rb +27 -10
- data/lib/isodoc/references.rb +12 -6
- data/lib/isodoc/section.rb +17 -11
- data/lib/isodoc/table.rb +2 -4
- data/lib/isodoc/terms.rb +3 -3
- data/lib/isodoc/utils.rb +15 -14
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/wordconvert/comments.rb +1 -1
- data/lib/isodoc/wordconvert/wordconvertmodule.rb +51 -12
- data/lib/isodoc/xref_gen.rb +30 -26
- data/lib/isodoc/xref_sect_gen.rb +31 -13
- data/spec/assets/scripts.html +1 -0
- data/spec/isodoc/blocks_spec.rb +50 -49
- data/spec/isodoc/cleanup_spec.rb +6 -6
- data/spec/isodoc/footnotes_spec.rb +10 -2
- data/spec/isodoc/i18n_spec.rb +86 -54
- data/spec/isodoc/inline_spec.rb +22 -18
- data/spec/isodoc/lists_spec.rb +25 -11
- data/spec/isodoc/metadata_spec.rb +4 -3
- data/spec/isodoc/postproc_spec.rb +108 -42
- data/spec/isodoc/ref_spec.rb +9 -7
- data/spec/isodoc/section_spec.rb +162 -141
- data/spec/isodoc/table_spec.rb +18 -16
- data/spec/isodoc/terms_spec.rb +9 -9
- data/spec/isodoc/xref_spec.rb +153 -122
- metadata +3 -2
data/lib/isodoc/inline.rb
CHANGED
@@ -33,13 +33,13 @@ module IsoDoc
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def get_linkend(node)
|
36
|
-
|
37
|
-
|
36
|
+
link = anchor_linkend(node, docid_l10n(node["target"] || node["citeas"]))
|
37
|
+
link += eref_localities(node.xpath(ns("./locality")))
|
38
38
|
text = node.children.select { |c| c.text? && !c.text.empty? }
|
39
|
-
|
39
|
+
link = text.join(" ") unless text.nil? || text.empty?
|
40
40
|
# so not <origin bibitemid="ISO7301" citeas="ISO 7301">
|
41
41
|
# <locality type="section"><reference>3.1</reference></locality></origin>
|
42
|
-
|
42
|
+
link
|
43
43
|
end
|
44
44
|
|
45
45
|
def xref_parse(node, out)
|
@@ -50,8 +50,7 @@ module IsoDoc
|
|
50
50
|
def eref_localities(refs)
|
51
51
|
ret = ""
|
52
52
|
refs.each do |r|
|
53
|
-
ret += if r["type"] == "whole"
|
54
|
-
l10n(", #{@whole_of_text}")
|
53
|
+
ret += if r["type"] == "whole" then l10n(", #{@whole_of_text}")
|
55
54
|
else
|
56
55
|
eref_localities1(r["type"], r.at(ns("./referenceFrom")),
|
57
56
|
r.at(ns("./referenceTo")), @lang)
|
data/lib/isodoc/iso2wordhtml.rb
CHANGED
@@ -82,7 +82,9 @@ module IsoDoc
|
|
82
82
|
def info(isoxml, out)
|
83
83
|
title isoxml, out
|
84
84
|
subtitle isoxml, out
|
85
|
-
|
85
|
+
docstatus isoxml, out
|
86
|
+
docid isoxml, out
|
87
|
+
doctype isoxml, out
|
86
88
|
author isoxml, out
|
87
89
|
bibdate isoxml, out
|
88
90
|
relations isoxml, out
|
@@ -97,10 +99,10 @@ module IsoDoc
|
|
97
99
|
|
98
100
|
def middle(isoxml, out)
|
99
101
|
middle_title(out)
|
100
|
-
scope isoxml, out
|
101
|
-
norm_ref isoxml, out
|
102
|
-
terms_defs isoxml, out
|
103
|
-
symbols_abbrevs isoxml, out
|
102
|
+
i = scope isoxml, out, 0
|
103
|
+
i = norm_ref isoxml, out, i
|
104
|
+
i = terms_defs isoxml, out, i
|
105
|
+
i = symbols_abbrevs isoxml, out, i
|
104
106
|
clause isoxml, out
|
105
107
|
annex isoxml, out
|
106
108
|
bibliography isoxml, out
|
@@ -142,7 +144,8 @@ module IsoDoc
|
|
142
144
|
when "callout" then callout_parse(node, out)
|
143
145
|
when "stem" then stem_parse(node, out)
|
144
146
|
when "clause" then clause_parse(node, out)
|
145
|
-
when "
|
147
|
+
# when "subclause" then clause_parse(node, out)
|
148
|
+
when "appendix" then clause_parse(node, out)
|
146
149
|
when "xref" then xref_parse(node, out)
|
147
150
|
when "eref" then eref_parse(node, out)
|
148
151
|
when "origin" then eref_parse(node, out)
|
data/lib/isodoc/lists.rb
CHANGED
@@ -22,7 +22,6 @@ module IsoDoc
|
|
22
22
|
# We don't really want users to specify type of ordered list;
|
23
23
|
# we will use a fixed hierarchy as practiced by ISO (though not
|
24
24
|
# fully spelled out): a) 1) i) A) I)
|
25
|
-
#
|
26
25
|
|
27
26
|
def ol_depth(node)
|
28
27
|
depth = node.ancestors("ul, ol").size + 1
|
@@ -58,17 +57,20 @@ module IsoDoc
|
|
58
57
|
end
|
59
58
|
end
|
60
59
|
|
60
|
+
def dt_dd?(n)
|
61
|
+
%w{dt dd}.include? n.name
|
62
|
+
end
|
63
|
+
|
61
64
|
def dl_parse(node, out)
|
62
65
|
out.dl do |v|
|
63
|
-
node.elements.each_slice(2) do |dt, dd|
|
64
|
-
v.dt
|
65
|
-
dt_parse(dt, term)
|
66
|
-
end
|
66
|
+
node.elements.select { |n| dt_dd? n }.each_slice(2) do |dt, dd|
|
67
|
+
v.dt { |term| dt_parse(dt, term) }
|
67
68
|
v.dd do |listitem|
|
68
69
|
dd.children.each { |n| parse(n, listitem) }
|
69
70
|
end
|
70
71
|
end
|
71
72
|
end
|
73
|
+
node.elements.reject { |n| dt_dd? n }.each { |n| parse(n, out) }
|
72
74
|
end
|
73
75
|
end
|
74
76
|
end
|
data/lib/isodoc/metadata.rb
CHANGED
@@ -2,15 +2,16 @@ require "htmlentities"
|
|
2
2
|
|
3
3
|
module IsoDoc
|
4
4
|
class Convert
|
5
|
+
DATETYPES = %w{published accessed created implemented obsoleted confirmed
|
6
|
+
updated issued}.freeze
|
7
|
+
|
5
8
|
def init_metadata
|
6
9
|
@meta = { tc: "XXXX", sc: "XXXX", wg: "XXXX",
|
7
10
|
editorialgroup: [],
|
8
11
|
secretariat: "XXXX",
|
9
12
|
obsoletes: nil,
|
10
13
|
obsoletes_part: nil }
|
11
|
-
|
12
|
-
@meta["#{w}date".to_sym] = "XXX"
|
13
|
-
end
|
14
|
+
DATETYPES.each { |w| @meta["#{w}date".to_sym] = "XXX" }
|
14
15
|
end
|
15
16
|
|
16
17
|
def get_metadata
|
@@ -79,6 +80,13 @@ module IsoDoc
|
|
79
80
|
end
|
80
81
|
end
|
81
82
|
|
83
|
+
def doctype(isoxml, _out)
|
84
|
+
b = isoxml.at(ns("//bibdata")) || return
|
85
|
+
return unless b["type"]
|
86
|
+
t = b["type"].split(/-/).map{ |w| w.capitalize }.join(" ")
|
87
|
+
set_metadata(:doctype, t)
|
88
|
+
end
|
89
|
+
|
82
90
|
def iso?(org)
|
83
91
|
name = org&.at(ns("./name"))&.text
|
84
92
|
abbrev = org&.at(ns("./abbreviation"))&.text
|
@@ -108,14 +116,23 @@ module IsoDoc
|
|
108
116
|
dn
|
109
117
|
end
|
110
118
|
|
111
|
-
def
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
119
|
+
def docstatus(isoxml, _out)
|
120
|
+
docstatus = isoxml.at(ns("//status/stage"))
|
121
|
+
if docstatus
|
122
|
+
set_metadata(:stage, docstatus.text)
|
123
|
+
abbr = stage_abbrev(docstatus.text, isoxml.at(ns("//status/iteration")),
|
124
|
+
isoxml.at(ns("//version/draft")))
|
117
125
|
set_metadata(:stageabbr, abbr)
|
118
|
-
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def docid(isoxml, _out)
|
130
|
+
dn = docnumber(isoxml)
|
131
|
+
docstatus = get_metadata[:stage]
|
132
|
+
if docstatus
|
133
|
+
abbr = get_metadata[:stageabbr]
|
134
|
+
docstatus = get_metadata[:stage]
|
135
|
+
(docstatus.to_i < 60) && dn = abbr + " " + dn
|
119
136
|
end
|
120
137
|
set_metadata(:docnumber, dn)
|
121
138
|
end
|
data/lib/isodoc/references.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module IsoDoc
|
2
2
|
class Convert
|
3
3
|
def docid_l10n(x)
|
4
|
+
return x if x.nil?
|
4
5
|
x.gsub(/All Parts/, @all_parts_lbl)
|
5
6
|
end
|
6
7
|
|
@@ -106,19 +107,24 @@ module IsoDoc
|
|
106
107
|
div.p pref
|
107
108
|
end
|
108
109
|
|
109
|
-
def norm_ref(isoxml, out)
|
110
|
-
q = "
|
111
|
-
f = isoxml.at(ns(q))
|
110
|
+
def norm_ref(isoxml, out, num)
|
111
|
+
q = "//bibliography/references[title = 'Normative References']"
|
112
|
+
f = isoxml.at(ns(q)) or return num
|
112
113
|
out.div do |div|
|
113
|
-
|
114
|
+
num = num + 1
|
115
|
+
clause_name("#{num}.", @normref_lbl, div, nil)
|
114
116
|
norm_ref_preface(f, div)
|
115
117
|
biblio_list(f, div, false)
|
116
118
|
end
|
119
|
+
num
|
117
120
|
end
|
118
121
|
|
122
|
+
BIBLIOGRAPHY_XPATH = "//bibliography/clause[title = 'Bibliography'] | "\
|
123
|
+
"//bibliography/references[title = 'Bibliography']".freeze
|
124
|
+
|
125
|
+
|
119
126
|
def bibliography(isoxml, out)
|
120
|
-
|
121
|
-
f = isoxml.at(ns(q)) || return
|
127
|
+
f = isoxml.at(ns(BIBLIOGRAPHY_XPATH)) || return
|
122
128
|
page_break(out)
|
123
129
|
out.div do |div|
|
124
130
|
div.h1 @bibliography_lbl, **{ class: "Section3" }
|
data/lib/isodoc/section.rb
CHANGED
@@ -83,14 +83,16 @@ module IsoDoc
|
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
|
-
def scope(isoxml, out)
|
87
|
-
f = isoxml.at(ns("//clause[title = 'Scope']"))
|
86
|
+
def scope(isoxml, out, num)
|
87
|
+
f = isoxml.at(ns("//clause[title = 'Scope']")) or return num
|
88
88
|
out.div **attr_code(id: f["id"]) do |div|
|
89
|
-
|
89
|
+
num = num + 1
|
90
|
+
clause_name("#{num}.", @scope_lbl, div, nil)
|
90
91
|
f.elements.each do |e|
|
91
92
|
parse(e, div) unless e.name == "title"
|
92
93
|
end
|
93
94
|
end
|
95
|
+
num
|
94
96
|
end
|
95
97
|
|
96
98
|
def external_terms_boilerplate(sources)
|
@@ -111,7 +113,7 @@ module IsoDoc
|
|
111
113
|
end
|
112
114
|
|
113
115
|
def term_defs_boilerplate_cont(src, term)
|
114
|
-
sources = sentence_join(src.map { |s| s["
|
116
|
+
sources = sentence_join(src.map { |s| @anchors[s["target"]][:xref] })
|
115
117
|
if src.empty?
|
116
118
|
@internal_terms_boilerplate
|
117
119
|
elsif term.nil?
|
@@ -130,16 +132,18 @@ module IsoDoc
|
|
130
132
|
TERM_CLAUSE = "//sections/terms | "\
|
131
133
|
"//sections/clause[descendant::terms]".freeze
|
132
134
|
|
133
|
-
def terms_defs(isoxml, out)
|
134
|
-
f = isoxml.at(ns(TERM_CLAUSE))
|
135
|
+
def terms_defs(isoxml, out, num)
|
136
|
+
f = isoxml.at(ns(TERM_CLAUSE)) or return num
|
135
137
|
out.div **attr_code(id: f["id"]) do |div|
|
136
|
-
|
138
|
+
num = num + 1
|
139
|
+
clause_name("#{num}.", terms_defs_title(f), div, nil)
|
137
140
|
term_defs_boilerplate(div, isoxml.xpath(ns(".//termdocsource")),
|
138
141
|
f.at(ns(".//term")))
|
139
142
|
f.elements.each do |e|
|
140
143
|
parse(e, div) unless %w{title source}.include? e.name
|
141
144
|
end
|
142
145
|
end
|
146
|
+
num
|
143
147
|
end
|
144
148
|
|
145
149
|
# subclause
|
@@ -147,14 +151,16 @@ module IsoDoc
|
|
147
151
|
clause_parse(isoxml, out)
|
148
152
|
end
|
149
153
|
|
150
|
-
def symbols_abbrevs(isoxml, out)
|
151
|
-
f = isoxml.at(ns("//sections/symbols-abbrevs"))
|
154
|
+
def symbols_abbrevs(isoxml, out, num)
|
155
|
+
f = isoxml.at(ns("//sections/symbols-abbrevs")) or return num
|
152
156
|
out.div **attr_code(id: f["id"], class: "Symbols") do |div|
|
153
|
-
|
157
|
+
num = num + 1
|
158
|
+
clause_name("#{num}.", @symbols_lbl, div, nil)
|
154
159
|
f.elements.each do |e|
|
155
160
|
parse(e, div) unless e.name == "title"
|
156
161
|
end
|
157
162
|
end
|
163
|
+
num
|
158
164
|
end
|
159
165
|
|
160
166
|
# subclause
|
@@ -166,7 +172,7 @@ module IsoDoc
|
|
166
172
|
|
167
173
|
def introduction(isoxml, out)
|
168
174
|
f = isoxml.at(ns("//introduction")) || return
|
169
|
-
num = f.at(ns(".//
|
175
|
+
num = f.at(ns(".//clause")) ? "0." : nil
|
170
176
|
title_attr = { class: "IntroTitle" }
|
171
177
|
page_break(out)
|
172
178
|
out.div **{ class: "Section3", id: f["id"] } do |div|
|
data/lib/isodoc/table.rb
CHANGED
@@ -3,10 +3,8 @@ module IsoDoc
|
|
3
3
|
def table_title_parse(node, out)
|
4
4
|
name = node.at(ns("./name"))
|
5
5
|
out.p **{ class: "TableTitle", align: "center" } do |p|
|
6
|
-
p
|
7
|
-
|
8
|
-
b << l10n(" — #{name.text}") if name
|
9
|
-
end
|
6
|
+
p << l10n("#{@table_lbl} #{get_anchors[node['id']][:label]}")
|
7
|
+
p << l10n(" — #{name.text}") if name
|
10
8
|
end
|
11
9
|
end
|
12
10
|
|
data/lib/isodoc/terms.rb
CHANGED
@@ -11,20 +11,20 @@ module IsoDoc
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def deprecated_term_parse(node, out)
|
14
|
-
out.p **{ class: "DeprecatedTerms" } do |p|
|
14
|
+
out.p **{ class: "DeprecatedTerms", style:"text-align:left;" } do |p|
|
15
15
|
p << l10n("#{@deprecated_lbl}: ")
|
16
16
|
node.children.each { |c| parse(c, p) }
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
20
|
def admitted_term_parse(node, out)
|
21
|
-
out.p **{ class: "AltTerms" } do |p|
|
21
|
+
out.p **{ class: "AltTerms", style:"text-align:left;" } do |p|
|
22
22
|
node.children.each { |c| parse(c, p) }
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
26
|
def term_parse(node, out)
|
27
|
-
out.p **{ class: "Terms" } do |p|
|
27
|
+
out.p **{ class: "Terms", style:"text-align:left;" } do |p|
|
28
28
|
node.children.each { |c| parse(c, p) }
|
29
29
|
end
|
30
30
|
end
|
data/lib/isodoc/utils.rb
CHANGED
@@ -3,8 +3,8 @@ module IsoDoc
|
|
3
3
|
def ns(xpath)
|
4
4
|
xpath.gsub(%r{/([a-zA-z])}, "/xmlns:\\1").
|
5
5
|
gsub(%r{::([a-zA-z])}, "::xmlns:\\1").
|
6
|
-
gsub(%r{\[([a-zA-z]
|
7
|
-
gsub(%r{\[([a-zA-z]
|
6
|
+
gsub(%r{\[([a-zA-z][a-z0-9A-Z@/]* ?=)}, "[xmlns:\\1").
|
7
|
+
gsub(%r{\[([a-zA-z][a-z0-9A-Z@/]*\])}, "[xmlns:\\1")
|
8
8
|
end
|
9
9
|
|
10
10
|
def insert_tab(out, n)
|
@@ -23,8 +23,11 @@ module IsoDoc
|
|
23
23
|
"95": "(Withdrawal)",
|
24
24
|
}.freeze
|
25
25
|
|
26
|
-
def
|
27
|
-
STAGE_ABBRS[stage.to_sym] || "??"
|
26
|
+
def stage_abbrev(stage, iter, draft)
|
27
|
+
stage = STAGE_ABBRS[stage.to_sym] || "??"
|
28
|
+
stage += iter.text if iter
|
29
|
+
stage = "Pre" + stage if draft&.text =~ /^0\./
|
30
|
+
stage
|
28
31
|
end
|
29
32
|
|
30
33
|
NOKOHEAD = <<~HERE.freeze
|
@@ -73,11 +76,10 @@ module IsoDoc
|
|
73
76
|
end
|
74
77
|
|
75
78
|
CLAUSE_ANCESTOR =
|
76
|
-
".//ancestor::*[local-name() = '
|
77
|
-
"local-name() = 'foreword' or "\
|
79
|
+
".//ancestor::*[local-name() = 'annex' or "\
|
80
|
+
"local-name() = 'appendix' or local-name() = 'foreword' or "\
|
78
81
|
"local-name() = 'introduction' or local-name() = 'terms' or "\
|
79
|
-
"local-name() = 'clause' or local-name() = 'references'
|
80
|
-
"local-name() = 'annex']/@id".freeze
|
82
|
+
"local-name() = 'clause' or local-name() = 'references']/@id".freeze
|
81
83
|
|
82
84
|
def get_clause_id(node)
|
83
85
|
clause = node.xpath(CLAUSE_ANCESTOR)
|
@@ -85,13 +87,12 @@ module IsoDoc
|
|
85
87
|
end
|
86
88
|
|
87
89
|
NOTE_CONTAINER_ANCESTOR =
|
88
|
-
".//ancestor::*[local-name() = '
|
89
|
-
"local-name() = 'foreword' or "\
|
90
|
+
".//ancestor::*[local-name() = 'annex' or "\
|
91
|
+
"local-name() = 'foreword' or local-name() = 'appendix' or "\
|
90
92
|
"local-name() = 'introduction' or local-name() = 'terms' or "\
|
91
93
|
"local-name() = 'clause' or local-name() = 'references' or "\
|
92
|
-
"local-name() = '
|
93
|
-
"local-name() = 'table' or local-name() = 'example'
|
94
|
-
"local-name() = 'figure']/@id".freeze
|
94
|
+
"local-name() = 'figure' or local-name() = 'formula' or "\
|
95
|
+
"local-name() = 'table' or local-name() = 'example']/@id".freeze
|
95
96
|
|
96
97
|
def get_note_container_id(node)
|
97
98
|
container = node.xpath(NOTE_CONTAINER_ANCESTOR)
|
@@ -132,7 +133,7 @@ module IsoDoc
|
|
132
133
|
end
|
133
134
|
|
134
135
|
def populate_template(docxml, _format)
|
135
|
-
meta = get_metadata
|
136
|
+
meta = get_metadata.merge(@labels)
|
136
137
|
docxml = docxml.
|
137
138
|
gsub(/\[TERMREF\]\s*/, l10n("[#{@source_lbl}: ")).
|
138
139
|
gsub(/\s*\[\/TERMREF\]\s*/, l10n("]")).
|
data/lib/isodoc/version.rb
CHANGED
@@ -36,7 +36,7 @@ def make_comment_link(out, fn, node)
|
|
36
36
|
out.span(**comment_link_attrs(fn, node)) do |s1|
|
37
37
|
s1.span **{ lang: "EN-GB", style: "font-size:9.0pt" } do |s2|
|
38
38
|
s2.a **{ style: "mso-comment-reference:SMC_#{fn};"\
|
39
|
-
"mso-comment-date:#{node['date']}" }
|
39
|
+
"mso-comment-date:#{node['date'].gsub(/[:-]+/, '')}" }
|
40
40
|
s2.span **{ style: "mso-special-character:comment",
|
41
41
|
target: fn } # do |s|
|
42
42
|
end
|
@@ -71,20 +71,22 @@ def page_break(out)
|
|
71
71
|
}
|
72
72
|
end
|
73
73
|
|
74
|
+
WORD_DT_ATTRS = {class: @note ? "Note" : nil, align: "left",
|
75
|
+
style: "margin-left:0pt;text-align:left;"}.freeze
|
76
|
+
|
74
77
|
def dt_parse(dt, term)
|
75
|
-
|
76
|
-
|
77
|
-
style: "text-align: left;") do |p|
|
78
|
+
term.p **attr_code(WORD_DT_ATTRS) do |p|
|
79
|
+
if dt.elements.empty?
|
78
80
|
p << dt.text
|
81
|
+
else
|
82
|
+
dt.children.each { |n| parse(n, p) }
|
79
83
|
end
|
80
|
-
else
|
81
|
-
dt.children.each { |n| parse(n, term) }
|
82
84
|
end
|
83
85
|
end
|
84
86
|
|
85
87
|
def dl_parse(node, out)
|
86
88
|
out.table **{ class: "dl" } do |v|
|
87
|
-
node.elements.each_slice(2) do |dt, dd|
|
89
|
+
node.elements.select { |n| dt_dd? n }.each_slice(2) do |dt, dd|
|
88
90
|
v.tr do |tr|
|
89
91
|
tr.td **{ valign: "top", align: "left" } do |term|
|
90
92
|
dt_parse(dt, term)
|
@@ -94,20 +96,52 @@ def dl_parse(node, out)
|
|
94
96
|
end
|
95
97
|
end
|
96
98
|
end
|
99
|
+
dl_parse_notes(node, v)
|
97
100
|
end
|
98
101
|
end
|
99
102
|
|
103
|
+
def dl_parse_notes(node, v)
|
104
|
+
return if node.elements.reject { |n| dt_dd? n }.empty?
|
105
|
+
v.tr do |tr|
|
106
|
+
tr.td **{ rowspan: 2 } do |td|
|
107
|
+
node.elements.reject { |n| dt_dd? n }.each { |n| parse(n, td) }
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
100
111
|
|
112
|
+
def figure_get_or_make_dl(t)
|
113
|
+
dl = t.at(".//table[@class = 'dl']")
|
114
|
+
if dl.nil?
|
115
|
+
t.add_child("<p><b>#{@key_lbl}</b></p><table class='dl'></table>")
|
116
|
+
dl = t.at(".//table[@class = 'dl']")
|
117
|
+
end
|
118
|
+
dl
|
119
|
+
end
|
120
|
+
|
121
|
+
def figure_aside_process(f, aside, key)
|
122
|
+
# get rid of footnote link, it is in diagram
|
123
|
+
f&.at("./a[@class='TableFootnoteRef']")&.remove
|
124
|
+
fnref = f.at(".//a[@class='TableFootnoteRef']")
|
125
|
+
tr = key.add_child("<tr></tr>").first
|
126
|
+
dt = tr.add_child("<td valign='top' align='left'></td>").first
|
127
|
+
dd = tr.add_child("<td valign='top'></td>").first
|
128
|
+
fnref.parent = dt
|
129
|
+
aside.xpath(".//p").each do |a|
|
130
|
+
a.delete("class")
|
131
|
+
a.parent = dd
|
132
|
+
end
|
133
|
+
end
|
101
134
|
|
102
135
|
def postprocess(result, filename, dir)
|
103
136
|
generate_header(filename, dir)
|
104
137
|
result = from_xhtml(cleanup(to_xhtml(result)))
|
105
138
|
toWord(result, filename, dir)
|
139
|
+
@files_to_delete.each { |f| system "rm #{f}" }
|
106
140
|
end
|
107
141
|
|
108
142
|
def toWord(result, filename, dir)
|
109
|
-
result = from_xhtml(word_cleanup(to_xhtml(result)))
|
110
143
|
result = populate_template(result, :word)
|
144
|
+
result = from_xhtml(word_cleanup(to_xhtml(result)))
|
111
145
|
Html2Doc.process(result, filename: filename, stylesheet: @wordstylesheet,
|
112
146
|
header_file: "header.html", dir: dir,
|
113
147
|
asciimathdelims: [@openmathdelim, @closemathdelim],
|
@@ -134,16 +168,20 @@ def word_preface(docxml)
|
|
134
168
|
end
|
135
169
|
|
136
170
|
def word_cover(docxml)
|
137
|
-
cover =
|
171
|
+
cover = File.read(@wordcoverpage, encoding: "UTF-8")
|
172
|
+
cover = populate_template(cover, :word)
|
173
|
+
coverxml = to_xhtml_fragment(cover)
|
138
174
|
docxml.at('//div[@class="WordSection1"]').children.first.previous =
|
139
|
-
|
175
|
+
coverxml.to_xml(encoding: "US-ASCII")
|
140
176
|
end
|
141
177
|
|
142
178
|
def word_intro(docxml)
|
143
|
-
intro =
|
144
|
-
sub(/WORDTOC/, make_WordToC(docxml))
|
179
|
+
intro = File.read(@wordintropage, encoding: "UTF-8").
|
180
|
+
sub(/WORDTOC/, make_WordToC(docxml))
|
181
|
+
intro = populate_template(intro, :word)
|
182
|
+
introxml = to_xhtml_fragment(intro)
|
145
183
|
docxml.at('//div[@class="WordSection2"]').children.first.previous =
|
146
|
-
|
184
|
+
introxml.to_xml(encoding: "US-ASCII")
|
147
185
|
end
|
148
186
|
|
149
187
|
def generate_header(filename, _dir)
|
@@ -155,6 +193,7 @@ def generate_header(filename, _dir)
|
|
155
193
|
File.open("header.html", "w") do |f|
|
156
194
|
f.write(template.render(params))
|
157
195
|
end
|
196
|
+
@files_to_delete << "header.html"
|
158
197
|
end
|
159
198
|
|
160
199
|
def word_toc_entry(toclevel, heading)
|