isodoc 2.5.1 → 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 +2 -2
- data/lib/isodoc/convert.rb +18 -105
- data/lib/isodoc/function/blocks.rb +17 -12
- data/lib/isodoc/function/cleanup.rb +4 -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 +0 -1
- data/lib/isodoc/function/to_word_html.rb +1 -5
- data/lib/isodoc/html_function/html.rb +1 -0
- 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/sourcecode.rb +37 -8
- data/lib/isodoc/presentation_function/terms.rb +16 -16
- 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 +12 -2
- data/lib/isodoc/xslfo_convert.rb +20 -15
- data/lib/isodoc-yaml/i18n-ar.yaml +1 -0
- data/lib/isodoc-yaml/i18n-de.yaml +1 -0
- data/lib/isodoc-yaml/i18n-en.yaml +1 -0
- data/lib/isodoc-yaml/i18n-es.yaml +1 -0
- data/lib/isodoc-yaml/i18n-fr.yaml +1 -0
- data/lib/isodoc-yaml/i18n-ja.yaml +3 -2
- data/lib/isodoc-yaml/i18n-ru.yaml +1 -0
- data/lib/isodoc-yaml/i18n-zh-Hans.yaml +1 -0
- metadata +6 -6
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,10 +29,10 @@ 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 "html2doc", "~> 1.5.
|
32
|
+
spec.add_dependency "html2doc", "~> 1.5.3"
|
33
33
|
spec.add_dependency "htmlentities", "~> 4.3.4"
|
34
34
|
# spec.add_dependency "isodoc-i18n", "~> 1.1.0" # already in relaton-render and mn-requirements
|
35
|
-
spec.add_dependency "liquid", "~>
|
35
|
+
spec.add_dependency "liquid", "~> 5"
|
36
36
|
spec.add_dependency "emf2svg"
|
37
37
|
spec.add_dependency "plurimath"
|
38
38
|
spec.add_dependency "relaton-cli"
|
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,10 +111,27 @@ 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
136
|
convert_i18n_init1(docxml)
|
223
137
|
i18n_init(@lang, @script, @locale)
|
@@ -242,8 +156,7 @@ module IsoDoc
|
|
242
156
|
@openmathdelim, @closemathdelim = extract_delims(file)
|
243
157
|
docxml, filename, dir = convert_init(file, input_filename, debug)
|
244
158
|
result = convert1(docxml, filename, dir)
|
245
|
-
return result
|
246
|
-
|
159
|
+
debug and return result
|
247
160
|
output_filename ||= "#{filename}.#{@suffix}"
|
248
161
|
postprocess(result, output_filename, dir)
|
249
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
|
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)
|
@@ -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/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
|
@@ -3,23 +3,26 @@ module IsoDoc
|
|
3
3
|
def sourcehighlighter_css(docxml)
|
4
4
|
ret = custom_css(docxml)
|
5
5
|
ret.empty? and return
|
6
|
-
ins = docxml
|
7
|
-
docxml.at(ns("//bibdata")).after("<metanorma-extension/>").next_element
|
6
|
+
ins = extension_insert(docxml)
|
8
7
|
ins << "<source-highlighter-css>#{ret}" \
|
9
8
|
"</source-highlighter-css>"
|
10
9
|
end
|
11
10
|
|
12
11
|
def custom_css(docxml)
|
13
12
|
ret = ""
|
14
|
-
@sourcehighlighter and
|
15
|
-
ret += File.read(File.join(File.dirname(__FILE__), "..", "base_style",
|
16
|
-
"rouge.css"))
|
13
|
+
@sourcehighlighter and ret += rouge_css_location
|
17
14
|
a = docxml.at(ns("//metanorma-extension/" \
|
18
15
|
"clause[title = 'user-css']/sourcecode")) and
|
19
16
|
ret += "\n#{to_xml(a.children)}"
|
20
17
|
ret
|
21
18
|
end
|
22
19
|
|
20
|
+
# replace in local gem rather than specify overrides of default
|
21
|
+
def rouge_css_location
|
22
|
+
File.read(File.join(File.dirname(__FILE__), "..", "base_style",
|
23
|
+
"rouge.css"))
|
24
|
+
end
|
25
|
+
|
23
26
|
def sourcehighlighter
|
24
27
|
@sourcehighlighter or return
|
25
28
|
Rouge::Formatter.enable_escape!
|
@@ -29,9 +32,16 @@ module IsoDoc
|
|
29
32
|
{ formatter: f, formatter_line: f1 }
|
30
33
|
end
|
31
34
|
|
35
|
+
def callouts(elem)
|
36
|
+
elem.xpath(ns(".//callout")).each do |c|
|
37
|
+
@callouts[c["target"]] = c.children.to_xml
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
32
41
|
def sourcecode(docxml)
|
33
42
|
sourcehighlighter_css(docxml)
|
34
43
|
@highlighter = sourcehighlighter
|
44
|
+
@callouts = {}
|
35
45
|
docxml.xpath(ns("//sourcecode")).each do |f|
|
36
46
|
sourcecode1(f)
|
37
47
|
end
|
@@ -40,6 +50,21 @@ module IsoDoc
|
|
40
50
|
def sourcecode1(elem)
|
41
51
|
source_highlight(elem)
|
42
52
|
source_label(elem)
|
53
|
+
callouts(elem)
|
54
|
+
annotations(elem)
|
55
|
+
end
|
56
|
+
|
57
|
+
def annotations(elem)
|
58
|
+
elem.at(ns("./annotation")) or return
|
59
|
+
ret = ""
|
60
|
+
elem.xpath(ns("./annotation")).each do |a|
|
61
|
+
a.remove
|
62
|
+
ret += <<~OUT
|
63
|
+
<dt id='#{a['id']}'><span class='c'>#{@callouts[a['id']]}</span></dt>
|
64
|
+
<dd>#{a.children.to_xml}</dd>
|
65
|
+
OUT
|
66
|
+
end
|
67
|
+
elem << "<dl><name>#{@i18n.key}</name>#{ret}</dl>"
|
43
68
|
end
|
44
69
|
|
45
70
|
def source_highlight(elem)
|
@@ -65,7 +90,7 @@ module IsoDoc
|
|
65
90
|
def source_remove_annotations(ret, elem)
|
66
91
|
ret[:ann] = elem.xpath(ns("./annotation")).each(&:remove)
|
67
92
|
ret[:call] = elem.xpath(ns("./callout")).each_with_object([]) do |c, m|
|
68
|
-
m << { xml: c.remove
|
93
|
+
m << { xml: c.remove, line: c.line - elem.line }
|
69
94
|
end
|
70
95
|
ret
|
71
96
|
end
|
@@ -85,7 +110,7 @@ module IsoDoc
|
|
85
110
|
text = to_xml(code)
|
86
111
|
text.split(/[\n\r]/).each_with_index do |c, i|
|
87
112
|
while !callouts.empty? && callouts[0][:line] == i
|
88
|
-
c.sub!(/\s+$/, "
|
113
|
+
c.sub!(/\s+$/, " #{reinsert_callout(callouts[0][:xml])} ")
|
89
114
|
callouts.shift
|
90
115
|
end
|
91
116
|
end.join("\n")
|
@@ -95,12 +120,16 @@ module IsoDoc
|
|
95
120
|
table.xpath(".//td[@class = 'rouge-code']/sourcecode")
|
96
121
|
.each_with_index do |c, i|
|
97
122
|
while !callouts.empty? && callouts[0][:line] == i
|
98
|
-
c << "
|
123
|
+
c << " #{reinsert_callout(callouts[0][:xml])} "
|
99
124
|
callouts.shift
|
100
125
|
end
|
101
126
|
end
|
102
127
|
end
|
103
128
|
|
129
|
+
def reinsert_callout(xml)
|
130
|
+
"<span class='c'>#{to_xml(xml)}</span>"
|
131
|
+
end
|
132
|
+
|
104
133
|
def sourcecode_table_to_elem(elem, tokens)
|
105
134
|
r = Nokogiri::XML(@highlighter[:formatter_line].format(tokens)).root
|
106
135
|
r.xpath(".//td[@class = 'rouge-code']/pre").each do |pre|
|
@@ -38,16 +38,13 @@ module IsoDoc
|
|
38
38
|
|
39
39
|
def concept_render_init(node, defaults)
|
40
40
|
opts = %i(bold ital ref linkref linkmention)
|
41
|
-
.each_with_object({})
|
42
|
-
m[x] = node[x.to_s] || defaults[x]
|
43
|
-
end
|
41
|
+
.each_with_object({}) { |x, m| m[x] = node[x.to_s] || defaults[x] }
|
44
42
|
[opts, node.at(ns("./renderterm")),
|
45
43
|
node.at(ns("./xref | ./eref | ./termref"))]
|
46
44
|
end
|
47
45
|
|
48
46
|
def concept1_linkmention(ref, renderterm, opts)
|
49
|
-
(opts[:linkmention] == "true" &&
|
50
|
-
!renderterm.nil? && !ref.nil?) or return
|
47
|
+
(opts[:linkmention] == "true" && !renderterm.nil? && !ref.nil?) or return
|
51
48
|
ref2 = ref.clone
|
52
49
|
r2 = renderterm.clone
|
53
50
|
renderterm.replace(ref2).children = r2
|
@@ -65,11 +62,10 @@ module IsoDoc
|
|
65
62
|
def concept1_ref_content(ref)
|
66
63
|
prev = "["
|
67
64
|
foll = "]"
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
prev, foll = @i18n.term_defined_in.split("%")
|
72
|
-
end
|
65
|
+
non_locality_elems(ref).select do |c|
|
66
|
+
!c.text? || /\S/.match(c)
|
67
|
+
end.empty? and
|
68
|
+
(prev, foll = @i18n.term_defined_in.split("%"))
|
73
69
|
ref.previous = prev
|
74
70
|
ref.next = foll
|
75
71
|
end
|
@@ -95,14 +91,20 @@ module IsoDoc
|
|
95
91
|
docxml.xpath(ns("//term")).each { |t| merge_second_preferred(t) }
|
96
92
|
docxml.xpath(ns("//preferred | //admitted | //deprecates"))
|
97
93
|
.each { |p| designation1(p) }
|
94
|
+
docxml.xpath(ns("//deprecates")).each { |d| deprecates(d) }
|
95
|
+
docxml.xpath(ns("//admitted")).each { |d| admits(d) }
|
96
|
+
end
|
97
|
+
|
98
|
+
def deprecates(elem)
|
99
|
+
elem.children.first.previous = @i18n.l10n("#{@i18n.deprecated}: ")
|
98
100
|
end
|
99
101
|
|
102
|
+
def admits(elem); end
|
103
|
+
|
100
104
|
def merge_second_preferred(term)
|
101
105
|
pref = nil
|
102
106
|
term.xpath(ns("./preferred[expression/name]")).each_with_index do |p, i|
|
103
|
-
|
104
|
-
else merge_second_preferred1(pref, p)
|
105
|
-
end
|
107
|
+
(i.zero? and pref = p) or merge_second_preferred1(pref, p)
|
106
108
|
end
|
107
109
|
end
|
108
110
|
|
@@ -226,9 +228,7 @@ module IsoDoc
|
|
226
228
|
docxml.xpath(ns("//termsource/modification")).each do |f|
|
227
229
|
termsource_modification(f)
|
228
230
|
end
|
229
|
-
docxml.xpath(ns("//termsource")).each
|
230
|
-
termsource1(f)
|
231
|
-
end
|
231
|
+
docxml.xpath(ns("//termsource")).each { |f| termsource1(f) }
|
232
232
|
end
|
233
233
|
|
234
234
|
def termsource1(elem)
|
data/lib/isodoc/version.rb
CHANGED
@@ -43,14 +43,21 @@ module IsoDoc
|
|
43
43
|
"#{ret}page-break-after:#{pb};"
|
44
44
|
end
|
45
45
|
|
46
|
-
def keep_rows_together(
|
46
|
+
def keep_rows_together(_cell, rowmax, totalrows, opt)
|
47
47
|
opt[:header] and return true
|
48
|
-
table_line_count
|
48
|
+
@table_line_count > 15 and return false
|
49
49
|
(totalrows <= 10 && rowmax < totalrows)
|
50
50
|
end
|
51
51
|
|
52
|
+
def tbody_parse(node, table)
|
53
|
+
tbody = node.at(ns("./tbody")) or return
|
54
|
+
@table_line_count = table_line_count(tbody)
|
55
|
+
super
|
56
|
+
end
|
57
|
+
|
52
58
|
def table_line_count(tbody)
|
53
59
|
sum = 0
|
60
|
+
tbody.xpath(ns(".//tr")).size > 15 and return 16 # short-circuit
|
54
61
|
tbody.xpath(ns(".//tr")).each do |r|
|
55
62
|
i = 1
|
56
63
|
r.xpath(ns(".//td | .//th")).each do |c|
|
@@ -70,7 +77,8 @@ module IsoDoc
|
|
70
77
|
summary: node["summary"], width: node["width"],
|
71
78
|
style: "mso-table-anchor-horizontal:column;mso-table-overlap:never;" \
|
72
79
|
"#{bordered}#{keep_style(node)}",
|
73
|
-
class: (node.text.length > 4000 ? "MsoISOTableBig" : "MsoISOTable")
|
80
|
+
class: (node.text.length > 4000 ? "MsoISOTableBig" : "MsoISOTable")
|
81
|
+
}
|
74
82
|
bordered or ret.delete(:class)
|
75
83
|
super.merge(attr_code(ret))
|
76
84
|
end
|
@@ -89,9 +97,8 @@ module IsoDoc
|
|
89
97
|
table_title_parse(node, out)
|
90
98
|
out.div align: "center", class: "table_container" do |div|
|
91
99
|
div.table **table_attrs(node) do |t|
|
92
|
-
table_parse_core(node,
|
93
|
-
(
|
94
|
-
node.xpath(ns("./note")).each { |n| parse(n, out) }
|
100
|
+
table_parse_core(node, t)
|
101
|
+
table_parse_tail(node, t)
|
95
102
|
end
|
96
103
|
end
|
97
104
|
@in_table = false
|
data/lib/isodoc/xref/xref_gen.rb
CHANGED
@@ -172,8 +172,8 @@ refer_list)
|
|
172
172
|
c = Counter.new(list["start"] ? list["start"].to_i - 1 : 0)
|
173
173
|
list.xpath(ns("./li")).each do |li|
|
174
174
|
label = c.increment(li).listlabel(list, depth)
|
175
|
-
label =
|
176
|
-
|
175
|
+
label = list_item_anchor_label(label, list_anchor, prev_label,
|
176
|
+
refer_list)
|
177
177
|
li["id"] and @anchors[li["id"]] =
|
178
178
|
{ xref: "#{label})", type: "listitem", refer_list:
|
179
179
|
refer_list, container: list_anchor[:container] }
|
@@ -183,6 +183,16 @@ refer_list)
|
|
183
183
|
end
|
184
184
|
end
|
185
185
|
|
186
|
+
def list_item_anchor_label(label, list_anchor, prev_label, refer_list)
|
187
|
+
prev_label.empty? or
|
188
|
+
label = @i18n.list_nested_xref.sub(/%1/, "#{prev_label})")
|
189
|
+
.sub(/%2/, label)
|
190
|
+
refer_list and
|
191
|
+
label = @i18n.list_nested_xref.sub(/%1/, list_anchor[:xref])
|
192
|
+
.sub(/%2/, label)
|
193
|
+
label
|
194
|
+
end
|
195
|
+
|
186
196
|
def deflist_anchor_names(sections)
|
187
197
|
sections.each do |s|
|
188
198
|
notes = s.xpath(ns(".//dl")) - s.xpath(ns(".//clause//dl")) -
|
data/lib/isodoc/xslfo_convert.rb
CHANGED
@@ -51,35 +51,40 @@ module IsoDoc
|
|
51
51
|
ret.merge(@pdf_cmd_options)
|
52
52
|
end
|
53
53
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
54
|
+
# input_file: keep-alive tempfile
|
55
|
+
def convert(input_fname, file = nil, debug = false,
|
56
|
+
output_fname = nil)
|
57
|
+
file = File.read(input_fname, encoding: "utf-8") if file.nil?
|
58
|
+
input_file, docxml, filename =
|
59
|
+
input_xml_path(input_fname, file, debug)
|
59
60
|
::Metanorma::Output::XslfoPdf.new.convert(
|
60
|
-
|
61
|
-
|
61
|
+
filename,
|
62
|
+
output_fname || output_filename(input_fname),
|
62
63
|
File.join(@libdir, pdf_stylesheet(docxml)),
|
63
64
|
pdf_options(docxml),
|
64
65
|
)
|
65
66
|
end
|
66
67
|
|
68
|
+
def output_filename(input_fname)
|
69
|
+
out = input_fname.sub(/\.presentation\.xml$/, ".xml")
|
70
|
+
File.join(File.dirname(input_fname),
|
71
|
+
"#{File.basename(out, '.*')}.#{@suffix}")
|
72
|
+
end
|
73
|
+
|
67
74
|
def xref_parse(node, out)
|
68
|
-
out.a(
|
75
|
+
out.a(href: target_pdf(node)) { |l| l << get_linkend(node) }
|
69
76
|
end
|
70
77
|
|
71
78
|
def input_xml_path(input_filename, xml_file, debug)
|
72
79
|
docxml, filename, dir = convert_init(xml_file, input_filename, debug)
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
f.path
|
78
|
-
end
|
80
|
+
input_filename = Tempfile.open([File.basename(filename), ".xml"],
|
81
|
+
encoding: "utf-8") do |f|
|
82
|
+
f.write xml_file
|
83
|
+
f
|
79
84
|
end
|
80
85
|
FileUtils.rm_rf dir
|
81
86
|
|
82
|
-
[input_filename, docxml,
|
87
|
+
[input_filename, docxml, input_filename.path]
|
83
88
|
end
|
84
89
|
end
|
85
90
|
end
|
@@ -40,12 +40,13 @@ chain_or: "%1 or %2"
|
|
40
40
|
chain_from: "%1 from %2"
|
41
41
|
chain_to: "%1 to %2"
|
42
42
|
nested_xref: "%1の%2"
|
43
|
+
list_nested_xref: "%1の%2"
|
43
44
|
ordinal_keys: []
|
44
45
|
SpelloutRules: spellout-ordinal
|
45
46
|
note: 注記
|
46
47
|
note_xref: 注記
|
47
48
|
termnote: 注釈%
|
48
|
-
list:
|
49
|
+
list: リスト
|
49
50
|
deflist: Definition List
|
50
51
|
figure: 図
|
51
52
|
diagram: Diagram
|
@@ -116,7 +117,7 @@ locality: {
|
|
116
117
|
part: 部,
|
117
118
|
paragraph: 段落,
|
118
119
|
chapter: Chapter,
|
119
|
-
page:
|
120
|
+
page: ページ,
|
120
121
|
table: 表,
|
121
122
|
annex: 附属書,
|
122
123
|
figure: 図,
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: isodoc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.5.
|
4
|
+
version: 2.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-04-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: html2doc
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.5.
|
19
|
+
version: 1.5.3
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.5.
|
26
|
+
version: 1.5.3
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: htmlentities
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '5'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '5'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: emf2svg
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|