isodoc 2.5.0 → 2.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/isodoc.gemspec +6 -6
- data/lib/isodoc/convert.rb +29 -108
- data/lib/isodoc/function/blocks.rb +17 -12
- data/lib/isodoc/function/cleanup.rb +4 -3
- data/lib/isodoc/function/lists.rb +3 -3
- data/lib/isodoc/function/reqt.rb +1 -1
- data/lib/isodoc/function/section.rb +1 -2
- data/lib/isodoc/function/table.rb +10 -4
- data/lib/isodoc/function/terms.rb +4 -5
- data/lib/isodoc/function/to_word_html.rb +1 -5
- data/lib/isodoc/html_function/html.rb +1 -0
- data/lib/isodoc/i18n.rb +1 -1
- data/lib/isodoc/init.rb +103 -0
- data/lib/isodoc/presentation_function/bibdata.rb +22 -2
- data/lib/isodoc/presentation_function/block.rb +27 -0
- data/lib/isodoc/presentation_function/math.rb +24 -7
- data/lib/isodoc/presentation_function/sourcecode.rb +37 -8
- data/lib/isodoc/presentation_function/terms.rb +16 -16
- data/lib/isodoc/presentation_function/xrefs.rb +15 -3
- data/lib/isodoc/presentation_xml_convert.rb +1 -0
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_function/table.rb +13 -6
- data/lib/isodoc/xref/xref_gen.rb +19 -6
- data/lib/isodoc/xslfo_convert.rb +20 -15
- data/lib/isodoc-yaml/i18n-ar.yaml +2 -0
- data/lib/isodoc-yaml/i18n-de.yaml +2 -0
- data/lib/isodoc-yaml/i18n-en.yaml +2 -0
- data/lib/isodoc-yaml/i18n-es.yaml +2 -0
- data/lib/isodoc-yaml/i18n-fr.yaml +2 -0
- data/lib/isodoc-yaml/i18n-ja.yaml +216 -0
- data/lib/isodoc-yaml/i18n-ru.yaml +2 -0
- data/lib/isodoc-yaml/i18n-zh-Hans.yaml +2 -0
- data/lib/isodoc.rb +0 -1
- metadata +13 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 35414cac7eab8ae893d39af33b9f3ecf591c33bd5013ea6340b13b26c23e73e1
|
4
|
+
data.tar.gz: b4820f7236dc69a3fadf213dcd7fef2eadddebbf85dc02a4ec7364c688baa4da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 902033f59dc11d6f097e7477aa8ea44cc7eb199e085778a3eee2cfa771d7a40a85869176ff0c57e0cad88d1c270546a7d9419da2119fb3a6d435c629aeea6acc
|
7
|
+
data.tar.gz: 0f346f7277f8aab99189f29d2e1a35a6d36c593cfd52628d37f9245acb39e7ea0aa8761f6797e18dbb1b1069812ffbf2c2563f97e472cfa628047c6e84df0eb0
|
data/isodoc.gemspec
CHANGED
@@ -29,17 +29,17 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.test_files = `git ls-files -- {spec}/*`.split("\n")
|
30
30
|
spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
|
31
31
|
|
32
|
-
spec.add_dependency "
|
33
|
-
spec.add_dependency "html2doc", "~> 1.4.3"
|
32
|
+
spec.add_dependency "html2doc", "~> 1.5.3"
|
34
33
|
spec.add_dependency "htmlentities", "~> 4.3.4"
|
35
34
|
# spec.add_dependency "isodoc-i18n", "~> 1.1.0" # already in relaton-render and mn-requirements
|
36
|
-
spec.add_dependency "liquid", "~>
|
37
|
-
# spec.add_dependency "metanorma", ">= 1.2.0"
|
35
|
+
spec.add_dependency "liquid", "~> 5"
|
38
36
|
spec.add_dependency "emf2svg"
|
39
|
-
spec.add_dependency "
|
40
|
-
spec.add_dependency "
|
37
|
+
spec.add_dependency "plurimath"
|
38
|
+
spec.add_dependency "relaton-cli"
|
39
|
+
# spec.add_dependency "metanorma-utils", "~> 1.5.0" # already in isodoc-i18n
|
41
40
|
spec.add_dependency "mn2pdf"
|
42
41
|
spec.add_dependency "mn-requirements", "~> 0.3.1"
|
42
|
+
|
43
43
|
spec.add_dependency "relaton-render", "~> 0.5.2"
|
44
44
|
spec.add_dependency "roman-numerals"
|
45
45
|
spec.add_dependency "rouge", "~> 4.0"
|
data/lib/isodoc/convert.rb
CHANGED
@@ -63,109 +63,6 @@ module IsoDoc
|
|
63
63
|
init_arrangement(@options)
|
64
64
|
end
|
65
65
|
|
66
|
-
def options_preprocess(options)
|
67
|
-
options.merge!(default_fonts(options)) do |_, old, new|
|
68
|
-
old || new
|
69
|
-
end.merge!(default_file_locations(options)) do |_, old, new|
|
70
|
-
old || new
|
71
|
-
end
|
72
|
-
options
|
73
|
-
end
|
74
|
-
|
75
|
-
def init_rendering(options)
|
76
|
-
@ulstyle = options[:ulstyle]
|
77
|
-
@olstyle = options[:olstyle]
|
78
|
-
@datauriimage = options[:datauriimage]
|
79
|
-
@suppressheadingnumbers = options[:suppressheadingnumbers]
|
80
|
-
@break_up_urls_in_tables = options[:breakupurlsintables]
|
81
|
-
@suppressasciimathdup = options[:suppressasciimathdup]
|
82
|
-
@aligncrosselements = options[:aligncrosselements]
|
83
|
-
@modspecidentifierbase = options[:modspecidentifierbase]
|
84
|
-
@sourcehighlighter = options[:sourcehighlighter]
|
85
|
-
end
|
86
|
-
|
87
|
-
def init_arrangement(options)
|
88
|
-
@sectionsplit = options[:sectionsplit] == "true"
|
89
|
-
@bare = options[:bare]
|
90
|
-
@semantic_xml_insert = options[:semanticxmlinsert] != "false"
|
91
|
-
end
|
92
|
-
|
93
|
-
def init_i18n(options)
|
94
|
-
@i18nyaml = options[:i18nyaml]
|
95
|
-
@lang = options[:language] || "en"
|
96
|
-
@script = options[:script] || "Latn"
|
97
|
-
@locale = options[:locale]
|
98
|
-
@localizenumber = options[:localizenumber]
|
99
|
-
end
|
100
|
-
|
101
|
-
def init_locations(options)
|
102
|
-
@libdir ||= File.dirname(__FILE__)
|
103
|
-
@baseassetpath = options[:baseassetpath]
|
104
|
-
@tmpimagedir_suffix = tmpimagedir_suffix
|
105
|
-
@tmpfilesdir_suffix = tmpfilesdir_suffix
|
106
|
-
@sourcefilename = options[:sourcefilename]
|
107
|
-
@files_to_delete = []
|
108
|
-
@tempfile_cache = []
|
109
|
-
end
|
110
|
-
|
111
|
-
def init_processing
|
112
|
-
@termdomain = ""
|
113
|
-
@termexample = false
|
114
|
-
@note = false
|
115
|
-
@sourcecode = false
|
116
|
-
@footnotes = []
|
117
|
-
@comments = []
|
118
|
-
@in_footnote = false
|
119
|
-
@in_comment = false
|
120
|
-
@in_table = false
|
121
|
-
@in_figure = false
|
122
|
-
@seen_footnote = Set.new
|
123
|
-
@c = HTMLEntities.new
|
124
|
-
@openmathdelim = "`"
|
125
|
-
@closemathdelim = "`"
|
126
|
-
@maxwidth = 1200
|
127
|
-
@maxheight = 800
|
128
|
-
@bookmarks_allocated = { "X" => true }
|
129
|
-
@fn_bookmarks = {}
|
130
|
-
end
|
131
|
-
|
132
|
-
def init_fonts(options)
|
133
|
-
@normalfontsize = options[:normalfontsize]
|
134
|
-
@smallerfontsize = options[:smallerfontsize]
|
135
|
-
@monospacefontsize = options[:monospacefontsize]
|
136
|
-
@footnotefontsize = options[:footnotefontsize]
|
137
|
-
@fontist_fonts = options[:fonts]
|
138
|
-
@fontlicenseagreement = options[:fontlicenseagreement]
|
139
|
-
end
|
140
|
-
|
141
|
-
def init_covers(options)
|
142
|
-
@header = options[:header]
|
143
|
-
@htmlcoverpage = options[:htmlcoverpage]
|
144
|
-
@wordcoverpage = options[:wordcoverpage]
|
145
|
-
@htmlintropage = options[:htmlintropage]
|
146
|
-
@wordintropage = options[:wordintropage]
|
147
|
-
@scripts = options[:scripts] ||
|
148
|
-
File.join(File.dirname(__FILE__), "base_style", "scripts.html")
|
149
|
-
@scripts_pdf = options[:scripts_pdf]
|
150
|
-
@scripts_override = options[:scripts_override]
|
151
|
-
end
|
152
|
-
|
153
|
-
def init_stylesheets(options)
|
154
|
-
@htmlstylesheet_name = options[:htmlstylesheet]
|
155
|
-
@wordstylesheet_name = options[:wordstylesheet]
|
156
|
-
@htmlstylesheet_override_name = options[:htmlstylesheet_override]
|
157
|
-
@wordstylesheet_override_name = options[:wordstylesheet_override]
|
158
|
-
@standardstylesheet_name = options[:standardstylesheet]
|
159
|
-
end
|
160
|
-
|
161
|
-
def init_toc(options)
|
162
|
-
@htmlToClevels = 2
|
163
|
-
@wordToClevels = 2
|
164
|
-
@tocfigures = options[:tocfigures]
|
165
|
-
@toctables = options[:toctables]
|
166
|
-
@tocrecommendations = options[:tocrecommendations]
|
167
|
-
end
|
168
|
-
|
169
66
|
def tmpimagedir_suffix
|
170
67
|
"_#{SecureRandom.hex(8)}_images"
|
171
68
|
end
|
@@ -214,28 +111,52 @@ module IsoDoc
|
|
214
111
|
convert_i18n_init(docxml)
|
215
112
|
metadata_init(@lang, @script, @locale, @i18n)
|
216
113
|
xref_init(@lang, @script, self, @i18n, { locale: @locale })
|
114
|
+
docxml = preprocess_xslt(docxml)
|
217
115
|
toc_init(docxml)
|
218
116
|
[docxml, filename, dir]
|
219
117
|
end
|
220
118
|
|
119
|
+
def preprocess_xslt(docxml)
|
120
|
+
extract_preprocess_xslt(docxml).each do |x|
|
121
|
+
docxml = Nokogiri::XSLT(x).transform(docxml)
|
122
|
+
end
|
123
|
+
docxml
|
124
|
+
end
|
125
|
+
|
126
|
+
def extract_preprocess_xslt(docxml)
|
127
|
+
docxml.xpath(ns("//metanorma-extension/render/preprocess-xslt"))
|
128
|
+
.each_with_object([]) do |x, m|
|
129
|
+
formats = x["format"]&.split(",") || []
|
130
|
+
!formats.empty? && !formats.include?(@format.to_s) and next
|
131
|
+
m << x.children.to_xml
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
221
135
|
def convert_i18n_init(docxml)
|
222
|
-
|
223
|
-
script = docxml.at(ns("//bibdata/script")) and @script = script.text
|
224
|
-
locale = docxml.at(ns("//bibdata/locale")) and @locale = locale.text
|
136
|
+
convert_i18n_init1(docxml)
|
225
137
|
i18n_init(@lang, @script, @locale)
|
226
138
|
@reqt_models = requirements_processor
|
227
139
|
.new({ default: "default", lang: @lang, script: @script, locale: @locale,
|
228
140
|
labels: @i18n.get, modspecidentifierbase: @modspecidentifierbase })
|
229
141
|
end
|
230
142
|
|
143
|
+
def convert_i18n_init1(docxml)
|
144
|
+
lang = docxml.at(ns("//bibdata/language")) and @lang = lang.text
|
145
|
+
if script = docxml.at(ns("//bibdata/script"))
|
146
|
+
@script = script.text
|
147
|
+
elsif lang
|
148
|
+
@script = ::Metanorma::Utils::default_script(@lang)
|
149
|
+
end
|
150
|
+
locale = docxml.at(ns("//bibdata/locale")) and @locale = locale.text
|
151
|
+
end
|
152
|
+
|
231
153
|
def convert(input_filename, file = nil, debug = false,
|
232
154
|
output_filename = nil)
|
233
155
|
file = File.read(input_filename, encoding: "utf-8") if file.nil?
|
234
156
|
@openmathdelim, @closemathdelim = extract_delims(file)
|
235
157
|
docxml, filename, dir = convert_init(file, input_filename, debug)
|
236
158
|
result = convert1(docxml, filename, dir)
|
237
|
-
return result
|
238
|
-
|
159
|
+
debug and return result
|
239
160
|
output_filename ||= "#{filename}.#{@suffix}"
|
240
161
|
postprocess(result, output_filename, dir)
|
241
162
|
FileUtils.rm_rf dir
|
@@ -76,6 +76,7 @@ module IsoDoc
|
|
76
76
|
out.p **sourcecode_attrs(node) do |div|
|
77
77
|
sourcecode_parse1(node, div)
|
78
78
|
end
|
79
|
+
annotation_parse(node, out)
|
79
80
|
sourcecode_name_parse(node, out, name)
|
80
81
|
end
|
81
82
|
|
@@ -84,9 +85,10 @@ module IsoDoc
|
|
84
85
|
node.at(ns(".//table[@class = 'rouge-line-table']")) ||
|
85
86
|
node.at("./ancestor::xmlns:table[@class = 'rouge-line-table']") and
|
86
87
|
@sourcecode = "table"
|
87
|
-
|
88
|
-
|
89
|
-
|
88
|
+
node.children.each do |n|
|
89
|
+
%w(name dl).include?(n.name) and next
|
90
|
+
parse(n, div)
|
91
|
+
end
|
90
92
|
@sourcecode = false
|
91
93
|
end
|
92
94
|
|
@@ -95,17 +97,12 @@ module IsoDoc
|
|
95
97
|
end
|
96
98
|
|
97
99
|
def annotation_parse(node, out)
|
100
|
+
dl = node.at(ns("./dl")) or return
|
98
101
|
@sourcecode = false
|
99
|
-
@annotation = true
|
102
|
+
# @annotation = true
|
100
103
|
out.div class: "annotation" do |div|
|
101
|
-
|
102
|
-
#
|
103
|
-
callout = node.at(ns("//callout[@target='#{node['id']}']"))
|
104
|
-
div << "<span class='c'><#{callout.text}></span> "
|
105
|
-
div << "<span class='c'>#{node.children&.text&.strip}</span>"
|
106
|
-
node.at("./following-sibling::*[local-name() = 'annotation']") and
|
107
|
-
div << "<br/>"
|
108
|
-
@annotation = false
|
104
|
+
parse(dl, div)
|
105
|
+
# @annotation = false
|
109
106
|
end
|
110
107
|
end
|
111
108
|
|
@@ -203,6 +200,14 @@ module IsoDoc
|
|
203
200
|
node.children.each { |n| parse(n, div) }
|
204
201
|
end
|
205
202
|
end
|
203
|
+
|
204
|
+
def source_parse(node, out)
|
205
|
+
out.div class: "BlockSource" do |d|
|
206
|
+
d.p do |p|
|
207
|
+
node.children.each { |n| parse(n, p) }
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
206
211
|
end
|
207
212
|
end
|
208
213
|
end
|
@@ -194,11 +194,12 @@ module IsoDoc
|
|
194
194
|
end
|
195
195
|
|
196
196
|
def table_note_cleanup(docxml)
|
197
|
-
docxml.xpath("//table[div[@class = 'Note' or " \
|
198
|
-
"@class = 'TableFootnote']]").each do |t|
|
197
|
+
docxml.xpath("//table[dl or div[@class = 'Note' or @class = 'BlockSource' " \
|
198
|
+
"or @class = 'TableFootnote']]").each do |t|
|
199
199
|
tfoot = table_get_or_make_tfoot(t)
|
200
200
|
insert_here = new_fullcolspan_row(t, tfoot)
|
201
|
-
t.xpath("div[@class = 'Note' or @class = '
|
201
|
+
t.xpath("dl | div[@class = 'Note' or @class = 'BlockSource' or " \
|
202
|
+
"@class = 'TableFootnote']")
|
202
203
|
.each do |d|
|
203
204
|
d.parent = insert_here
|
204
205
|
end
|
@@ -3,7 +3,7 @@ module IsoDoc
|
|
3
3
|
module Lists
|
4
4
|
def list_title_parse(node, out)
|
5
5
|
name = node.at(ns("./name")) or return
|
6
|
-
out.p
|
6
|
+
out.p class: "ListTitle" do |p|
|
7
7
|
name&.children&.each { |n| parse(n, p) }
|
8
8
|
end
|
9
9
|
end
|
@@ -61,10 +61,10 @@ module IsoDoc
|
|
61
61
|
def li_parse(node, out)
|
62
62
|
out.li **attr_code(id: node["id"]) do |li|
|
63
63
|
if node["uncheckedcheckbox"] == "true"
|
64
|
-
li << '<span class="zzMoveToFollowing">'\
|
64
|
+
li << '<span class="zzMoveToFollowing">' \
|
65
65
|
'<input type="checkbox" checked="checked"/></span>'
|
66
66
|
elsif node["checkedcheckbox"] == "true"
|
67
|
-
li << '<span class="zzMoveToFollowing">'\
|
67
|
+
li << '<span class="zzMoveToFollowing">' \
|
68
68
|
'<input type="checkbox"/></span>'
|
69
69
|
end
|
70
70
|
node.children.each { |n| parse(n, li) }
|
data/lib/isodoc/function/reqt.rb
CHANGED
@@ -20,10 +20,11 @@ module IsoDoc
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def tbody_parse(node, table)
|
23
|
-
tbody = node.at(ns("./tbody"))
|
23
|
+
tbody = node.at(ns("./tbody")) or return
|
24
|
+
rowcount = tbody.xpath(ns("./tr")).size
|
24
25
|
table.tbody do |h|
|
25
26
|
tbody.element_children.each_with_index do |n, i|
|
26
|
-
tr_parse(n, h, i,
|
27
|
+
tr_parse(n, h, i, rowcount, false)
|
27
28
|
end
|
28
29
|
end
|
29
30
|
end
|
@@ -76,12 +77,17 @@ module IsoDoc
|
|
76
77
|
table_title_parse(node, out)
|
77
78
|
out.table **table_attrs(node) do |t|
|
78
79
|
table_parse_core(node, t)
|
79
|
-
(
|
80
|
-
node.xpath(ns("./note")).each { |n| parse(n, out) }
|
80
|
+
table_parse_tail(node, t)
|
81
81
|
end
|
82
82
|
@in_table = false
|
83
83
|
end
|
84
84
|
|
85
|
+
def table_parse_tail(node, out)
|
86
|
+
(dl = node.at(ns("./dl"))) && parse(dl, out)
|
87
|
+
node.xpath(ns("./source")).each { |n| parse(n, out) }
|
88
|
+
node.xpath(ns("./note")).each { |n| parse(n, out) }
|
89
|
+
end
|
90
|
+
|
85
91
|
def table_parse_core(node, out)
|
86
92
|
tcaption(node, out)
|
87
93
|
colgroup(node, out)
|
@@ -11,20 +11,19 @@ module IsoDoc
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def deprecated_term_parse(node, out)
|
14
|
-
out.p
|
15
|
-
p << l10n("#{@i18n.deprecated}: ")
|
14
|
+
out.p class: "DeprecatedTerms", style: "text-align:left;" do |p|
|
16
15
|
node.children.each { |c| parse(c, p) }
|
17
16
|
end
|
18
17
|
end
|
19
18
|
|
20
19
|
def admitted_term_parse(node, out)
|
21
|
-
out.p
|
20
|
+
out.p class: "AltTerms", style: "text-align:left;" do |p|
|
22
21
|
node.children.each { |c| parse(c, p) }
|
23
22
|
end
|
24
23
|
end
|
25
24
|
|
26
25
|
def term_parse(node, out)
|
27
|
-
out.p
|
26
|
+
out.p class: "Terms", style: "text-align:left;" do |p|
|
28
27
|
node.children.each { |c| parse(c, p) }
|
29
28
|
end
|
30
29
|
end
|
@@ -63,7 +62,7 @@ module IsoDoc
|
|
63
62
|
|
64
63
|
def termdef_parse(node, out)
|
65
64
|
name = node&.at(ns("./name"))&.remove
|
66
|
-
out.p
|
65
|
+
out.p class: "TermNum", id: node["id"] do |p|
|
67
66
|
name&.children&.each { |n| parse(n, p) }
|
68
67
|
end
|
69
68
|
set_termdomain("")
|
@@ -176,6 +176,7 @@ module IsoDoc
|
|
176
176
|
when "fn" then footnote_parse(node, out)
|
177
177
|
when "p" then para_parse(node, out)
|
178
178
|
when "quote" then quote_parse(node, out)
|
179
|
+
when "source" then source_parse(node, out)
|
179
180
|
when "tr" then tr_parse(node, out)
|
180
181
|
when "note" then note_parse(node, out)
|
181
182
|
when "review" then review_note_parse(node, out)
|
@@ -205,11 +206,6 @@ module IsoDoc
|
|
205
206
|
when "recommendation" then recommendation_parse(node, out)
|
206
207
|
when "permission" then permission_parse(node, out)
|
207
208
|
when "div" then div_parse(node, out)
|
208
|
-
# when "subject", "classification"
|
209
|
-
# requirement_skip_parse(node, out)
|
210
|
-
# when "inherit", "description", "specification", "measurement-target",
|
211
|
-
# "verification", "import", "component"
|
212
|
-
# requirement_component_parse(node, out)
|
213
209
|
when "index" then index_parse(node, out)
|
214
210
|
when "index-xref" then index_xref_parse(node, out)
|
215
211
|
when "termref" then termrefelem_parse(node, out)
|
data/lib/isodoc/i18n.rb
CHANGED
data/lib/isodoc/init.rb
CHANGED
@@ -26,5 +26,108 @@ module IsoDoc
|
|
26
26
|
n = docxml.at(ns(x.sub(/TOC/, "HTML TOC"))) and
|
27
27
|
@htmlToClevels = n.text.to_i
|
28
28
|
end
|
29
|
+
|
30
|
+
def options_preprocess(options)
|
31
|
+
options.merge!(default_fonts(options)) do |_, old, new|
|
32
|
+
old || new
|
33
|
+
end.merge!(default_file_locations(options)) do |_, old, new|
|
34
|
+
old || new
|
35
|
+
end
|
36
|
+
options
|
37
|
+
end
|
38
|
+
|
39
|
+
def init_rendering(options)
|
40
|
+
@ulstyle = options[:ulstyle]
|
41
|
+
@olstyle = options[:olstyle]
|
42
|
+
@datauriimage = options[:datauriimage]
|
43
|
+
@suppressheadingnumbers = options[:suppressheadingnumbers]
|
44
|
+
@break_up_urls_in_tables = options[:breakupurlsintables]
|
45
|
+
@suppressasciimathdup = options[:suppressasciimathdup]
|
46
|
+
@aligncrosselements = options[:aligncrosselements]
|
47
|
+
@modspecidentifierbase = options[:modspecidentifierbase]
|
48
|
+
@sourcehighlighter = options[:sourcehighlighter]
|
49
|
+
end
|
50
|
+
|
51
|
+
def init_arrangement(options)
|
52
|
+
@sectionsplit = options[:sectionsplit] == "true"
|
53
|
+
@bare = options[:bare]
|
54
|
+
@semantic_xml_insert = options[:semanticxmlinsert] != "false"
|
55
|
+
end
|
56
|
+
|
57
|
+
def init_i18n(options)
|
58
|
+
@i18nyaml = options[:i18nyaml]
|
59
|
+
@lang = options[:language] || "en"
|
60
|
+
@script = options[:script] || "Latn"
|
61
|
+
@locale = options[:locale]
|
62
|
+
@localizenumber = options[:localizenumber]
|
63
|
+
end
|
64
|
+
|
65
|
+
def init_locations(options)
|
66
|
+
@libdir ||= File.dirname(__FILE__)
|
67
|
+
@baseassetpath = options[:baseassetpath]
|
68
|
+
@tmpimagedir_suffix = tmpimagedir_suffix
|
69
|
+
@tmpfilesdir_suffix = tmpfilesdir_suffix
|
70
|
+
@sourcefilename = options[:sourcefilename]
|
71
|
+
@files_to_delete = []
|
72
|
+
@tempfile_cache = []
|
73
|
+
end
|
74
|
+
|
75
|
+
def init_processing
|
76
|
+
@termdomain = ""
|
77
|
+
@termexample = false
|
78
|
+
@note = false
|
79
|
+
@sourcecode = false
|
80
|
+
@footnotes = []
|
81
|
+
@comments = []
|
82
|
+
@in_footnote = false
|
83
|
+
@in_comment = false
|
84
|
+
@in_table = false
|
85
|
+
@in_figure = false
|
86
|
+
@seen_footnote = Set.new
|
87
|
+
@c = HTMLEntities.new
|
88
|
+
@openmathdelim = "`"
|
89
|
+
@closemathdelim = "`"
|
90
|
+
@maxwidth = 1200
|
91
|
+
@maxheight = 800
|
92
|
+
@bookmarks_allocated = { "X" => true }
|
93
|
+
@fn_bookmarks = {}
|
94
|
+
end
|
95
|
+
|
96
|
+
def init_fonts(options)
|
97
|
+
@normalfontsize = options[:normalfontsize]
|
98
|
+
@smallerfontsize = options[:smallerfontsize]
|
99
|
+
@monospacefontsize = options[:monospacefontsize]
|
100
|
+
@footnotefontsize = options[:footnotefontsize]
|
101
|
+
@fontist_fonts = options[:fonts]
|
102
|
+
@fontlicenseagreement = options[:fontlicenseagreement]
|
103
|
+
end
|
104
|
+
|
105
|
+
def init_covers(options)
|
106
|
+
@header = options[:header]
|
107
|
+
@htmlcoverpage = options[:htmlcoverpage]
|
108
|
+
@wordcoverpage = options[:wordcoverpage]
|
109
|
+
@htmlintropage = options[:htmlintropage]
|
110
|
+
@wordintropage = options[:wordintropage]
|
111
|
+
@scripts = options[:scripts] ||
|
112
|
+
File.join(File.dirname(__FILE__), "base_style", "scripts.html")
|
113
|
+
@scripts_pdf = options[:scripts_pdf]
|
114
|
+
@scripts_override = options[:scripts_override]
|
115
|
+
end
|
116
|
+
|
117
|
+
def init_stylesheets(options)
|
118
|
+
@htmlstylesheet_name = options[:htmlstylesheet]
|
119
|
+
@wordstylesheet_name = options[:wordstylesheet]
|
120
|
+
@htmlstylesheet_override_name = options[:htmlstylesheet_override]
|
121
|
+
@wordstylesheet_override_name = options[:wordstylesheet_override]
|
122
|
+
@standardstylesheet_name = options[:standardstylesheet]
|
123
|
+
end
|
124
|
+
|
125
|
+
def init_toc(options)
|
126
|
+
@htmlToClevels = 2
|
127
|
+
@wordToClevels = 2
|
128
|
+
@tocfigures = options[:tocfigures]
|
129
|
+
@toctables = options[:toctables]
|
130
|
+
@tocrecommendations = options[:tocrecommendations]
|
131
|
+
end
|
29
132
|
end
|
30
133
|
end
|
@@ -5,6 +5,7 @@ module IsoDoc
|
|
5
5
|
def bibdata(docxml)
|
6
6
|
toc_metadata(docxml)
|
7
7
|
fonts_metadata(docxml)
|
8
|
+
preprocess_xslt_insert(docxml)
|
8
9
|
docid_prefixes(docxml)
|
9
10
|
a = bibdata_current(docxml) or return
|
10
11
|
address_precompose(a)
|
@@ -14,11 +15,30 @@ module IsoDoc
|
|
14
15
|
"</localized-strings>"
|
15
16
|
end
|
16
17
|
|
18
|
+
def extension_insert(docxml, path = [])
|
19
|
+
ins = docxml.at(ns("//metanorma-extension")) ||
|
20
|
+
docxml.at(ns("//bibdata")).after("<metanorma-extension/>").next_element
|
21
|
+
path.each do |n|
|
22
|
+
ins = ins.at(ns("./#{n}")) || ins.add_child("<#{n}/>").first
|
23
|
+
end
|
24
|
+
ins
|
25
|
+
end
|
26
|
+
|
27
|
+
def preprocess_xslt_insert(docxml)
|
28
|
+
content = preprocess_xslt_read or return
|
29
|
+
ins = extension_insert(docxml, %w(render))
|
30
|
+
ins << File.read(content)
|
31
|
+
end
|
32
|
+
|
33
|
+
# read in from file, but with `<preprocess-xslt @format="">` wrapper
|
34
|
+
def preprocess_xslt_read
|
35
|
+
html_doc_path("preprocess.xslt")
|
36
|
+
end
|
37
|
+
|
17
38
|
def toc_metadata(docxml)
|
18
39
|
return unless @tocfigures || @toctables || @tocrecommendations
|
19
40
|
|
20
|
-
ins = docxml
|
21
|
-
docxml.at(ns("//bibdata")).after("<metanorma-extension/>").next_element
|
41
|
+
ins = extension_insert(docxml)
|
22
42
|
@tocfigures and
|
23
43
|
ins << "<toc type='figure'><title>#{@i18n.toc_figures}</title></toc>"
|
24
44
|
@toctables and
|
@@ -178,5 +178,32 @@ module IsoDoc
|
|
178
178
|
node.replace(@reqt_models.model(node["model"])
|
179
179
|
.requirement_render1(node))
|
180
180
|
end
|
181
|
+
|
182
|
+
def source(docxml)
|
183
|
+
docxml.xpath(ns("//source/modification")).each do |f|
|
184
|
+
source_modification(f)
|
185
|
+
end
|
186
|
+
docxml.xpath(ns("//table/source")).each { |f| tablesource(f) }
|
187
|
+
docxml.xpath(ns("//figure/source")).each { |f| figuresource(f) }
|
188
|
+
end
|
189
|
+
|
190
|
+
def tablesource(elem)
|
191
|
+
source1(elem)
|
192
|
+
end
|
193
|
+
|
194
|
+
def figuresource(elem)
|
195
|
+
source1(elem)
|
196
|
+
end
|
197
|
+
|
198
|
+
def source1(elem)
|
199
|
+
while elem&.next_element&.name == "source"
|
200
|
+
elem << "; #{to_xml(elem.next_element.remove.children)}"
|
201
|
+
end
|
202
|
+
elem.children = l10n("[#{@i18n.source}: #{to_xml(elem.children).strip}]")
|
203
|
+
end
|
204
|
+
|
205
|
+
def source_modification(mod)
|
206
|
+
termsource_modification(mod)
|
207
|
+
end
|
181
208
|
end
|
182
209
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require "twitter_cldr"
|
2
2
|
require "bigdecimal"
|
3
|
-
require "
|
3
|
+
require "plurimath"
|
4
4
|
|
5
5
|
module IsoDoc
|
6
6
|
class PresentationXMLConvert < ::IsoDoc::Convert
|
@@ -20,7 +20,7 @@ module IsoDoc
|
|
20
20
|
num = BigDecimal(x.text)
|
21
21
|
precision = /\./.match?(x.text) ? x.text.sub(/^.*\./, "").size : 0
|
22
22
|
x.children = localized_number(num, locale, precision)
|
23
|
-
rescue ArgumentError
|
23
|
+
rescue ArgumentError
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
@@ -90,17 +90,34 @@ module IsoDoc
|
|
90
90
|
end
|
91
91
|
|
92
92
|
def asciimath_dup(node)
|
93
|
-
return if @suppressasciimathdup
|
93
|
+
return if @suppressasciimathdup || node.parent.at(ns("./asciimath"))
|
94
|
+
|
95
|
+
math = node.to_xml.gsub(/ xmlns=["'][^"']+["']/, "")
|
96
|
+
.gsub(%r{<[^:/>]+:}, "<").gsub(%r{</[^:/>]+:}, "</")
|
97
|
+
ret = Plurimath::Math.parse(math, "mathml").to_asciimath
|
98
|
+
ret = HTMLEntities.new.encode(ret, :basic)
|
99
|
+
node.next = "<asciimath>#{ret}</asciimath>"
|
100
|
+
rescue StandardError => e
|
101
|
+
warn "Failure to convert MathML to AsciiMath"
|
102
|
+
warn node.parent.to_xml
|
103
|
+
warn e
|
104
|
+
end
|
94
105
|
|
95
|
-
|
96
|
-
|
106
|
+
def maths_just_numeral(node)
|
107
|
+
mn = node.at("./m:mn", MATHML).children
|
108
|
+
if node.parent.name == "stem"
|
109
|
+
node.parent.replace(mn)
|
110
|
+
else
|
111
|
+
node.replace(mn)
|
112
|
+
end
|
97
113
|
end
|
98
114
|
|
99
115
|
def mathml1(node, locale)
|
100
116
|
mathml_style_inherit(node)
|
101
|
-
|
117
|
+
justnumeral = node.elements.size == 1 && node.elements.first.name == "mn"
|
118
|
+
justnumeral or asciimath_dup(node)
|
102
119
|
localize_maths(node, locale)
|
103
|
-
|
120
|
+
justnumeral and maths_just_numeral(node)
|
104
121
|
end
|
105
122
|
|
106
123
|
def mathml_style_inherit(node)
|