isodoc 1.8.3.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/rake.yml +3 -31
- data/lib/isodoc/base_style/all.css +9 -0
- data/lib/isodoc/base_style/reset.css +9 -0
- data/lib/isodoc/base_style/reset.scss +11 -0
- data/lib/isodoc/class_utils.rb +18 -6
- data/lib/isodoc/convert.rb +8 -1
- data/lib/isodoc/function/blocks.rb +4 -1
- data/lib/isodoc/function/references.rb +31 -22
- data/lib/isodoc/function/section_titles.rb +6 -1
- data/lib/isodoc/function/to_word_html.rb +3 -3
- data/lib/isodoc/function/utils.rb +13 -14
- data/lib/isodoc/headlesshtml_convert.rb +1 -1
- data/lib/isodoc/html_convert.rb +1 -1
- data/lib/isodoc/html_function/postprocess.rb +9 -2
- data/lib/isodoc/i18n.rb +6 -3
- data/lib/isodoc/pdf_convert.rb +1 -1
- data/lib/isodoc/presentation_function/bibdata.rb +0 -6
- data/lib/isodoc/presentation_function/section.rb +40 -4
- data/lib/isodoc/presentation_function/terms.rb +25 -20
- data/lib/isodoc/presentation_xml_convert.rb +1 -0
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/xref/xref_sect_gen.rb +7 -3
- data/lib/isodoc/xslfo_convert.rb +1 -2
- data/spec/isodoc/blocks_spec.rb +2 -1
- data/spec/isodoc/postproc_spec.rb +46 -16
- data/spec/isodoc/presentation_xml_spec.rb +208 -37
- data/spec/isodoc/ref_spec.rb +332 -300
- data/spec/isodoc/section_spec.rb +713 -601
- data/spec/isodoc/utils_spec.rb +57 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 94378642fdbff3fdfd64fc15d3f502fd3ac966926d19b060c5b7bbd4b9f9e545
|
4
|
+
data.tar.gz: eeb1da05b0df09ea66cd55692f3d2f706991904216c5869025b9d936dc93cf12
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b8164bf9d471f1b409ff4c0d933f69b9f834d340548caf3b441d7ca4584460b026420bb752903121561d573f8ddc618e5796d5e22dd09c1a9f3ca429cf567df5
|
7
|
+
data.tar.gz: 75a73a94378f4d0fe6187b343d84961265e60d1417d23c43c38b11c819190cba0838dd0a99ba21d7e49824add339f7a6007c42748f87130a7abd2ce35d14105b
|
data/.github/workflows/rake.yml
CHANGED
@@ -10,34 +10,6 @@ on:
|
|
10
10
|
|
11
11
|
jobs:
|
12
12
|
rake:
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
strategy:
|
17
|
-
fail-fast: false
|
18
|
-
matrix:
|
19
|
-
ruby: [ '3.0', '2.7', '2.6', '2.5' ]
|
20
|
-
os: [ ubuntu-latest, windows-latest, macos-latest ]
|
21
|
-
experimental: [ false ]
|
22
|
-
steps:
|
23
|
-
- uses: actions/checkout@master
|
24
|
-
|
25
|
-
- uses: ruby/setup-ruby@v1
|
26
|
-
with:
|
27
|
-
ruby-version: ${{ matrix.ruby }}
|
28
|
-
bundler-cache: true
|
29
|
-
|
30
|
-
- uses: metanorma/metanorma-build-scripts/inkscape-setup-action@master
|
31
|
-
|
32
|
-
- run: bundle exec rake
|
33
|
-
|
34
|
-
tests-passed:
|
35
|
-
needs: rake
|
36
|
-
runs-on: ubuntu-latest
|
37
|
-
steps:
|
38
|
-
- uses: peter-evans/repository-dispatch@v1
|
39
|
-
with:
|
40
|
-
token: ${{ secrets.METANORMA_CI_PAT_TOKEN || secrets.GITHUB_TOKEN }}
|
41
|
-
repository: ${{ github.repository }}
|
42
|
-
event-type: tests-passed
|
43
|
-
client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}"}'
|
13
|
+
uses: metanorma/metanorma-build-scripts/.github/workflows/inkscape-rake.yml@main
|
14
|
+
secrets:
|
15
|
+
pat_token: ${{ secrets.METANORMA_CI_PAT_TOKEN }}
|
@@ -68,6 +68,12 @@ code *, pre *, tt *, kbd *, samp * {
|
|
68
68
|
font-family: {{monospacefont}} !important;
|
69
69
|
font-variant-ligatures: none; }
|
70
70
|
|
71
|
+
p code, dt code, li code, label code, legend code, caption code, th code, td code,
|
72
|
+
p tt, dt tt, li tt, label tt, legend tt, caption tt, th tt, td tt,
|
73
|
+
p kbd, dt kbd, li kbd, label kbd, legend kbd, caption kbd, th kbd, td kbd,
|
74
|
+
p samp, dt samp, li samp, label samp, legend samp, caption samp, th samp, td samp {
|
75
|
+
font-size: {{monospacefontsize}}; }
|
76
|
+
|
71
77
|
article, aside, details, figcaption, figure,
|
72
78
|
footer, header, hgroup, menu, nav, section {
|
73
79
|
display: block; }
|
@@ -79,6 +85,9 @@ table {
|
|
79
85
|
h1, h2, h3, h4, h5, h6 {
|
80
86
|
font-family: {{headerfont}}; }
|
81
87
|
|
88
|
+
.h1, .h2, .h3, .h4, .h5, .h6 {
|
89
|
+
font-family: {{headerfont}}; }
|
90
|
+
|
82
91
|
blockquote, q {
|
83
92
|
quotes: none; }
|
84
93
|
blockquote:before, blockquote:after, q:before, q:after {
|
@@ -68,6 +68,12 @@ code *, pre *, tt *, kbd *, samp * {
|
|
68
68
|
font-family: {{monospacefont}} !important;
|
69
69
|
font-variant-ligatures: none; }
|
70
70
|
|
71
|
+
p code, dt code, li code, label code, legend code, caption code, th code, td code,
|
72
|
+
p tt, dt tt, li tt, label tt, legend tt, caption tt, th tt, td tt,
|
73
|
+
p kbd, dt kbd, li kbd, label kbd, legend kbd, caption kbd, th kbd, td kbd,
|
74
|
+
p samp, dt samp, li samp, label samp, legend samp, caption samp, th samp, td samp {
|
75
|
+
font-size: {{monospacefontsize}}; }
|
76
|
+
|
71
77
|
article, aside, details, figcaption, figure,
|
72
78
|
footer, header, hgroup, menu, nav, section {
|
73
79
|
display: block; }
|
@@ -79,6 +85,9 @@ table {
|
|
79
85
|
h1, h2, h3, h4, h5, h6 {
|
80
86
|
font-family: {{headerfont}}; }
|
81
87
|
|
88
|
+
.h1, .h2, .h3, .h4, .h5, .h6 {
|
89
|
+
font-family: {{headerfont}}; }
|
90
|
+
|
82
91
|
blockquote, q {
|
83
92
|
quotes: none; }
|
84
93
|
blockquote:before, blockquote:after, q:before, q:after {
|
@@ -74,6 +74,13 @@ code *, pre *, tt *, kbd *, samp * {
|
|
74
74
|
font-variant-ligatures: none;
|
75
75
|
}
|
76
76
|
|
77
|
+
p code, dt code, li code, label code, legend code, caption code, th code, td code,
|
78
|
+
p tt, dt tt, li tt, label tt, legend tt, caption tt, th tt, td tt,
|
79
|
+
p kbd, dt kbd, li kbd, label kbd, legend kbd, caption kbd, th kbd, td kbd,
|
80
|
+
p samp, dt samp, li samp, label samp, legend samp, caption samp, th samp, td samp {
|
81
|
+
font-size: $monospacefontsize;
|
82
|
+
}
|
83
|
+
|
77
84
|
article, aside, details, figcaption, figure,
|
78
85
|
footer, header, hgroup, menu, nav, section {
|
79
86
|
display: block;
|
@@ -88,6 +95,10 @@ h1, h2, h3, h4, h5, h6 {
|
|
88
95
|
font-family: $headerfont;
|
89
96
|
}
|
90
97
|
|
98
|
+
.h1, .h2, .h3, .h4, .h5, .h6 {
|
99
|
+
font-family: $headerfont;
|
100
|
+
}
|
101
|
+
|
91
102
|
blockquote, q {
|
92
103
|
quotes: none;
|
93
104
|
|
data/lib/isodoc/class_utils.rb
CHANGED
@@ -28,25 +28,37 @@ module IsoDoc
|
|
28
28
|
Liquid::Template.parse(doc)
|
29
29
|
end
|
30
30
|
|
31
|
-
def case_strict(text, casing, script)
|
31
|
+
def case_strict(text, casing, script, firstonly: true)
|
32
32
|
return text unless %w(Latn Cyrl Grek Armn).include?(script)
|
33
33
|
|
34
|
-
|
34
|
+
seen = false
|
35
|
+
text.split(/(\s+)/).map do |w|
|
36
|
+
letters = w.chars
|
37
|
+
case_strict1(letters, casing) if !seen || !firstonly
|
38
|
+
seen ||= /\S/.match?(w)
|
39
|
+
letters.join
|
40
|
+
end.join
|
41
|
+
end
|
42
|
+
|
43
|
+
def case_strict1(letters, casing)
|
44
|
+
return letters if letters.empty?
|
45
|
+
|
35
46
|
case casing
|
36
47
|
when "capital" then letters.first.upcase!
|
37
48
|
when "lowercase" then letters.first.downcase!
|
49
|
+
when "allcaps" then letters.map(&:upcase!)
|
38
50
|
end
|
39
|
-
letters.join
|
40
51
|
end
|
41
52
|
|
42
|
-
def case_with_markup(linkend, casing, script)
|
53
|
+
def case_with_markup(linkend, casing, script, firstonly: true)
|
43
54
|
seen = false
|
44
55
|
xml = Nokogiri::XML("<root>#{linkend}</root>")
|
45
56
|
xml.traverse do |b|
|
46
57
|
next unless b.text? && !seen
|
47
58
|
|
48
|
-
b.replace(Common::case_strict(b.text, casing, script
|
49
|
-
|
59
|
+
b.replace(Common::case_strict(b.text, casing, script,
|
60
|
+
firstonly: firstonly))
|
61
|
+
seen = true if firstonly
|
50
62
|
end
|
51
63
|
xml.root.children.to_xml
|
52
64
|
end
|
data/lib/isodoc/convert.rb
CHANGED
@@ -5,6 +5,7 @@ require "fileutils"
|
|
5
5
|
require "tempfile"
|
6
6
|
require_relative "i18n"
|
7
7
|
require_relative "css"
|
8
|
+
require "securerandom"
|
8
9
|
|
9
10
|
module IsoDoc
|
10
11
|
class Convert < ::IsoDoc::Common
|
@@ -103,10 +104,16 @@ module IsoDoc
|
|
103
104
|
@fn_bookmarks = {}
|
104
105
|
@baseassetpath = options[:baseassetpath]
|
105
106
|
@aligncrosselements = options[:aligncrosselements]
|
107
|
+
@tmpimagedir_suffix = tmpimagedir_suffix
|
108
|
+
@tmpfilesdir_suffix = tmpfilesdir_suffix
|
106
109
|
end
|
107
110
|
|
108
111
|
def tmpimagedir_suffix
|
109
|
-
"_images"
|
112
|
+
"_#{SecureRandom.hex(8)}_images"
|
113
|
+
end
|
114
|
+
|
115
|
+
def tmpfilesdir_suffix
|
116
|
+
"_#{SecureRandom.hex(8)}_files"
|
110
117
|
end
|
111
118
|
|
112
119
|
def html_doc_path(*file)
|
@@ -174,10 +174,13 @@ module IsoDoc
|
|
174
174
|
end
|
175
175
|
end
|
176
176
|
|
177
|
-
def para_class(
|
177
|
+
def para_class(node)
|
178
178
|
classtype = nil
|
179
179
|
classtype = "MsoCommentText" if in_comment
|
180
180
|
classtype = "Sourcecode" if @annotation
|
181
|
+
if node["type"] == "floating-title"
|
182
|
+
classtype = "h#{node['depth']}"
|
183
|
+
end
|
181
184
|
classtype
|
182
185
|
end
|
183
186
|
|
@@ -14,27 +14,28 @@ module IsoDoc
|
|
14
14
|
def nonstd_bibitem(list, bib, ordinal, biblio)
|
15
15
|
list.p **attr_code(iso_bibitem_entry_attrs(bib, biblio)) do |ref|
|
16
16
|
ids = bibitem_ref_code(bib)
|
17
|
-
|
18
|
-
if biblio then ref_entry_code(ref, ordinal,
|
17
|
+
idents = render_identifier(ids)
|
18
|
+
if biblio then ref_entry_code(ref, ordinal, idents, ids)
|
19
19
|
else
|
20
|
-
ref << (
|
21
|
-
ref << ", #{
|
20
|
+
ref << (idents[:ordinal] || idents[:metanorma] || idents[:sdo]).to_s
|
21
|
+
ref << ", #{idents[sdo]}" if idents[:ordinal] && idents[:sdo]
|
22
22
|
end
|
23
|
-
ref << ", " unless biblio && !
|
23
|
+
ref << ", " unless biblio && !idents[:sdo]
|
24
24
|
reference_format(bib, ref)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
28
|
def std_bibitem_entry(list, bib, ordinal, biblio)
|
29
29
|
list.p **attr_code(iso_bibitem_entry_attrs(bib, biblio)) do |ref|
|
30
|
-
|
31
|
-
if biblio then ref_entry_code(ref, ordinal,
|
30
|
+
idents = render_identifier(bibitem_ref_code(bib))
|
31
|
+
if biblio then ref_entry_code(ref, ordinal, idents, nil)
|
32
32
|
else
|
33
|
-
ref << (
|
34
|
-
ref << ", #{
|
33
|
+
ref << (idents[:ordinal] || idents[:metanorma] || idents[:sdo]).to_s
|
34
|
+
ref << ", #{idents[:sdo]}" if (idents[:ordinal] ||
|
35
|
+
idents[:metanorma]) && idents[:sdo]
|
35
36
|
end
|
36
37
|
date_note_process(bib, ref)
|
37
|
-
ref << ", " unless biblio && !
|
38
|
+
ref << ", " unless biblio && !idents[:sdo]
|
38
39
|
reference_format(bib, ref)
|
39
40
|
end
|
40
41
|
end
|
@@ -42,13 +43,15 @@ module IsoDoc
|
|
42
43
|
# if ids is just a number, only use that ([1] Non-Standard)
|
43
44
|
# else, use both ordinal, as prefix, and ids
|
44
45
|
def ref_entry_code(ref, ordinal, ids, _id)
|
45
|
-
prefix_bracketed_ref(ref, ids[
|
46
|
-
|
46
|
+
prefix_bracketed_ref(ref, ids[:ordinal] || ids[:metanorma] ||
|
47
|
+
"[#{ordinal}]")
|
48
|
+
ids[:sdo] and ref << (ids[:sdo]).to_s
|
47
49
|
end
|
48
50
|
|
49
51
|
def pref_ref_code(bib)
|
50
52
|
bib.at(ns("./docidentifier[not(@type = 'DOI' or @type = 'metanorma' "\
|
51
|
-
"or @type = '
|
53
|
+
"or @type = 'metanorma-ordinal' or "\
|
54
|
+
"@type = 'ISSN' or @type = 'ISBN' or "\
|
52
55
|
"@type = 'rfc-anchor')]"))
|
53
56
|
end
|
54
57
|
|
@@ -58,11 +61,12 @@ module IsoDoc
|
|
58
61
|
id1 = pref_ref_code(bib)
|
59
62
|
id2 = bib.at(ns("./docidentifier[@type = 'DOI' or @type = 'ISSN' or "\
|
60
63
|
"@type = 'ISBN']"))
|
61
|
-
|
64
|
+
id3 = bib.at(ns("./docidentifier[@type = 'metanorma-ordinal']"))
|
65
|
+
return [id, id1, id2, id3] if id || id1 || id2 || id3
|
62
66
|
|
63
67
|
id = Nokogiri::XML::Node.new("docidentifier", bib.document)
|
64
68
|
id << "(NO ID)"
|
65
|
-
[nil, id, nil]
|
69
|
+
[nil, id, nil, nil]
|
66
70
|
end
|
67
71
|
|
68
72
|
def bracket_if_num(num)
|
@@ -74,10 +78,15 @@ module IsoDoc
|
|
74
78
|
num
|
75
79
|
end
|
76
80
|
|
81
|
+
def unbracket(ident)
|
82
|
+
ident&.text&.sub(/^\[/, "")&.sub(/\]$/, "")
|
83
|
+
end
|
84
|
+
|
77
85
|
def render_identifier(ident)
|
78
|
-
|
79
|
-
|
80
|
-
|
86
|
+
{ metanorma: bracket_if_num(ident[0]),
|
87
|
+
sdo: unbracket(ident[1]),
|
88
|
+
doi: unbracket(ident[2]),
|
89
|
+
ordinal: bracket_if_num(ident[3]) }
|
81
90
|
end
|
82
91
|
|
83
92
|
def docid_prefix(prefix, docid)
|
@@ -133,7 +142,7 @@ module IsoDoc
|
|
133
142
|
end
|
134
143
|
end
|
135
144
|
|
136
|
-
def
|
145
|
+
def standard?(bib)
|
137
146
|
ret = false
|
138
147
|
drop = %w(metanorma DOI ISSN ISBN)
|
139
148
|
bib.xpath(ns("./docidentifier")).each do |id|
|
@@ -151,7 +160,7 @@ module IsoDoc
|
|
151
160
|
next if implicit_reference(b)
|
152
161
|
|
153
162
|
i += 1
|
154
|
-
if
|
163
|
+
if standard?(b) then std_bibitem_entry(div, b, i, biblio)
|
155
164
|
else nonstd_bibitem(div, b, i, biblio)
|
156
165
|
end
|
157
166
|
else
|
@@ -166,7 +175,7 @@ module IsoDoc
|
|
166
175
|
end
|
167
176
|
|
168
177
|
def norm_ref(isoxml, out, num)
|
169
|
-
f = isoxml.at(ns(norm_ref_xpath)) and f["hidden"] != "true" or
|
178
|
+
(f = isoxml.at(ns(norm_ref_xpath)) and f["hidden"] != "true") or
|
170
179
|
return num
|
171
180
|
out.div do |div|
|
172
181
|
num = num + 1
|
@@ -186,7 +195,7 @@ module IsoDoc
|
|
186
195
|
end
|
187
196
|
|
188
197
|
def bibliography(isoxml, out)
|
189
|
-
f = isoxml.at(ns(bibliography_xpath)) and f["hidden"] != "true" or
|
198
|
+
(f = isoxml.at(ns(bibliography_xpath)) and f["hidden"] != "true") or
|
190
199
|
return
|
191
200
|
page_break(out)
|
192
201
|
out.div do |div|
|
@@ -76,7 +76,12 @@ module IsoDoc
|
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
|
-
def variant_title(
|
79
|
+
def variant_title(node, out)
|
80
|
+
out.p **attr_code(style: "display:none;",
|
81
|
+
class: "variant-title-#{node['type']}") do |p|
|
82
|
+
node.children.each { |c| parse(c, p) }
|
83
|
+
end
|
84
|
+
end
|
80
85
|
end
|
81
86
|
end
|
82
87
|
end
|
@@ -30,7 +30,7 @@ module IsoDoc
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def init_dir(filename, debug)
|
33
|
-
dir = "#{filename}
|
33
|
+
dir = "#{filename}#{@tmpfilesdir_suffix}"
|
34
34
|
unless debug
|
35
35
|
Dir.mkdir(dir, 0o777) unless File.exists?(dir)
|
36
36
|
FileUtils.rm_rf "#{dir}/*"
|
@@ -40,11 +40,11 @@ module IsoDoc
|
|
40
40
|
|
41
41
|
# tmp image dir is same directory as @filename
|
42
42
|
def tmpimagedir
|
43
|
-
@filename + tmpimagedir_suffix
|
43
|
+
@filename + @tmpimagedir_suffix
|
44
44
|
end
|
45
45
|
|
46
46
|
def rel_tmpimagedir
|
47
|
-
Pathname.new(@filename).basename.to_s + tmpimagedir_suffix
|
47
|
+
Pathname.new(@filename).basename.to_s + @tmpimagedir_suffix
|
48
48
|
end
|
49
49
|
|
50
50
|
# isodoc.css overrides any CSS injected by Html2Doc, which
|
@@ -129,6 +129,7 @@ module IsoDoc
|
|
129
129
|
|
130
130
|
def header_strip(hdr)
|
131
131
|
h1 = to_xhtml_fragment(hdr.to_s.gsub(%r{<br\s*/>}, " ")
|
132
|
+
.gsub(%r{</?p(\s[^>]+)?>}, "")
|
132
133
|
.gsub(/<\/?h[123456][^>]*>/, "").gsub(/<\/?b[^>]*>/, "").dup)
|
133
134
|
h1.traverse do |x|
|
134
135
|
if x.name == "span" && /mso-tab-count/.match(x["style"])
|
@@ -142,9 +143,9 @@ module IsoDoc
|
|
142
143
|
|
143
144
|
def header_strip_elem?(elem)
|
144
145
|
elem.name == "img" ||
|
145
|
-
elem.name == "span" && elem["class"] == "MsoCommentReference" ||
|
146
|
-
elem.name == "a" && elem["class"] == "FootnoteRef" ||
|
147
|
-
elem.name == "span" && /mso-bookmark/.match(elem["style"])
|
146
|
+
(elem.name == "span" && elem["class"] == "MsoCommentReference") ||
|
147
|
+
(elem.name == "a" && elem["class"] == "FootnoteRef") ||
|
148
|
+
(elem.name == "span" && /mso-bookmark/.match(elem["style"]))
|
148
149
|
end
|
149
150
|
|
150
151
|
def liquid(doc)
|
@@ -192,12 +193,6 @@ module IsoDoc
|
|
192
193
|
save_dataimage(img["src"], false)
|
193
194
|
when %r{^([A-Z]:)?/}
|
194
195
|
img["src"]
|
195
|
-
=begin
|
196
|
-
if /^data:/.match? img["src"]
|
197
|
-
save_dataimage(img["src"], false)
|
198
|
-
elsif %r{^([A-Z]:)?/}.match? img["src"]
|
199
|
-
img["src"]
|
200
|
-
=end
|
201
196
|
else
|
202
197
|
File.join(@localdir, img["src"])
|
203
198
|
end
|
@@ -213,12 +208,16 @@ module IsoDoc
|
|
213
208
|
application/x-msmetafile image/x-xbitmap).include? type
|
214
209
|
end
|
215
210
|
|
216
|
-
def cleanup_entities(text)
|
211
|
+
def cleanup_entities(text, is_xml: true)
|
217
212
|
c = HTMLEntities.new
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
213
|
+
if is_xml
|
214
|
+
text.split(/([<>])/).each_slice(4).map do |a|
|
215
|
+
a[0] = c.encode(c.decode(a[0]), :hexadecimal)
|
216
|
+
a
|
217
|
+
end.join
|
218
|
+
else
|
219
|
+
c.encode(c.decode(text), :hexadecimal)
|
220
|
+
end
|
222
221
|
end
|
223
222
|
|
224
223
|
def external_path(path)
|
data/lib/isodoc/html_convert.rb
CHANGED
@@ -122,8 +122,10 @@ module IsoDoc
|
|
122
122
|
end
|
123
123
|
|
124
124
|
def html_toc_entry(level, header)
|
125
|
+
content = header.at("./following-sibling::p"\
|
126
|
+
"[@class = 'variant-title-toc']") || header
|
125
127
|
%(<li class="#{level}"><a href="##{header['id']}">\
|
126
|
-
#{header_strip(
|
128
|
+
#{header_strip(content)}</a></li>)
|
127
129
|
end
|
128
130
|
|
129
131
|
def toclevel_classes
|
@@ -144,7 +146,7 @@ module IsoDoc
|
|
144
146
|
idx = docxml.at("//div[@id = 'toc']") or return docxml
|
145
147
|
toc = "<ul>"
|
146
148
|
path = toclevel_classes.map do |l|
|
147
|
-
"//main//#{l}
|
149
|
+
"//main//#{l}#{toc_exclude_class}"
|
148
150
|
end
|
149
151
|
docxml.xpath(path.join(" | ")).each_with_index do |h, tocidx|
|
150
152
|
h["id"] ||= "toc#{tocidx}"
|
@@ -154,6 +156,11 @@ module IsoDoc
|
|
154
156
|
docxml
|
155
157
|
end
|
156
158
|
|
159
|
+
def toc_exclude_class
|
160
|
+
"[not(@class = 'TermNum')][not(@class = 'noTOC')]"\
|
161
|
+
"[string-length(normalize-space(.))>0]"
|
162
|
+
end
|
163
|
+
|
157
164
|
# presupposes that the image source is local
|
158
165
|
def move_images(docxml)
|
159
166
|
FileUtils.rm_rf tmpimagedir
|
data/lib/isodoc/i18n.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "yaml"
|
2
|
+
require_relative "function/utils"
|
2
3
|
|
3
4
|
module IsoDoc
|
4
5
|
class I18n
|
@@ -17,7 +18,7 @@ module IsoDoc
|
|
17
18
|
end
|
18
19
|
ret
|
19
20
|
when Array then ret.map { |n| normalise_hash(n) }
|
20
|
-
when String then ret.unicode_normalize(:nfc)
|
21
|
+
when String then cleanup_entities(ret.unicode_normalize(:nfc))
|
21
22
|
else ret
|
22
23
|
end
|
23
24
|
end
|
@@ -96,8 +97,9 @@ module IsoDoc
|
|
96
97
|
xml.traverse do |n|
|
97
98
|
next unless n.text?
|
98
99
|
|
99
|
-
n.replace(n.text.gsub(/ /, "").gsub(/:/, ":")
|
100
|
-
.gsub(
|
100
|
+
n.replace(cleanup_entities(n.text.gsub(/ /, "").gsub(/:/, ":")
|
101
|
+
.gsub(/,/, "、").gsub(/\(/, "(").gsub(/\)/, ")")
|
102
|
+
.gsub(/\[/, "【").gsub(/\]/, "】"), is_xml: false))
|
101
103
|
end
|
102
104
|
xml.to_xml.gsub(/<b>/, "").gsub("</b>", "").gsub(/<\?[^>]+>/, "")
|
103
105
|
end
|
@@ -111,6 +113,7 @@ module IsoDoc
|
|
111
113
|
l10n(names[0..-2].join(", ") + " #{andword} #{names[-1]}", @lang, @script)
|
112
114
|
end
|
113
115
|
|
116
|
+
include Function::Utils
|
114
117
|
# module_function :l10n
|
115
118
|
end
|
116
119
|
end
|
data/lib/isodoc/pdf_convert.rb
CHANGED
@@ -10,12 +10,6 @@ module IsoDoc
|
|
10
10
|
"</localized-strings>"
|
11
11
|
end
|
12
12
|
|
13
|
-
def docid_prefixes(docxml)
|
14
|
-
docxml.xpath(ns("//references/bibitem/docidentifier")).each do |i|
|
15
|
-
i.children = @xrefs.klass.docid_prefix(i["type"], i.text)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
13
|
def address_precompose(bib)
|
20
14
|
bib.xpath(ns("//bibdata//address")).each do |b|
|
21
15
|
next if b.at(ns("./formattedAddress"))
|
@@ -19,6 +19,22 @@ module IsoDoc
|
|
19
19
|
prefix_name(elem, "<tab/>", "#{lbl}#{clausedelim}", "title")
|
20
20
|
end
|
21
21
|
|
22
|
+
def floattitle(docxml)
|
23
|
+
docxml.xpath(ns("//clause | //annex | //appendix | //introduction | "\
|
24
|
+
"//foreword | //preface/abstract | //acknowledgements | "\
|
25
|
+
"//terms | //definitions | //references"))
|
26
|
+
.each do |f|
|
27
|
+
floattitle1(f)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def floattitle1(elem)
|
32
|
+
elem.xpath(ns(".//floating-title")).each do |p|
|
33
|
+
p.name = "p"
|
34
|
+
p["type"] = "floating-title"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
22
38
|
def annex(docxml)
|
23
39
|
docxml.xpath(ns("//annex")).each do |f|
|
24
40
|
annex1(f)
|
@@ -44,7 +60,29 @@ module IsoDoc
|
|
44
60
|
prefix_name(elem, "", "#{lbl}#{clausedelim}", "name")
|
45
61
|
end
|
46
62
|
|
47
|
-
def references(docxml)
|
63
|
+
def references(docxml)
|
64
|
+
bibliography_bibitem_number(docxml)
|
65
|
+
end
|
66
|
+
|
67
|
+
def bibliography_bibitem_number_skip(bibitem)
|
68
|
+
@xrefs.klass.implicit_reference(bibitem) ||
|
69
|
+
bibitem.at(ns(".//docidentifier[@type = 'metanorma']")) ||
|
70
|
+
bibitem.at(ns(".//docidentifier[@type = 'metanorma-ordinal']"))
|
71
|
+
# || @xrefs.klass.standard?(bibitem)
|
72
|
+
end
|
73
|
+
|
74
|
+
def bibliography_bibitem_number(docxml)
|
75
|
+
i = 0
|
76
|
+
docxml.xpath(ns("//references[@normative = 'false']/bibitem")).each do |b|
|
77
|
+
next if bibliography_bibitem_number_skip(b)
|
78
|
+
|
79
|
+
i += 1
|
80
|
+
id = b.at(ns(".//docidentifier"))
|
81
|
+
id.previous =
|
82
|
+
"<docidentifier type='metanorma-ordinal'>[#{i}]</docidentifier>"
|
83
|
+
end
|
84
|
+
@xrefs.references docxml
|
85
|
+
end
|
48
86
|
|
49
87
|
def docid_prefixes(docxml)
|
50
88
|
docxml.xpath(ns("//references/bibitem/docidentifier")).each do |i|
|
@@ -86,9 +124,7 @@ module IsoDoc
|
|
86
124
|
display_order_xpath(docxml, "//indexsect", i)
|
87
125
|
end
|
88
126
|
|
89
|
-
def clausetitle(docxml)
|
90
|
-
docxml.xpath(ns("//variant-title[@type = 'toc']")).each(&:remove)
|
91
|
-
end
|
127
|
+
def clausetitle(docxml); end
|
92
128
|
|
93
129
|
def toc(docxml)
|
94
130
|
docxml.xpath(ns("//toc//xref[text()]")).each do |x|
|