relaton-render 0.5.13 → 0.5.15

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ff9e0dafe6ba6d6df3cd7f3e98057a96400abe99c90e8f8a14525b18d019d673
4
- data.tar.gz: 450df19a0aec2275174c164559838023a977ffdfb435f0e07730081c46f4bcfb
3
+ metadata.gz: 0af6169e02ec5d26e446cde74cd73a1f46e35c8940d30f6c510f4be4de0088e6
4
+ data.tar.gz: f57803b06b0cdd09d3a0a7c88a2e33755fc976c4e32d15d5ad060442ac2a7c10
5
5
  SHA512:
6
- metadata.gz: 1f408ad815ea069f7bf8eca30461eaa1965f6303e57a37698d66135159d70e93bcc90ffaf5f49bb3dc173a4e689e7d5090baa60b510aca95b5fe2d50cf0bb196
7
- data.tar.gz: 070304e5689852b644ff5d072e18d7354e5d274196afa4b1f85f89e3edfb865c93642bcce1bd18a9d195217e9ec1cbe1a63782549382308ee67632a1d9dcc108
6
+ metadata.gz: ea4a04f26b246e60e332e6b77a9ebbdac20c0ae80e77b68e80446930a3eff08b12e598eec6d35919aebbc17e07d6ae4b56aa6b808b752d877ca1cb9f7ce10d16
7
+ data.tar.gz: 31712a34848e3564f871e7b41044d8082d2ee19036372b002a46670c4b8dc8ce9a206d6a4ae1fb783ea501fea20604753c2c9946e804afa36576a75b62aa74db
data/README.adoc CHANGED
@@ -158,6 +158,7 @@ drawn from the bibliographic item:
158
158
  | authorizer | ./contributor[role/@type = 'authorizer']/organization/name \| ./contributor[role/@type = 'publisher']/organization/name | | Y |
159
159
  | authoritative_identifier | ./docidentifier[not(@type = 'metanorma' or @type = 'ordinal' or @type = 'ISBN' or @type = 'ISSN' or @type = 'DOI')] | Y | |
160
160
  | other_identifier | ./docidentifier[@type = 'ISBN' or @type = 'ISSN' or @type = 'DOI'] | Y | | By default, each such identifier is prefixed with its type and colon
161
+ | doi | ./docidentifier[@type = 'DOI'] | Y | | No prefix supplied
161
162
  | status | ./status | | | Rendering varies by flavour
162
163
  | uri | ./uri[@type = 'citation' or @type = 'uri' or @type = 'src' or true] | | | If multiples, prioritise language match. Always exclude DOI: that is not where the resource is available from
163
164
  | access_location | ./accessLocation | | Y |
data/lib/isodoc/i18n.rb CHANGED
@@ -5,7 +5,7 @@ module IsoDoc
5
5
  class RelatonRenderI18n < I18n
6
6
  def load_yaml1(lang, script)
7
7
  case lang
8
- when "en", "fr", "ru", "de", "es", "ar"
8
+ when "en", "fr", "ru", "de", "es", "ar", "ja"
9
9
  load_yaml2(lang)
10
10
  when "zh"
11
11
  case script
@@ -25,7 +25,7 @@ module IsoDoc
25
25
  # because of the potential for script mixing
26
26
  def cleanup_entities(hash, is_xml: true)
27
27
  ret = super
28
- if @lang == "ar" && /%/.match?(ret)
28
+ if @lang == "ar" && ret.include?("%")
29
29
  ret = "&#x61c;#{ret}&#x61c;"
30
30
  end
31
31
  ret
@@ -5,6 +5,7 @@ author_and: و
5
5
  updated: محدث
6
6
  viewed: ينظر
7
7
  version: الإصدار
8
+ also_pub_as: ":نشرت أيضا باسم"
8
9
  no_date: بدون تاريخ
9
10
  no_place: بدون مدينة
10
11
  date_formats:
@@ -5,6 +5,7 @@ author_and: und
5
5
  updated: aktualisiert
6
6
  viewed: angesehen
7
7
  version: Version
8
+ also_pub_as: "Auch veröffentlicht als: "
8
9
  no_date: o.J.
9
10
  no_place: o.O.
10
11
  date_formats:
@@ -5,6 +5,7 @@ author_and: and
5
5
  updated: updated
6
6
  viewed: viewed
7
7
  version: version
8
+ also_pub_as: "Also published as: "
8
9
  no_date: n.d.
9
10
  no_place: n.p.
10
11
  date_formats:
@@ -5,6 +5,7 @@ author_and: y
5
5
  updated: actualizado
6
6
  viewed: visto
7
7
  version: versión
8
+ also_pub_as: "También publicado como: "
8
9
  no_date: s.f.
9
10
  no_place: s.l.
10
11
  date_formats:
@@ -5,6 +5,7 @@ author_and: et
5
5
  updated: mise à jour
6
6
  viewed: vu
7
7
  version: version
8
+ also_pub_as: "Également publié sous le titre : "
8
9
  no_date: s.d.
9
10
  no_place: s.l.
10
11
  date_formats:
@@ -0,0 +1,46 @@
1
+ in:
2
+ at:
3
+ and: と
4
+ author_and: と
5
+ updated: 更新しました
6
+ viewed: 見た
7
+ version: バージョン
8
+ also_pub_as: 次のようにも出版されています
9
+ no_date: 日付なし。
10
+ no_place: 都市はありません。
11
+ date_formats:
12
+ month_year: yMMMM
13
+ day_month_year: to_long_s
14
+ date_time: to_long_s
15
+ ordinal_keys: []
16
+ OrdinalRules: digits-ordinal
17
+ edition: 版
18
+ edition_ordinal: "%Ordinal edition"
19
+ draft: "下書き %"
20
+ editor:
21
+ sg: 編
22
+ pl: 編
23
+ qq-open: <em>
24
+ qq-close: </em>
25
+ q-open:
26
+ q-close:
27
+ extent:
28
+ page:
29
+ sg: "ページ%"
30
+ pl: "ページ%"
31
+ volume:
32
+ sg: "巻%"
33
+ pl: "巻%"
34
+ issue:
35
+ sg: "いいえ%"
36
+ pl: "いいえ%"
37
+ size:
38
+ page:
39
+ sg: "ページ%"
40
+ pl: "ページ%"
41
+ volume:
42
+ sg: "巻%"
43
+ pl: "巻%"
44
+ issue:
45
+ sg: "いいえ%"
46
+ pl: "いいえ%"
@@ -5,6 +5,7 @@ author_and: и
5
5
  updated: обновлен
6
6
  viewed: просмотрено
7
7
  version: версия
8
+ also_pub_as: "Также опубликовано как: "
8
9
  no_date: б.г.
9
10
  no_place: б.м.
10
11
  date_formats:
@@ -5,6 +5,7 @@ author_and: 和
5
5
  updated: 更新
6
6
  viewed: 阅
7
7
  version: 版本
8
+ also_pub_as: "还发布为:"
8
9
  no_date: 无日期
9
10
  no_place: 无出版地
10
11
  date_formats:
@@ -5,6 +5,7 @@ author_and: 與
5
5
  updated: 更新
6
6
  viewed: 閱
7
7
  version: 版本
8
+ also_pub_as: "也發佈為:"
8
9
  no_date: 無日期
9
10
  no_place: 無出版地
10
11
  date_formats:
@@ -48,7 +48,7 @@ template:
48
48
  software: "{{ creatornames }} ({{ role}}) . {{labels['qq-open']}}{{ title }}{{labels['qq-close']}} . {{ labels['version'] | capitalize }}_{{ edition_raw }}. {{medium | capitalize}}. {{place}}: {{publisher}}. {{date}}. {{ labels['updated'] | capitalize }}:_{{date_updated}}. {{ authoritative_identifier | join: '. ' }}. {{ other_identifier | join: '. ' }}. {{ uri }}. {{size}}. {{ extent}}. [{{ labels['viewed'] }}:_{{date_accessed}}]. "
49
49
  # TODO: omitted: author ids, subsidiary titles, subsidiary creators, copyright, license, distributor, system requirements, relationships
50
50
  electronic resource: software
51
- standard: "{{ creatornames }} ({{ role}}) . {{ authoritative_identifier | join '|' }}: {{labels['qq-open']}}{{ title }}{{labels['qq-close']}} . {{ labels['in'] | capitalize }}:_{{ series_title }}. {{ medium | capitalize }}. {{ edition | capitalize_first }}. {{ place }}: {{ publisher }}. {{date}}. {{size}}. {{ extent }}. {{ other_identifier | join: '. ' }}. {{ uri }}. {{ labels['at'] | capitalize}}:_{{ access_location }}. [{{ labels['viewed'] }}:_{{date_accessed}}]."
51
+ standard: "{{ creatornames }} ({{ role}}) . {{ authoritative_identifier | join: '|' }}: {{labels['qq-open']}}{{ title }}{{labels['qq-close']}} . {{ labels['in'] | capitalize }}:_{{ series_title }}. {{ medium | capitalize }}. {{ edition | capitalize_first }}. {{ place }}: {{ publisher }}. {{date}}. {{size}}. {{ extent }}. {{ other_identifier | join: '. ' }}. {{ uri }}. {{ labels['at'] | capitalize}}:_{{ access_location }}. [{{ labels['viewed'] }}:_{{date_accessed}}]."
52
52
  # TODO: omitted: author ids, subsidiary titles, rights metadata, distributor, persistent identifier, item attributes, relationships
53
53
  techreport: standard
54
54
  dataset: "{{ creatornames }} ({{ role }}) . {{labels['qq-open']}}{{ title }}{{labels['qq-close']}} . {{ labels['version'] | capitalize }}_{{ edition_raw }}. {{medium | capitalize }}. {{ labels['in'] | capitalize }}:_{{series}}. {{date}}. {{ labels['updated'] | capitalize }}:_{{date_updated}}. {{ authoritative_identifier | join: '. ' }}. {{ other_identifier | join: '. ' }}. {{ uri }}. {{ size }}. {{ extent}}. [{{ labels['viewed'] }}:_{{date_accessed}}]. "
@@ -2,7 +2,9 @@ require_relative "render_classes"
2
2
  require_relative "citations"
3
3
  require "yaml"
4
4
  require "liquid"
5
+ require "date"
5
6
  require "relaton_bib"
7
+ require "net/http"
6
8
  require_relative "../template/template"
7
9
  require_relative "../../../isodoc/i18n"
8
10
 
@@ -131,8 +133,16 @@ module Relaton
131
133
  end
132
134
 
133
135
  def parse1(doc)
136
+ r = doc.relation.select { |x| x.type == "hasRepresentation" }
137
+ .map { |x| @i18n.also_pub_as + parse_single_bibitem(x.bibitem) }
138
+ out = [parse_single_bibitem(doc)] + r
139
+ @i18n.l10n(out.join(". ").gsub(".. ", ". "))
140
+ end
141
+
142
+ def parse_single_bibitem(doc)
134
143
  r = renderer(doc.type || "misc")
135
144
  data = @parse.extract(doc)
145
+ enhance_data(data, r.template_raw)
136
146
  data_liquid = @fieldsklass.new(renderer: self)
137
147
  .compound_fields_format(data)
138
148
  valid_parse(@i18n.l10n(r.render(data_liquid)))
@@ -173,6 +183,23 @@ module Relaton
173
183
  end
174
184
  end
175
185
 
186
+ # add to liquid data based on template
187
+ def enhance_data(data, template)
188
+ template.is_a?(String) or return
189
+ add_date_accessed(data, template)
190
+ end
191
+
192
+ def add_date_accessed(data, template)
193
+ (/\{\{\s*date_accessed\s*\}\}/.match?(template) &&
194
+ /\{\{\s*uri\s*\}\}/.match?(template) &&
195
+ data[:uri_raw] && !data[:date_accessed]) or return
196
+ if url_exist?(data[:uri_raw])
197
+ data[:date_accessed] = { on: ::Date.today.to_s }
198
+ else
199
+ warn "BIBLIOGRAPHY WARNING: cannot access #{data[:uri_raw]}"
200
+ end
201
+ end
202
+
176
203
  private
177
204
 
178
205
  def template_hash_fill(templates)
@@ -182,6 +209,23 @@ module Relaton
182
209
  m[type] = template
183
210
  end
184
211
  end
212
+
213
+ def url_exist?(url_string)
214
+ res = access_url(url_string)
215
+ res.is_a?(Net::HTTPRedirection) and return url_exist?(res["location"])
216
+ res.code[0] != "4"
217
+ rescue Errno::ENOENT, SocketError
218
+ false # false if can't find the server
219
+ end
220
+
221
+ def access_url(url_string)
222
+ url = URI.parse(url_string)
223
+ req = Net::HTTP.new(url.host, url.port)
224
+ req.use_ssl = (url.scheme == "https")
225
+ path = url.path or return false
226
+ path.empty? and path = "/"
227
+ req.request_head(path)
228
+ end
185
229
  end
186
230
  end
187
231
  end
@@ -22,7 +22,7 @@ module Relaton
22
22
  def simple_xml2hash(doc)
23
23
  creators, role = creatornames(doc)
24
24
  { type: type(doc), title: title(doc), extent_raw: extent(doc),
25
- size_raw: size(doc), uri_raw: uri(doc),
25
+ size_raw: size(doc), uri_raw: uri(doc), doi: doi(doc),
26
26
  authoritative_identifier: authoritative_identifier(doc),
27
27
  other_identifier: other_identifier(doc),
28
28
  status: status(doc), creators: creators, role_raw: role }
@@ -109,7 +109,7 @@ module Relaton
109
109
  ret = date.detect { |x| x.type == t } and
110
110
  return ret
111
111
  end
112
- date.first
112
+ date.reject { |x| x.type == "accessed" }.first
113
113
  end
114
114
 
115
115
  # year-only
@@ -91,9 +91,15 @@ module Relaton
91
91
  end
92
92
 
93
93
  def authoritative_identifier(doc)
94
- doc.docidentifier.each_with_object([]) do |id, ret|
95
- ret << id.id unless authoritative_identifier_exclude.include? id.type
94
+ out = doc.docidentifier.each_with_object([]) do |id, ret|
95
+ id.primary && !authoritative_identifier_exclude.include?(id.type) and
96
+ ret << id.id
97
+ end
98
+ out.empty? and out = doc.docidentifier.each_with_object([]) do |id, ret|
99
+ authoritative_identifier_exclude.include?(id_type_norm(id)) or
100
+ ret << id.id
96
101
  end
102
+ out
97
103
  end
98
104
 
99
105
  def authoritative_identifier_exclude
@@ -102,7 +108,7 @@ module Relaton
102
108
 
103
109
  def other_identifier(doc)
104
110
  doc.docidentifier.each_with_object([]) do |id, ret|
105
- type = id.type&.sub(/^(ISBN|ISSN)\..*$/, "\\1")
111
+ type = id_type_norm(id)
106
112
  other_identifier_include.include? type or next
107
113
  ret << @i18n.l10n("#{type}: #{id.id}")
108
114
  end
@@ -112,6 +118,19 @@ module Relaton
112
118
  %w(ISSN ISBN DOI)
113
119
  end
114
120
 
121
+ def doi(doc)
122
+ out = doc.docidentifier.each_with_object([]) do |id, ret|
123
+ type = id.type&.sub(/^(DOI)\..*$/i, "\\1") or next
124
+ type.casecmp("doi").zero? or next
125
+ ret << id.id
126
+ end
127
+ out.empty? ? nil : out
128
+ end
129
+
130
+ def id_type_norm(id)
131
+ id.type&.sub(/^(ISBN|ISSN)\..*$/i) { $1.upcase }
132
+ end
133
+
115
134
  def uri(doc)
116
135
  uri = nil
117
136
  %w(citation uri src).each do |t|
@@ -5,6 +5,8 @@ module Relaton
5
5
  module Render
6
6
  module Template
7
7
  class General
8
+ attr_reader :template_raw
9
+
8
10
  def initialize(opt = {})
9
11
  @htmlentities = HTMLEntities.new
10
12
  customise_liquid
@@ -43,7 +45,7 @@ module Relaton
43
45
 
44
46
  def punct_field?(name)
45
47
  name or return false
46
- name = name.gsub(/'/, '"')
48
+ name = name.gsub("'", '"')
47
49
  %w(labels["qq-open"] labels["qq-close"] labels["q-open"]
48
50
  labels["q-close"]).include?(name)
49
51
  end
@@ -60,7 +62,7 @@ module Relaton
60
62
  a[3] = "}}#{FIELD_DELIM}"
61
63
  end
62
64
  a.join
63
- end.join.gsub(/\t/, " ")
65
+ end.join.gsub("\t", " ")
64
66
  t.gsub(/\}\}#{FIELD_DELIM}\|/o, "}}#{FIELD_DELIM}\t")
65
67
  .gsub(/\|#{FIELD_DELIM}\{\{/o, "\t#{FIELD_DELIM}{{")
66
68
  end
@@ -96,7 +98,7 @@ module Relaton
96
98
  .sub(/^\s*[,.:;]\s*/, "")
97
99
  .sub(/[,:;]\s*$/, "")
98
100
  .gsub(/(?<!\\)_/, " ")
99
- .gsub(/\\_/, "_")
101
+ .gsub("\\_", "_")
100
102
  .gsub(/#{NON_SPACING_DELIM}/o, "").gsub(/\s+/, " ")
101
103
  end
102
104
 
@@ -110,7 +112,7 @@ module Relaton
110
112
  when Array
111
113
  hash.map { |v| liquid_hash(v) }
112
114
  when String
113
- hash.empty? ? nil : hash.gsub(/_/, "\\_").gsub(/ /, "_")
115
+ hash.empty? ? nil : hash.gsub("_", "\\_").gsub(/ /, "_")
114
116
  else hash
115
117
  end
116
118
  end
@@ -165,7 +167,7 @@ module Relaton
165
167
  t = nametemplate_split(template)
166
168
 
167
169
  mid = (1..size - 2).each_with_object([]) do |i, m|
168
- m << t[1].gsub(/\[1\]/, "[#{i}]")
170
+ m << t[1].gsub("[1]", "[#{i}]")
169
171
  end
170
172
  t[1] = mid.join
171
173
  t[2].gsub!(/\[\d+\]/, "[#{size - 1}]")
@@ -1,5 +1,5 @@
1
1
  module Relaton
2
2
  module Render
3
- VERSION = "0.5.13".freeze
3
+ VERSION = "0.5.15".freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: relaton-render
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.13
4
+ version: 0.5.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-08-10 00:00:00.000000000 Z
11
+ date: 2023-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -201,6 +201,7 @@ files:
201
201
  - lib/isodoc-yaml/i18n-en.yaml
202
202
  - lib/isodoc-yaml/i18n-es.yaml
203
203
  - lib/isodoc-yaml/i18n-fr.yaml
204
+ - lib/isodoc-yaml/i18n-ja.yaml
204
205
  - lib/isodoc-yaml/i18n-ru.yaml
205
206
  - lib/isodoc-yaml/i18n-zh-Hans.yaml
206
207
  - lib/isodoc-yaml/i18n-zh-Hant.yaml