isodoc 0.5.8 → 0.5.9
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/.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)
|