isodoc 2.6.4 → 2.6.6
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 +2 -1
- data/lib/isodoc/function/blocks.rb +2 -0
- data/lib/isodoc/function/references.rb +4 -2
- data/lib/isodoc/function/to_word_html.rb +1 -0
- data/lib/isodoc/function/utils.rb +5 -2
- data/lib/isodoc/init.rb +1 -0
- data/lib/isodoc/metadata.rb +1 -1
- data/lib/isodoc/presentation_function/block.rb +1 -58
- data/lib/isodoc/presentation_function/image.rb +1 -0
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_function/postprocess_toc.rb +1 -2
- data/lib/isodoc/xref/xref_gen.rb +25 -43
- data/lib/isodoc/xref/xref_gen_seq.rb +0 -3
- data/lib/isodoc/xref/xref_sect_gen.rb +0 -6
- data/lib/isodoc/xref/xref_util.rb +41 -0
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5facc53bb7c8a88619fbf516d9d4d749ee960311f32dcf9f536375ee0c25a806
|
4
|
+
data.tar.gz: a6fc8b7e15083a368e3527d4e745977de12fddf02d907163fcc142f41fa96fa2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 55858670ba62d093769824d5888ba78d4af4170626c18e2f575e0fcfbaa6ea2e461b920664ad60911304329536846b89cd54d55688f43c9674938e426a366472
|
7
|
+
data.tar.gz: 0aded4a1dd614f01e6d5cff9ed4e8b6f7d4065694e156ec0023fdb7f9525243bd64bc9579a008587274c43f3d5a8af29aa88366cc366632e269434458734701a
|
data/isodoc.gemspec
CHANGED
@@ -36,9 +36,9 @@ Gem::Specification.new do |spec|
|
|
36
36
|
spec.add_dependency "relaton-cli"
|
37
37
|
# spec.add_dependency "metanorma-utils", "~> 1.5.0" # already in isodoc-i18n
|
38
38
|
spec.add_dependency "mn2pdf"
|
39
|
-
spec.add_dependency "mn-requirements", "~> 0.3.
|
39
|
+
spec.add_dependency "mn-requirements", "~> 0.3.4"
|
40
40
|
|
41
|
-
spec.add_dependency "relaton-render", "~> 0.
|
41
|
+
spec.add_dependency "relaton-render", "~> 0.6.0"
|
42
42
|
spec.add_dependency "roman-numerals"
|
43
43
|
spec.add_dependency "rouge", "~> 4.0"
|
44
44
|
spec.add_dependency "thread_safe"
|
data/lib/isodoc/convert.rb
CHANGED
@@ -50,6 +50,7 @@ module IsoDoc
|
|
50
50
|
# sourcehighlighter: whether to apply sourcecode highlighting
|
51
51
|
# semantic_xml_insert: whether to insert into presentation XML
|
52
52
|
# a copy of semantic XML
|
53
|
+
# output_formats: hash of supported output formats and suffixes
|
53
54
|
def initialize(options) # rubocop:disable Lint/MissingSuper
|
54
55
|
@options = options_preprocess(options)
|
55
56
|
init_stylesheets(@options)
|
@@ -97,7 +98,7 @@ module IsoDoc
|
|
97
98
|
end
|
98
99
|
|
99
100
|
def convert_init(file, input_filename, debug)
|
100
|
-
docxml = Nokogiri::XML(file
|
101
|
+
docxml = Nokogiri::XML(file, &:huge)
|
101
102
|
filename, dir = init_file(input_filename, debug)
|
102
103
|
docxml.root.default_namespace = ""
|
103
104
|
convert_i18n_init(docxml)
|
@@ -34,12 +34,14 @@ module IsoDoc
|
|
34
34
|
#{SKIP_DOCID} or @type = 'metanorma-ordinal' or @type = 'metanorma'
|
35
35
|
XPATH
|
36
36
|
|
37
|
+
PRIMARY_ID = "docidentifier[@primary = 'true']".freeze
|
38
|
+
|
37
39
|
def pref_ref_code(bib)
|
38
40
|
bib["suppress_identifier"] == "true" and return nil
|
39
41
|
lang = "[@language = '#{@lang}']"
|
40
|
-
ret = bib.xpath(ns("
|
42
|
+
ret = bib.xpath(ns("./#{PRIMARY_ID}[not(#{SKIP_DOCID})]#{lang}"))
|
41
43
|
ret.empty? and
|
42
|
-
ret = bib.xpath(ns("
|
44
|
+
ret = bib.xpath(ns("./#{PRIMARY_ID}[not(#{SKIP_DOCID})]"))
|
43
45
|
ret.empty? and
|
44
46
|
ret = bib.at(ns("./docidentifier[not(#{SKIP_DOC1})]#{lang}")) ||
|
45
47
|
bib.at(ns("./docidentifier[not(#{SKIP_DOC1})]"))
|
@@ -252,6 +252,7 @@ module IsoDoc
|
|
252
252
|
when "variant-title" then variant_title(node, out)
|
253
253
|
when "span" then span_parse(node, out)
|
254
254
|
when "location" then location_parse(node, out)
|
255
|
+
when "columnbreak" then columnbreak_parse(node, out)
|
255
256
|
else error_parse(node, out)
|
256
257
|
end
|
257
258
|
end
|
@@ -3,6 +3,9 @@ require "metanorma-utils"
|
|
3
3
|
module IsoDoc
|
4
4
|
module Function
|
5
5
|
module Utils
|
6
|
+
Hash.include Metanorma::Utils::Hash
|
7
|
+
Array.include Metanorma::Utils::Array
|
8
|
+
|
6
9
|
def to_xml(node)
|
7
10
|
self.class.to_xml(node)
|
8
11
|
end
|
@@ -166,8 +169,8 @@ module IsoDoc
|
|
166
169
|
.merge(@labels ? { labels: @labels } : {})
|
167
170
|
.merge(@meta.labels ? { labels: @meta.labels } : {})
|
168
171
|
.merge(fonts_options || {})
|
169
|
-
|
170
|
-
|
172
|
+
liquid(docxml).render(meta.stringify_all_keys
|
173
|
+
.transform_values { |v| empty2nil(v) })
|
171
174
|
.gsub("<", "<").gsub(">", ">").gsub("&", "&")
|
172
175
|
end
|
173
176
|
|
data/lib/isodoc/init.rb
CHANGED
@@ -48,6 +48,7 @@ module IsoDoc
|
|
48
48
|
@aligncrosselements = options[:aligncrosselements]
|
49
49
|
@modspecidentifierbase = options[:modspecidentifierbase]
|
50
50
|
@sourcehighlighter = options[:sourcehighlighter]
|
51
|
+
@output_formats = options[:output_formats] || {}
|
51
52
|
end
|
52
53
|
|
53
54
|
def init_arrangement(options)
|
data/lib/isodoc/metadata.rb
CHANGED
@@ -106,69 +106,12 @@ module IsoDoc
|
|
106
106
|
docxml.xpath(ns("//td | //th")).each do |d|
|
107
107
|
d.traverse do |n|
|
108
108
|
n.text? or next
|
109
|
-
ret = break_up_long_str(n.text)
|
109
|
+
ret = Metanorma::Utils::break_up_long_str(n.text)
|
110
110
|
n.content = ret
|
111
111
|
end
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
115
|
-
LONGSTR_THRESHOLD = 10
|
116
|
-
LONGSTR_NOPUNCT = 2
|
117
|
-
|
118
|
-
def break_up_long_str(text)
|
119
|
-
/^\s*$/.match?(text) and return text
|
120
|
-
text.split(/(?=\s)/).map do |w|
|
121
|
-
if /^\s*$/.match(text) || (w.size < LONGSTR_THRESHOLD) then w
|
122
|
-
else
|
123
|
-
w.scan(/.{,#{LONGSTR_THRESHOLD}}/o).map.with_index do |w1, i|
|
124
|
-
w1.size < LONGSTR_THRESHOLD ? w1 : break_up_long_str1(w1, i + 1)
|
125
|
-
end.join
|
126
|
-
end
|
127
|
-
end.join
|
128
|
-
end
|
129
|
-
|
130
|
-
STR_BREAKUP_RE = %r{
|
131
|
-
(?<=[=_—–\u2009→?+;]) | # break after any of these
|
132
|
-
(?<=[,.:])(?!\d) | # break on punct only if not preceding digit
|
133
|
-
(?<=[>])(?![>]) | # > not >->
|
134
|
-
(?<=[\]])(?![\]]) | # ] not ]-]
|
135
|
-
(?<=//) | # //
|
136
|
-
(?<=[/])(?![/]) | # / not /-/
|
137
|
-
(?<![<])(?=[<]) | # < not <-<
|
138
|
-
(?<=\p{L})(?=[(\{\[]\p{L}) # letter and bracket, followed by letter
|
139
|
-
}x.freeze
|
140
|
-
|
141
|
-
|
142
|
-
CAMEL_CASE_RE = %r{
|
143
|
-
(?<=\p{Ll}\p{Ll})(?=\p{Lu}\p{Ll}\p{Ll}) # 2 lowerc / upperc, 2 lowerc
|
144
|
-
}x.freeze
|
145
|
-
|
146
|
-
# break on punct every LONGSTRING_THRESHOLD chars, with zero width space
|
147
|
-
# if punct fails, try break on camel case, with soft hyphen
|
148
|
-
# break regardless every LONGSTRING_THRESHOLD * LONGSTR_NOPUNCT,
|
149
|
-
# with soft hyphen
|
150
|
-
def break_up_long_str1(text, iteration)
|
151
|
-
s, separator = break_up_long_str2(text)
|
152
|
-
if s.size == 1 # could not break up
|
153
|
-
(iteration % LONGSTR_NOPUNCT).zero? and
|
154
|
-
text += "\u00ad" # force soft hyphen
|
155
|
-
text
|
156
|
-
else
|
157
|
-
s[-1] = "#{separator}#{s[-1]}"
|
158
|
-
s.join
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
def break_up_long_str2(text)
|
163
|
-
s = text.split(STR_BREAKUP_RE, -1)
|
164
|
-
separator = "\u200b"
|
165
|
-
if s.size == 1
|
166
|
-
s = text.split(CAMEL_CASE_RE)
|
167
|
-
separator = "\u00ad"
|
168
|
-
end
|
169
|
-
[s, separator]
|
170
|
-
end
|
171
|
-
|
172
115
|
# we use this to eliminate the semantic amend blocks from rendering
|
173
116
|
def amend(docxml)
|
174
117
|
docxml.xpath(ns("//amend")).each { |f| amend1(f) }
|
data/lib/isodoc/version.rb
CHANGED
@@ -31,8 +31,7 @@ module IsoDoc
|
|
31
31
|
<<~TOC
|
32
32
|
<p class="MsoToc#{toclevel}"><span class="MsoHyperlink"><span lang="EN-GB" style='mso-no-proof:yes'>
|
33
33
|
<a href="#_Toc#{bookmark}">#{heading}<span lang="EN-GB" class="MsoTocTextSpan">
|
34
|
-
<span style='mso-tab-count:1 dotted'>. </span>
|
35
|
-
</span><span lang="EN-GB" class="MsoTocTextSpan">
|
34
|
+
<span style='mso-tab-count:1 dotted'>. </span></span><span lang="EN-GB" class="MsoTocTextSpan">
|
36
35
|
<span style='mso-element:field-begin'></span></span>
|
37
36
|
<span lang="EN-GB" class="MsoTocTextSpan"> PAGEREF _Toc#{bookmark} \\h </span>
|
38
37
|
<span lang="EN-GB" class="MsoTocTextSpan"><span style='mso-element:field-separator'></span></span><span
|
data/lib/isodoc/xref/xref_gen.rb
CHANGED
@@ -1,12 +1,5 @@
|
|
1
1
|
require_relative "xref_gen_seq"
|
2
|
-
|
3
|
-
module Enumerable
|
4
|
-
def noblank
|
5
|
-
reject do |n|
|
6
|
-
n["id"].nil? || n["id"].empty?
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
2
|
+
require_relative "xref_util"
|
10
3
|
|
11
4
|
module IsoDoc
|
12
5
|
module XrefGen
|
@@ -15,14 +8,6 @@ module IsoDoc
|
|
15
8
|
recommendation permission figure table formula
|
16
9
|
admonition sourcecode).freeze
|
17
10
|
|
18
|
-
def blank?(text)
|
19
|
-
text.nil? || text.empty?
|
20
|
-
end
|
21
|
-
|
22
|
-
def noblank(xpath)
|
23
|
-
xpath.reject { |n| blank?(n["id"]) }
|
24
|
-
end
|
25
|
-
|
26
11
|
def amend_preprocess(xmldoc)
|
27
12
|
xmldoc.xpath(ns("//amend[newcontent]")).each do |a|
|
28
13
|
autonum = amend_autonums(a)
|
@@ -84,23 +69,6 @@ module IsoDoc
|
|
84
69
|
end
|
85
70
|
end
|
86
71
|
|
87
|
-
SECTIONS_XPATH =
|
88
|
-
"//foreword | //introduction | //acknowledgements | " \
|
89
|
-
"//preface/terms | preface/definitions | preface/references | " \
|
90
|
-
"//preface/clause | //sections/terms | //annex | " \
|
91
|
-
"//sections/clause | //sections/definitions | " \
|
92
|
-
"//bibliography/references | //bibliography/clause".freeze
|
93
|
-
|
94
|
-
def sections_xpath
|
95
|
-
SECTIONS_XPATH
|
96
|
-
end
|
97
|
-
|
98
|
-
def child_asset_path(asset)
|
99
|
-
"./*[not(self::xmlns:clause) and not(self::xmlns:appendix) and " \
|
100
|
-
"not(self::xmlns:terms) and not(self::xmlns:definitions)]//xmlns:X | " \
|
101
|
-
"./xmlns:X".gsub("X", asset)
|
102
|
-
end
|
103
|
-
|
104
72
|
def note_anchor_names(sections)
|
105
73
|
sections.each do |s|
|
106
74
|
notes = s.xpath(child_asset_path("note")) -
|
@@ -118,9 +86,6 @@ module IsoDoc
|
|
118
86
|
end
|
119
87
|
end
|
120
88
|
|
121
|
-
CHILD_SECTIONS = "./clause | ./appendix | ./terms | ./definitions | " \
|
122
|
-
"./references".freeze
|
123
|
-
|
124
89
|
def admonition_anchor_names(sections)
|
125
90
|
sections.each do |s|
|
126
91
|
notes = s.xpath(child_asset_path("admonition[@type = 'box']"))
|
@@ -239,16 +204,33 @@ refer_list)
|
|
239
204
|
Common::to_xml(label.children)
|
240
205
|
end
|
241
206
|
|
242
|
-
def
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
207
|
+
def id_ancestor(node)
|
208
|
+
parent = nil
|
209
|
+
node.ancestors.each do |a|
|
210
|
+
(a["id"] && (parent = a) && @anchors.dig(a["id"], :xref)) or next
|
211
|
+
break
|
212
|
+
end
|
213
|
+
parent ? [parent, parent["id"]] : [nil, nil]
|
214
|
+
end
|
247
215
|
|
248
|
-
|
216
|
+
def bookmark_container(parent)
|
217
|
+
if parent
|
218
|
+
clause = parent.xpath(CLAUSE_ANCESTOR)&.last
|
219
|
+
if clause["id"] == id
|
220
|
+
nil
|
221
|
+
else
|
222
|
+
@anchors.dig(clause["id"], :xref)
|
249
223
|
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
def bookmark_anchor_names(xml)
|
228
|
+
xml.xpath(ns(".//bookmark")).noblank.each do |n|
|
229
|
+
_parent, id = id_ancestor(n)
|
230
|
+
#container = bookmark_container(parent)
|
250
231
|
@anchors[n["id"]] = { type: "bookmark", label: nil, value: nil,
|
251
|
-
xref:
|
232
|
+
xref: @anchors.dig(id, :xref) || "???",
|
233
|
+
container: @anchors.dig(id, :container) }
|
252
234
|
end
|
253
235
|
end
|
254
236
|
end
|
@@ -84,11 +84,9 @@ module IsoDoc
|
|
84
84
|
FIRST_LVL_REQ_RULE = <<~XPATH.freeze
|
85
85
|
[not(ancestor::permission or ancestor::requirement or ancestor::recommendation)]
|
86
86
|
XPATH
|
87
|
-
|
88
87
|
FIRST_LVL_REQ = <<~XPATH.freeze
|
89
88
|
.//permission#{FIRST_LVL_REQ_RULE} | .//requirement#{FIRST_LVL_REQ_RULE} | .//recommendation#{FIRST_LVL_REQ_RULE}
|
90
89
|
XPATH
|
91
|
-
|
92
90
|
REQ_CHILDREN = <<~XPATH.freeze
|
93
91
|
./permission | ./requirement | ./recommendation
|
94
92
|
XPATH
|
@@ -234,7 +232,6 @@ module IsoDoc
|
|
234
232
|
block, anchor_struct(id, nil,
|
235
233
|
label, klass, block["unnumbered"])
|
236
234
|
)
|
237
|
-
|
238
235
|
model.permission_parts(block, id, label, klass).each do |n|
|
239
236
|
@anchors[n[:id]] = anchor_struct(n[:number], nil, n[:label],
|
240
237
|
n[:klass], false)
|
@@ -231,12 +231,6 @@ module IsoDoc
|
|
231
231
|
end
|
232
232
|
end
|
233
233
|
|
234
|
-
ISO_PUBLISHER_XPATH =
|
235
|
-
"./contributor[xmlns:role/@type = 'publisher']/" \
|
236
|
-
"organization[abbreviation = 'ISO' or xmlns:abbreviation = 'IEC' or " \
|
237
|
-
"xmlns:name = 'International Organization for Standardization' or " \
|
238
|
-
"xmlns:name = 'International Electrotechnical Commission']".freeze
|
239
|
-
|
240
234
|
def reference_names(ref)
|
241
235
|
ids = @klass.bibitem_ref_code(ref)
|
242
236
|
identifiers = @klass.render_identifier(ids)
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Enumerable
|
2
|
+
def noblank
|
3
|
+
reject do |n|
|
4
|
+
n["id"].nil? || n["id"].empty?
|
5
|
+
end
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
module IsoDoc
|
10
|
+
module XrefGen
|
11
|
+
module Blocks
|
12
|
+
def blank?(text)
|
13
|
+
text.nil? || text.empty?
|
14
|
+
end
|
15
|
+
|
16
|
+
def noblank(xpath)
|
17
|
+
xpath.reject { |n| blank?(n["id"]) }
|
18
|
+
end
|
19
|
+
|
20
|
+
SECTIONS_XPATH =
|
21
|
+
"//foreword | //introduction | //acknowledgements | " \
|
22
|
+
"//preface/terms | preface/definitions | preface/references | " \
|
23
|
+
"//preface/clause | //sections/terms | //annex | " \
|
24
|
+
"//sections/clause | //sections/definitions | " \
|
25
|
+
"//bibliography/references | //bibliography/clause".freeze
|
26
|
+
|
27
|
+
def sections_xpath
|
28
|
+
SECTIONS_XPATH
|
29
|
+
end
|
30
|
+
|
31
|
+
def child_asset_path(asset)
|
32
|
+
"./*[not(self::xmlns:clause) and not(self::xmlns:appendix) and " \
|
33
|
+
"not(self::xmlns:terms) and not(self::xmlns:definitions)]//xmlns:X | " \
|
34
|
+
"./xmlns:X".gsub("X", asset)
|
35
|
+
end
|
36
|
+
|
37
|
+
CHILD_SECTIONS = "./clause | ./appendix | ./terms | ./definitions | " \
|
38
|
+
"./references".freeze
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
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.6.
|
4
|
+
version: 2.6.6
|
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-10-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: html2doc
|
@@ -100,28 +100,28 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0.3.
|
103
|
+
version: 0.3.4
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0.3.
|
110
|
+
version: 0.3.4
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: relaton-render
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 0.
|
117
|
+
version: 0.6.0
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 0.
|
124
|
+
version: 0.6.0
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: roman-numerals
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -451,6 +451,7 @@ files:
|
|
451
451
|
- lib/isodoc/xref/xref_gen.rb
|
452
452
|
- lib/isodoc/xref/xref_gen_seq.rb
|
453
453
|
- lib/isodoc/xref/xref_sect_gen.rb
|
454
|
+
- lib/isodoc/xref/xref_util.rb
|
454
455
|
- lib/isodoc/xslfo_convert.rb
|
455
456
|
- lib/metanorma/output.rb
|
456
457
|
- lib/metanorma/output/base.rb
|