isodoc 2.3.5 → 2.3.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 +0 -1
- data/lib/isodoc/base_style/nav.scss +12 -0
- data/lib/isodoc/convert.rb +4 -4
- data/lib/isodoc/function/cleanup.rb +1 -1
- data/lib/isodoc/metadata_contributor.rb +21 -15
- data/lib/isodoc/presentation_function/erefs.rb +168 -0
- data/lib/isodoc/presentation_function/inline.rb +13 -164
- data/lib/isodoc/presentation_function/terms.rb +6 -6
- data/lib/isodoc/presentation_function/xrefs.rb +22 -10
- data/lib/isodoc/presentation_xml_convert.rb +2 -0
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_function/postprocess_cover.rb +83 -58
- metadata +3 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fa570f1c978671ee699be488fae2f0fe3835db689bfa7c5c0c1183e0a87f1854
|
4
|
+
data.tar.gz: 2ae14cde9d26714858c4240012d29e4483b22044d8112256627a709bc2704aee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 39d02fd071cd42d4e3771e1d6c6ed938024a2fd0842820d775b35cd5494371c31c09232b39c5526a921b81d660f9e2d9d3222e35c347b899d09c2fab8e35fed1
|
7
|
+
data.tar.gz: 3da1407baf7cd7a36e414925755436fbf4547f8f64da8c739c2e53edcda4e7a3d72a40efd5bb9be93bc9f9f28c626f59903b802e58b764f68e571e5172455398
|
data/isodoc.gemspec
CHANGED
@@ -52,7 +52,6 @@ Gem::Specification.new do |spec|
|
|
52
52
|
spec.add_development_dependency "guard", "~> 2.14"
|
53
53
|
spec.add_development_dependency "guard-rspec", "~> 4.7"
|
54
54
|
spec.add_development_dependency "rake", "~> 13.0"
|
55
|
-
spec.add_development_dependency "rexml"
|
56
55
|
spec.add_development_dependency "rspec", "~> 3.6"
|
57
56
|
spec.add_development_dependency "rubocop", "~> 1.5.2"
|
58
57
|
spec.add_development_dependency "sassc", "~> 2.4.0"
|
@@ -30,6 +30,18 @@
|
|
30
30
|
padding-left: 50px;
|
31
31
|
}
|
32
32
|
|
33
|
+
.h4 {
|
34
|
+
padding-left: 70px;
|
35
|
+
}
|
36
|
+
|
37
|
+
.h5 {
|
38
|
+
padding-left: 90px;
|
39
|
+
}
|
40
|
+
|
41
|
+
.h6 {
|
42
|
+
padding-left: 110px;
|
43
|
+
}
|
44
|
+
|
33
45
|
.toc-active, li:hover {
|
34
46
|
background: $colorLinkActiveBg;
|
35
47
|
box-shadow: inset -5px 0px 10px -5px $colorLinkActiveBg !important;
|
data/lib/isodoc/convert.rb
CHANGED
@@ -38,7 +38,7 @@ module IsoDoc
|
|
38
38
|
# scripts_override: Override scripts file for HTML
|
39
39
|
# scripts_pdf: Scripts file for PDF (not used in XSLT PDF)
|
40
40
|
# datauriimage: Encode images in HTML output as data URIs
|
41
|
-
#
|
41
|
+
# breakupurlsintables: whether to insert spaces in URLs in tables
|
42
42
|
# every 40-odd chars
|
43
43
|
# sectionsplit: split up HTML output on sections
|
44
44
|
# bare: do not insert any prefatory material (coverpage, boilerplate)
|
@@ -74,7 +74,7 @@ module IsoDoc
|
|
74
74
|
@olstyle = options[:olstyle]
|
75
75
|
@datauriimage = options[:datauriimage]
|
76
76
|
@suppressheadingnumbers = options[:suppressheadingnumbers]
|
77
|
-
@break_up_urls_in_tables = options[:
|
77
|
+
@break_up_urls_in_tables = options[:breakupurlsintables]
|
78
78
|
@sectionsplit = options[:sectionsplit] == "true"
|
79
79
|
@suppressasciimathdup = options[:suppressasciimathdup] == "true"
|
80
80
|
@bare = options[:bare]
|
@@ -151,9 +151,9 @@ module IsoDoc
|
|
151
151
|
end
|
152
152
|
|
153
153
|
def init_toc(options)
|
154
|
-
@wordToClevels = options[:doctoclevels].to_i
|
154
|
+
@wordToClevels = (options[:doctoclevels] || options[:toclevels]).to_i
|
155
155
|
@wordToClevels = 2 if @wordToClevels.zero?
|
156
|
-
@htmlToClevels = options[:htmltoclevels].to_i
|
156
|
+
@htmlToClevels = (options[:htmltoclevels] || options[:toclevels]).to_i
|
157
157
|
@htmlToClevels = 2 if @htmlToClevels.zero?
|
158
158
|
@tocfigures = options[:tocfigures]
|
159
159
|
@toctables = options[:toctables]
|
@@ -2,23 +2,29 @@ module IsoDoc
|
|
2
2
|
class Metadata
|
3
3
|
def extract_person_names(authors)
|
4
4
|
authors.reduce([]) do |ret, a|
|
5
|
-
if a.at(ns("./name/completename"))
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
ret << "#{fn.join(' ')} #{a&.at(ns('./name/surname'))&.text}"
|
11
|
-
end
|
5
|
+
ret << if a.at(ns("./name/completename"))
|
6
|
+
a.at(ns("./name/completename")).text
|
7
|
+
else
|
8
|
+
extract_person_name_from_components(a)
|
9
|
+
end
|
12
10
|
end
|
13
11
|
end
|
14
12
|
|
13
|
+
def extract_person_name_from_components(person)
|
14
|
+
name = person.xpath(ns("./name/forename"))
|
15
|
+
name.empty? and name = person.xpath(ns("./name/formatted-initials"))
|
16
|
+
out = name.map(&:text)
|
17
|
+
out << person.at(ns("./name/surname"))&.text
|
18
|
+
l10n(out.compact.join(" "))
|
19
|
+
end
|
20
|
+
|
15
21
|
def extract_person_affiliations(authors)
|
16
22
|
authors.reduce([]) do |m, a|
|
17
|
-
name = a
|
18
|
-
subdivs = a
|
23
|
+
name = a.at(ns("./affiliation/organization/name"))&.text
|
24
|
+
subdivs = a.xpath(ns("./affiliation/organization/subdivision"))&.map(&:text)&.join(", ")
|
19
25
|
name and subdivs and !subdivs.empty? and
|
20
26
|
name = l10n("#{name}, #{subdivs}")
|
21
|
-
location = a
|
27
|
+
location = a.at(ns("./affiliation/organization/address/formattedAddress"))&.text
|
22
28
|
m << (if !name.nil? && !location.nil?
|
23
29
|
l10n("#{name}, #{location}")
|
24
30
|
else
|
@@ -40,7 +46,7 @@ module IsoDoc
|
|
40
46
|
end
|
41
47
|
|
42
48
|
def personal_authors(isoxml)
|
43
|
-
authors = isoxml.xpath(ns("//bibdata/contributor[role/@type = 'author' "\
|
49
|
+
authors = isoxml.xpath(ns("//bibdata/contributor[role/@type = 'author' " \
|
44
50
|
"or xmlns:role/@type = 'editor']/person"))
|
45
51
|
set(:authors, extract_person_names(authors))
|
46
52
|
set(:authors_affiliations, extract_person_names_affiliations(authors))
|
@@ -61,10 +67,10 @@ module IsoDoc
|
|
61
67
|
def agency1(xml)
|
62
68
|
agency = ""
|
63
69
|
publisher = []
|
64
|
-
xml.xpath(ns("//bibdata/contributor[xmlns:role/@type = 'publisher']/"\
|
70
|
+
xml.xpath(ns("//bibdata/contributor[xmlns:role/@type = 'publisher']/" \
|
65
71
|
"organization")).each do |org|
|
66
|
-
name = org
|
67
|
-
agency1 = org
|
72
|
+
name = org.at(ns("./name"))&.text
|
73
|
+
agency1 = org.at(ns("./abbreviation"))&.text || name
|
68
74
|
publisher << name if name
|
69
75
|
agency = iso?(org) ? "ISO/#{agency}" : "#{agency}#{agency1}/"
|
70
76
|
end
|
@@ -79,7 +85,7 @@ module IsoDoc
|
|
79
85
|
end
|
80
86
|
|
81
87
|
def agency_addr(xml)
|
82
|
-
a = xml.at(ns("//bibdata/contributor[xmlns:role/@type = 'publisher'][1]/"\
|
88
|
+
a = xml.at(ns("//bibdata/contributor[xmlns:role/@type = 'publisher'][1]/" \
|
83
89
|
"organization")) or return
|
84
90
|
{ subdivision: "./subdivision", pub_phone: "./phone[not(@type = 'fax')]",
|
85
91
|
pub_fax: "./phone[@type = 'fax']", pub_email: "./email",
|
@@ -0,0 +1,168 @@
|
|
1
|
+
require "metanorma-utils"
|
2
|
+
|
3
|
+
module IsoDoc
|
4
|
+
class PresentationXMLConvert < ::IsoDoc::Convert
|
5
|
+
def expand_citeas(text)
|
6
|
+
text.nil? and return text
|
7
|
+
HTMLEntities.new.decode(text.gsub(/&#x/, "&#"))
|
8
|
+
end
|
9
|
+
|
10
|
+
def erefstack1(elem)
|
11
|
+
locs = elem.xpath(ns("./eref")).map do |e|
|
12
|
+
[e["connective"], e.to_xml]
|
13
|
+
end.flatten
|
14
|
+
ret = resolve_eref_connectives(locs)
|
15
|
+
elem.replace(ret[1])
|
16
|
+
end
|
17
|
+
|
18
|
+
def eref_localities(refs, target, node)
|
19
|
+
if can_conflate_eref_rendering?(refs)
|
20
|
+
l10n(", #{eref_localities_conflated(refs, target, node)}")
|
21
|
+
else
|
22
|
+
ret = resolve_eref_connectives(eref_locality_stacks(refs, target, node))
|
23
|
+
l10n(ret.join)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def eref_localities_conflated(refs, target, node)
|
28
|
+
droploc = node["droploc"]
|
29
|
+
node["droploc"] = true
|
30
|
+
ret = resolve_eref_connectives(eref_locality_stacks(refs, target,
|
31
|
+
node))
|
32
|
+
node.delete("droploc") unless droploc
|
33
|
+
eref_localities1(target,
|
34
|
+
refs.first.at(ns("./locality/@type")).text,
|
35
|
+
l10n(ret[1..-1].join), nil, node, @lang)
|
36
|
+
end
|
37
|
+
|
38
|
+
def can_conflate_eref_rendering?(refs)
|
39
|
+
(refs.size > 1 &&
|
40
|
+
refs.all? { |r| r.name == "localityStack" } &&
|
41
|
+
refs.all? { |r| r.xpath(ns("./locality")).size == 1 }) or return false
|
42
|
+
|
43
|
+
first = refs.first.at(ns("./locality/@type")).text
|
44
|
+
refs.all? do |r|
|
45
|
+
r.at(ns("./locality/@type")).text == first
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def resolve_eref_connectives(locs)
|
50
|
+
locs = resolve_comma_connectives(locs)
|
51
|
+
locs = resolve_to_connectives(locs)
|
52
|
+
return locs if locs.size < 3
|
53
|
+
|
54
|
+
locs = locs.each_slice(2).with_object([]) do |a, m|
|
55
|
+
m << { conn: a[0], label: a[1] }
|
56
|
+
end
|
57
|
+
[", ", combine_conn(locs)]
|
58
|
+
end
|
59
|
+
|
60
|
+
def resolve_comma_connectives(locs)
|
61
|
+
locs1 = []
|
62
|
+
add = ""
|
63
|
+
until locs.empty?
|
64
|
+
if [", ", " "].include?(locs[1])
|
65
|
+
add += locs[0..2].join
|
66
|
+
locs.shift(3)
|
67
|
+
else
|
68
|
+
locs1 << add unless add.empty?
|
69
|
+
add = ""
|
70
|
+
locs1 << locs.shift
|
71
|
+
end
|
72
|
+
end
|
73
|
+
locs1 << add unless add.empty?
|
74
|
+
locs1
|
75
|
+
end
|
76
|
+
|
77
|
+
def resolve_to_connectives(locs)
|
78
|
+
locs1 = []
|
79
|
+
until locs.empty?
|
80
|
+
if locs[1] == "to"
|
81
|
+
locs1 << @i18n.chain_to.sub(/%1/, locs[0]).sub(/%2/, locs[2])
|
82
|
+
locs.shift(3)
|
83
|
+
else locs1 << locs.shift
|
84
|
+
end
|
85
|
+
end
|
86
|
+
locs1
|
87
|
+
end
|
88
|
+
|
89
|
+
def eref_locality_stacks(refs, target, node)
|
90
|
+
ret = refs.each_with_index.with_object([]) do |(r, i), m|
|
91
|
+
added = eref_locality_stack(r, i, target, node)
|
92
|
+
added.empty? and next
|
93
|
+
added.each { |a| m << a }
|
94
|
+
next if i == refs.size - 1
|
95
|
+
|
96
|
+
m << eref_locality_delimiter(r)
|
97
|
+
end
|
98
|
+
ret.empty? ? ret : [", "] + ret
|
99
|
+
end
|
100
|
+
|
101
|
+
def eref_locality_delimiter(ref)
|
102
|
+
if ref&.next_element&.name == "localityStack"
|
103
|
+
ref.next_element["connective"]
|
104
|
+
else locality_delimiter(ref)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def eref_locality_stack(ref, idx, target, node)
|
109
|
+
ret = []
|
110
|
+
if ref.name == "localityStack"
|
111
|
+
ref.elements.each_with_index do |rr, j|
|
112
|
+
l = eref_localities0(rr, j, target, node) or next
|
113
|
+
|
114
|
+
ret << l
|
115
|
+
ret << locality_delimiter(rr) unless j == ref.elements.size - 1
|
116
|
+
end
|
117
|
+
else
|
118
|
+
l = eref_localities0(ref, idx, target, node) and ret << l
|
119
|
+
end
|
120
|
+
ret[-1] == ", " and ret.pop
|
121
|
+
ret
|
122
|
+
end
|
123
|
+
|
124
|
+
def locality_delimiter(_loc)
|
125
|
+
", "
|
126
|
+
end
|
127
|
+
|
128
|
+
def eref_localities0(ref, _idx, target, node)
|
129
|
+
if ref["type"] == "whole" then @i18n.wholeoftext
|
130
|
+
else
|
131
|
+
eref_localities1(target, ref["type"],
|
132
|
+
ref&.at(ns("./referenceFrom"))&.text,
|
133
|
+
ref&.at(ns("./referenceTo"))&.text, node, @lang)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def eref_localities1_zh(_target, type, from, upto, node)
|
138
|
+
ret = "第#{from}" if from
|
139
|
+
ret += "–#{upto}" if upto
|
140
|
+
loc = eref_locality_populate(type, node)
|
141
|
+
ret += " #{loc}" unless node["droploc"] == "true"
|
142
|
+
ret
|
143
|
+
end
|
144
|
+
|
145
|
+
def eref_localities1(target, type, from, upto, node, lang = "en")
|
146
|
+
return nil if type == "anchor"
|
147
|
+
|
148
|
+
lang == "zh" and
|
149
|
+
return l10n(eref_localities1_zh(target, type, from, upto, node))
|
150
|
+
ret = eref_locality_populate(type, node)
|
151
|
+
ret += " #{from}" if from
|
152
|
+
ret += "–#{upto}" if upto
|
153
|
+
l10n(ret)
|
154
|
+
end
|
155
|
+
|
156
|
+
def eref_locality_populate(type, node)
|
157
|
+
return "" if node["droploc"] == "true"
|
158
|
+
|
159
|
+
loc = type.sub(/^locality:/, "")
|
160
|
+
ret = @i18n.locality[loc] || loc
|
161
|
+
ret = case node["case"]
|
162
|
+
when "lowercase" then loc.downcase
|
163
|
+
else Metanorma::Utils.strict_capitalize_first(ret)
|
164
|
+
end
|
165
|
+
" #{ret}"
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require "metanorma-utils"
|
2
|
-
require_relative "xrefs"
|
3
2
|
|
4
3
|
module IsoDoc
|
5
4
|
class PresentationXMLConvert < ::IsoDoc::Convert
|
@@ -19,10 +18,19 @@ module IsoDoc
|
|
19
18
|
link, node)
|
20
19
|
non_locality_elems(node).each(&:remove)
|
21
20
|
node.add_child(cleanup_entities(link))
|
21
|
+
unnest_linkend(node)
|
22
22
|
end
|
23
23
|
# so not <origin bibitemid="ISO7301" citeas="ISO 7301">
|
24
24
|
# <locality type="section"><reference>3.1</reference></locality></origin>
|
25
25
|
|
26
|
+
def unnest_linkend(node)
|
27
|
+
return unless node.at(ns("./xref[@nested]"))
|
28
|
+
|
29
|
+
node.xpath(ns("./xref[@nested]")).each { |x| x.delete("nested") }
|
30
|
+
node.xpath(ns("./location | ./locationStack")).each(&:remove)
|
31
|
+
node.replace(node.children)
|
32
|
+
end
|
33
|
+
|
26
34
|
def xref_empty?(node)
|
27
35
|
c1 = non_locality_elems(node).select { |c| !c.text? || /\S/.match(c) }
|
28
36
|
c1.empty?
|
@@ -30,169 +38,6 @@ module IsoDoc
|
|
30
38
|
|
31
39
|
def anchor_id_postprocess(node); end
|
32
40
|
|
33
|
-
def expand_citeas(text)
|
34
|
-
text.nil? and return text
|
35
|
-
HTMLEntities.new.decode(text.gsub(/&#x/, "&#"))
|
36
|
-
end
|
37
|
-
|
38
|
-
def erefstack1(elem)
|
39
|
-
locs = elem.xpath(ns("./eref")).map do |e|
|
40
|
-
[e["connective"], e.to_xml]
|
41
|
-
end.flatten
|
42
|
-
ret = resolve_eref_connectives(locs)
|
43
|
-
elem.replace(ret[1])
|
44
|
-
end
|
45
|
-
|
46
|
-
def eref_localities(refs, target, node)
|
47
|
-
if can_conflate_eref_rendering?(refs)
|
48
|
-
l10n(", #{eref_localities_conflated(refs, target, node)}")
|
49
|
-
else
|
50
|
-
ret = resolve_eref_connectives(eref_locality_stacks(refs, target, node))
|
51
|
-
l10n(ret.join)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def eref_localities_conflated(refs, target, node)
|
56
|
-
droploc = node["droploc"]
|
57
|
-
node["droploc"] = true
|
58
|
-
ret = resolve_eref_connectives(eref_locality_stacks(refs, target,
|
59
|
-
node))
|
60
|
-
node.delete("droploc") unless droploc
|
61
|
-
eref_localities1(target,
|
62
|
-
refs.first.at(ns("./locality/@type")).text,
|
63
|
-
l10n(ret[1..-1].join), nil, node, @lang)
|
64
|
-
end
|
65
|
-
|
66
|
-
def can_conflate_eref_rendering?(refs)
|
67
|
-
(refs.size > 1 &&
|
68
|
-
refs.all? { |r| r.name == "localityStack" } &&
|
69
|
-
refs.all? { |r| r.xpath(ns("./locality")).size == 1 }) or return false
|
70
|
-
|
71
|
-
first = refs.first.at(ns("./locality/@type")).text
|
72
|
-
refs.all? do |r|
|
73
|
-
r.at(ns("./locality/@type")).text == first
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def resolve_eref_connectives(locs)
|
78
|
-
locs = resolve_comma_connectives(locs)
|
79
|
-
locs = resolve_to_connectives(locs)
|
80
|
-
return locs if locs.size < 3
|
81
|
-
|
82
|
-
locs = locs.each_slice(2).with_object([]) do |a, m|
|
83
|
-
m << { conn: a[0], target: a[1] }
|
84
|
-
end
|
85
|
-
[", ", combine_conn(locs)]
|
86
|
-
end
|
87
|
-
|
88
|
-
def resolve_comma_connectives(locs)
|
89
|
-
locs1 = []
|
90
|
-
add = ""
|
91
|
-
until locs.empty?
|
92
|
-
if [", ", " "].include?(locs[1])
|
93
|
-
add += locs[0..2].join
|
94
|
-
locs.shift(3)
|
95
|
-
else
|
96
|
-
locs1 << add unless add.empty?
|
97
|
-
add = ""
|
98
|
-
locs1 << locs.shift
|
99
|
-
end
|
100
|
-
end
|
101
|
-
locs1 << add unless add.empty?
|
102
|
-
locs1
|
103
|
-
end
|
104
|
-
|
105
|
-
def resolve_to_connectives(locs)
|
106
|
-
locs1 = []
|
107
|
-
until locs.empty?
|
108
|
-
if locs[1] == "to"
|
109
|
-
locs1 << @i18n.chain_to.sub(/%1/, locs[0]).sub(/%2/, locs[2])
|
110
|
-
locs.shift(3)
|
111
|
-
else locs1 << locs.shift
|
112
|
-
end
|
113
|
-
end
|
114
|
-
locs1
|
115
|
-
end
|
116
|
-
|
117
|
-
def eref_locality_stacks(refs, target, node)
|
118
|
-
ret = refs.each_with_index.with_object([]) do |(r, i), m|
|
119
|
-
added = eref_locality_stack(r, i, target, node)
|
120
|
-
added.empty? and next
|
121
|
-
added.each { |a| m << a }
|
122
|
-
next if i == refs.size - 1
|
123
|
-
|
124
|
-
m << eref_locality_delimiter(r)
|
125
|
-
end
|
126
|
-
ret.empty? ? ret : [", "] + ret
|
127
|
-
end
|
128
|
-
|
129
|
-
def eref_locality_delimiter(ref)
|
130
|
-
if ref&.next_element&.name == "localityStack"
|
131
|
-
ref.next_element["connective"]
|
132
|
-
else locality_delimiter(ref)
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
def eref_locality_stack(ref, idx, target, node)
|
137
|
-
ret = []
|
138
|
-
if ref.name == "localityStack"
|
139
|
-
ref.elements.each_with_index do |rr, j|
|
140
|
-
l = eref_localities0(rr, j, target, node) or next
|
141
|
-
|
142
|
-
ret << l
|
143
|
-
ret << locality_delimiter(rr) unless j == ref.elements.size - 1
|
144
|
-
end
|
145
|
-
else
|
146
|
-
l = eref_localities0(ref, idx, target, node) and ret << l
|
147
|
-
end
|
148
|
-
ret[-1] == ", " and ret.pop
|
149
|
-
ret
|
150
|
-
end
|
151
|
-
|
152
|
-
def locality_delimiter(_loc)
|
153
|
-
", "
|
154
|
-
end
|
155
|
-
|
156
|
-
def eref_localities0(ref, _idx, target, node)
|
157
|
-
if ref["type"] == "whole" then @i18n.wholeoftext
|
158
|
-
else
|
159
|
-
eref_localities1(target, ref["type"],
|
160
|
-
ref&.at(ns("./referenceFrom"))&.text,
|
161
|
-
ref&.at(ns("./referenceTo"))&.text, node, @lang)
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
def eref_localities1_zh(_target, type, from, upto, node)
|
166
|
-
ret = "第#{from}" if from
|
167
|
-
ret += "–#{upto}" if upto
|
168
|
-
loc = eref_locality_populate(type, node)
|
169
|
-
ret += " #{loc}" unless node["droploc"] == "true"
|
170
|
-
ret
|
171
|
-
end
|
172
|
-
|
173
|
-
def eref_localities1(target, type, from, upto, node, lang = "en")
|
174
|
-
return nil if type == "anchor"
|
175
|
-
|
176
|
-
lang == "zh" and
|
177
|
-
return l10n(eref_localities1_zh(target, type, from, upto, node))
|
178
|
-
ret = eref_locality_populate(type, node)
|
179
|
-
ret += " #{from}" if from
|
180
|
-
ret += "–#{upto}" if upto
|
181
|
-
l10n(ret)
|
182
|
-
end
|
183
|
-
|
184
|
-
def eref_locality_populate(type, node)
|
185
|
-
return "" if node["droploc"] == "true"
|
186
|
-
|
187
|
-
loc = type.sub(/^locality:/, "")
|
188
|
-
ret = @i18n.locality[loc] || loc
|
189
|
-
ret = case node["case"]
|
190
|
-
when "lowercase" then loc.downcase
|
191
|
-
else Metanorma::Utils.strict_capitalize_first(ret)
|
192
|
-
end
|
193
|
-
" #{ret}"
|
194
|
-
end
|
195
|
-
|
196
41
|
def xref(docxml)
|
197
42
|
docxml.xpath(ns("//xref")).each { |f| xref1(f) }
|
198
43
|
docxml.xpath(ns("//xref//xref")).each { |f| f.replace(f.children) }
|
@@ -200,6 +45,7 @@ module IsoDoc
|
|
200
45
|
|
201
46
|
def eref(docxml)
|
202
47
|
docxml.xpath(ns("//eref")).each { |f| xref1(f) }
|
48
|
+
docxml.xpath(ns("//eref//xref")).each { |f| f.replace(f.children) }
|
203
49
|
docxml.xpath(ns("//erefstack")).each { |f| erefstack1(f) }
|
204
50
|
end
|
205
51
|
|
@@ -209,6 +55,9 @@ module IsoDoc
|
|
209
55
|
|
210
56
|
def quotesource(docxml)
|
211
57
|
docxml.xpath(ns("//quote/source")).each { |f| xref1(f) }
|
58
|
+
docxml.xpath(ns("//quote/source//xref")).each do |f|
|
59
|
+
f.replace(f.children)
|
60
|
+
end
|
212
61
|
end
|
213
62
|
|
214
63
|
def xref1(node)
|
@@ -24,7 +24,7 @@ module IsoDoc
|
|
24
24
|
concept1_linkmention(ref, render, opts)
|
25
25
|
concept1_ref(node, ref, opts)
|
26
26
|
concept1_nonital(node, opts)
|
27
|
-
node.replace(node.children)
|
27
|
+
node.replace(node.children.to_xml.strip)
|
28
28
|
end
|
29
29
|
|
30
30
|
def concept1_nonital(node, opts)
|
@@ -54,8 +54,8 @@ module IsoDoc
|
|
54
54
|
return ref.remove if opts[:ref] == "false"
|
55
55
|
|
56
56
|
r = concept1_ref_content(ref)
|
57
|
-
ref = r.at("./descendant-or-self::xmlns:xref | "\
|
58
|
-
"./descendant-or-self::xmlns:eref | "\
|
57
|
+
ref = r.at("./descendant-or-self::xmlns:xref | " \
|
58
|
+
"./descendant-or-self::xmlns:eref | " \
|
59
59
|
"./descendant-or-self::xmlns:termref")
|
60
60
|
%w(xref eref).include? ref&.name and get_linkend(ref)
|
61
61
|
if opts[:linkref] == "false" && %w(xref eref).include?(ref&.name)
|
@@ -82,10 +82,10 @@ module IsoDoc
|
|
82
82
|
ref = node.at(ns("./xref | ./eref | ./termref"))
|
83
83
|
label = @i18n.relatedterms[node["type"]].upcase
|
84
84
|
if p && ref
|
85
|
-
node.replace(l10n("<p><strong>#{label}:</strong> "\
|
85
|
+
node.replace(l10n("<p><strong>#{label}:</strong> " \
|
86
86
|
"<em>#{p.to_xml}</em> (#{ref.to_xml})</p>"))
|
87
87
|
else
|
88
|
-
node.replace(l10n("<p><strong>#{label}:</strong> "\
|
88
|
+
node.replace(l10n("<p><strong>#{label}:</strong> " \
|
89
89
|
"<strong>**RELATED TERM NOT FOUND**</strong></p>"))
|
90
90
|
end
|
91
91
|
end
|
@@ -125,7 +125,7 @@ module IsoDoc
|
|
125
125
|
|
126
126
|
def designation1(desgn)
|
127
127
|
s = desgn.at(ns("./termsource"))
|
128
|
-
name = desgn.at(ns("./expression/name | ./letter-symbol/name | "\
|
128
|
+
name = desgn.at(ns("./expression/name | ./letter-symbol/name | " \
|
129
129
|
"./graphical-symbol")) or return
|
130
130
|
|
131
131
|
designation_annotate(desgn, name)
|
@@ -41,8 +41,7 @@ module IsoDoc
|
|
41
41
|
if node["style"] == "basic" && t then t
|
42
42
|
elsif node["style"] == "full" && t
|
43
43
|
l10n("#{x}, #{t}")
|
44
|
-
else
|
45
|
-
x
|
44
|
+
else x
|
46
45
|
end
|
47
46
|
end
|
48
47
|
|
@@ -58,15 +57,20 @@ module IsoDoc
|
|
58
57
|
linkend = if can_conflate_xref_rendering?(locs)
|
59
58
|
combine_conflated_xref_locations(locs)
|
60
59
|
else
|
61
|
-
out = locs.each { |l| l[:
|
60
|
+
out = locs.each { |l| l[:label] = anchor_linkend1(l[:node]) }
|
62
61
|
l10n(combine_conn(out))
|
63
62
|
end
|
64
63
|
capitalise_xref(node, linkend, anchor_value(node["target"]))
|
65
64
|
end
|
66
65
|
|
67
66
|
def combine_conflated_xref_locations(locs)
|
68
|
-
out = locs.each { |l| l[:
|
69
|
-
|
67
|
+
out = locs.each { |l| l[:label] = anchor_value(l[:target]) }
|
68
|
+
label = @i18n.inflect(locs.first[:elem], number: "pl")
|
69
|
+
ret = l10n("#{label} #{combine_conn(out)}")
|
70
|
+
combine_conflated_xref_locations_container(locs, ret)
|
71
|
+
end
|
72
|
+
|
73
|
+
def combine_conflated_xref_locations_container(locs, ret)
|
70
74
|
container = @xrefs.anchor(locs.first[:node]["target"], :container,
|
71
75
|
false)
|
72
76
|
prefix_container?(container, locs.first[:node]) and
|
@@ -85,15 +89,23 @@ module IsoDoc
|
|
85
89
|
end
|
86
90
|
end
|
87
91
|
|
92
|
+
def loc2xref(entry)
|
93
|
+
if entry[:target]
|
94
|
+
"<xref nested='true' target='#{entry[:target]}'>#{entry[:label]}</xref>"
|
95
|
+
else
|
96
|
+
entry[:label]
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
88
100
|
def combine_conn(list)
|
89
|
-
return list.first[:
|
101
|
+
return list.first[:label] if list.size == 1
|
90
102
|
|
91
103
|
if list[1..-1].all? { |l| l[:conn] == "and" }
|
92
|
-
@i18n.boolean_conj(list.map { |l| l
|
104
|
+
@i18n.boolean_conj(list.map { |l| loc2xref(l) }, "and")
|
93
105
|
elsif list[1..-1].all? { |l| l[:conn] == "or" }
|
94
|
-
@i18n.boolean_conj(list.map { |l| l
|
106
|
+
@i18n.boolean_conj(list.map { |l| loc2xref(l) }, "or")
|
95
107
|
else
|
96
|
-
ret = list[0]
|
108
|
+
ret = loc2xref(list[0])
|
97
109
|
list[1..-1].each { |l| ret = i18n_chain_boolean(ret, l) }
|
98
110
|
ret
|
99
111
|
end
|
@@ -101,7 +113,7 @@ module IsoDoc
|
|
101
113
|
|
102
114
|
def i18n_chain_boolean(value, entry)
|
103
115
|
@i18n.send("chain_#{entry[:conn]}").sub(/%1/, value)
|
104
|
-
.sub(/%2/, entry
|
116
|
+
.sub(/%2/, loc2xref(entry))
|
105
117
|
end
|
106
118
|
|
107
119
|
def can_conflate_xref_rendering?(locs)
|
@@ -1,5 +1,7 @@
|
|
1
1
|
require_relative "presentation_function/block"
|
2
2
|
require_relative "presentation_function/terms"
|
3
|
+
require_relative "presentation_function/xrefs"
|
4
|
+
require_relative "presentation_function/erefs"
|
3
5
|
require_relative "presentation_function/inline"
|
4
6
|
require_relative "presentation_function/math"
|
5
7
|
require_relative "presentation_function/section"
|
data/lib/isodoc/version.rb
CHANGED
@@ -26,41 +26,33 @@ module IsoDoc
|
|
26
26
|
def insert_toc(intro, docxml, level)
|
27
27
|
toc = ""
|
28
28
|
toc += make_WordToC(docxml, level)
|
29
|
-
toc +=
|
30
|
-
toc +=
|
31
|
-
toc +=
|
29
|
+
toc += make_table_word_toc(docxml)
|
30
|
+
toc += make_figure_word_toc(docxml)
|
31
|
+
toc += make_recommendation_word_toc(docxml)
|
32
32
|
intro.sub(/WORDTOC/, toc)
|
33
33
|
end
|
34
34
|
|
35
35
|
def word_toc_entry(toclevel, heading)
|
36
36
|
bookmark = bookmarkid # Random.rand(1000000000)
|
37
37
|
<<~TOC
|
38
|
-
<p class="MsoToc#{toclevel}"><span class="MsoHyperlink"><span
|
39
|
-
lang="EN-GB"
|
40
|
-
<a href="#_Toc#{bookmark}">#{heading}<span lang="EN-GB"
|
41
|
-
class="MsoTocTextSpan">
|
38
|
+
<p class="MsoToc#{toclevel}"><span class="MsoHyperlink"><span lang="EN-GB" style='mso-no-proof:yes'>
|
39
|
+
<a href="#_Toc#{bookmark}">#{heading}<span lang="EN-GB" class="MsoTocTextSpan">
|
42
40
|
<span style='mso-tab-count:1 dotted'>. </span>
|
43
41
|
</span><span lang="EN-GB" class="MsoTocTextSpan">
|
44
42
|
<span style='mso-element:field-begin'></span></span>
|
45
|
-
<span lang="EN-GB"
|
46
|
-
|
47
|
-
<span lang="EN-GB" class="MsoTocTextSpan"><span
|
48
|
-
style='mso-element:field-separator'></span></span><span
|
43
|
+
<span lang="EN-GB" class="MsoTocTextSpan"> PAGEREF _Toc#{bookmark} \\h </span>
|
44
|
+
<span lang="EN-GB" class="MsoTocTextSpan"><span style='mso-element:field-separator'></span></span><span
|
49
45
|
lang="EN-GB" class="MsoTocTextSpan">1</span>
|
50
|
-
<span lang="EN-GB"
|
51
|
-
class="MsoTocTextSpan"></span
|
52
|
-
lang="EN-GB" class="MsoTocTextSpan"><span
|
53
|
-
style='mso-element:field-end'></span></span></a></span></span></p>
|
46
|
+
<span lang="EN-GB" class="MsoTocTextSpan"></span><span
|
47
|
+
lang="EN-GB" class="MsoTocTextSpan"><span style='mso-element:field-end'></span></span></a></span></span></p>
|
54
48
|
|
55
49
|
TOC
|
56
50
|
end
|
57
51
|
|
58
52
|
def word_toc_preface(level)
|
59
|
-
<<~TOC
|
60
|
-
<span lang="EN-GB"><span
|
61
|
-
style='mso-
|
62
|
-
style='mso-spacerun:yes'> </span>TOC
|
63
|
-
\\o "1-#{level}" \\h \\z \\u <span
|
53
|
+
<<~TOC
|
54
|
+
<span lang="EN-GB"><span style='mso-element:field-begin'></span><span
|
55
|
+
style='mso-spacerun:yes'> </span>TOC \\o "1-#{level}" \\h \\z \\u <span
|
64
56
|
style='mso-element:field-separator'></span></span>
|
65
57
|
TOC
|
66
58
|
end
|
@@ -82,63 +74,96 @@ module IsoDoc
|
|
82
74
|
%{\\1#{word_toc_preface(level)}}) + WORD_TOC_SUFFIX1
|
83
75
|
end
|
84
76
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
77
|
+
# inheriting gems need to add native Word name of style, if different
|
78
|
+
# including both CSS style name and human readable style name.
|
79
|
+
# Any human readable style name needs to come first for the Word template
|
80
|
+
# to work in regenerating the ToC
|
81
|
+
def table_toc_class
|
82
|
+
%w(TableTitle tabletitle)
|
83
|
+
end
|
92
84
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
style='mso-spacerun:yes'> </span>TOC
|
97
|
-
\\h \\z \\t "TableTitle,tabletitle" <span
|
98
|
-
style='mso-element:field-separator'></span></span>
|
99
|
-
TOC
|
85
|
+
def figure_toc_class
|
86
|
+
%w(FigureTitle figuretitle)
|
87
|
+
end
|
100
88
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
\\h \\z \\t "FigureTitle,figuretitle" <span
|
106
|
-
style='mso-element:field-separator'></span></span>
|
107
|
-
TOC
|
89
|
+
def reqt_toc_class
|
90
|
+
%w(RecommendationTitle RecommendationTestTitle
|
91
|
+
recommendationtitle recommendationtesttitle)
|
92
|
+
end
|
108
93
|
|
109
|
-
def
|
110
|
-
|
111
|
-
|
94
|
+
def toc_word_class_list(classes)
|
95
|
+
classes.map do |x|
|
96
|
+
/ /.match?(x) ? %("#{x}") : x
|
97
|
+
end.join(",")
|
98
|
+
end
|
99
|
+
|
100
|
+
def word_toc_reqt_preface1
|
101
|
+
<<~TOC
|
102
|
+
<span lang="EN-GB"><span style='mso-element:field-begin'></span><span
|
103
|
+
style='mso-spacerun:yes'> </span>TOC \\h \\z \\t #{toc_word_class_list reqt_toc_class}
|
104
|
+
<span style='mso-element:field-separator'></span></span>
|
105
|
+
TOC
|
106
|
+
end
|
107
|
+
|
108
|
+
def word_toc_table_preface1
|
109
|
+
<<~TOC
|
110
|
+
<span lang="EN-GB"><span style='mso-element:field-begin'></span><span style='mso-spacerun:yes'> </span>TOC
|
111
|
+
\\h \\z \\t #{toc_word_class_list table_toc_class} <span style='mso-element:field-separator'></span></span>
|
112
|
+
TOC
|
113
|
+
end
|
114
|
+
|
115
|
+
def word_toc_figure_preface1
|
116
|
+
<<~TOC
|
117
|
+
<span lang="EN-GB"><span style='mso-element:field-begin'></span><span style='mso-spacerun:yes'> </span>TOC
|
118
|
+
\\h \\z \\t #{toc_word_class_list figure_toc_class} <span style='mso-element:field-separator'></span></span>
|
119
|
+
TOC
|
120
|
+
end
|
121
|
+
|
122
|
+
def table_toc_xpath
|
123
|
+
attr = table_toc_class.map { |x| "@class = '#{x}'" }
|
124
|
+
"//p[#{attr.join(' or ')}]"
|
125
|
+
end
|
126
|
+
|
127
|
+
def make_table_word_toc(docxml)
|
128
|
+
(docxml.at(table_toc_xpath) && @toctablestitle) or return ""
|
112
129
|
toc = %{<p class="TOCTitle">#{@toctablestitle}</p>}
|
113
|
-
docxml.xpath(
|
130
|
+
docxml.xpath(table_toc_xpath).each do |h|
|
114
131
|
toc += word_toc_entry(1, header_strip(h))
|
115
132
|
end
|
116
133
|
toc.sub(/(<p class="MsoToc1">)/,
|
117
|
-
%{\\1#{
|
134
|
+
%{\\1#{word_toc_table_preface1}}) + WORD_TOC_SUFFIX1
|
135
|
+
end
|
136
|
+
|
137
|
+
def figure_toc_xpath
|
138
|
+
attr = figure_toc_class.map { |x| "@class = '#{x}'" }
|
139
|
+
"//p[#{attr.join(' or ')}]"
|
118
140
|
end
|
119
141
|
|
120
|
-
def
|
121
|
-
(docxml.at(
|
122
|
-
return ""
|
142
|
+
def make_figure_word_toc(docxml)
|
143
|
+
(docxml.at(figure_toc_xpath) && @tocfigurestitle) or return ""
|
123
144
|
toc = %{<p class="TOCTitle">#{@tocfigurestitle}</p>}
|
124
|
-
docxml.xpath(
|
145
|
+
docxml.xpath(figure_toc_xpath).each do |h|
|
125
146
|
toc += word_toc_entry(1, header_strip(h))
|
126
147
|
end
|
127
148
|
toc.sub(/(<p class="MsoToc1">)/,
|
128
|
-
%{\\1#{
|
149
|
+
%{\\1#{word_toc_figure_preface1}}) + WORD_TOC_SUFFIX1
|
150
|
+
end
|
151
|
+
|
152
|
+
def reqt_toc_xpath
|
153
|
+
attr = reqt_toc_class.map { |x| "@class = '#{x}'" }
|
154
|
+
"//p[#{attr.join(' or ')}]"
|
129
155
|
end
|
130
156
|
|
131
|
-
def
|
132
|
-
(docxml.at(
|
133
|
-
@tocrecommendationstitle) or return ""
|
157
|
+
def make_recommendation_word_toc(docxml)
|
158
|
+
(docxml.at(reqt_toc_xpath) && @tocrecommendationstitle) or return ""
|
134
159
|
toc = %{<p class="TOCTitle">#{@tocrecommendationstitle}</p>}
|
135
|
-
docxml.xpath(
|
160
|
+
docxml.xpath(reqt_toc_xpath).sort_by do |h|
|
136
161
|
recommmendation_sort_key(h.text)
|
137
162
|
end.each do |h|
|
138
163
|
toc += word_toc_entry(1, header_strip(h))
|
139
164
|
end
|
140
165
|
toc.sub(/(<p class="MsoToc1">)/,
|
141
|
-
%{\\1#{
|
166
|
+
%{\\1#{word_toc_reqt_preface1}}) + WORD_TOC_SUFFIX1
|
142
167
|
end
|
143
168
|
|
144
169
|
def recommmendation_sort_key(header)
|
@@ -160,7 +185,7 @@ module IsoDoc
|
|
160
185
|
|
161
186
|
def authority_cleanup1(docxml, klass)
|
162
187
|
dest = docxml.at("//div[@id = 'boilerplate-#{klass}-destination']")
|
163
|
-
auth = docxml.at("//div[@id = 'boilerplate-#{klass}' "\
|
188
|
+
auth = docxml.at("//div[@id = 'boilerplate-#{klass}' " \
|
164
189
|
"or @class = 'boilerplate-#{klass}']")
|
165
190
|
auth&.xpath(".//h1[not(text())] | .//h2[not(text())]")&.each(&:remove)
|
166
191
|
auth&.xpath(".//h1 | .//h2")&.each do |h|
|
@@ -218,7 +243,7 @@ module IsoDoc
|
|
218
243
|
docxml.xpath("//div[@class = '#{sect}']//br[@orientation]").reverse
|
219
244
|
.each_with_index do |br, i|
|
220
245
|
@landscapestyle +=
|
221
|
-
"\ndiv.#{sect}_#{i} {page:#{sect}"\
|
246
|
+
"\ndiv.#{sect}_#{i} {page:#{sect}" \
|
222
247
|
"#{br['orientation'] == 'landscape' ? 'L' : 'P'};}\n"
|
223
248
|
split_at_section_break(docxml, sect, br, i)
|
224
249
|
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.3.
|
4
|
+
version: 2.3.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: 2022-11-
|
11
|
+
date: 2022-11-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: asciimath
|
@@ -290,20 +290,6 @@ dependencies:
|
|
290
290
|
- - "~>"
|
291
291
|
- !ruby/object:Gem::Version
|
292
292
|
version: '13.0'
|
293
|
-
- !ruby/object:Gem::Dependency
|
294
|
-
name: rexml
|
295
|
-
requirement: !ruby/object:Gem::Requirement
|
296
|
-
requirements:
|
297
|
-
- - ">="
|
298
|
-
- !ruby/object:Gem::Version
|
299
|
-
version: '0'
|
300
|
-
type: :development
|
301
|
-
prerelease: false
|
302
|
-
version_requirements: !ruby/object:Gem::Requirement
|
303
|
-
requirements:
|
304
|
-
- - ">="
|
305
|
-
- !ruby/object:Gem::Version
|
306
|
-
version: '0'
|
307
293
|
- !ruby/object:Gem::Dependency
|
308
294
|
name: rspec
|
309
295
|
requirement: !ruby/object:Gem::Requirement
|
@@ -459,6 +445,7 @@ files:
|
|
459
445
|
- lib/isodoc/pdf_convert.rb
|
460
446
|
- lib/isodoc/presentation_function/bibdata.rb
|
461
447
|
- lib/isodoc/presentation_function/block.rb
|
448
|
+
- lib/isodoc/presentation_function/erefs.rb
|
462
449
|
- lib/isodoc/presentation_function/image.rb
|
463
450
|
- lib/isodoc/presentation_function/inline.rb
|
464
451
|
- lib/isodoc/presentation_function/math.rb
|