isodoc 1.2.5 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/rake.yml +69 -0
- data/README.adoc +1 -3
- data/isodoc.gemspec +3 -1
- data/lib/isodoc-yaml/i18n-en.yaml +1 -0
- data/lib/isodoc-yaml/i18n-fr.yaml +8 -7
- data/lib/isodoc-yaml/i18n-zh-Hans.yaml +1 -0
- data/lib/isodoc/base_style/all.css +5 -1
- data/lib/isodoc/base_style/blocks.scss +2 -2
- data/lib/isodoc/base_style/reset.css +5 -1
- data/lib/isodoc/base_style/reset.scss +6 -1
- data/lib/isodoc/base_style/typography.scss +1 -1
- data/lib/isodoc/convert.rb +12 -97
- data/lib/isodoc/css.rb +95 -0
- data/lib/isodoc/function/inline.rb +0 -33
- data/lib/isodoc/function/inline_simple.rb +4 -1
- data/lib/isodoc/function/lists.rb +2 -1
- data/lib/isodoc/function/references.rb +8 -13
- data/lib/isodoc/function/table.rb +10 -0
- data/lib/isodoc/function/to_word_html.rb +3 -2
- data/lib/isodoc/gem_tasks.rb +4 -0
- data/lib/isodoc/html_function/html.rb +1 -0
- data/lib/isodoc/html_function/postprocess.rb +12 -3
- data/lib/isodoc/i18n.rb +23 -51
- data/lib/isodoc/metadata.rb +42 -115
- data/lib/isodoc/metadata_contributor.rb +90 -0
- data/lib/isodoc/metadata_date.rb +11 -0
- data/lib/isodoc/presentation_function/bibdata.rb +79 -7
- data/lib/isodoc/presentation_function/block.rb +14 -9
- data/lib/isodoc/presentation_function/inline.rb +126 -22
- data/lib/isodoc/presentation_function/section.rb +6 -0
- data/lib/isodoc/presentation_xml_convert.rb +4 -0
- data/lib/isodoc/version.rb +1 -1
- data/lib/isodoc/word_convert.rb +0 -20
- data/lib/isodoc/word_function/body.rb +12 -0
- data/lib/isodoc/word_function/postprocess.rb +38 -80
- data/lib/isodoc/word_function/postprocess_cover.rb +55 -0
- data/lib/isodoc/word_function/table.rb +10 -0
- data/lib/isodoc/xref.rb +1 -0
- data/lib/isodoc/xref/xref_counter.rb +20 -9
- data/lib/isodoc/xref/xref_gen.rb +20 -2
- data/lib/isodoc/xslfo_convert.rb +6 -1
- data/spec/assets/html.scss +14 -0
- data/spec/assets/i18n.yaml +17 -9
- data/spec/isodoc/blocks_spec.rb +88 -240
- data/spec/isodoc/cleanup_spec.rb +0 -1
- data/spec/isodoc/footnotes_spec.rb +4 -5
- data/spec/isodoc/i18n_spec.rb +73 -38
- data/spec/isodoc/inline_spec.rb +177 -199
- data/spec/isodoc/lists_spec.rb +1 -1
- data/spec/isodoc/metadata_spec.rb +68 -20
- data/spec/isodoc/postproc_spec.rb +306 -8
- data/spec/isodoc/presentation_xml_spec.rb +584 -1
- data/spec/isodoc/ref_spec.rb +327 -12
- data/spec/isodoc/table_spec.rb +28 -0
- data/spec/isodoc/xref_spec.rb +162 -17
- data/spec/spec_helper.rb +6 -0
- metadata +35 -7
- data/.github/workflows/macos.yml +0 -42
- data/.github/workflows/ubuntu.yml +0 -62
- data/.github/workflows/windows.yml +0 -44
@@ -67,19 +67,6 @@ module IsoDoc::Function
|
|
67
67
|
out << "Termbase #{node['base']}, term ID #{node['target']}"
|
68
68
|
end
|
69
69
|
|
70
|
-
def concept_parse(node, out)
|
71
|
-
content = node.first_element_child.children.select do |c|
|
72
|
-
!%w{locality localityStack}.include? c.name
|
73
|
-
end.select { |c| !c.text? || /\S/.match(c) }
|
74
|
-
if content.empty?
|
75
|
-
out << "[Term defined in "
|
76
|
-
parse(node.first_element_child, out)
|
77
|
-
out << "]"
|
78
|
-
else
|
79
|
-
content.each { |n| parse(n, out) }
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
70
|
def stem_parse(node, out)
|
84
71
|
ooml = if node["type"] == "AsciiMath"
|
85
72
|
"#{@openmathdelim}#{HTMLEntities.new.encode(node.text)}"\
|
@@ -131,25 +118,5 @@ module IsoDoc::Function
|
|
131
118
|
p.b(**{ role: "strong" }) { |e| e << text }
|
132
119
|
end
|
133
120
|
end
|
134
|
-
|
135
|
-
def variant_parse(node, out)
|
136
|
-
if node["lang"] == @lang && node["script"] == @script
|
137
|
-
node.children.each { |n| parse(n, out) }
|
138
|
-
else
|
139
|
-
return if found_matching_variant_sibling(node)
|
140
|
-
return unless !node.at("./preceding-sibling::xmlns:variant")
|
141
|
-
node.children.each { |n| parse(n, out) }
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
def found_matching_variant_sibling(node)
|
146
|
-
prev = node.xpath("./preceding-sibling::xmlns:variant")
|
147
|
-
foll = node.xpath("./following-sibling::xmlns:variant")
|
148
|
-
found = false
|
149
|
-
(prev + foll).each do |n|
|
150
|
-
found = true if n["lang"] == @lang && n["script"] == @script
|
151
|
-
end
|
152
|
-
found
|
153
|
-
end
|
154
121
|
end
|
155
122
|
end
|
@@ -38,7 +38,8 @@ module IsoDoc::Function
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def ol_attrs(node)
|
41
|
-
{ type:
|
41
|
+
{ type: node["type"] ? ol_style(node["type"].to_sym) : ol_depth(node),
|
42
|
+
id: node["id"], style: keep_style(node) }
|
42
43
|
end
|
43
44
|
|
44
45
|
def ol_parse(node, out)
|
@@ -80,7 +80,8 @@ module IsoDoc::Function
|
|
80
80
|
end
|
81
81
|
|
82
82
|
def docid_prefix(prefix, docid)
|
83
|
-
docid = "#{prefix} #{docid}" if prefix && !omit_docid_prefix(prefix)
|
83
|
+
docid = "#{prefix} #{docid}" if prefix && !omit_docid_prefix(prefix) &&
|
84
|
+
!/^#{prefix}\b/.match(docid)
|
84
85
|
docid_l10n(docid)
|
85
86
|
end
|
86
87
|
|
@@ -90,7 +91,7 @@ module IsoDoc::Function
|
|
90
91
|
end
|
91
92
|
|
92
93
|
def date_note_process(b, ref)
|
93
|
-
date_note = b.at(ns("./note[@type = '
|
94
|
+
date_note = b.at(ns("./note[@type = 'Unpublished-Status']"))
|
94
95
|
return if date_note.nil?
|
95
96
|
date_note.children.first.replace("<p>#{date_note.content}</p>")
|
96
97
|
footnote_parse(date_note, ref)
|
@@ -111,7 +112,7 @@ module IsoDoc::Function
|
|
111
112
|
# reference not to be rendered because it is deemed implicit
|
112
113
|
# in the standards environment
|
113
114
|
def implicit_reference(b)
|
114
|
-
|
115
|
+
b["hidden"] == "true"
|
115
116
|
end
|
116
117
|
|
117
118
|
def prefix_bracketed_ref(ref, text)
|
@@ -160,7 +161,7 @@ module IsoDoc::Function
|
|
160
161
|
end
|
161
162
|
|
162
163
|
def norm_ref(isoxml, out, num)
|
163
|
-
f = isoxml.at(ns(norm_ref_xpath)) or return num
|
164
|
+
f = isoxml.at(ns(norm_ref_xpath)) and f["hidden"] != "true" or return num
|
164
165
|
out.div do |div|
|
165
166
|
num = num + 1
|
166
167
|
clause_name(num, f.at(ns("./title")), div, nil)
|
@@ -180,10 +181,9 @@ module IsoDoc::Function
|
|
180
181
|
end
|
181
182
|
|
182
183
|
def bibliography(isoxml, out)
|
183
|
-
f = isoxml.at(ns(bibliography_xpath))
|
184
|
+
f = isoxml.at(ns(bibliography_xpath)) and f["hidden"] != "true" or return
|
184
185
|
page_break(out)
|
185
186
|
out.div do |div|
|
186
|
-
#div.h1 @bibliography_lbl, **{ class: "Section3" }
|
187
187
|
div.h1 **{class: "Section3"} do |h1|
|
188
188
|
f&.at(ns("./title"))&.children&.each { |c2| parse(c2, h1) }
|
189
189
|
end
|
@@ -192,6 +192,7 @@ module IsoDoc::Function
|
|
192
192
|
end
|
193
193
|
|
194
194
|
def bibliography_parse(node, out)
|
195
|
+
node["hidden"] != true or return
|
195
196
|
title = node&.at(ns("./title"))&.text || ""
|
196
197
|
out.div do |div|
|
197
198
|
clause_parse_title(node, div, node.at(ns("./title")), out,
|
@@ -202,15 +203,9 @@ module IsoDoc::Function
|
|
202
203
|
|
203
204
|
def format_ref(ref, prefix, isopub, date, allparts)
|
204
205
|
ref = docid_prefix(prefix, ref)
|
205
|
-
return "[#{ref}]" if /^\d+$/.match(ref) && !prefix &&
|
206
|
+
return "[#{ref}]" if ref && /^\d+$/.match(ref) && !prefix &&
|
206
207
|
!/^\[.*\]$/.match(ref)
|
207
208
|
ref
|
208
209
|
end
|
209
|
-
|
210
|
-
# def ref_names(ref)
|
211
|
-
# linkend = ref.text
|
212
|
-
# linkend.gsub!(/[\[\]]/, "") unless /^\[\d+\]$/.match linkend
|
213
|
-
# @anchors[ref["id"]] = { xref: linkend }
|
214
|
-
# end
|
215
210
|
end
|
216
211
|
end
|
@@ -58,11 +58,21 @@ module IsoDoc::Function
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
+
def colgroup(node, t)
|
62
|
+
colgroup = node.at(ns("./colgroup")) or return
|
63
|
+
t.colgroup do |cg|
|
64
|
+
colgroup.xpath(ns("./col")).each do |c|
|
65
|
+
cg.col **{ style: "width: #{c['width']};" }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
61
70
|
def table_parse(node, out)
|
62
71
|
@in_table = true
|
63
72
|
table_title_parse(node, out)
|
64
73
|
out.table **table_attrs(node) do |t|
|
65
74
|
tcaption(node, t)
|
75
|
+
colgroup(node, t)
|
66
76
|
thead_parse(node, t)
|
67
77
|
tbody_parse(node, t)
|
68
78
|
tfoot_parse(node, t)
|
@@ -96,6 +96,7 @@ module IsoDoc::Function
|
|
96
96
|
@meta.subtitle isoxml, out
|
97
97
|
@meta.docstatus isoxml, out
|
98
98
|
@meta.docid isoxml, out
|
99
|
+
@meta.otherid isoxml, out
|
99
100
|
@meta.docnumeric isoxml, out
|
100
101
|
@meta.doctype isoxml, out
|
101
102
|
@meta.author isoxml, out
|
@@ -104,6 +105,7 @@ module IsoDoc::Function
|
|
104
105
|
@meta.version isoxml, out
|
105
106
|
@meta.url isoxml, out
|
106
107
|
@meta.keywords isoxml, out
|
108
|
+
@meta.note isoxml, out
|
107
109
|
@meta.get
|
108
110
|
end
|
109
111
|
|
@@ -213,14 +215,13 @@ module IsoDoc::Function
|
|
213
215
|
when "verification" then requirement_component_parse(node, out)
|
214
216
|
when "import" then requirement_component_parse(node, out)
|
215
217
|
when "index" then index_parse(node, out)
|
216
|
-
when "
|
218
|
+
when "index-xref" then index_xref_parse(node, out)
|
217
219
|
when "termref" then termrefelem_parse(node, out)
|
218
220
|
when "copyright-statement" then copyright_parse(node, out)
|
219
221
|
when "license-statement" then license_parse(node, out)
|
220
222
|
when "legal-statement" then legal_parse(node, out)
|
221
223
|
when "feedback-statement" then feedback_parse(node, out)
|
222
224
|
when "passthrough" then passthrough_parse(node, out)
|
223
|
-
when "variant" then variant_parse(node, out)
|
224
225
|
when "amend" then amend_parse(node, out)
|
225
226
|
when "tab" then clausedelimspace(out) # in Presentation XML only
|
226
227
|
else
|
data/lib/isodoc/gem_tasks.rb
CHANGED
@@ -97,6 +97,10 @@ module IsoDoc
|
|
97
97
|
$bodyfont: '{{bodyfont}}';
|
98
98
|
$headerfont: '{{headerfont}}';
|
99
99
|
$monospacefont: '{{monospacefont}}';
|
100
|
+
$normalfontsize: '{{normalfontsize}}';
|
101
|
+
$smallerfontsize: '{{smallerfontsize}}';
|
102
|
+
$footnotefontsize: '{{footnotefontsize}}';
|
103
|
+
$monospacefontsize: '{{monospacefontsize}}';
|
100
104
|
TEXT
|
101
105
|
end
|
102
106
|
|
@@ -60,6 +60,7 @@ module IsoDoc::HtmlFunction
|
|
60
60
|
<script type="text/javascript">#{toclevel}</script>
|
61
61
|
|
62
62
|
<!--Google fonts-->
|
63
|
+
<link rel="preconnect" href="https://fonts.gstatic.com">
|
63
64
|
#{googlefonts}
|
64
65
|
<!--Font awesome import for the link icon-->
|
65
66
|
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.8/css/solid.css" integrity="sha384-v2Tw72dyUXeU3y4aM2Y0tBJQkGfplr39mxZqlTBDUZAb9BGoC40+rdFCG0m10lXk" crossorigin="anonymous">
|
@@ -186,14 +186,22 @@ module IsoDoc::HtmlFunction
|
|
186
186
|
docxml
|
187
187
|
end
|
188
188
|
|
189
|
+
def footnote_backlinks1(x, fn)
|
190
|
+
xdup = x.dup
|
191
|
+
xdup.remove["id"]
|
192
|
+
if fn.elements.empty?
|
193
|
+
fn.children.first.previous = xdup
|
194
|
+
else
|
195
|
+
fn.elements.first.children.first.previous = xdup
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
189
199
|
def footnote_backlinks(docxml)
|
190
200
|
seen = {}
|
191
201
|
docxml.xpath('//a[@class = "FootnoteRef"]').each_with_index do |x, i|
|
192
202
|
seen[x["href"]] and next or seen[x["href"]] = true
|
193
203
|
fn = docxml.at(%<//*[@id = '#{x['href'].sub(/^#/, '')}']>) || next
|
194
|
-
|
195
|
-
xdup.remove["id"]
|
196
|
-
fn.elements.first.children.first.previous = xdup
|
204
|
+
footnote_backlinks1(x, fn)
|
197
205
|
x["id"] ||= "fnref:#{i + 1}"
|
198
206
|
fn.add_child "<a href='##{x['id']}'>↩</a>"
|
199
207
|
end
|
@@ -221,6 +229,7 @@ module IsoDoc::HtmlFunction
|
|
221
229
|
MATHJAX = <<~"MATHJAX".freeze
|
222
230
|
<script type="text/x-mathjax-config">
|
223
231
|
MathJax.Hub.Config({
|
232
|
+
"HTML-CSS": { preferredFont: "STIX" },
|
224
233
|
asciimath2jax: { delimiters: [['OPEN', 'CLOSE']] }
|
225
234
|
});
|
226
235
|
</script>
|
data/lib/isodoc/i18n.rb
CHANGED
@@ -4,8 +4,21 @@ module IsoDoc
|
|
4
4
|
class I18n
|
5
5
|
def load_yaml(lang, script, i18nyaml = nil)
|
6
6
|
ret = load_yaml1(lang, script)
|
7
|
-
return ret.merge(YAML.load_file(i18nyaml)) if i18nyaml
|
8
|
-
ret
|
7
|
+
return normalise_hash(ret.merge(YAML.load_file(i18nyaml))) if i18nyaml
|
8
|
+
normalise_hash(ret)
|
9
|
+
end
|
10
|
+
|
11
|
+
def normalise_hash(ret)
|
12
|
+
if ret.is_a? Hash
|
13
|
+
ret.each do |k, v|
|
14
|
+
ret[k] = normalise_hash(v)
|
15
|
+
end
|
16
|
+
ret
|
17
|
+
elsif ret.is_a? Array then ret.map { |n| normalise_hash(n) }
|
18
|
+
elsif ret.is_a? String then ret.unicode_normalize(:nfc)
|
19
|
+
else
|
20
|
+
ret
|
21
|
+
end
|
9
22
|
end
|
10
23
|
|
11
24
|
def load_yaml1(lang, script)
|
@@ -42,55 +55,6 @@ module IsoDoc
|
|
42
55
|
@labels.each do |k, v|
|
43
56
|
self.class.send(:define_method, k.downcase) { v }
|
44
57
|
end
|
45
|
-
=begin
|
46
|
-
@term_def_boilerplate = y["term_def_boilerplate"]
|
47
|
-
@scope_lbl = y["scope"]
|
48
|
-
@symbols_lbl = y["symbols"]
|
49
|
-
@table_of_contents_lbl = y["table_of_contents"]
|
50
|
-
@introduction_lbl = y["introduction"]
|
51
|
-
@foreword_lbl = y["foreword"]
|
52
|
-
@abstract_lbl = y["abstract"]
|
53
|
-
@termsdef_lbl = y["termsdef"]
|
54
|
-
@termsdefsymbols_lbl = y["termsdefsymbols"]
|
55
|
-
@normref_lbl = y["normref"]
|
56
|
-
@bibliography_lbl = y["bibliography"]
|
57
|
-
@clause_lbl = y["clause"]
|
58
|
-
@annex_lbl = y["annex"]
|
59
|
-
@appendix_lbl = y["appendix"]
|
60
|
-
@no_terms_boilerplate = y["no_terms_boilerplate"]
|
61
|
-
@internal_terms_boilerplate = y["internal_terms_boilerplate"]
|
62
|
-
@norm_with_refs_pref = y["norm_with_refs_pref"]
|
63
|
-
@norm_empty_pref = y["norm_empty_pref"]
|
64
|
-
@external_terms_boilerplate = y["external_terms_boilerplate"]
|
65
|
-
@internal_external_terms_boilerplate =
|
66
|
-
y["internal_external_terms_boilerplate"]
|
67
|
-
@note_lbl = y["note"]
|
68
|
-
@note_xref_lbl = y["note_xref"]
|
69
|
-
@termnote_lbl = y["termnote"]
|
70
|
-
@figure_lbl = y["figure"]
|
71
|
-
@list_lbl = y["list"]
|
72
|
-
@formula_lbl = y["formula"]
|
73
|
-
@inequality_lbl = y["inequality"]
|
74
|
-
@table_lbl = y["table"]
|
75
|
-
@key_lbl = y["key"]
|
76
|
-
@example_lbl = y["example"]
|
77
|
-
@example_xref_lbl = y["example_xref"]
|
78
|
-
@where_lbl = y["where"]
|
79
|
-
@wholeoftext_lbl = y["wholeoftext"]
|
80
|
-
@draft_lbl = y["draft_label"]
|
81
|
-
@inform_annex_lbl = y["inform_annex"]
|
82
|
-
@norm_annex_lbl = y["norm_annex"]
|
83
|
-
@modified_lbl = y["modified"]
|
84
|
-
@deprecated_lbl = y["deprecated"]
|
85
|
-
@source_lbl = y["source"]
|
86
|
-
@and_lbl = y["and"]
|
87
|
-
@all_parts_lbl = y["all_parts"]
|
88
|
-
@permission_lbl = y["permission"]
|
89
|
-
@recommendation_lbl = y["recommendation"]
|
90
|
-
@requirement_lbl = y["requirement"]
|
91
|
-
@locality = y["locality"]
|
92
|
-
@admonition = y["admonition"]
|
93
|
-
=end
|
94
58
|
end
|
95
59
|
|
96
60
|
def self.l10n(x, lang = @lang, script = @script)
|
@@ -115,6 +79,14 @@ module IsoDoc
|
|
115
79
|
end
|
116
80
|
end
|
117
81
|
|
82
|
+
def multiple_and(names, andword)
|
83
|
+
return '' if names.empty?
|
84
|
+
return names[0] if names.length == 1
|
85
|
+
(names.length == 2) &&
|
86
|
+
(return l10n("#{names[0]} #{andword} #{names[1]}", @lang, @script))
|
87
|
+
l10n(names[0..-2].join(', ') + " #{andword} #{names[-1]}", @lang, @script)
|
88
|
+
end
|
89
|
+
|
118
90
|
#module_function :l10n
|
119
91
|
|
120
92
|
end
|
data/lib/isodoc/metadata.rb
CHANGED
@@ -1,14 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative './metadata_date'
|
4
|
+
require_relative './metadata_contributor'
|
4
5
|
|
5
6
|
module IsoDoc
|
6
7
|
class Metadata
|
7
|
-
DATETYPES = %w{published accessed created implemented obsoleted confirmed
|
8
|
-
updated issued received transmitted copied unchanged
|
9
|
-
circulated vote-started
|
10
|
-
vote-ended}.freeze
|
11
|
-
|
12
8
|
attr_accessor :fonts_options
|
13
9
|
|
14
10
|
def ns(xpath)
|
@@ -20,7 +16,7 @@ module IsoDoc
|
|
20
16
|
end
|
21
17
|
|
22
18
|
def initialize(lang, script, i18n, fonts_options = {})
|
23
|
-
@metadata = {}
|
19
|
+
@metadata = { lang: lang, script: script }
|
24
20
|
DATETYPES.each { |w| @metadata["#{w.gsub(/-/, '_')}date".to_sym] = 'XXX' }
|
25
21
|
@lang = lang
|
26
22
|
@script = script
|
@@ -42,119 +38,37 @@ module IsoDoc
|
|
42
38
|
@metadata[key] = value
|
43
39
|
end
|
44
40
|
|
45
|
-
|
46
|
-
authors.reduce([]) do |ret, a|
|
47
|
-
if a.at(ns('./name/completename'))
|
48
|
-
ret << a.at(ns('./name/completename')).text
|
49
|
-
else
|
50
|
-
fn = []
|
51
|
-
forenames = a.xpath(ns('./name/forename'))
|
52
|
-
forenames.each { |f| fn << f.text }
|
53
|
-
surname = a&.at(ns('./name/surname'))&.text
|
54
|
-
ret << fn.join(' ') + ' ' + surname
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
41
|
+
NOLANG = "[not(@language) or @language = '']".freeze
|
58
42
|
|
59
|
-
def
|
60
|
-
|
61
|
-
name = a&.at(ns('./affiliation/organization/name'))&.text
|
62
|
-
location = a&.at(ns('./affiliation/organization/address/'\
|
63
|
-
'formattedAddress'))&.text
|
64
|
-
m << (!name.nil? && !location.nil? ? "#{name}, #{location}" :
|
65
|
-
(name || location || ''))
|
66
|
-
m
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def extract_person_names_affiliations(authors)
|
71
|
-
names = extract_person_names(authors)
|
72
|
-
affils = extract_person_affiliations(authors)
|
73
|
-
ret = {}
|
74
|
-
affils.each_with_index do |a, i|
|
75
|
-
ret[a] ||= []
|
76
|
-
ret[a] << names[i]
|
77
|
-
end
|
78
|
-
ret
|
79
|
-
end
|
80
|
-
|
81
|
-
def personal_authors(isoxml)
|
82
|
-
authors = isoxml.xpath(ns("//bibdata/contributor[role/@type = 'author' "\
|
83
|
-
"or xmlns:role/@type = 'editor']/person"))
|
84
|
-
set(:authors, extract_person_names(authors))
|
85
|
-
set(:authors_affiliations, extract_person_names_affiliations(authors))
|
86
|
-
end
|
87
|
-
|
88
|
-
def author(xml, _out)
|
89
|
-
personal_authors(xml)
|
90
|
-
agency(xml)
|
91
|
-
end
|
92
|
-
|
93
|
-
def bibdate(isoxml, _out)
|
94
|
-
isoxml.xpath(ns('//bibdata/date')).each do |d|
|
95
|
-
set("#{d['type'].gsub(/-/, '_')}date".to_sym, Common::date_range(d))
|
96
|
-
end
|
43
|
+
def currlang
|
44
|
+
"[@language = '#{@lang}']"
|
97
45
|
end
|
98
46
|
|
99
47
|
def doctype(isoxml, _out)
|
100
|
-
b = isoxml&.at(ns(
|
48
|
+
b = isoxml&.at(ns("//bibdata/ext/doctype#{NOLANG}"))&.text || return
|
101
49
|
set(:doctype, status_print(b))
|
102
|
-
|
103
|
-
set(:doctype_display, status_print(
|
104
|
-
end
|
105
|
-
|
106
|
-
def iso?(org)
|
107
|
-
name = org&.at(ns('./name'))&.text
|
108
|
-
abbrev = org&.at(ns('./abbreviation'))&.text
|
109
|
-
(abbrev == 'ISO' ||
|
110
|
-
name == 'International Organization for Standardization')
|
111
|
-
end
|
112
|
-
|
113
|
-
def agency(xml)
|
114
|
-
agency = ''
|
115
|
-
publisher = []
|
116
|
-
xml.xpath(ns("//bibdata/contributor[xmlns:role/@type = 'publisher']/"\
|
117
|
-
'organization')).each do |org|
|
118
|
-
name = org&.at(ns('./name'))&.text
|
119
|
-
agency1 = org&.at(ns('./abbreviation'))&.text || name
|
120
|
-
publisher << name if name
|
121
|
-
agency = iso?(org) ? "ISO/#{agency}" : "#{agency}#{agency1}/"
|
122
|
-
end
|
123
|
-
set(:agency, agency.sub(%r{/$}, ''))
|
124
|
-
set(:publisher, multiple_and(publisher, @labels['and']))
|
125
|
-
end
|
126
|
-
|
127
|
-
def multiple_and(names, andword)
|
128
|
-
return '' if names.empty?
|
129
|
-
return names[0] if names.length == 1
|
130
|
-
(names.length == 2) &&
|
131
|
-
(return l10n("#{names[0]} #{andword} #{names[1]}", @lang, @script))
|
132
|
-
l10n(names[0..-2].join(', ') + " #{andword} #{names[-1]}", @lang, @script)
|
50
|
+
b1 = isoxml&.at(ns("//bibdata/ext/doctype#{currlang}"))&.text || b
|
51
|
+
set(:doctype_display, status_print(b1))
|
133
52
|
end
|
134
53
|
|
135
|
-
def docstatus(
|
136
|
-
docstatus = isoxml.at(ns('//bibdata/status/stage'))
|
54
|
+
def docstatus(xml, _out)
|
137
55
|
set(:unpublished, true)
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
(i
|
144
|
-
|
145
|
-
(
|
146
|
-
|
147
|
-
(
|
148
|
-
|
149
|
-
|
150
|
-
unpublished(docstatus.text) &&
|
151
|
-
set(:stageabbr, stage_abbr(docstatus.text))
|
152
|
-
end
|
56
|
+
return unless s = xml.at(ns("//bibdata/status/stage#{NOLANG}"))
|
57
|
+
s1 = xml.at(ns("//bibdata/status/stage#{currlang}")) || s
|
58
|
+
set(:stage, status_print(s.text))
|
59
|
+
s1 and set(:stage_display, status_print(s1.text))
|
60
|
+
(i = xml&.at(ns("//bibdata/status/substage#{NOLANG}"))&.text) and
|
61
|
+
set(:substage, i)
|
62
|
+
(i1 = xml&.at(ns("//bibdata/status/substage#{currlang}"))&.text || i) and
|
63
|
+
set(:substage_display, i1)
|
64
|
+
(i2 = xml&.at(ns('//bibdata/status/iteration'))&.text) and
|
65
|
+
set(:iteration, i2)
|
66
|
+
set(:unpublished, unpublished(s.text))
|
67
|
+
unpublished(s.text) && set(:stageabbr, stage_abbr(s.text))
|
153
68
|
end
|
154
69
|
|
155
70
|
def stage_abbr(docstatus)
|
156
|
-
status_print(docstatus).split(/ /)
|
157
|
-
.map { |s| s[0].upcase }.join('')
|
71
|
+
status_print(docstatus).split(/ /).map { |s| s[0].upcase }.join('')
|
158
72
|
end
|
159
73
|
|
160
74
|
def unpublished(status)
|
@@ -170,18 +84,23 @@ module IsoDoc
|
|
170
84
|
set(:docnumber, dn&.text)
|
171
85
|
end
|
172
86
|
|
87
|
+
def otherid(isoxml, _out)
|
88
|
+
dn = isoxml.at(ns('//bibdata/docidentifier[@type = "ISBN"]'))
|
89
|
+
set(:isbn, dn&.text)
|
90
|
+
dn = isoxml.at(ns('//bibdata/docidentifier[@type = "ISBN10"]'))
|
91
|
+
set(:isbn10, dn&.text)
|
92
|
+
end
|
93
|
+
|
173
94
|
def docnumeric(isoxml, _out)
|
174
95
|
dn = isoxml.at(ns('//bibdata/docnumber'))
|
175
96
|
set(:docnumeric, dn&.text)
|
176
97
|
end
|
177
98
|
|
178
99
|
def draftinfo(draft, revdate)
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
draftinfo += ')'
|
184
|
-
end
|
100
|
+
return "" unless draft
|
101
|
+
draftinfo = " (#{@labels['draft_label']} #{draft}"
|
102
|
+
draftinfo += ", #{revdate}" if revdate
|
103
|
+
draftinfo += ')'
|
185
104
|
l10n(draftinfo, @lang, @script)
|
186
105
|
end
|
187
106
|
|
@@ -197,7 +116,7 @@ module IsoDoc
|
|
197
116
|
end
|
198
117
|
|
199
118
|
def title(isoxml, _out)
|
200
|
-
main = isoxml&.at(ns("//bibdata/title[@language='
|
119
|
+
main = isoxml&.at(ns("//bibdata/title[@language='#{@lang}']"))&.text
|
201
120
|
set(:doctitle, main)
|
202
121
|
end
|
203
122
|
|
@@ -237,5 +156,13 @@ module IsoDoc
|
|
237
156
|
isoxml.xpath(ns('//bibdata/keyword')).each { |kw| ret << kw.text }
|
238
157
|
set(:keywords, ret)
|
239
158
|
end
|
159
|
+
|
160
|
+
def note(isoxml, _out)
|
161
|
+
ret = []
|
162
|
+
isoxml.xpath(ns("//bibdata/note[@type = 'title-footnote']")).each do |n|
|
163
|
+
ret << n.text
|
164
|
+
end
|
165
|
+
set(:title_footnote, ret)
|
166
|
+
end
|
240
167
|
end
|
241
168
|
end
|