isodoc 2.5.1 → 2.5.2
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/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
|