isodoc 1.1.1 → 1.1.3
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/Rakefile +3 -1
- data/isodoc.gemspec +2 -2
- data/lib/isodoc/base_style/all.css +207 -0
- data/lib/isodoc/base_style/blocks.css +0 -0
- data/lib/isodoc/base_style/coverpage.css +0 -0
- data/lib/isodoc/base_style/defaults.css +0 -0
- data/lib/isodoc/base_style/metanorma_word.css +34 -0
- data/lib/isodoc/base_style/metanorma_word.scss +0 -1
- data/lib/isodoc/base_style/nav.css +0 -0
- data/lib/isodoc/base_style/reset.css +105 -0
- data/lib/isodoc/base_style/reset.scss +3 -3
- data/lib/isodoc/base_style/typography.css +0 -0
- data/lib/isodoc/convert.rb +111 -54
- data/lib/isodoc/function/utils.rb +57 -51
- data/lib/isodoc/gem_tasks.rb +133 -0
- data/lib/isodoc/metadata.rb +69 -63
- data/lib/isodoc/sassc_importer.rb +11 -0
- data/lib/isodoc/version.rb +1 -1
- data/spec/assets/{html.css → html.scss} +0 -0
- data/spec/isodoc/footnotes_spec.rb +2 -2
- data/spec/isodoc/postproc_spec.rb +1319 -1345
- metadata +27 -17
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module IsoDoc::Function
|
2
4
|
module Utils
|
3
5
|
def date_range(date)
|
@@ -9,50 +11,50 @@ module IsoDoc::Function
|
|
9
11
|
end
|
10
12
|
|
11
13
|
def insert_tab(out, n)
|
12
|
-
[1..n].each { out <<
|
14
|
+
[1..n].each { out << ' ' }
|
13
15
|
end
|
14
16
|
|
15
17
|
# add namespaces for Word fragments
|
16
|
-
NOKOHEAD = <<~HERE
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
NOKOHEAD = <<~HERE
|
19
|
+
<!DOCTYPE html SYSTEM
|
20
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
21
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
22
|
+
<head> <title></title> <meta charset="UTF-8" /> </head>
|
23
|
+
<body> </body> </html>
|
22
24
|
HERE
|
23
25
|
|
24
26
|
# block for processing XML document fragments as XHTML,
|
25
27
|
# to allow for HTMLentities
|
26
28
|
def noko(&block)
|
27
29
|
doc = ::Nokogiri::XML.parse(NOKOHEAD)
|
28
|
-
fragment = doc.fragment(
|
30
|
+
fragment = doc.fragment('')
|
29
31
|
::Nokogiri::XML::Builder.with fragment, &block
|
30
|
-
fragment.to_xml(encoding:
|
31
|
-
l.gsub(/\s*\n/,
|
32
|
+
fragment.to_xml(encoding: 'US-ASCII').lines.map do |l|
|
33
|
+
l.gsub(/\s*\n/, '')
|
32
34
|
end
|
33
35
|
end
|
34
36
|
|
35
37
|
def attr_code(attributes)
|
36
38
|
attributes = attributes.reject { |_, val| val.nil? }.map
|
37
39
|
attributes.map do |k, v|
|
38
|
-
[k,
|
40
|
+
[k, v.is_a?(String) ? HTMLEntities.new.decode(v) : v]
|
39
41
|
end.to_h
|
40
42
|
end
|
41
43
|
|
42
44
|
DOCTYPE_HDR = '<!DOCTYPE html SYSTEM '\
|
43
|
-
'"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'
|
45
|
+
'"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'
|
44
46
|
|
45
47
|
def to_xhtml(xml)
|
46
|
-
xml.gsub!(/<\?xml[^>]*>/,
|
47
|
-
/<!DOCTYPE /.match
|
48
|
+
xml.gsub!(/<\?xml[^>]*>/, '')
|
49
|
+
/<!DOCTYPE /.match(xml) || (xml = DOCTYPE_HDR + xml)
|
48
50
|
xml = xml.split(/(\&[^ \r\n\t#;]+;)/).map do |t|
|
49
|
-
/^(\&[^ \t\r\n#;]+;)/.match(t) ?
|
51
|
+
/^(\&[^ \t\r\n#;]+;)/.match?(t) ?
|
50
52
|
HTMLEntities.new.encode(HTMLEntities.new.decode(t), :hexadecimal) : t
|
51
|
-
end.join(
|
53
|
+
end.join('')
|
52
54
|
begin
|
53
|
-
Nokogiri::XML.parse(xml
|
55
|
+
Nokogiri::XML.parse(xml, &:strict)
|
54
56
|
rescue Nokogiri::XML::SyntaxError => e
|
55
|
-
File.open("#{@filename}.#{@format}.err",
|
57
|
+
File.open("#{@filename}.#{@format}.err", 'w:UTF-8') { |f| f.write xml }
|
56
58
|
abort "Malformed Output XML for #{@format}: #{e} (see #{@filename}.#{@format}.err)"
|
57
59
|
end
|
58
60
|
end
|
@@ -64,7 +66,7 @@ module IsoDoc::Function
|
|
64
66
|
end
|
65
67
|
|
66
68
|
def from_xhtml(xml)
|
67
|
-
xml.to_xml.sub(%r{ xmlns="http://www.w3.org/1999/xhtml"},
|
69
|
+
xml.to_xml.sub(%r{ xmlns="http://www.w3.org/1999/xhtml"}, '')
|
68
70
|
end
|
69
71
|
|
70
72
|
CLAUSE_ANCESTOR =
|
@@ -72,7 +74,7 @@ module IsoDoc::Function
|
|
72
74
|
"local-name() = 'acknowledgements' or local-name() = 'term' or "\
|
73
75
|
"local-name() = 'appendix' or local-name() = 'foreword' or "\
|
74
76
|
"local-name() = 'introduction' or local-name() = 'terms' or "\
|
75
|
-
"local-name() = 'clause' or local-name() = 'references']/@id"
|
77
|
+
"local-name() = 'clause' or local-name() = 'references']/@id"
|
76
78
|
|
77
79
|
def get_clause_id(node)
|
78
80
|
clause = node.xpath(CLAUSE_ANCESTOR)
|
@@ -86,7 +88,7 @@ module IsoDoc::Function
|
|
86
88
|
"local-name() = 'acknowledgements' or local-name() = 'term' or "\
|
87
89
|
"local-name() = 'clause' or local-name() = 'references' or "\
|
88
90
|
"local-name() = 'figure' or local-name() = 'formula' or "\
|
89
|
-
"local-name() = 'table' or local-name() = 'example']/@id"
|
91
|
+
"local-name() = 'table' or local-name() = 'example']/@id"
|
90
92
|
|
91
93
|
def get_note_container_id(node)
|
92
94
|
container = node.xpath(NOTE_CONTAINER_ANCESTOR)
|
@@ -94,7 +96,7 @@ module IsoDoc::Function
|
|
94
96
|
end
|
95
97
|
|
96
98
|
def sentence_join(array)
|
97
|
-
return
|
99
|
+
return '' if array.nil? || array.empty?
|
98
100
|
if array.length == 1 then array[0]
|
99
101
|
else
|
100
102
|
IsoDoc::Function::I18n::l10n("#{array[0..-2].join(', ')} "\
|
@@ -105,25 +107,25 @@ module IsoDoc::Function
|
|
105
107
|
|
106
108
|
# avoid `; avoid {{ (Liquid Templates); avoid [[ (Javascript)
|
107
109
|
def extract_delims(text)
|
108
|
-
@openmathdelim =
|
109
|
-
@closemathdelim =
|
110
|
+
@openmathdelim = '(#('
|
111
|
+
@closemathdelim = ')#)'
|
110
112
|
while text.include?(@openmathdelim) || text.include?(@closemathdelim)
|
111
|
-
@openmathdelim +=
|
112
|
-
@closemathdelim +=
|
113
|
+
@openmathdelim += '('
|
114
|
+
@closemathdelim += ')'
|
113
115
|
end
|
114
116
|
[@openmathdelim, @closemathdelim]
|
115
117
|
end
|
116
118
|
|
117
119
|
def header_strip(h)
|
118
|
-
h = h.to_s.gsub(%r{<br\s*/>},
|
119
|
-
|
120
|
+
h = h.to_s.gsub(%r{<br\s*/>}, ' ').gsub(/<\/?h[123456][^>]*>/, '')
|
121
|
+
.gsub(/<\/?b[^>]*>/, '')
|
120
122
|
h1 = to_xhtml_fragment(h.dup)
|
121
123
|
h1.traverse do |x|
|
122
|
-
x.replace(
|
123
|
-
x.remove if x.name ==
|
124
|
-
x.remove if x.name ==
|
125
|
-
x.remove if x.name ==
|
126
|
-
x.replace(x.children) if x.name ==
|
124
|
+
x.replace(' ') if x.name == 'span' && /mso-tab-count/.match(x['style'])
|
125
|
+
x.remove if x.name == 'span' && x['class'] == 'MsoCommentReference'
|
126
|
+
x.remove if x.name == 'a' && x['class'] == 'FootnoteRef'
|
127
|
+
x.remove if x.name == 'span' && /mso-bookmark/.match(x['style'])
|
128
|
+
x.replace(x.children) if x.name == 'a'
|
127
129
|
end
|
128
130
|
from_xhtml(h1)
|
129
131
|
end
|
@@ -135,9 +137,9 @@ module IsoDoc::Function
|
|
135
137
|
def liquid(doc)
|
136
138
|
# unescape HTML escapes in doc
|
137
139
|
doc = doc.split(%r<(\{%|%\})>).each_slice(4).map do |a|
|
138
|
-
a[2] = a[2].gsub(/\</,
|
139
|
-
a.join(
|
140
|
-
end.join(
|
140
|
+
a[2] = a[2].gsub(/\</, '<').gsub(/\>/, '>') if a.size > 2
|
141
|
+
a.join('')
|
142
|
+
end.join('')
|
141
143
|
Liquid::Template.parse(doc)
|
142
144
|
end
|
143
145
|
|
@@ -147,37 +149,41 @@ module IsoDoc::Function
|
|
147
149
|
end
|
148
150
|
|
149
151
|
def populate_template(docxml, _format = nil)
|
150
|
-
meta = @meta
|
152
|
+
meta = @meta
|
153
|
+
.get
|
154
|
+
.merge(@labels || {})
|
155
|
+
.merge(@meta.labels || {})
|
156
|
+
.merge(@meta.fonts_options || {})
|
151
157
|
template = liquid(docxml)
|
152
|
-
template.render(meta.map { |k, v| [k.to_s, empty2nil(v)] }.to_h)
|
153
|
-
|
158
|
+
template.render(meta.map { |k, v| [k.to_s, empty2nil(v)] }.to_h)
|
159
|
+
.gsub('<', '<').gsub('>', '>').gsub('&', '&')
|
154
160
|
end
|
155
161
|
|
156
|
-
def save_dataimage(uri,
|
162
|
+
def save_dataimage(uri, _relative_dir = true)
|
157
163
|
%r{^data:image/(?<imgtype>[^;]+);base64,(?<imgdata>.+)$} =~ uri
|
158
|
-
imgtype.sub!(/\+[a-z0-9]+$/,
|
159
|
-
imgtype =
|
160
|
-
Tempfile.open([
|
164
|
+
imgtype.sub!(/\+[a-z0-9]+$/, '') # svg+xml
|
165
|
+
imgtype = 'png' unless /^[a-z0-9]+$/.match imgtype
|
166
|
+
Tempfile.open(['image', ".#{imgtype}"]) do |f|
|
161
167
|
f.binmode
|
162
168
|
f.write(Base64.strict_decode64(imgdata))
|
163
|
-
@tempfile_cache << f #persist to the end
|
169
|
+
@tempfile_cache << f # persist to the end
|
164
170
|
f.path
|
165
171
|
end
|
166
172
|
end
|
167
173
|
|
168
174
|
def image_localfile(i)
|
169
|
-
if /^data:image/.match i[
|
170
|
-
save_dataimage(i[
|
171
|
-
elsif %r{^([A-Z]:)?/}.match i[
|
172
|
-
i[
|
175
|
+
if /^data:image/.match? i['src']
|
176
|
+
save_dataimage(i['src'], false)
|
177
|
+
elsif %r{^([A-Z]:)?/}.match? i['src']
|
178
|
+
i['src']
|
173
179
|
else
|
174
|
-
File.join(@localdir, i[
|
180
|
+
File.join(@localdir, i['src'])
|
175
181
|
end
|
176
182
|
end
|
177
183
|
|
178
184
|
def labelled_ancestor(node)
|
179
|
-
|
180
|
-
|
185
|
+
!node.ancestors('example, requirement, recommendation, permission, '\
|
186
|
+
'table, figure, sourcecode').empty?
|
181
187
|
end
|
182
188
|
end
|
183
189
|
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sassc'
|
4
|
+
require 'isodoc/sassc_importer'
|
5
|
+
require 'rake/clean'
|
6
|
+
|
7
|
+
module IsoDoc
|
8
|
+
module GemTasks
|
9
|
+
extend Rake::DSL if defined? Rake::DSL
|
10
|
+
|
11
|
+
module_function
|
12
|
+
|
13
|
+
def install
|
14
|
+
rule '.css' => [proc { |tn| tn.sub(/\.css$/, '.scss') }] do |current_task|
|
15
|
+
begin
|
16
|
+
puts(current_task)
|
17
|
+
compile_scss_task(current_task)
|
18
|
+
rescue StandardError => e
|
19
|
+
notify_borken_compilation(e, current_task)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
scss_files = Rake::FileList['lib/**/*.scss']
|
24
|
+
source_files = scss_files.ext('.css')
|
25
|
+
|
26
|
+
task :comment_out_liquid do
|
27
|
+
process_css_files(scss_files) do |file_name|
|
28
|
+
comment_out_liquid(File.read(file_name, encoding: 'UTF-8'))
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
task build_scss: [:comment_out_liquid].push(*source_files) do
|
33
|
+
process_css_files(scss_files) do |file_name|
|
34
|
+
uncomment_out_liquid(File.read(file_name, encoding: 'UTF-8'))
|
35
|
+
end
|
36
|
+
git_cache_compiled_files && puts('Built scss!')
|
37
|
+
end
|
38
|
+
|
39
|
+
Rake::Task['build'].enhance [:build_scss] do
|
40
|
+
git_rm_compiled_files
|
41
|
+
Rake::Task[:clean].invoke
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def notify_borken_compilation(error, current_task)
|
46
|
+
puts("Cannot compile #{current_task} because of #{error.message}")
|
47
|
+
puts('continue anyway[y|n]?')
|
48
|
+
answer = STDIN.gets.strip
|
49
|
+
if %w[y yes].include?(answer.strip.downcase)
|
50
|
+
puts("Cannot compile #{current_task} because of #{error.message}")
|
51
|
+
else
|
52
|
+
exit(0)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def git_cache_compiled_files
|
57
|
+
CLEAN.each do |css_file|
|
58
|
+
sh "git add #{css_file}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def git_rm_compiled_files
|
63
|
+
CLEAN.each do |css_file|
|
64
|
+
sh "git rm --cached #{css_file}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def process_css_files(scss_files)
|
69
|
+
scss_files.each do |file_name|
|
70
|
+
result = yield(file_name)
|
71
|
+
File.open(file_name, 'w', encoding: 'UTF-8') do |file|
|
72
|
+
file.puts(result)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def comment_out_liquid(text)
|
78
|
+
text.split("\n").map do |line|
|
79
|
+
if line.match?(/{({|%).+(}|%)}/)
|
80
|
+
"/* LIQUID_COMMENT#{line}LIQUID_COMMENT */"
|
81
|
+
else
|
82
|
+
line
|
83
|
+
end
|
84
|
+
end
|
85
|
+
.join("\n")
|
86
|
+
end
|
87
|
+
|
88
|
+
def uncomment_out_liquid(text)
|
89
|
+
text
|
90
|
+
.gsub('/* LIQUID_COMMENT', '')
|
91
|
+
.gsub('LIQUID_COMMENT */', '')
|
92
|
+
.gsub('"{{', '{{').gsub('}}"', '}}')
|
93
|
+
end
|
94
|
+
|
95
|
+
def fonts_placeholder
|
96
|
+
<<~TEXT
|
97
|
+
$bodyfont: '{{bodyfont}}';
|
98
|
+
$headerfont: '{{headerfont}}';
|
99
|
+
$monospacefont: '{{monospacefont}}';
|
100
|
+
TEXT
|
101
|
+
end
|
102
|
+
|
103
|
+
def compile_scss(filename)
|
104
|
+
require 'sassc'
|
105
|
+
|
106
|
+
isodoc_path = if Gem.loaded_specs['isodoc']
|
107
|
+
File.join(Gem.loaded_specs['isodoc'].full_gem_path, 'lib', 'isodoc')
|
108
|
+
else
|
109
|
+
File.join('lib', 'isodoc')
|
110
|
+
end
|
111
|
+
[isodoc_path,
|
112
|
+
File.dirname(filename)].each do |name|
|
113
|
+
SassC.load_paths << name
|
114
|
+
end
|
115
|
+
sheet_content = File.read(filename, encoding: 'UTF-8')
|
116
|
+
SassC::Engine.new(fonts_placeholder + sheet_content,
|
117
|
+
syntax: :scss,
|
118
|
+
importer: SasscImporter)
|
119
|
+
.render
|
120
|
+
end
|
121
|
+
|
122
|
+
def compile_scss_task(current_task)
|
123
|
+
filename = current_task.source
|
124
|
+
basename = File.basename(filename, '.*')
|
125
|
+
compiled_path = File.join(File.dirname(filename), "#{basename}.css")
|
126
|
+
content = uncomment_out_liquid(compile_scss(filename))
|
127
|
+
File.open(compiled_path, 'w:UTF-8') do |f|
|
128
|
+
f.write(content)
|
129
|
+
end
|
130
|
+
CLEAN << compiled_path
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
data/lib/isodoc/metadata.rb
CHANGED
@@ -1,10 +1,15 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './metadata_date'
|
2
4
|
|
3
5
|
module IsoDoc
|
4
6
|
class Metadata
|
5
7
|
DATETYPES = %w{published accessed created implemented obsoleted confirmed
|
6
|
-
|
7
|
-
|
8
|
+
updated issued received transmitted copied unchanged
|
9
|
+
circulated vote-started
|
10
|
+
vote-ended}.freeze
|
11
|
+
|
12
|
+
attr_accessor :fonts_options
|
8
13
|
|
9
14
|
def ns(xpath)
|
10
15
|
Common::ns(xpath)
|
@@ -14,13 +19,14 @@ module IsoDoc
|
|
14
19
|
IsoDoc::Function::I18n::l10n(a, b, c)
|
15
20
|
end
|
16
21
|
|
17
|
-
def initialize(lang, script, labels)
|
22
|
+
def initialize(lang, script, labels, fonts_options = {})
|
18
23
|
@metadata = {}
|
19
|
-
DATETYPES.each { |w| @metadata["#{w.gsub(/-/,
|
24
|
+
DATETYPES.each { |w| @metadata["#{w.gsub(/-/, '_')}date".to_sym] = 'XXX' }
|
20
25
|
@lang = lang
|
21
26
|
@script = script
|
22
27
|
@c = HTMLEntities.new
|
23
28
|
@labels = labels
|
29
|
+
@fonts_options = fonts_options
|
24
30
|
end
|
25
31
|
|
26
32
|
def get
|
@@ -36,26 +42,26 @@ module IsoDoc
|
|
36
42
|
end
|
37
43
|
|
38
44
|
def extract_person_names(authors)
|
39
|
-
authors.
|
40
|
-
if a.at(ns(
|
41
|
-
ret << a.at(ns(
|
45
|
+
authors.reduce([]) do |ret, a|
|
46
|
+
if a.at(ns('./name/completename'))
|
47
|
+
ret << a.at(ns('./name/completename')).text
|
42
48
|
else
|
43
49
|
fn = []
|
44
|
-
forenames = a.xpath(ns(
|
50
|
+
forenames = a.xpath(ns('./name/forename'))
|
45
51
|
forenames.each { |f| fn << f.text }
|
46
|
-
surname = a&.at(ns(
|
47
|
-
ret << fn.join(
|
52
|
+
surname = a&.at(ns('./name/surname'))&.text
|
53
|
+
ret << fn.join(' ') + ' ' + surname
|
48
54
|
end
|
49
55
|
end
|
50
56
|
end
|
51
57
|
|
52
58
|
def extract_person_affiliations(authors)
|
53
|
-
authors.
|
54
|
-
name = a&.at(ns(
|
55
|
-
location = a&.at(ns(
|
56
|
-
|
57
|
-
m << (
|
58
|
-
(name || location ||
|
59
|
+
authors.reduce([]) do |m, a|
|
60
|
+
name = a&.at(ns('./affiliation/organization/name'))&.text
|
61
|
+
location = a&.at(ns('./affiliation/organization/address/'\
|
62
|
+
'formattedAddress'))&.text
|
63
|
+
m << (!name.nil? && !location.nil? ? "#{name}, #{location}" :
|
64
|
+
(name || location || ''))
|
59
65
|
m
|
60
66
|
end
|
61
67
|
end
|
@@ -84,99 +90,99 @@ module IsoDoc
|
|
84
90
|
end
|
85
91
|
|
86
92
|
def bibdate(isoxml, _out)
|
87
|
-
isoxml.xpath(ns(
|
88
|
-
set("#{d['type'].gsub(/-/,
|
93
|
+
isoxml.xpath(ns('//bibdata/date')).each do |d|
|
94
|
+
set("#{d['type'].gsub(/-/, '_')}date".to_sym, Common::date_range(d))
|
89
95
|
end
|
90
96
|
end
|
91
97
|
|
92
98
|
def doctype(isoxml, _out)
|
93
|
-
b = isoxml&.at(ns(
|
94
|
-
t = b.split(/[- ]/).map
|
99
|
+
b = isoxml&.at(ns('//bibdata/ext/doctype'))&.text || return
|
100
|
+
t = b.split(/[- ]/).map(&:capitalize).join(' ')
|
95
101
|
set(:doctype, t)
|
96
102
|
end
|
97
103
|
|
98
104
|
def iso?(org)
|
99
|
-
name = org&.at(ns(
|
100
|
-
abbrev = org&.at(ns(
|
101
|
-
(abbrev ==
|
102
|
-
name ==
|
105
|
+
name = org&.at(ns('./name'))&.text
|
106
|
+
abbrev = org&.at(ns('./abbreviation'))&.text
|
107
|
+
(abbrev == 'ISO' ||
|
108
|
+
name == 'International Organization for Standardization')
|
103
109
|
end
|
104
110
|
|
105
111
|
def agency(xml)
|
106
|
-
agency =
|
112
|
+
agency = ''
|
107
113
|
publisher = []
|
108
114
|
xml.xpath(ns("//bibdata/contributor[xmlns:role/@type = 'publisher']/"\
|
109
|
-
|
110
|
-
name = org&.at(ns(
|
111
|
-
agency1 = org&.at(ns(
|
115
|
+
'organization')).each do |org|
|
116
|
+
name = org&.at(ns('./name'))&.text
|
117
|
+
agency1 = org&.at(ns('./abbreviation'))&.text || name
|
112
118
|
publisher << name if name
|
113
|
-
agency = iso?(org) ?
|
119
|
+
agency = iso?(org) ? "ISO/#{agency}" : "#{agency}#{agency1}/"
|
114
120
|
end
|
115
|
-
set(:agency, agency.sub(%r{/$},
|
116
|
-
set(:publisher, multiple_and(publisher, @labels[
|
121
|
+
set(:agency, agency.sub(%r{/$}, ''))
|
122
|
+
set(:publisher, multiple_and(publisher, @labels['and']))
|
117
123
|
end
|
118
124
|
|
119
125
|
def multiple_and(names, andword)
|
120
|
-
return
|
126
|
+
return '' if names.empty?
|
121
127
|
return names[0] if names.length == 1
|
122
|
-
names.length == 2
|
123
|
-
return l10n("#{names[0]} #{andword} #{names[1]}", @lang, @script)
|
124
|
-
l10n(names[0..-2].join(
|
128
|
+
(names.length == 2) &&
|
129
|
+
(return l10n("#{names[0]} #{andword} #{names[1]}", @lang, @script))
|
130
|
+
l10n(names[0..-2].join(', ') + " #{andword} #{names[-1]}", @lang, @script)
|
125
131
|
end
|
126
132
|
|
127
133
|
def docstatus(isoxml, _out)
|
128
|
-
docstatus = isoxml.at(ns(
|
134
|
+
docstatus = isoxml.at(ns('//bibdata/status/stage'))
|
129
135
|
set(:unpublished, true)
|
130
136
|
if docstatus
|
131
137
|
set(:stage, status_print(docstatus.text))
|
132
|
-
i = isoxml&.at(ns(
|
138
|
+
(i = isoxml&.at(ns('//bibdata/status/substage'))&.text) &&
|
133
139
|
set(:substage, i)
|
134
|
-
i = isoxml&.at(ns(
|
140
|
+
(i = isoxml&.at(ns('//bibdata/status/iteration'))&.text) &&
|
135
141
|
set(:iteration, i)
|
136
142
|
set(:unpublished, unpublished(docstatus.text))
|
137
|
-
unpublished(docstatus.text)
|
143
|
+
unpublished(docstatus.text) &&
|
138
144
|
set(:stageabbr, stage_abbr(docstatus.text))
|
139
145
|
end
|
140
146
|
end
|
141
147
|
|
142
148
|
def stage_abbr(docstatus)
|
143
|
-
status_print(docstatus).split(/ /)
|
144
|
-
|
149
|
+
status_print(docstatus).split(/ /)
|
150
|
+
.map { |s| s[0].upcase }.join('')
|
145
151
|
end
|
146
152
|
|
147
153
|
def unpublished(status)
|
148
|
-
!
|
154
|
+
!status.casecmp('published').zero?
|
149
155
|
end
|
150
156
|
|
151
157
|
def status_print(status)
|
152
|
-
status.split(/-/).map
|
158
|
+
status.split(/-/).map(&:capitalize).join(' ')
|
153
159
|
end
|
154
160
|
|
155
161
|
def docid(isoxml, _out)
|
156
|
-
dn = isoxml.at(ns(
|
162
|
+
dn = isoxml.at(ns('//bibdata/docidentifier'))
|
157
163
|
set(:docnumber, dn&.text)
|
158
164
|
end
|
159
165
|
|
160
166
|
def docnumeric(isoxml, _out)
|
161
|
-
dn = isoxml.at(ns(
|
167
|
+
dn = isoxml.at(ns('//bibdata/docnumber'))
|
162
168
|
set(:docnumeric, dn&.text)
|
163
169
|
end
|
164
170
|
|
165
171
|
def draftinfo(draft, revdate)
|
166
|
-
draftinfo =
|
172
|
+
draftinfo = ''
|
167
173
|
if draft
|
168
|
-
draftinfo = " (#{@labels[
|
174
|
+
draftinfo = " (#{@labels['draft_label']} #{draft}"
|
169
175
|
draftinfo += ", #{revdate}" if revdate
|
170
|
-
draftinfo +=
|
176
|
+
draftinfo += ')'
|
171
177
|
end
|
172
178
|
l10n(draftinfo, @lang, @script)
|
173
179
|
end
|
174
180
|
|
175
181
|
def version(isoxml, _out)
|
176
|
-
set(:edition, isoxml&.at(ns(
|
177
|
-
set(:docyear, isoxml&.at(ns(
|
178
|
-
set(:draft, isoxml&.at(ns(
|
179
|
-
revdate = isoxml&.at(ns(
|
182
|
+
set(:edition, isoxml&.at(ns('//bibdata/edition'))&.text)
|
183
|
+
set(:docyear, isoxml&.at(ns('//bibdata/copyright/from'))&.text)
|
184
|
+
set(:draft, isoxml&.at(ns('//version/draft'))&.text)
|
185
|
+
revdate = isoxml&.at(ns('//version/revision-date'))&.text
|
180
186
|
set(:revdate, revdate)
|
181
187
|
set(:revdate_monthyear, monthyr(revdate))
|
182
188
|
set(:draftinfo,
|
@@ -188,7 +194,7 @@ module IsoDoc
|
|
188
194
|
set(:doctitle, main)
|
189
195
|
end
|
190
196
|
|
191
|
-
def subtitle(
|
197
|
+
def subtitle(_isoxml, _out)
|
192
198
|
nil
|
193
199
|
end
|
194
200
|
|
@@ -199,29 +205,29 @@ module IsoDoc
|
|
199
205
|
|
200
206
|
def relations_partof(isoxml)
|
201
207
|
std = isoxml.at(ns("//bibdata/relation[@type = 'partOf']")) || return
|
202
|
-
id = std.at(ns(
|
208
|
+
id = std.at(ns('.//docidentifier'))
|
203
209
|
set(:partof, id.text) if id
|
204
210
|
end
|
205
211
|
|
206
212
|
def relations_obsoletes(isoxml)
|
207
213
|
std = isoxml.at(ns("//bibdata/relation[@type = 'obsoletes']")) || return
|
208
|
-
locality = std.at(ns(
|
209
|
-
id = std.at(ns(
|
214
|
+
locality = std.at(ns('.//locality'))
|
215
|
+
id = std.at(ns('.//docidentifier'))
|
210
216
|
set(:obsoletes, id.text) if id
|
211
217
|
set(:obsoletes_part, locality.text) if locality
|
212
218
|
end
|
213
219
|
|
214
220
|
def url(xml, _out)
|
215
|
-
a = xml.at(ns(
|
216
|
-
a = xml.at(ns("//bibdata/uri[@type = 'html']"))
|
217
|
-
a = xml.at(ns("//bibdata/uri[@type = 'xml']"))
|
218
|
-
a = xml.at(ns("//bibdata/uri[@type = 'pdf']"))
|
219
|
-
a = xml.at(ns("//bibdata/uri[@type = 'doc']"))
|
221
|
+
(a = xml.at(ns('//bibdata/uri[not(@type)]'))) && set(:url, a.text)
|
222
|
+
(a = xml.at(ns("//bibdata/uri[@type = 'html']"))) && set(:html, a.text)
|
223
|
+
(a = xml.at(ns("//bibdata/uri[@type = 'xml']"))) && set(:xml, a.text)
|
224
|
+
(a = xml.at(ns("//bibdata/uri[@type = 'pdf']"))) && set(:pdf, a.text)
|
225
|
+
(a = xml.at(ns("//bibdata/uri[@type = 'doc']"))) && set(:doc, a.text)
|
220
226
|
end
|
221
227
|
|
222
228
|
def keywords(isoxml, _out)
|
223
229
|
ret = []
|
224
|
-
isoxml.xpath(ns(
|
230
|
+
isoxml.xpath(ns('//bibdata/keyword')).each { |kw| ret << kw.text }
|
225
231
|
set(:keywords, ret)
|
226
232
|
end
|
227
233
|
end
|