isodoc 1.3.0 → 1.5.0
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/.github/workflows/rake.yml +14 -0
- data/isodoc.gemspec +2 -2
- data/lib/isodoc-yaml/i18n-en.yaml +55 -0
- data/lib/isodoc-yaml/i18n-fr.yaml +56 -0
- data/lib/isodoc/convert.rb +2 -1
- data/lib/isodoc/function/inline_simple.rb +10 -1
- data/lib/isodoc/function/section.rb +1 -1
- data/lib/isodoc/function/table.rb +10 -0
- data/lib/isodoc/function/to_word_html.rb +4 -2
- data/lib/isodoc/function/utils.rb +4 -4
- data/lib/isodoc/gem_tasks.rb +4 -0
- data/lib/isodoc/html_function/html.rb +7 -0
- data/lib/isodoc/html_function/mathvariant_to_plain.rb +82 -0
- data/lib/isodoc/html_function/postprocess.rb +32 -19
- data/lib/isodoc/metadata_contributor.rb +4 -3
- data/lib/isodoc/presentation_function/inline.rb +5 -1
- data/lib/isodoc/presentation_function/section.rb +9 -0
- data/lib/isodoc/presentation_xml_convert.rb +2 -0
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_function/inline.rb +2 -2
- data/lib/isodoc/word_function/postprocess.rb +38 -80
- data/lib/isodoc/word_function/postprocess_cover.rb +55 -0
- data/lib/isodoc/word_function/table.rb +10 -0
- data/lib/isodoc/xref.rb +1 -0
- data/lib/isodoc/xref/xref_counter.rb +44 -12
- data/lib/isodoc/xref/xref_gen.rb +18 -0
- data/lib/isodoc/xref/xref_sect_gen.rb +34 -27
- data/spec/isodoc/blocks_spec.rb +26 -73
- data/spec/isodoc/cleanup_spec.rb +0 -1
- data/spec/isodoc/inline_spec.rb +14 -14
- data/spec/isodoc/metadata_spec.rb +3 -1
- data/spec/isodoc/postproc_spec.rb +441 -3
- data/spec/isodoc/presentation_xml_spec.rb +5 -5
- data/spec/isodoc/table_spec.rb +28 -0
- data/spec/isodoc/xref_spec.rb +455 -2
- metadata +9 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46206b47756f66c1927ca1810020fbe63141a27f6ad000e95b7938f5b2f8cdcc
|
4
|
+
data.tar.gz: bbce350ccfa6c97bff0c45cccdc15febde0a2c17b1e415fb8132f205ba202d85
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7679fe14d35c348ffc9fcda332f27bf39e898337ae5c0cd7a8638e74f1d26a77ca528cad7d210b82f546336b80e0115c4131c49d9cec1ae82a8174d34002ead3
|
7
|
+
data.tar.gz: 20ca1c4d733511fa7f5dc5fe28295c754803b20167e3ae8d39209b1c2d3f63fc064308668a7c23cf834a6a1d93e46ec486931d2c189c0e47210507b32c0291a2
|
data/.github/workflows/rake.yml
CHANGED
@@ -67,3 +67,17 @@ jobs:
|
|
67
67
|
inkscape --version
|
68
68
|
|
69
69
|
- run: bundle exec rake
|
70
|
+
|
71
|
+
tests-passed:
|
72
|
+
needs: rake
|
73
|
+
runs-on: ubuntu-latest
|
74
|
+
continue-on-error: true
|
75
|
+
steps:
|
76
|
+
- name: Trigger tests passed event
|
77
|
+
uses: Sibz/github-status-action@v1
|
78
|
+
with:
|
79
|
+
authToken: ${{ secrets.METANORMA_CI_PAT_TOKEN || secrets.GITHUB_TOKEN }}
|
80
|
+
context: 'tests-passed-successfully'
|
81
|
+
description: 'Tests passed successfully'
|
82
|
+
state: 'success'
|
83
|
+
sha: ${{ github.event.pull_request.head.sha || github.sha }}
|
data/isodoc.gemspec
CHANGED
@@ -30,11 +30,11 @@ Gem::Specification.new do |spec|
|
|
30
30
|
|
31
31
|
spec.add_dependency "asciimath"
|
32
32
|
spec.add_dependency "htmlentities", "~> 4.3.4"
|
33
|
-
spec.add_dependency "nokogiri", "
|
33
|
+
spec.add_dependency "nokogiri", "~> 1.10.4"
|
34
34
|
spec.add_dependency "thread_safe"
|
35
35
|
spec.add_dependency "uuidtools"
|
36
36
|
spec.add_dependency "html2doc", "~> 1.0.0"
|
37
|
-
spec.add_dependency "liquid"
|
37
|
+
spec.add_dependency "liquid", "~> 4"
|
38
38
|
spec.add_dependency "twitter_cldr"
|
39
39
|
spec.add_dependency "roman-numerals"
|
40
40
|
spec.add_dependency "metanorma", "~> 1.2.0"
|
@@ -97,3 +97,58 @@ locality: {
|
|
97
97
|
note: Note,
|
98
98
|
formula: Formula
|
99
99
|
}
|
100
|
+
inflection:
|
101
|
+
Clause:
|
102
|
+
sg: Clause
|
103
|
+
pl: Clauses
|
104
|
+
Annex:
|
105
|
+
sg: Annex
|
106
|
+
pl: Annexes
|
107
|
+
Appendix:
|
108
|
+
sg: Appendix
|
109
|
+
pl: Appendixes
|
110
|
+
Note:
|
111
|
+
sg: Note
|
112
|
+
pl: Notes
|
113
|
+
"Note % to entry":
|
114
|
+
sg: Note % to entry
|
115
|
+
pl: Notes % to entry
|
116
|
+
List:
|
117
|
+
sg: List
|
118
|
+
pl: Lists
|
119
|
+
Figure:
|
120
|
+
sg: Figure
|
121
|
+
pl: Figures
|
122
|
+
Formula:
|
123
|
+
sg: Formula
|
124
|
+
pl: Formulas
|
125
|
+
Table:
|
126
|
+
sg: Table
|
127
|
+
pl: Tables
|
128
|
+
Requirement:
|
129
|
+
sg: Requirement
|
130
|
+
pl: Requirements
|
131
|
+
Recommendation:
|
132
|
+
sg: Recommendation
|
133
|
+
pl: Recommendations
|
134
|
+
Permission:
|
135
|
+
sg: Permission
|
136
|
+
pl: Permissions
|
137
|
+
Example:
|
138
|
+
sg: Example
|
139
|
+
pl: Examples
|
140
|
+
Part:
|
141
|
+
sg: Part
|
142
|
+
pl: Parts
|
143
|
+
Section:
|
144
|
+
sg: Section
|
145
|
+
pl: Sections
|
146
|
+
Paragraph:
|
147
|
+
sg: Paragraph
|
148
|
+
pl: Paragraphs
|
149
|
+
Chapter:
|
150
|
+
sg: Chapter
|
151
|
+
pl: Chapters
|
152
|
+
Page:
|
153
|
+
sg: Page
|
154
|
+
pl: Pages
|
@@ -90,3 +90,59 @@ locality: {
|
|
90
90
|
note: Note,
|
91
91
|
formula: Formule
|
92
92
|
}
|
93
|
+
inflection:
|
94
|
+
Clause:
|
95
|
+
sg: Article
|
96
|
+
pl: Articles
|
97
|
+
Annex:
|
98
|
+
sg: Annexe
|
99
|
+
pl: Annexes
|
100
|
+
Appendix:
|
101
|
+
sg: Appendice
|
102
|
+
pl: Appendices
|
103
|
+
Note:
|
104
|
+
sg: Note
|
105
|
+
pl: Notes
|
106
|
+
"Note % à l’article":
|
107
|
+
sg: Note % à l’article
|
108
|
+
pl: Notes % à l’article
|
109
|
+
List:
|
110
|
+
sg: Liste
|
111
|
+
pl: Listes
|
112
|
+
Figure:
|
113
|
+
sg: Figure
|
114
|
+
pl: Figures
|
115
|
+
Formula:
|
116
|
+
sg: Formule
|
117
|
+
pl: Formules
|
118
|
+
Table:
|
119
|
+
sg: Tableau
|
120
|
+
pl: Tableaux
|
121
|
+
Requirement:
|
122
|
+
sg: Exigence
|
123
|
+
pl: Exigences
|
124
|
+
Recommendation:
|
125
|
+
sg: Recommandation
|
126
|
+
pl: Recommandations
|
127
|
+
Permission:
|
128
|
+
sg: Autorisation
|
129
|
+
pl: Autorisations
|
130
|
+
Example:
|
131
|
+
sg: Exemple
|
132
|
+
pl: Exemples
|
133
|
+
Part:
|
134
|
+
sg: Partie
|
135
|
+
pl: Parties
|
136
|
+
Section:
|
137
|
+
sg: Section
|
138
|
+
pl: Sections
|
139
|
+
Paragraph:
|
140
|
+
sg: Alinéa
|
141
|
+
pl: Alinéas
|
142
|
+
Chapter:
|
143
|
+
sg: Chapitre
|
144
|
+
pl: Chapitres
|
145
|
+
Page:
|
146
|
+
sg: Page
|
147
|
+
pl: Pages
|
148
|
+
|
data/lib/isodoc/convert.rb
CHANGED
@@ -9,6 +9,7 @@ module IsoDoc
|
|
9
9
|
class Convert < ::IsoDoc::Common
|
10
10
|
attr_accessor :options
|
11
11
|
attr_accessor :i18n
|
12
|
+
attr_accessor :meta
|
12
13
|
|
13
14
|
# htmlstylesheet: Generic stylesheet for HTML
|
14
15
|
# wordstylesheet: Generic stylesheet for Word
|
@@ -157,7 +158,7 @@ module IsoDoc
|
|
157
158
|
FileUtils.rm_rf dir
|
158
159
|
end
|
159
160
|
|
160
|
-
def middle_clause
|
161
|
+
def middle_clause(docxml = nil)
|
161
162
|
"//clause[parent::sections][not(@type = 'scope')]"\
|
162
163
|
'[not(descendant::terms)]'
|
163
164
|
end
|
@@ -23,7 +23,10 @@ module IsoDoc::Function
|
|
23
23
|
def index_parse(node, out)
|
24
24
|
end
|
25
25
|
|
26
|
-
|
26
|
+
def index_xref_parse(node, out)
|
27
|
+
end
|
28
|
+
|
29
|
+
def bookmark_parse(node, out)
|
27
30
|
out.a **attr_code(id: node["id"])
|
28
31
|
end
|
29
32
|
|
@@ -68,5 +71,11 @@ module IsoDoc::Function
|
|
68
71
|
node.children.each { |n| parse(n, e) }
|
69
72
|
end
|
70
73
|
end
|
74
|
+
|
75
|
+
def underline_parse(node, out)
|
76
|
+
out.u do |e|
|
77
|
+
node.children.each { |n| parse(n, e) }
|
78
|
+
end
|
79
|
+
end
|
71
80
|
end
|
72
81
|
end
|
@@ -56,7 +56,7 @@ module IsoDoc::Function
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def clause(isoxml, out)
|
59
|
-
isoxml.xpath(ns(middle_clause)).each do |c|
|
59
|
+
isoxml.xpath(ns(middle_clause(isoxml))).each do |c|
|
60
60
|
out.div **attr_code(clause_attrs(c)) do |s|
|
61
61
|
clause_name(nil, c&.at(ns("./title")), s, nil)
|
62
62
|
c.elements.reject { |c1| c1.name == "title" }.each do |c1|
|
@@ -58,11 +58,21 @@ module IsoDoc::Function
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
+
def colgroup(node, t)
|
62
|
+
colgroup = node.at(ns("./colgroup")) or return
|
63
|
+
t.colgroup do |cg|
|
64
|
+
colgroup.xpath(ns("./col")).each do |c|
|
65
|
+
cg.col **{ style: "width: #{c['width']};" }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
61
70
|
def table_parse(node, out)
|
62
71
|
@in_table = true
|
63
72
|
table_title_parse(node, out)
|
64
73
|
out.table **table_attrs(node) do |t|
|
65
74
|
tcaption(node, t)
|
75
|
+
colgroup(node, t)
|
66
76
|
thead_parse(node, t)
|
67
77
|
tbody_parse(node, t)
|
68
78
|
tfoot_parse(node, t)
|
@@ -109,7 +109,7 @@ module IsoDoc::Function
|
|
109
109
|
@meta.get
|
110
110
|
end
|
111
111
|
|
112
|
-
def middle_title(out)
|
112
|
+
def middle_title(_isoxml, out)
|
113
113
|
out.p(**{ class: "zzSTDTitle1" }) { |p| p << @meta.get[:doctitle] }
|
114
114
|
end
|
115
115
|
|
@@ -120,7 +120,7 @@ module IsoDoc::Function
|
|
120
120
|
end
|
121
121
|
|
122
122
|
def middle(isoxml, out)
|
123
|
-
middle_title(out)
|
123
|
+
middle_title(isoxml, out)
|
124
124
|
middle_admonitions(isoxml, out)
|
125
125
|
i = scope isoxml, out, 0
|
126
126
|
i = norm_ref isoxml, out, i
|
@@ -157,6 +157,7 @@ module IsoDoc::Function
|
|
157
157
|
when "sub" then sub_parse(node, out)
|
158
158
|
when "tt" then tt_parse(node, out)
|
159
159
|
when "strike" then strike_parse(node, out)
|
160
|
+
when "underline" then underline_parse(node, out)
|
160
161
|
when "keyword" then keyword_parse(node, out)
|
161
162
|
when "smallcap" then smallcap_parse(node, out)
|
162
163
|
when "br" then br_parse(node, out)
|
@@ -215,6 +216,7 @@ module IsoDoc::Function
|
|
215
216
|
when "verification" then requirement_component_parse(node, out)
|
216
217
|
when "import" then requirement_component_parse(node, out)
|
217
218
|
when "index" then index_parse(node, out)
|
219
|
+
when "index-xref" then index_xref_parse(node, out)
|
218
220
|
when "termref" then termrefelem_parse(node, out)
|
219
221
|
when "copyright-statement" then copyright_parse(node, out)
|
220
222
|
when "license-statement" then license_parse(node, out)
|
@@ -152,8 +152,8 @@ module IsoDoc::Function
|
|
152
152
|
def populate_template(docxml, _format = nil)
|
153
153
|
meta = @meta
|
154
154
|
.get
|
155
|
-
.merge(@labels
|
156
|
-
.merge(@meta.labels
|
155
|
+
.merge(@labels ? {labels: @labels} : {})
|
156
|
+
.merge(@meta.labels ? {labels: @meta.labels} : {})
|
157
157
|
.merge(fonts_options || {})
|
158
158
|
template = liquid(docxml)
|
159
159
|
template.render(meta.map { |k, v| [k.to_s, empty2nil(v)] }.to_h)
|
@@ -161,7 +161,7 @@ module IsoDoc::Function
|
|
161
161
|
end
|
162
162
|
|
163
163
|
def save_dataimage(uri, _relative_dir = true)
|
164
|
-
%r{^data:image/(?<imgtype>[^;]+);base64,(?<imgdata>.+)$} =~ uri
|
164
|
+
%r{^data:(image|application)/(?<imgtype>[^;]+);base64,(?<imgdata>.+)$} =~ uri
|
165
165
|
imgtype.sub!(/\+[a-z0-9]+$/, '') # svg+xml
|
166
166
|
imgtype = 'png' unless /^[a-z0-9]+$/.match imgtype
|
167
167
|
Tempfile.open(['image', ".#{imgtype}"]) do |f|
|
@@ -173,7 +173,7 @@ module IsoDoc::Function
|
|
173
173
|
end
|
174
174
|
|
175
175
|
def image_localfile(i)
|
176
|
-
if /^data
|
176
|
+
if /^data:/.match? i['src']
|
177
177
|
save_dataimage(i['src'], false)
|
178
178
|
elsif %r{^([A-Z]:)?/}.match? i['src']
|
179
179
|
i['src']
|
data/lib/isodoc/gem_tasks.rb
CHANGED
@@ -97,6 +97,10 @@ module IsoDoc
|
|
97
97
|
$bodyfont: '{{bodyfont}}';
|
98
98
|
$headerfont: '{{headerfont}}';
|
99
99
|
$monospacefont: '{{monospacefont}}';
|
100
|
+
$normalfontsize: '{{normalfontsize}}';
|
101
|
+
$smallerfontsize: '{{smallerfontsize}}';
|
102
|
+
$footnotefontsize: '{{footnotefontsize}}';
|
103
|
+
$monospacefontsize: '{{monospacefontsize}}';
|
100
104
|
TEXT
|
101
105
|
end
|
102
106
|
|
@@ -60,6 +60,7 @@ module IsoDoc::HtmlFunction
|
|
60
60
|
<script type="text/javascript">#{toclevel}</script>
|
61
61
|
|
62
62
|
<!--Google fonts-->
|
63
|
+
<link rel="preconnect" href="https://fonts.gstatic.com">
|
63
64
|
#{googlefonts}
|
64
65
|
<!--Font awesome import for the link icon-->
|
65
66
|
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.8/css/solid.css" integrity="sha384-v2Tw72dyUXeU3y4aM2Y0tBJQkGfplr39mxZqlTBDUZAb9BGoC40+rdFCG0m10lXk" crossorigin="anonymous">
|
@@ -110,6 +111,12 @@ module IsoDoc::HtmlFunction
|
|
110
111
|
sourcecode_name_parse(node, out, name)
|
111
112
|
end
|
112
113
|
|
114
|
+
def underline_parse(node, out)
|
115
|
+
out.span **{ style: "text-decoration: underline;" } do |e|
|
116
|
+
node.children.each { |n| parse(n, e) }
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
113
120
|
def table_long_strings_cleanup(docxml)
|
114
121
|
end
|
115
122
|
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module IsoDoc
|
2
|
+
module HtmlFunction
|
3
|
+
# Class for recursively converting mathvariant text into plain text symbols
|
4
|
+
class MathvariantToPlain
|
5
|
+
MATHML = { "m" => "http://www.w3.org/1998/Math/MathML" }.freeze
|
6
|
+
MATHVARIANT_SPECIAL_CASE_MAPPINGS_1 = %w[bold italic sans-serif]
|
7
|
+
.permutation
|
8
|
+
.each_with_object(:sansbolditalic)
|
9
|
+
.map { |n, y| [n, y] }
|
10
|
+
.to_h
|
11
|
+
.freeze
|
12
|
+
MATHVARIANT_SPECIAL_CASE_MAPPINGS_2 = {
|
13
|
+
%w[bold fraktur] => :frakturbold,
|
14
|
+
%w[bold script] => :scriptbold,
|
15
|
+
%w[sans-serif bold] => :sansbold,
|
16
|
+
%w[sans-serif italic] => :sansitalic,
|
17
|
+
%w[sans-serif bold-italic] => :sansbolditalic,
|
18
|
+
%w[bold-sans-serif italic] => :sansbolditalic,
|
19
|
+
%w[sans-serif-italic bold] => :sansbolditalic,
|
20
|
+
}.freeze
|
21
|
+
MATHVARIANT_TO_PLANE_MAPPINGS = {
|
22
|
+
%w[double-struck] => :doublestruck,
|
23
|
+
%w[bold-fraktur] => :frakturbold,
|
24
|
+
%w[script] => :script,
|
25
|
+
%w[bold-script] => :scriptbold,
|
26
|
+
%w[fraktur] => :fraktur,
|
27
|
+
%w[sans-serif] => :sans,
|
28
|
+
%w[bold-sans-serif] => :sansbold,
|
29
|
+
%w[sans-serif-italic] => :sansitalic,
|
30
|
+
%w[sans-serif-bold-italic] => :sansbolditalic,
|
31
|
+
%w[monospace] => :monospace,
|
32
|
+
}.freeze
|
33
|
+
|
34
|
+
attr_reader :docxml
|
35
|
+
|
36
|
+
# @param [Nokogiri::Document] docxml
|
37
|
+
def initialize(docxml)
|
38
|
+
@docxml = docxml
|
39
|
+
end
|
40
|
+
|
41
|
+
def convert
|
42
|
+
docxml.xpath("//m:math", MATHML).each do |elem|
|
43
|
+
next if nothing_to_style(elem)
|
44
|
+
mathml1(elem)
|
45
|
+
end
|
46
|
+
docxml
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def nothing_to_style(elem)
|
52
|
+
!elem.at("./*[@mathvariant][not(@mathvariant = 'normal')][not(@mathvariant = 'italic')]")
|
53
|
+
end
|
54
|
+
|
55
|
+
def mathml1(base_elem)
|
56
|
+
MATHVARIANT_SPECIAL_CASE_MAPPINGS_1
|
57
|
+
.merge(MATHVARIANT_SPECIAL_CASE_MAPPINGS_2)
|
58
|
+
.merge(MATHVARIANT_TO_PLANE_MAPPINGS)
|
59
|
+
.each_pair do |mathvariant_list, plain_font|
|
60
|
+
base_elem.xpath(mathvariant_xpath(mathvariant_list)).each do |elem|
|
61
|
+
toPlane(elem, plain_font)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def mathvariant_xpath(list)
|
67
|
+
list
|
68
|
+
.map { |variant| "//*[@mathvariant = '#{variant}']" }
|
69
|
+
.join
|
70
|
+
end
|
71
|
+
|
72
|
+
def toPlane(elem, font)
|
73
|
+
elem.traverse do |n|
|
74
|
+
next unless n.text?
|
75
|
+
|
76
|
+
n.replace(Plane1Converter.conv(HTMLEntities.new.decode(n.text), font))
|
77
|
+
end
|
78
|
+
elem
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -1,35 +1,47 @@
|
|
1
|
+
require "isodoc/html_function/mathvariant_to_plain"
|
2
|
+
|
1
3
|
module IsoDoc::HtmlFunction
|
2
4
|
module Html
|
3
|
-
def postprocess(result, filename,
|
5
|
+
def postprocess(result, filename, _dir)
|
4
6
|
result = from_xhtml(cleanup(to_xhtml(textcleanup(result))))
|
5
7
|
toHTML(result, filename)
|
6
8
|
@files_to_delete.each { |f| FileUtils.rm_rf f }
|
7
9
|
end
|
8
10
|
|
9
11
|
def script_cdata(result)
|
10
|
-
result.gsub(%r{<script([^>]*)>\s*<!\[CDATA\[}m, "<script\\1>")
|
11
|
-
gsub(%r{\]\]>\s*</script>}, "</script>")
|
12
|
-
gsub(%r{<!\[CDATA\[\s*<script([^>]*)>}m, "<script\\1>")
|
13
|
-
gsub(%r{</script>\s*\]\]>}, "</script>")
|
12
|
+
result.gsub(%r{<script([^>]*)>\s*<!\[CDATA\[}m, "<script\\1>")
|
13
|
+
.gsub(%r{\]\]>\s*</script>}, "</script>")
|
14
|
+
.gsub(%r{<!\[CDATA\[\s*<script([^>]*)>}m, "<script\\1>")
|
15
|
+
.gsub(%r{</script>\s*\]\]>}, "</script>")
|
14
16
|
end
|
15
17
|
|
16
18
|
def toHTML(result, filename)
|
17
|
-
result =
|
18
|
-
#result = populate_template(result, :html)
|
19
|
+
result = from_xhtml(html_cleanup(to_xhtml(result)))
|
20
|
+
# result = populate_template(result, :html)
|
19
21
|
result = from_xhtml(move_images(to_xhtml(result)))
|
20
22
|
result = html5(script_cdata(inject_script(result)))
|
21
23
|
File.open(filename, "w:UTF-8") { |f| f.write(result) }
|
22
24
|
end
|
23
25
|
|
24
26
|
def html5(doc)
|
25
|
-
doc.sub(%r{<!DOCTYPE html [^>]+>}, "<!DOCTYPE html>")
|
26
|
-
sub(%r{<\?xml[^>]+>}, "")
|
27
|
+
doc.sub(%r{<!DOCTYPE html [^>]+>}, "<!DOCTYPE html>")
|
28
|
+
.sub(%r{<\?xml[^>]+>}, "")
|
27
29
|
end
|
28
30
|
|
29
31
|
def html_cleanup(x)
|
30
|
-
|
31
|
-
|
32
|
-
|
32
|
+
mathml(
|
33
|
+
footnote_format(
|
34
|
+
footnote_backlinks(
|
35
|
+
html_toc(
|
36
|
+
term_header(html_footnote_filter(html_preface(htmlstyle(x))))
|
37
|
+
)
|
38
|
+
)
|
39
|
+
)
|
40
|
+
)
|
41
|
+
end
|
42
|
+
|
43
|
+
def mathml(docxml)
|
44
|
+
IsoDoc::HtmlFunction::MathvariantToPlain.new(docxml).convert
|
33
45
|
end
|
34
46
|
|
35
47
|
def htmlstylesheet
|
@@ -76,14 +88,14 @@ module IsoDoc::HtmlFunction
|
|
76
88
|
def html_cover(docxml)
|
77
89
|
doc = to_xhtml_fragment(File.read(@htmlcoverpage, encoding: "UTF-8"))
|
78
90
|
d = docxml.at('//div[@class="title-section"]')
|
79
|
-
#d.children.first.add_previous_sibling doc.to_xml(encoding: "US-ASCII")
|
91
|
+
# d.children.first.add_previous_sibling doc.to_xml(encoding: "US-ASCII")
|
80
92
|
d.children.first.add_previous_sibling populate_template(doc.to_xml(encoding: "US-ASCII"), :html)
|
81
93
|
end
|
82
94
|
|
83
95
|
def html_intro(docxml)
|
84
96
|
doc = to_xhtml_fragment(File.read(@htmlintropage, encoding: "UTF-8"))
|
85
97
|
d = docxml.at('//div[@class="prefatory-section"]')
|
86
|
-
#d.children.first.add_previous_sibling doc.to_xml(encoding: "US-ASCII")
|
98
|
+
# d.children.first.add_previous_sibling doc.to_xml(encoding: "US-ASCII")
|
87
99
|
d.children.first.add_previous_sibling populate_template(doc.to_xml(encoding: "US-ASCII"), :html)
|
88
100
|
end
|
89
101
|
|
@@ -93,19 +105,19 @@ module IsoDoc::HtmlFunction
|
|
93
105
|
end
|
94
106
|
|
95
107
|
def toclevel_classes
|
96
|
-
(1..@htmlToClevels).
|
108
|
+
(1..@htmlToClevels).reduce([]) { |m, i| m << "h#{i}" }
|
97
109
|
end
|
98
110
|
|
99
111
|
def toclevel
|
100
112
|
ret = toclevel_classes.map { |l| "#{l}:not(:empty):not(.TermNum):not(.noTOC)" }
|
101
113
|
<<~HEAD.freeze
|
102
|
-
|
114
|
+
function toclevel() { return "#{ret.join(',')}";}
|
103
115
|
HEAD
|
104
116
|
end
|
105
117
|
|
106
118
|
# needs to be same output as toclevel
|
107
119
|
def html_toc(docxml)
|
108
|
-
idx = docxml.at("//div[@id = 'toc']") or return docxml
|
120
|
+
(idx = docxml.at("//div[@id = 'toc']")) or (return docxml)
|
109
121
|
toc = "<ul>"
|
110
122
|
path = toclevel_classes.map do |l|
|
111
123
|
"//main//#{l}[not(@class = 'TermNum')][not(@class = 'noTOC')][text()]"
|
@@ -125,7 +137,7 @@ module IsoDoc::HtmlFunction
|
|
125
137
|
docxml.xpath("//*[local-name() = 'img']").each do |i|
|
126
138
|
i["width"], i["height"] = Html2Doc.image_resize(i, image_localfile(i),
|
127
139
|
@maxheight, @maxwidth)
|
128
|
-
next if /^data
|
140
|
+
next if /^data:/.match i["src"]
|
129
141
|
@datauriimage ? datauri(i) : move_image1(i)
|
130
142
|
end
|
131
143
|
docxml
|
@@ -133,9 +145,10 @@ module IsoDoc::HtmlFunction
|
|
133
145
|
|
134
146
|
def datauri(i)
|
135
147
|
type = i["src"].split(".")[-1]
|
148
|
+
supertype = type == "xml" ? "application" : "image"
|
136
149
|
bin = IO.binread(image_localfile(i))
|
137
150
|
data = Base64.strict_encode64(bin)
|
138
|
-
i["src"] = "data
|
151
|
+
i["src"] = "data:#{supertype}/#{type};base64,#{data}"
|
139
152
|
end
|
140
153
|
|
141
154
|
def image_suffix(i)
|