isodoc 1.6.0 → 1.6.5
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 +2 -12
- data/.hound.yml +3 -1
- data/.rubocop.yml +4 -8
- data/Rakefile +2 -2
- data/bin/rspec +1 -2
- data/isodoc.gemspec +4 -3
- data/lib/isodoc-yaml/i18n-ar.yaml +152 -0
- data/lib/isodoc-yaml/i18n-de.yaml +149 -0
- data/lib/isodoc-yaml/i18n-en.yaml +1 -0
- data/lib/isodoc-yaml/i18n-es.yaml +151 -0
- data/lib/isodoc-yaml/i18n-fr.yaml +1 -0
- data/lib/isodoc-yaml/i18n-ru.yaml +154 -0
- data/lib/isodoc-yaml/i18n-zh-Hans.yaml +1 -0
- data/lib/isodoc.rb +0 -2
- data/lib/isodoc/common.rb +2 -0
- data/lib/isodoc/convert.rb +10 -4
- data/lib/isodoc/css.rb +30 -26
- data/lib/isodoc/function/blocks.rb +26 -8
- data/lib/isodoc/function/blocks_example_note.rb +2 -2
- data/lib/isodoc/function/cleanup.rb +53 -45
- data/lib/isodoc/function/form.rb +51 -0
- data/lib/isodoc/function/inline.rb +8 -7
- data/lib/isodoc/function/references.rb +71 -77
- data/lib/isodoc/function/section.rb +28 -16
- data/lib/isodoc/function/table.rb +22 -22
- data/lib/isodoc/function/terms.rb +6 -7
- data/lib/isodoc/function/to_word_html.rb +19 -25
- data/lib/isodoc/function/utils.rb +180 -160
- data/lib/isodoc/gem_tasks.rb +36 -38
- data/lib/isodoc/headlesshtml_convert.rb +8 -7
- data/lib/isodoc/html_convert.rb +10 -4
- data/lib/isodoc/html_function/comments.rb +14 -12
- data/lib/isodoc/html_function/footnotes.rb +14 -7
- data/lib/isodoc/html_function/form.rb +62 -0
- data/lib/isodoc/html_function/html.rb +30 -26
- data/lib/isodoc/html_function/postprocess.rb +191 -226
- data/lib/isodoc/html_function/postprocess_footnotes.rb +59 -0
- data/lib/isodoc/html_function/sectionsplit.rb +230 -0
- data/lib/isodoc/i18n.rb +33 -31
- data/lib/isodoc/metadata.rb +22 -20
- data/lib/isodoc/metadata_contributor.rb +31 -28
- data/lib/isodoc/pdf_convert.rb +11 -13
- data/lib/isodoc/presentation_function/bibdata.rb +54 -30
- data/lib/isodoc/presentation_function/block.rb +17 -8
- data/lib/isodoc/presentation_function/inline.rb +72 -120
- data/lib/isodoc/presentation_function/math.rb +84 -0
- data/lib/isodoc/presentation_function/section.rb +55 -19
- data/lib/isodoc/presentation_xml_convert.rb +2 -0
- data/lib/isodoc/sassc_importer.rb +1 -1
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_function/body.rb +28 -24
- data/lib/isodoc/word_function/footnotes.rb +22 -15
- data/lib/isodoc/word_function/postprocess.rb +50 -36
- data/lib/isodoc/xref.rb +11 -10
- data/lib/isodoc/xref/xref_counter.rb +32 -17
- data/lib/isodoc/xref/xref_gen.rb +33 -21
- data/lib/isodoc/xref/xref_gen_seq.rb +60 -35
- data/lib/isodoc/xref/xref_sect_gen.rb +37 -35
- data/spec/assets/scripts_override.html +3 -0
- data/spec/isodoc/blocks_spec.rb +2258 -2622
- data/spec/isodoc/cleanup_spec.rb +1103 -1107
- data/spec/isodoc/form_spec.rb +156 -0
- data/spec/isodoc/i18n_spec.rb +802 -917
- data/spec/isodoc/inline_spec.rb +1105 -921
- data/spec/isodoc/lists_spec.rb +316 -315
- data/spec/isodoc/metadata_spec.rb +384 -379
- data/spec/isodoc/postproc_spec.rb +1783 -1549
- data/spec/isodoc/presentation_xml_spec.rb +355 -278
- data/spec/isodoc/ref_spec.rb +718 -723
- data/spec/isodoc/section_spec.rb +216 -199
- data/spec/isodoc/sectionsplit_spec.rb +190 -0
- data/spec/isodoc/table_spec.rb +41 -42
- data/spec/isodoc/terms_spec.rb +84 -84
- data/spec/isodoc/xref_spec.rb +1024 -930
- metadata +33 -7
@@ -0,0 +1,59 @@
|
|
1
|
+
module IsoDoc::HtmlFunction
|
2
|
+
module Html
|
3
|
+
def update_footnote_filter(fn, x, i, seen)
|
4
|
+
if seen[fn.text]
|
5
|
+
x.at("./sup").content = seen[fn.text][:num].to_s
|
6
|
+
fn.remove unless x["href"] == seen[fn.text][:href]
|
7
|
+
x["href"] = seen[fn.text][:href]
|
8
|
+
else
|
9
|
+
seen[fn.text] = { num: i, href: x["href"] }
|
10
|
+
x.at("./sup").content = i.to_s
|
11
|
+
i += 1
|
12
|
+
end
|
13
|
+
[i, seen]
|
14
|
+
end
|
15
|
+
|
16
|
+
def html_footnote_filter(docxml)
|
17
|
+
seen = {}
|
18
|
+
i = 1
|
19
|
+
docxml.xpath('//a[@class = "FootnoteRef"]').each do |x|
|
20
|
+
fn = docxml.at(%<//*[@id = '#{x['href'].sub(/^#/, '')}']>) || next
|
21
|
+
i, seen = update_footnote_filter(fn, x, i, seen)
|
22
|
+
end
|
23
|
+
docxml
|
24
|
+
end
|
25
|
+
|
26
|
+
def footnote_backlinks1(x, fn)
|
27
|
+
xdup = x.dup
|
28
|
+
xdup.remove["id"]
|
29
|
+
if fn.elements.empty?
|
30
|
+
fn.children.first.previous = xdup
|
31
|
+
else
|
32
|
+
fn.elements.first.children.first.previous = xdup
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def footnote_backlinks(docxml)
|
37
|
+
seen = {}
|
38
|
+
docxml.xpath('//a[@class = "FootnoteRef"]').each_with_index do |x, i|
|
39
|
+
seen[x["href"]] and next or seen[x["href"]] = true
|
40
|
+
fn = docxml.at(%<//*[@id = '#{x['href'].sub(/^#/, '')}']>) || next
|
41
|
+
footnote_backlinks1(x, fn)
|
42
|
+
x["id"] ||= "fnref:#{i + 1}"
|
43
|
+
fn.add_child "<a href='##{x['id']}'>↩</a>"
|
44
|
+
end
|
45
|
+
docxml
|
46
|
+
end
|
47
|
+
|
48
|
+
def footnote_format(docxml)
|
49
|
+
docxml.xpath("//a[@class = 'FootnoteRef']/sup").each do |x|
|
50
|
+
footnote_reference_format(x)
|
51
|
+
end
|
52
|
+
docxml.xpath("//a[@class = 'TableFootnoteRef'] | "\
|
53
|
+
"//span[@class = 'TableFootnoteRef']").each do |x|
|
54
|
+
table_footnote_reference_format(x)
|
55
|
+
end
|
56
|
+
docxml
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,230 @@
|
|
1
|
+
require "metanorma"
|
2
|
+
require "yaml"
|
3
|
+
|
4
|
+
module IsoDoc::HtmlFunction
|
5
|
+
module Html
|
6
|
+
# assume we pass in Presentation XML, but we want to recover Semantic XML
|
7
|
+
def sectionsplit_convert(input_filename, file, debug, output_filename = nil)
|
8
|
+
input_filename += ".xml" unless input_filename.match?(/\.xml$/)
|
9
|
+
File.exist?(input_filename) or
|
10
|
+
File.open(input_filename, "w:UTF-8") { |f| f.write(file) }
|
11
|
+
presxml = File.read(input_filename, encoding: "utf-8")
|
12
|
+
@openmathdelim, @closemathdelim = extract_delims(presxml)
|
13
|
+
xml, filename, dir = convert_init(presxml, input_filename, debug)
|
14
|
+
build_collection(xml, presxml, output_filename || filename, dir)
|
15
|
+
end
|
16
|
+
|
17
|
+
def build_collection(xml, presxml, filename, dir)
|
18
|
+
base = File.basename(filename)
|
19
|
+
collection_setup(base, dir)
|
20
|
+
files = sectionsplit(xml, base, dir)
|
21
|
+
collection_manifest(base, files, xml, presxml, dir).render(
|
22
|
+
format: %i(html), output_folder: "#{filename}_collection",
|
23
|
+
coverpage: File.join(dir, "cover.html")
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
def collection_manifest(filename, files, origxml, _presxml, dir)
|
28
|
+
File.open(File.join(dir, "#{filename}.html.yaml"), "w:UTF-8") do |f|
|
29
|
+
f.write(collectionyaml(files, origxml))
|
30
|
+
end
|
31
|
+
Metanorma::Collection.parse File.join(dir, "#{filename}.html.yaml")
|
32
|
+
end
|
33
|
+
|
34
|
+
def collection_setup(filename, dir)
|
35
|
+
FileUtils.mkdir_p "#{filename}_collection"
|
36
|
+
FileUtils.mkdir_p dir
|
37
|
+
File.open(File.join(dir, "cover.html"), "w:UTF-8") do |f|
|
38
|
+
f.write(coll_cover)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def coll_cover
|
43
|
+
<<~COVER
|
44
|
+
<html>
|
45
|
+
<head/>
|
46
|
+
<body>
|
47
|
+
<h1>{{ doctitle }}</h1>
|
48
|
+
<h2>{{ docnumber }}</h2>
|
49
|
+
<nav>{{ labels["navigation"] }}</nav>
|
50
|
+
</body>
|
51
|
+
</html>
|
52
|
+
COVER
|
53
|
+
end
|
54
|
+
|
55
|
+
def sectionsplit(xml, filename, dir)
|
56
|
+
xref_preprocess(xml)
|
57
|
+
out = emptydoc(xml)
|
58
|
+
[["//preface/*", "preface"], ["//sections/*", "sections"],
|
59
|
+
["//annex", nil],
|
60
|
+
["//bibliography/*[not(@hidden = 'true')]", "bibliography"],
|
61
|
+
["//indexsect", nil]].each_with_object([]) do |n, ret|
|
62
|
+
xml.xpath(ns(n[0])).each do |s|
|
63
|
+
ret << sectionfile(out, dir, "#{filename}.#{ret.size}", s, n[1])
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def emptydoc(xml)
|
69
|
+
out = xml.dup
|
70
|
+
out.xpath(
|
71
|
+
ns("//preface | //sections | //annex | //bibliography/clause | "\
|
72
|
+
"//bibliography/references[not(@hidden = 'true')] | //indexsect"),
|
73
|
+
).each(&:remove)
|
74
|
+
out
|
75
|
+
end
|
76
|
+
|
77
|
+
def sectionfile(xml, dir, file, chunk, parentnode)
|
78
|
+
fname = create_sectionfile(xml.dup, dir, file, chunk, parentnode)
|
79
|
+
{ order: chunk["displayorder"].to_i, url: fname,
|
80
|
+
title: titlerender(chunk) }
|
81
|
+
end
|
82
|
+
|
83
|
+
def create_sectionfile(out, dir, file, chunk, parentnode)
|
84
|
+
ins = out.at(ns("//misccontainer")) || out.at(ns("//bibdata"))
|
85
|
+
if parentnode
|
86
|
+
ins.next = "<#{parentnode}/>"
|
87
|
+
ins.next.add_child(chunk.dup)
|
88
|
+
else
|
89
|
+
ins.next = chunk.dup
|
90
|
+
end
|
91
|
+
outname = "#{file}.xml"
|
92
|
+
File.open(File.join(dir, outname), "w:UTF-8") { |f| f.write(out) }
|
93
|
+
outname
|
94
|
+
end
|
95
|
+
|
96
|
+
def xref_preprocess(xml)
|
97
|
+
svg_preprocess(xml)
|
98
|
+
key = (0...8).map { rand(65..90).chr }.join # random string
|
99
|
+
refs = eref_to_internal_eref(xml, key)
|
100
|
+
refs += xref_to_internal_eref(xml, key)
|
101
|
+
xml.root["type"] = key # to force recognition of internal refs
|
102
|
+
insert_indirect_biblio(xml, refs, key)
|
103
|
+
end
|
104
|
+
|
105
|
+
def svg_preprocess(xml)
|
106
|
+
xml.xpath("//m:svg", "m" => "http://www.w3.org/2000/svg").each do |s|
|
107
|
+
m = svgmap_wrap(s)
|
108
|
+
s.xpath(".//m:a", "m" => "http://www.w3.org/2000/svg").each do |a|
|
109
|
+
next unless /^#/.match? a["href"]
|
110
|
+
|
111
|
+
a["href"] = a["href"].sub(/^#/, "")
|
112
|
+
m << "<target href='#{a['href']}'>"\
|
113
|
+
"<xref target='#{a['href']}'/></target>"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def svgmap_wrap(svg)
|
119
|
+
ret = svg.at("./ancestor::xmlns:svgmap") and return ret
|
120
|
+
ret = svg.at("./ancestor::xmlns:figure")
|
121
|
+
ret.wrap("<svgmap/>")
|
122
|
+
svg.at("./ancestor::xmlns:svgmap")
|
123
|
+
end
|
124
|
+
|
125
|
+
def make_anchor(anchor)
|
126
|
+
"<localityStack><locality type='anchor'><referenceFrom>"\
|
127
|
+
"#{anchor}</referenceFrom></locality></localityStack>"
|
128
|
+
end
|
129
|
+
|
130
|
+
def xref_to_internal_eref(xml, key)
|
131
|
+
xml.xpath(ns("//xref")).each_with_object({}) do |x, m|
|
132
|
+
x["bibitemid"] = "#{key}_#{x['target']}"
|
133
|
+
x << make_anchor(x["target"])
|
134
|
+
m[x["bibitemid"]] = true
|
135
|
+
x.delete("target")
|
136
|
+
x["type"] = key
|
137
|
+
x.name = "eref"
|
138
|
+
end.keys
|
139
|
+
end
|
140
|
+
|
141
|
+
def eref_to_internal_eref(xml, key)
|
142
|
+
eref_to_internal_eref_select(xml).each_with_object([]) do |x, m|
|
143
|
+
url = xml.at(ns("//bibitem[@id = '#{x}']/url[@type = 'citation']"))
|
144
|
+
xml.xpath(("//*[@bibitemid = '#{x}']")).each do |e|
|
145
|
+
id = eref_to_internal_eref1(e, key, url)
|
146
|
+
id and m << id
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def eref_to_internal_eref1(elem, key, url)
|
152
|
+
if url
|
153
|
+
elem.name = "link"
|
154
|
+
elem["target"] = url
|
155
|
+
nil
|
156
|
+
else
|
157
|
+
elem["bibitemid"] = "#{key}_#{elem['bibitemid']}"
|
158
|
+
elem << make_anchor(elem["bibitemid"])
|
159
|
+
elem["type"] = key
|
160
|
+
elem["bibitemid"]
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def eref_to_internal_eref_select(xml)
|
165
|
+
refs = xml.xpath(("//*/@bibitemid")).map { |x| x.text } # rubocop:disable Style/SymbolProc
|
166
|
+
refs.uniq.reject do |x|
|
167
|
+
xml.at(ns("//bibitem[@id = '#{x}'][@type = 'internal']"))
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
# from standoc
|
172
|
+
def insert_indirect_biblio(xmldoc, refs, prefix)
|
173
|
+
ins = xmldoc.at("bibliography") or
|
174
|
+
xmldoc.root << "<bibliography/>" and ins = xmldoc.at("bibliography")
|
175
|
+
ins = ins.add_child("<references hidden='true' normative='false'/>").first
|
176
|
+
refs.each do |x|
|
177
|
+
ins << <<~BIBENTRY
|
178
|
+
<bibitem id="#{x}" type="internal">
|
179
|
+
<docidentifier type="repository">#{x.sub(/^#{prefix}_/, "#{prefix}/")}</docidentifier>
|
180
|
+
</bibitem>
|
181
|
+
BIBENTRY
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def recursive_string_keys(hash)
|
186
|
+
case hash
|
187
|
+
when Hash then Hash[
|
188
|
+
hash.map { |k, v| [k.to_s, recursive_string_keys(v)] }
|
189
|
+
]
|
190
|
+
when Enumerable then hash.map { |v| recursive_string_keys(v) }
|
191
|
+
else
|
192
|
+
hash
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
def titlerender(section)
|
197
|
+
title = section.at(ns("./title")) or return "[Untitled]"
|
198
|
+
t = title.dup
|
199
|
+
t.xpath(ns(".//tab | .//br")).each { |x| x.replace(" ") }
|
200
|
+
t.xpath(ns(".//strong")).each { |x| x.replace(x.children) }
|
201
|
+
t.children.to_xml
|
202
|
+
end
|
203
|
+
|
204
|
+
def collectionyaml(files, xml)
|
205
|
+
ret = {
|
206
|
+
directives: ["presentation-xml", "bare-after-first"],
|
207
|
+
bibdata: {
|
208
|
+
title: {
|
209
|
+
type: "title-main",
|
210
|
+
language: @lang,
|
211
|
+
content: xml.at(ns("//bibdata/title")).text,
|
212
|
+
},
|
213
|
+
type: "collection",
|
214
|
+
docid: {
|
215
|
+
type: xml.at(ns("//bibdata/docidentifier/@type")).text,
|
216
|
+
id: xml.at(ns("//bibdata/docidentifier")).text,
|
217
|
+
},
|
218
|
+
},
|
219
|
+
manifest: {
|
220
|
+
level: "collection",
|
221
|
+
title: "Collection",
|
222
|
+
docref: files.sort_by { |f| f[:order] }.each.map do |f|
|
223
|
+
{ fileref: f[:url], identifier: f[:title] }
|
224
|
+
end,
|
225
|
+
},
|
226
|
+
}
|
227
|
+
recursive_string_keys(ret).to_yaml
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
data/lib/isodoc/i18n.rb
CHANGED
@@ -5,44 +5,47 @@ module IsoDoc
|
|
5
5
|
def load_yaml(lang, script, i18nyaml = nil)
|
6
6
|
ret = load_yaml1(lang, script)
|
7
7
|
return normalise_hash(ret.merge(YAML.load_file(i18nyaml))) if i18nyaml
|
8
|
+
|
8
9
|
normalise_hash(ret)
|
9
10
|
end
|
10
11
|
|
11
12
|
def normalise_hash(ret)
|
12
|
-
|
13
|
+
case ret
|
14
|
+
when Hash
|
13
15
|
ret.each do |k, v|
|
14
16
|
ret[k] = normalise_hash(v)
|
15
17
|
end
|
16
18
|
ret
|
17
|
-
|
18
|
-
|
19
|
-
else
|
20
|
-
ret
|
19
|
+
when Array then ret.map { |n| normalise_hash(n) }
|
20
|
+
when String then ret.unicode_normalize(:nfc)
|
21
|
+
else ret
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
24
25
|
def load_yaml1(lang, script)
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
YAML.load_file(File.join(File.dirname(__FILE__),
|
33
|
-
"../isodoc-yaml/i18n-zh-Hans.yaml"))
|
26
|
+
case lang
|
27
|
+
when "en", "fr", "ru", "de", "es", "ar"
|
28
|
+
load_yaml2(lang)
|
29
|
+
when "zh"
|
30
|
+
if script == "Hans" then load_yaml2("zh-Hans")
|
31
|
+
else load_yaml2("en")
|
32
|
+
end
|
34
33
|
else
|
35
|
-
|
36
|
-
"../isodoc-yaml/i18n-en.yaml"))
|
34
|
+
load_yaml2("en")
|
37
35
|
end
|
38
36
|
end
|
39
37
|
|
38
|
+
def load_yaml2(str)
|
39
|
+
YAML.load_file(File.join(File.dirname(__FILE__),
|
40
|
+
"../isodoc-yaml/i18n-#{str}.yaml"))
|
41
|
+
end
|
42
|
+
|
40
43
|
def get
|
41
44
|
@labels
|
42
45
|
end
|
43
46
|
|
44
|
-
def set(
|
45
|
-
@labels[
|
47
|
+
def set(key, val)
|
48
|
+
@labels[key] = val
|
46
49
|
end
|
47
50
|
|
48
51
|
def initialize(lang, script, i18nyaml = nil)
|
@@ -57,37 +60,36 @@ module IsoDoc
|
|
57
60
|
end
|
58
61
|
end
|
59
62
|
|
60
|
-
def self.l10n(
|
61
|
-
l10n(
|
63
|
+
def self.l10n(text, lang = @lang, script = @script)
|
64
|
+
l10n(text, lang, script)
|
62
65
|
end
|
63
66
|
|
64
67
|
# TODO: move to localization file
|
65
68
|
# function localising spaces and punctuation.
|
66
69
|
# Not clear if period needs to be localised for zh
|
67
|
-
def l10n(
|
70
|
+
def l10n(text, lang = @lang, script = @script)
|
68
71
|
if lang == "zh" && script == "Hans"
|
69
|
-
xml = Nokogiri::HTML::DocumentFragment.parse(
|
72
|
+
xml = Nokogiri::HTML::DocumentFragment.parse(text)
|
70
73
|
xml.traverse do |n|
|
71
74
|
next unless n.text?
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
+
|
76
|
+
n.replace(n.text.gsub(/ /, "").gsub(/:/, ":").gsub(/,/, "、")
|
77
|
+
.gsub(/\(/, "(").gsub(/\)/, ")").gsub(/\[/, "【").gsub(/\]/, "】"))
|
75
78
|
end
|
76
79
|
xml.to_xml.gsub(/<b>/, "").gsub("</b>", "").gsub(/<\?[^>]+>/, "")
|
77
|
-
else
|
78
|
-
x
|
80
|
+
else text
|
79
81
|
end
|
80
82
|
end
|
81
83
|
|
82
84
|
def multiple_and(names, andword)
|
83
|
-
return
|
85
|
+
return "" if names.empty?
|
84
86
|
return names[0] if names.length == 1
|
87
|
+
|
85
88
|
(names.length == 2) &&
|
86
89
|
(return l10n("#{names[0]} #{andword} #{names[1]}", @lang, @script))
|
87
|
-
l10n(names[0..-2].join(
|
90
|
+
l10n(names[0..-2].join(", ") + " #{andword} #{names[-1]}", @lang, @script)
|
88
91
|
end
|
89
92
|
|
90
|
-
#module_function :l10n
|
91
|
-
|
93
|
+
# module_function :l10n
|
92
94
|
end
|
93
95
|
end
|
data/lib/isodoc/metadata.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
4
|
-
require_relative
|
3
|
+
require_relative "./metadata_date"
|
4
|
+
require_relative "./metadata_contributor"
|
5
5
|
|
6
6
|
module IsoDoc
|
7
7
|
class Metadata
|
@@ -17,7 +17,7 @@ module IsoDoc
|
|
17
17
|
|
18
18
|
def initialize(lang, script, i18n, fonts_options = {})
|
19
19
|
@metadata = { lang: lang, script: script }
|
20
|
-
DATETYPES.each { |w| @metadata["#{w.gsub(/-/, '_')}date".to_sym] =
|
20
|
+
DATETYPES.each { |w| @metadata["#{w.gsub(/-/, '_')}date".to_sym] = "XXX" }
|
21
21
|
@lang = lang
|
22
22
|
@script = script
|
23
23
|
@c = HTMLEntities.new
|
@@ -38,7 +38,7 @@ module IsoDoc
|
|
38
38
|
@metadata[key] = value
|
39
39
|
end
|
40
40
|
|
41
|
-
NOLANG = "[not(@language) or @language = '']"
|
41
|
+
NOLANG = "[not(@language) or @language = '']"
|
42
42
|
|
43
43
|
def currlang
|
44
44
|
"[@language = '#{@lang}']"
|
@@ -54,6 +54,7 @@ module IsoDoc
|
|
54
54
|
def docstatus(xml, _out)
|
55
55
|
set(:unpublished, true)
|
56
56
|
return unless s = xml.at(ns("//bibdata/status/stage#{NOLANG}"))
|
57
|
+
|
57
58
|
s1 = xml.at(ns("//bibdata/status/stage#{currlang}")) || s
|
58
59
|
set(:stage, status_print(s.text))
|
59
60
|
s1 and set(:stage_display, status_print(s1.text))
|
@@ -61,26 +62,26 @@ module IsoDoc
|
|
61
62
|
set(:substage, i)
|
62
63
|
(i1 = xml&.at(ns("//bibdata/status/substage#{currlang}"))&.text || i) and
|
63
64
|
set(:substage_display, i1)
|
64
|
-
(i2 = xml&.at(ns(
|
65
|
+
(i2 = xml&.at(ns("//bibdata/status/iteration"))&.text) and
|
65
66
|
set(:iteration, i2)
|
66
67
|
set(:unpublished, unpublished(s.text))
|
67
68
|
unpublished(s.text) && set(:stageabbr, stage_abbr(s.text))
|
68
69
|
end
|
69
70
|
|
70
71
|
def stage_abbr(docstatus)
|
71
|
-
status_print(docstatus).split(/ /).map { |s| s[0].upcase }.join(
|
72
|
+
status_print(docstatus).split(/ /).map { |s| s[0].upcase }.join("")
|
72
73
|
end
|
73
74
|
|
74
75
|
def unpublished(status)
|
75
|
-
!status.casecmp(
|
76
|
+
!status.casecmp("published").zero?
|
76
77
|
end
|
77
78
|
|
78
79
|
def status_print(status)
|
79
|
-
status.split(/[- ]/).map(&:capitalize).join(
|
80
|
+
status.split(/[- ]/).map(&:capitalize).join(" ")
|
80
81
|
end
|
81
82
|
|
82
83
|
def docid(isoxml, _out)
|
83
|
-
dn = isoxml.at(ns(
|
84
|
+
dn = isoxml.at(ns("//bibdata/docidentifier"))
|
84
85
|
set(:docnumber, dn&.text)
|
85
86
|
end
|
86
87
|
|
@@ -92,23 +93,24 @@ module IsoDoc
|
|
92
93
|
end
|
93
94
|
|
94
95
|
def docnumeric(isoxml, _out)
|
95
|
-
dn = isoxml.at(ns(
|
96
|
+
dn = isoxml.at(ns("//bibdata/docnumber"))
|
96
97
|
set(:docnumeric, dn&.text)
|
97
98
|
end
|
98
99
|
|
99
100
|
def draftinfo(draft, revdate)
|
100
101
|
return "" unless draft
|
102
|
+
|
101
103
|
draftinfo = " (#{@labels['draft_label']} #{draft}"
|
102
104
|
draftinfo += ", #{revdate}" if revdate
|
103
|
-
draftinfo +=
|
105
|
+
draftinfo += ")"
|
104
106
|
l10n(draftinfo, @lang, @script)
|
105
107
|
end
|
106
108
|
|
107
109
|
def version(isoxml, _out)
|
108
|
-
set(:edition, isoxml&.at(ns(
|
109
|
-
set(:docyear, isoxml&.at(ns(
|
110
|
-
set(:draft, isoxml&.at(ns(
|
111
|
-
revdate = isoxml&.at(ns(
|
110
|
+
set(:edition, isoxml&.at(ns("//bibdata/edition"))&.text)
|
111
|
+
set(:docyear, isoxml&.at(ns("//bibdata/copyright/from"))&.text)
|
112
|
+
set(:draft, isoxml&.at(ns("//bibdata/version/draft"))&.text)
|
113
|
+
revdate = isoxml&.at(ns("//bibdata/version/revision-date"))&.text
|
112
114
|
set(:revdate, revdate)
|
113
115
|
set(:revdate_monthyear, monthyr(revdate))
|
114
116
|
set(:draftinfo,
|
@@ -131,20 +133,20 @@ module IsoDoc
|
|
131
133
|
|
132
134
|
def relations_partof(isoxml)
|
133
135
|
std = isoxml.at(ns("//bibdata/relation[@type = 'partOf']")) || return
|
134
|
-
id = std.at(ns(
|
136
|
+
id = std.at(ns(".//docidentifier"))
|
135
137
|
set(:partof, id.text) if id
|
136
138
|
end
|
137
139
|
|
138
140
|
def relations_obsoletes(isoxml)
|
139
141
|
std = isoxml.at(ns("//bibdata/relation[@type = 'obsoletes']")) || return
|
140
|
-
locality = std.at(ns(
|
141
|
-
id = std.at(ns(
|
142
|
+
locality = std.at(ns(".//locality"))
|
143
|
+
id = std.at(ns(".//docidentifier"))
|
142
144
|
set(:obsoletes, id.text) if id
|
143
145
|
set(:obsoletes_part, locality.text) if locality
|
144
146
|
end
|
145
147
|
|
146
148
|
def url(xml, _out)
|
147
|
-
(a = xml.at(ns(
|
149
|
+
(a = xml.at(ns("//bibdata/uri[not(@type)]"))) && set(:url, a.text)
|
148
150
|
(a = xml.at(ns("//bibdata/uri[@type = 'html']"))) && set(:html, a.text)
|
149
151
|
(a = xml.at(ns("//bibdata/uri[@type = 'xml']"))) && set(:xml, a.text)
|
150
152
|
(a = xml.at(ns("//bibdata/uri[@type = 'pdf']"))) && set(:pdf, a.text)
|
@@ -153,7 +155,7 @@ module IsoDoc
|
|
153
155
|
|
154
156
|
def keywords(isoxml, _out)
|
155
157
|
ret = []
|
156
|
-
isoxml.xpath(ns(
|
158
|
+
isoxml.xpath(ns("//bibdata/keyword")).each { |kw| ret << kw.text }
|
157
159
|
set(:keywords, ret)
|
158
160
|
end
|
159
161
|
|