isodoc 0.5.9 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/isodoc.gemspec +1 -0
- data/lib/isodoc.rb +2 -0
- data/lib/isodoc/convert.rb +17 -1
- data/lib/isodoc/footnotes.rb +8 -3
- data/lib/isodoc/html.rb +65 -27
- data/lib/isodoc/i18n-en.yaml +1 -1
- data/lib/isodoc/iso/convert.rb +46 -0
- data/lib/isodoc/iso/html/header.html +184 -0
- data/lib/isodoc/iso/html/html_iso_intro.html +34 -0
- data/lib/isodoc/iso/html/html_iso_titlepage.html +32 -0
- data/lib/isodoc/iso/html/htmlstyle.scss +46 -0
- data/lib/isodoc/iso/html/isodoc.scss +679 -0
- data/lib/isodoc/iso/html/scripts.html +174 -0
- data/lib/isodoc/iso/html/style-human.scss +1277 -0
- data/lib/isodoc/iso/html/style-iso.scss +1257 -0
- data/lib/isodoc/iso/html/word_iso_intro.html +72 -0
- data/lib/isodoc/iso/html/word_iso_titlepage.html +58 -0
- data/lib/isodoc/iso/html/wordstyle.scss +1135 -0
- data/lib/isodoc/iso/wordconvert.rb +34 -0
- data/lib/isodoc/iso2wordhtml.rb +17 -23
- data/lib/isodoc/section.rb +1 -1
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/wordconvert/comments.rb +0 -15
- data/lib/isodoc/wordconvert/convert.rb +1 -0
- data/lib/isodoc/wordconvert/footnotes.rb +0 -12
- data/lib/isodoc/wordconvert/postprocess.rb +110 -0
- data/lib/isodoc/wordconvert/wordconvertmodule.rb +18 -130
- data/lib/isodoc/xref_sect_gen.rb +7 -4
- data/spec/assets/scripts.html +3 -1
- data/spec/isodoc/blocks_spec.rb +97 -211
- data/spec/isodoc/cleanup_spec.rb +27 -0
- data/spec/isodoc/footnotes_spec.rb +40 -53
- data/spec/isodoc/i18n_spec.rb +4 -56
- data/spec/isodoc/inline_spec.rb +7 -98
- data/spec/isodoc/iso_spec.rb +89 -0
- data/spec/isodoc/lists_spec.rb +5 -57
- data/spec/isodoc/postproc_spec.rb +43 -79
- data/spec/isodoc/ref_spec.rb +4 -17
- data/spec/isodoc/section_spec.rb +11 -24
- data/spec/isodoc/table_spec.rb +61 -76
- data/spec/isodoc/terms_spec.rb +1 -13
- data/spec/isodoc/xref_spec.rb +21 -164
- data/spec/spec_helper.rb +21 -1
- metadata +31 -2
@@ -0,0 +1,34 @@
|
|
1
|
+
module IsoDoc
|
2
|
+
module Iso
|
3
|
+
class WordConvert < IsoDoc::Convert
|
4
|
+
include IsoDoc::WordConvertModule
|
5
|
+
|
6
|
+
def default_fonts(options)
|
7
|
+
b = options[:bodyfont] ||
|
8
|
+
(options[:script] == "Hans" ? '"SimSun",serif' :
|
9
|
+
'"Cambria",serif')
|
10
|
+
h = options[:headerfont] ||
|
11
|
+
(options[:script] == "Hans" ? '"SimHei",sans-serif' :
|
12
|
+
'"Cambria",serif')
|
13
|
+
m = options[:monospacefont] || '"Courier New",monospace'
|
14
|
+
"$bodyfont: #{b};\n$headerfont: #{h};\n$monospacefont: #{m};\n"
|
15
|
+
end
|
16
|
+
|
17
|
+
def html_doc_path(file)
|
18
|
+
File.join(File.dirname(__FILE__), File.join("html", file))
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(options)
|
22
|
+
super
|
23
|
+
@wordstylesheet = generate_css(html_doc_path("wordstyle.scss"), false, default_fonts(options))
|
24
|
+
@standardstylesheet = generate_css(html_doc_path("isodoc.scss"), false, default_fonts(options))
|
25
|
+
@header = html_doc_path("header.html")
|
26
|
+
@wordcoverpage = html_doc_path("word_iso_titlepage.html")
|
27
|
+
@wordintropage = html_doc_path("word_iso_intro.html")
|
28
|
+
@ulstyle = "l3"
|
29
|
+
@olstyle = "l2"
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/isodoc/iso2wordhtml.rb
CHANGED
@@ -24,23 +24,17 @@ module IsoDoc
|
|
24
24
|
[filename, dir]
|
25
25
|
end
|
26
26
|
|
27
|
-
# these are in fact preprocess,
|
28
|
-
# but they are extraneous to main HTML file
|
29
|
-
def html_header(html, docxml, filename, dir)
|
30
|
-
anchor_names docxml
|
31
|
-
define_head html, filename, dir
|
32
|
-
end
|
33
|
-
|
34
27
|
# isodoc.css overrides any CSS injected by Html2Doc, which
|
35
28
|
# is inserted before this CSS.
|
36
29
|
def define_head(html, filename, _dir)
|
37
30
|
html.head do |head|
|
38
31
|
head.title { |t| t << filename }
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
32
|
+
if @standardstylesheet
|
33
|
+
head.style do |style|
|
34
|
+
stylesheet = File.read(@standardstylesheet).
|
35
|
+
gsub("FILENAME", filename)
|
36
|
+
style.comment "\n#{stylesheet}\n"
|
37
|
+
end
|
44
38
|
end
|
45
39
|
end
|
46
40
|
end
|
@@ -64,8 +58,6 @@ module IsoDoc
|
|
64
58
|
def make_body2(body, docxml)
|
65
59
|
body.div **{ class: "WordSection2" } do |div2|
|
66
60
|
info docxml, div2
|
67
|
-
foreword docxml, div2
|
68
|
-
introduction docxml, div2
|
69
61
|
div2.p { |p| p << " " } # placeholder
|
70
62
|
end
|
71
63
|
section_break(body)
|
@@ -73,6 +65,8 @@ module IsoDoc
|
|
73
65
|
|
74
66
|
def make_body3(body, docxml)
|
75
67
|
body.div **{ class: "WordSection3" } do |div3|
|
68
|
+
foreword docxml, div3
|
69
|
+
introduction docxml, div3
|
76
70
|
middle docxml, div3
|
77
71
|
footnotes div3
|
78
72
|
comments div3
|
@@ -110,13 +104,13 @@ module IsoDoc
|
|
110
104
|
|
111
105
|
def smallcap_parse(node, xml)
|
112
106
|
xml.span **{ style: "font-variant:small-caps;" } do |s|
|
113
|
-
s << node.
|
107
|
+
s << node.inner_html
|
114
108
|
end
|
115
109
|
end
|
116
110
|
|
117
111
|
def text_parse(node, out)
|
118
112
|
return if node.nil? || node.text.nil?
|
119
|
-
text = node.
|
113
|
+
text = node.to_s
|
120
114
|
text = text.gsub("\n", "<br/>").gsub(" ", " ") if in_sourcecode
|
121
115
|
out << text
|
122
116
|
end
|
@@ -130,12 +124,12 @@ module IsoDoc
|
|
130
124
|
text_parse(node, out)
|
131
125
|
else
|
132
126
|
case node.name
|
133
|
-
when "em" then out.i { |e| e << node.
|
134
|
-
when "strong" then out.b { |e| e << node.
|
135
|
-
when "sup" then out.sup { |e| e << node.
|
136
|
-
when "sub" then out.sub { |e| e << node.
|
137
|
-
when "tt" then out.tt { |e| e << node.
|
138
|
-
when "strike" then out.s { |e| e << node.
|
127
|
+
when "em" then out.i { |e| e << node.inner_html }
|
128
|
+
when "strong" then out.b { |e| e << node.inner_html }
|
129
|
+
when "sup" then out.sup { |e| e << node.inner_html }
|
130
|
+
when "sub" then out.sub { |e| e << node.inner_html }
|
131
|
+
when "tt" then out.tt { |e| e << node.inner_html }
|
132
|
+
when "strike" then out.s { |e| e << node.inner_html }
|
139
133
|
when "smallcap" then smallcap_parse(node, out)
|
140
134
|
when "br" then out.br
|
141
135
|
when "hr" then out.hr
|
@@ -144,7 +138,7 @@ module IsoDoc
|
|
144
138
|
when "callout" then callout_parse(node, out)
|
145
139
|
when "stem" then stem_parse(node, out)
|
146
140
|
when "clause" then clause_parse(node, out)
|
147
|
-
|
141
|
+
# when "subclause" then clause_parse(node, out)
|
148
142
|
when "appendix" then clause_parse(node, out)
|
149
143
|
when "xref" then xref_parse(node, out)
|
150
144
|
when "eref" then eref_parse(node, out)
|
data/lib/isodoc/section.rb
CHANGED
@@ -113,7 +113,7 @@ module IsoDoc
|
|
113
113
|
end
|
114
114
|
|
115
115
|
def term_defs_boilerplate_cont(src, term)
|
116
|
-
sources = sentence_join(src.map { |s| @anchors[s["
|
116
|
+
sources = sentence_join(src.map { |s| @anchors[s["bibitemid"]][:xref] })
|
117
117
|
if src.empty?
|
118
118
|
@internal_terms_boilerplate
|
119
119
|
elsif term.nil?
|
data/lib/isodoc/version.rb
CHANGED
@@ -1,11 +1,3 @@
|
|
1
|
-
#require "uuidtools"
|
2
|
-
|
3
|
-
#module IsoDoc
|
4
|
-
#class WordConvert
|
5
|
-
#module WordConvertModule
|
6
|
-
#def self.included base
|
7
|
-
#base.class_eval do
|
8
|
-
|
9
1
|
def in_comment
|
10
2
|
@in_comment
|
11
3
|
end
|
@@ -67,7 +59,6 @@ def comment_cleanup(docxml)
|
|
67
59
|
embed_comment_in_comment_list(docxml)
|
68
60
|
end
|
69
61
|
|
70
|
-
#COMMENT_IN_COMMENT_LIST =
|
71
62
|
COMMENT_IN_COMMENT_LIST1 =
|
72
63
|
'//div[@style="mso-element:comment-list"]//'\
|
73
64
|
'span[@style="MsoCommentReference"]'.freeze
|
@@ -135,13 +126,11 @@ def get_comments_from_text(docxml, link_order)
|
|
135
126
|
# comments
|
136
127
|
end
|
137
128
|
|
138
|
-
#COMMENT_TARGET_XREFS =
|
139
129
|
COMMENT_TARGET_XREFS1 =
|
140
130
|
"//span[@style='mso-special-character:comment']/@target".freeze
|
141
131
|
|
142
132
|
def reorder_comments_by_comment_link(docxml)
|
143
133
|
link_order = {}
|
144
|
-
#docxml.xpath(COMMENT_TARGET_XREFS).each_with_index do |target, i|
|
145
134
|
docxml.xpath(COMMENT_TARGET_XREFS1).each_with_index do |target, i|
|
146
135
|
link_order[target.value] = i
|
147
136
|
end
|
@@ -149,7 +138,3 @@ def reorder_comments_by_comment_link(docxml)
|
|
149
138
|
list = docxml.at("//*[@style='mso-element:comment-list']") || return
|
150
139
|
list.children = comments.map { |c| c[:text] }.join("\n")
|
151
140
|
end
|
152
|
-
#end
|
153
|
-
#end
|
154
|
-
#end
|
155
|
-
#end
|
@@ -20,6 +20,7 @@ module IsoDoc
|
|
20
20
|
eval File.open(File.join(File.dirname(__FILE__),"wordconvertmodule.rb")).read
|
21
21
|
eval File.open(File.join(File.dirname(__FILE__),"comments.rb")).read
|
22
22
|
eval File.open(File.join(File.dirname(__FILE__),"footnotes.rb")).read
|
23
|
+
eval File.open(File.join(File.dirname(__FILE__),"postprocess.rb")).read
|
23
24
|
end
|
24
25
|
end
|
25
26
|
end
|
@@ -1,11 +1,3 @@
|
|
1
|
-
#require "uuidtools"
|
2
|
-
|
3
|
-
#module IsoDoc
|
4
|
-
#class WordConvert
|
5
|
-
#module WordConvertModule
|
6
|
-
#def self.included base
|
7
|
-
#base.class_eval do
|
8
|
-
|
9
1
|
def footnotes(div)
|
10
2
|
return if @footnotes.empty?
|
11
3
|
@footnotes.each { |fn| div.parent << fn }
|
@@ -74,7 +66,3 @@ def footnote_parse(node, out)
|
|
74
66
|
@in_footnote = false
|
75
67
|
@seen_footnote << fn
|
76
68
|
end
|
77
|
-
#end
|
78
|
-
#end
|
79
|
-
#end
|
80
|
-
#end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
def postprocess(result, filename, dir)
|
2
|
+
generate_header(filename, dir)
|
3
|
+
result = from_xhtml(cleanup(to_xhtml(result)))
|
4
|
+
toWord(result, filename, dir)
|
5
|
+
@files_to_delete.each { |f| system "rm #{f}" }
|
6
|
+
end
|
7
|
+
|
8
|
+
def toWord(result, filename, dir)
|
9
|
+
result = populate_template(result, :word)
|
10
|
+
result = from_xhtml(word_cleanup(to_xhtml(result)))
|
11
|
+
Html2Doc.process(result, filename: filename, stylesheet: @wordstylesheet,
|
12
|
+
header_file: "header.html", dir: dir,
|
13
|
+
asciimathdelims: [@openmathdelim, @closemathdelim],
|
14
|
+
liststyles: { ul: @ulstyle, ol: @olstyle })
|
15
|
+
end
|
16
|
+
|
17
|
+
def word_cleanup(docxml)
|
18
|
+
word_preface(docxml)
|
19
|
+
word_annex_cleanup(docxml)
|
20
|
+
docxml
|
21
|
+
end
|
22
|
+
|
23
|
+
# force Annex h2 to be p.h2Annex, so it is not picked up by ToC
|
24
|
+
def word_annex_cleanup(docxml)
|
25
|
+
docxml.xpath("//h2[ancestor::*[@class = 'Section3']]").each do |h2|
|
26
|
+
h2.name = "p"
|
27
|
+
h2["class"] = "h2Annex"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def word_preface(docxml)
|
32
|
+
word_cover(docxml) if @wordcoverpage
|
33
|
+
word_intro(docxml) if @wordintropage
|
34
|
+
end
|
35
|
+
|
36
|
+
def word_cover(docxml)
|
37
|
+
cover = File.read(@wordcoverpage, encoding: "UTF-8")
|
38
|
+
cover = populate_template(cover, :word)
|
39
|
+
coverxml = to_xhtml_fragment(cover)
|
40
|
+
docxml.at('//div[@class="WordSection1"]').children.first.previous =
|
41
|
+
coverxml.to_xml(encoding: "US-ASCII")
|
42
|
+
end
|
43
|
+
|
44
|
+
def word_intro(docxml)
|
45
|
+
intro = File.read(@wordintropage, encoding: "UTF-8").
|
46
|
+
sub(/WORDTOC/, make_WordToC(docxml))
|
47
|
+
intro = populate_template(intro, :word)
|
48
|
+
introxml = to_xhtml_fragment(intro)
|
49
|
+
docxml.at('//div[@class="WordSection2"]').children.first.previous =
|
50
|
+
introxml.to_xml(encoding: "US-ASCII")
|
51
|
+
end
|
52
|
+
|
53
|
+
def generate_header(filename, _dir)
|
54
|
+
return unless @header
|
55
|
+
template = Liquid::Template.parse(File.read(@header, encoding: "UTF-8"))
|
56
|
+
meta = get_metadata
|
57
|
+
meta[:filename] = filename
|
58
|
+
params = meta.map { |k, v| [k.to_s, v] }.to_h
|
59
|
+
File.open("header.html", "w") do |f|
|
60
|
+
f.write(template.render(params))
|
61
|
+
end
|
62
|
+
@files_to_delete << "header.html"
|
63
|
+
end
|
64
|
+
|
65
|
+
def word_toc_entry(toclevel, heading)
|
66
|
+
bookmark = Random.rand(1000000000)
|
67
|
+
<<~TOC
|
68
|
+
<p class="MsoToc#{toclevel}"><span class="MsoHyperlink"><span
|
69
|
+
lang="EN-GB" style='mso-no-proof:yes'>
|
70
|
+
<a href="#_Toc#{bookmark}">#{heading}<span lang="EN-GB"
|
71
|
+
class="MsoTocTextSpan">
|
72
|
+
<span style='mso-tab-count:1 dotted'>. </span>
|
73
|
+
</span><span lang="EN-GB" class="MsoTocTextSpan">
|
74
|
+
<span style='mso-element:field-begin'></span></span>
|
75
|
+
<span lang="EN-GB"
|
76
|
+
class="MsoTocTextSpan"> PAGEREF _Toc#{bookmark} \\h </span>
|
77
|
+
<span lang="EN-GB" class="MsoTocTextSpan"><span
|
78
|
+
style='mso-element:field-separator'></span></span><span
|
79
|
+
lang="EN-GB" class="MsoTocTextSpan">1</span>
|
80
|
+
<span lang="EN-GB"
|
81
|
+
class="MsoTocTextSpan"></span><span
|
82
|
+
lang="EN-GB" class="MsoTocTextSpan"><span
|
83
|
+
style='mso-element:field-end'></span></span></a></span></span></p>
|
84
|
+
|
85
|
+
TOC
|
86
|
+
end
|
87
|
+
|
88
|
+
WORD_TOC_PREFACE1 = <<~TOC.freeze
|
89
|
+
<span lang="EN-GB"><span
|
90
|
+
style='mso-element:field-begin'></span><span
|
91
|
+
style='mso-spacerun:yes'> </span>TOC
|
92
|
+
\\o "1-2" \\h \\z \\u <span
|
93
|
+
style='mso-element:field-separator'></span></span>
|
94
|
+
TOC
|
95
|
+
|
96
|
+
WORD_TOC_SUFFIX1 = <<~TOC.freeze
|
97
|
+
<p class="MsoToc1"><span lang="EN-GB"><span
|
98
|
+
style='mso-element:field-end'></span></span><span
|
99
|
+
lang="EN-GB"><o:p> </o:p></span></p>
|
100
|
+
TOC
|
101
|
+
|
102
|
+
def make_WordToC(docxml)
|
103
|
+
toc = ""
|
104
|
+
docxml.xpath("//h1 | //h2[not(ancestor::*[@class = 'Section3'])]").
|
105
|
+
each do |h|
|
106
|
+
toc += word_toc_entry(h.name == "h1" ? 1 : 2, header_strip(h))
|
107
|
+
end
|
108
|
+
toc.sub(/(<p class="MsoToc1">)/,
|
109
|
+
%{\\1#{WORD_TOC_PREFACE1}}) + WORD_TOC_SUFFIX1
|
110
|
+
end
|
@@ -1,12 +1,21 @@
|
|
1
|
+
def make_body2(body, docxml)
|
2
|
+
body.div **{ class: "WordSection2" } do |div2|
|
3
|
+
info docxml, div2
|
4
|
+
foreword docxml, div2
|
5
|
+
introduction docxml, div2
|
6
|
+
div2.p { |p| p << " " } # placeholder
|
7
|
+
end
|
8
|
+
section_break(body)
|
9
|
+
end
|
1
10
|
|
2
|
-
|
3
|
-
|
11
|
+
def make_body3(body, docxml)
|
12
|
+
body.div **{ class: "WordSection3" } do |div3|
|
13
|
+
middle docxml, div3
|
14
|
+
footnotes div3
|
15
|
+
comments div3
|
16
|
+
end
|
17
|
+
end
|
4
18
|
|
5
|
-
#module IsoDoc
|
6
|
-
#class WordConvert < Convert
|
7
|
-
#module WordConvertModule
|
8
|
-
#def self.included base
|
9
|
-
#base.class_eval do
|
10
19
|
def insert_tab(out, n)
|
11
20
|
out.span **attr_code(style: "mso-tab-count:#{n}") do |span|
|
12
21
|
[1..n].each { span << "  " }
|
@@ -32,7 +41,6 @@ def remove_bottom_border(td)
|
|
32
41
|
gsub(/mso-border-bottom-alt:[^;]+;/, "mso-border-bottom-alt:0pt;")
|
33
42
|
end
|
34
43
|
|
35
|
-
#SW1 = IsoDoc::SW
|
36
44
|
SW1 = "solid windowtext".freeze
|
37
45
|
|
38
46
|
def new_fullcolspan_row(t, tfoot)
|
@@ -65,10 +73,8 @@ def section_break(body)
|
|
65
73
|
end
|
66
74
|
|
67
75
|
def page_break(out)
|
68
|
-
out.br **{
|
69
|
-
|
70
|
-
style: "mso-special-character:line-break;page-break-before:always",
|
71
|
-
}
|
76
|
+
out.br **{ clear: "all",
|
77
|
+
style: "mso-special-character:line-break;page-break-before:always" }
|
72
78
|
end
|
73
79
|
|
74
80
|
WORD_DT_ATTRS = {class: @note ? "Note" : nil, align: "left",
|
@@ -131,121 +137,3 @@ def figure_aside_process(f, aside, key)
|
|
131
137
|
a.parent = dd
|
132
138
|
end
|
133
139
|
end
|
134
|
-
|
135
|
-
def postprocess(result, filename, dir)
|
136
|
-
generate_header(filename, dir)
|
137
|
-
result = from_xhtml(cleanup(to_xhtml(result)))
|
138
|
-
toWord(result, filename, dir)
|
139
|
-
@files_to_delete.each { |f| system "rm #{f}" }
|
140
|
-
end
|
141
|
-
|
142
|
-
def toWord(result, filename, dir)
|
143
|
-
result = populate_template(result, :word)
|
144
|
-
result = from_xhtml(word_cleanup(to_xhtml(result)))
|
145
|
-
Html2Doc.process(result, filename: filename, stylesheet: @wordstylesheet,
|
146
|
-
header_file: "header.html", dir: dir,
|
147
|
-
asciimathdelims: [@openmathdelim, @closemathdelim],
|
148
|
-
liststyles: { ul: @ulstyle, ol: @olstyle })
|
149
|
-
end
|
150
|
-
|
151
|
-
def word_cleanup(docxml)
|
152
|
-
word_preface(docxml)
|
153
|
-
word_annex_cleanup(docxml)
|
154
|
-
docxml
|
155
|
-
end
|
156
|
-
|
157
|
-
# force Annex h2 to be p.h2Annex, so it is not picked up by ToC
|
158
|
-
def word_annex_cleanup(docxml)
|
159
|
-
docxml.xpath("//h2[ancestor::*[@class = 'Section3']]").each do |h2|
|
160
|
-
h2.name = "p"
|
161
|
-
h2["class"] = "h2Annex"
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
def word_preface(docxml)
|
166
|
-
word_cover(docxml) if @wordcoverpage
|
167
|
-
word_intro(docxml) if @wordintropage
|
168
|
-
end
|
169
|
-
|
170
|
-
def word_cover(docxml)
|
171
|
-
cover = File.read(@wordcoverpage, encoding: "UTF-8")
|
172
|
-
cover = populate_template(cover, :word)
|
173
|
-
coverxml = to_xhtml_fragment(cover)
|
174
|
-
docxml.at('//div[@class="WordSection1"]').children.first.previous =
|
175
|
-
coverxml.to_xml(encoding: "US-ASCII")
|
176
|
-
end
|
177
|
-
|
178
|
-
def word_intro(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)
|
183
|
-
docxml.at('//div[@class="WordSection2"]').children.first.previous =
|
184
|
-
introxml.to_xml(encoding: "US-ASCII")
|
185
|
-
end
|
186
|
-
|
187
|
-
def generate_header(filename, _dir)
|
188
|
-
return unless @header
|
189
|
-
template = Liquid::Template.parse(File.read(@header, encoding: "UTF-8"))
|
190
|
-
meta = get_metadata
|
191
|
-
meta[:filename] = filename
|
192
|
-
params = meta.map { |k, v| [k.to_s, v] }.to_h
|
193
|
-
File.open("header.html", "w") do |f|
|
194
|
-
f.write(template.render(params))
|
195
|
-
end
|
196
|
-
@files_to_delete << "header.html"
|
197
|
-
end
|
198
|
-
|
199
|
-
def word_toc_entry(toclevel, heading)
|
200
|
-
bookmark = Random.rand(1000000000)
|
201
|
-
<<~TOC
|
202
|
-
<p class="MsoToc#{toclevel}"><span class="MsoHyperlink"><span
|
203
|
-
lang="EN-GB" style='mso-no-proof:yes'>
|
204
|
-
<a href="#_Toc#{bookmark}">#{heading}<span lang="EN-GB"
|
205
|
-
class="MsoTocTextSpan">
|
206
|
-
<span style='mso-tab-count:1 dotted'>. </span>
|
207
|
-
</span><span lang="EN-GB" class="MsoTocTextSpan">
|
208
|
-
<span style='mso-element:field-begin'></span></span>
|
209
|
-
<span lang="EN-GB"
|
210
|
-
class="MsoTocTextSpan"> PAGEREF _Toc#{bookmark} \\h </span>
|
211
|
-
<span lang="EN-GB" class="MsoTocTextSpan"><span
|
212
|
-
style='mso-element:field-separator'></span></span><span
|
213
|
-
lang="EN-GB" class="MsoTocTextSpan">1</span>
|
214
|
-
<span lang="EN-GB"
|
215
|
-
class="MsoTocTextSpan"></span><span
|
216
|
-
lang="EN-GB" class="MsoTocTextSpan"><span
|
217
|
-
style='mso-element:field-end'></span></span></a></span></span></p>
|
218
|
-
|
219
|
-
TOC
|
220
|
-
end
|
221
|
-
|
222
|
-
#WORD_TOC_PREFACE = <<~TOC.freeze
|
223
|
-
WORD_TOC_PREFACE1 = <<~TOC.freeze
|
224
|
-
<span lang="EN-GB"><span
|
225
|
-
style='mso-element:field-begin'></span><span
|
226
|
-
style='mso-spacerun:yes'> </span>TOC
|
227
|
-
\\o "1-2" \\h \\z \\u <span
|
228
|
-
style='mso-element:field-separator'></span></span>
|
229
|
-
TOC
|
230
|
-
|
231
|
-
#WORD_TOC_SUFFIX = <<~TOC.freeze
|
232
|
-
WORD_TOC_SUFFIX1 = <<~TOC.freeze
|
233
|
-
<p class="MsoToc1"><span lang="EN-GB"><span
|
234
|
-
style='mso-element:field-end'></span></span><span
|
235
|
-
lang="EN-GB"><o:p> </o:p></span></p>
|
236
|
-
TOC
|
237
|
-
|
238
|
-
def make_WordToC(docxml)
|
239
|
-
toc = ""
|
240
|
-
docxml.xpath("//h1 | //h2[not(ancestor::*[@class = 'Section3'])]").
|
241
|
-
each do |h|
|
242
|
-
toc += word_toc_entry(h.name == "h1" ? 1 : 2, header_strip(h))
|
243
|
-
end
|
244
|
-
toc.sub(/(<p class="MsoToc1">)/,
|
245
|
-
#%{\\1#{WORD_TOC_PREFACE}}) + WORD_TOC_SUFFIX
|
246
|
-
%{\\1#{WORD_TOC_PREFACE1}}) + WORD_TOC_SUFFIX1
|
247
|
-
end
|
248
|
-
#end
|
249
|
-
#end
|
250
|
-
#end
|
251
|
-
#end
|