relaton-render 1.2.2 → 1.4.0.pre.alpha.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 +6 -1
- data/.github/workflows/release.yml +1 -1
- data/.rubocop.yml +2 -2
- data/Gemfile +15 -2
- data/lib/isodoc-yaml/i18n-ar.yaml +8 -2
- data/lib/isodoc-yaml/i18n-de.yaml +8 -2
- data/lib/isodoc-yaml/i18n-en.yaml +8 -2
- data/lib/isodoc-yaml/i18n-es.yaml +8 -2
- data/lib/isodoc-yaml/i18n-fr.yaml +8 -2
- data/lib/isodoc-yaml/i18n-ja.yaml +13 -7
- data/lib/isodoc-yaml/i18n-ru.yaml +8 -2
- data/lib/isodoc-yaml/i18n-zh-Hans.yaml +8 -2
- data/lib/isodoc-yaml/i18n-zh-Hant.yaml +8 -2
- data/lib/relaton/render/iso690/element.rb +43 -0
- data/lib/relaton/render/iso690/elements/component_part.rb +50 -0
- data/lib/relaton/render/iso690/elements/creator.rb +129 -0
- data/lib/relaton/render/iso690/elements/edition.rb +47 -0
- data/lib/relaton/render/iso690/elements/identifier.rb +32 -0
- data/lib/relaton/render/iso690/elements/location.rb +27 -0
- data/lib/relaton/render/iso690/elements/medium.rb +27 -0
- data/lib/relaton/render/iso690/elements/numeration.rb +26 -0
- data/lib/relaton/render/iso690/elements/production.rb +36 -0
- data/lib/relaton/render/iso690/elements/pub_date.rb +51 -0
- data/lib/relaton/render/iso690/elements/series.rb +40 -0
- data/lib/relaton/render/iso690/elements/title.rb +30 -0
- data/lib/relaton/render/iso690/elements.rb +40 -0
- data/lib/relaton/render/iso690/fields.rb +53 -0
- data/lib/relaton/render/iso690/i18n/en.yml +13 -0
- data/lib/relaton/render/iso690/i18n/fr.yml +14 -0
- data/lib/relaton/render/iso690/i18n.rb +53 -0
- data/lib/relaton/render/iso690/identifier_kinds.rb +34 -0
- data/lib/relaton/render/iso690/index_renderer.rb +57 -0
- data/lib/relaton/render/iso690/kinds.rb +43 -0
- data/lib/relaton/render/iso690/renderer.rb +52 -0
- data/lib/relaton/render/iso690/style/locale.rb +44 -0
- data/lib/relaton/render/iso690/style/name_form.rb +21 -0
- data/lib/relaton/render/iso690/style/scheme.rb +23 -0
- data/lib/relaton/render/iso690/style/sort_rule.rb +25 -0
- data/lib/relaton/render/iso690/style/template_map.rb +28 -0
- data/lib/relaton/render/iso690/style/type_template.rb +21 -0
- data/lib/relaton/render/iso690/style.rb +76 -0
- data/lib/relaton/render/iso690/styles/author-date.yml +28 -0
- data/lib/relaton/render/iso690/template.rb +72 -0
- data/lib/relaton/render/iso690.rb +22 -0
- data/lib/relaton/render/version.rb +1 -1
- data/lib/relaton-render.rb +3 -7
- data/relaton-render.gemspec +2 -19
- metadata +35 -249
- data/lib/relaton/render/fields/date.rb +0 -48
- data/lib/relaton/render/fields/fields.rb +0 -266
- data/lib/relaton/render/general/citations.rb +0 -178
- data/lib/relaton/render/general/config.yml +0 -129
- data/lib/relaton/render/general/render.rb +0 -316
- data/lib/relaton/render/general/render_classes.rb +0 -132
- data/lib/relaton/render/general/uri.rb +0 -57
- data/lib/relaton/render/i18n/i18n.rb +0 -40
- data/lib/relaton/render/parse/parse.rb +0 -152
- data/lib/relaton/render/parse/parse_contributors.rb +0 -184
- data/lib/relaton/render/parse/parse_extract.rb +0 -200
- data/lib/relaton/render/parse/parse_id.rb +0 -128
- data/lib/relaton/render/template/liquid.rb +0 -48
- data/lib/relaton/render/template/subclasses.rb +0 -123
- data/lib/relaton/render/template/template.rb +0 -228
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d8d567a54651ce75901eeb043077a17b840e9a9d9d00e95d3afcde793bfc6795
|
|
4
|
+
data.tar.gz: 3b6019abeef370c32db6e855238b4500c1be2a785eb726eb6577b6e454588d4b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c75141af4b07759f64a7c12ed491509ddfc2cd88595ea6484587a0bb753e333b633906188bf03e765912a06c4fd6e7a1812e0a886486c3c1b3f8435488f376b6
|
|
7
|
+
data.tar.gz: 2d8b040b077067944c76dd2149af2272bb536811fe228c940d91e5e79c0b42de0f3c4360b9586f0c6a369507eddf01e96246f334b169e4c1e2c5ea1df3507ee5
|
data/.github/workflows/rake.yml
CHANGED
|
@@ -8,6 +8,11 @@ on:
|
|
|
8
8
|
tags: [ v* ]
|
|
9
9
|
pull_request:
|
|
10
10
|
|
|
11
|
+
permissions:
|
|
12
|
+
contents: write
|
|
13
|
+
|
|
11
14
|
jobs:
|
|
12
15
|
rake:
|
|
13
|
-
uses:
|
|
16
|
+
uses: metanorma/ci/.github/workflows/generic-rake.yml@main
|
|
17
|
+
secrets:
|
|
18
|
+
pat_token: ${{ secrets.METANORMA_CI_PAT_TOKEN }}
|
|
@@ -14,7 +14,6 @@ on:
|
|
|
14
14
|
repository_dispatch:
|
|
15
15
|
types: [ do-release ]
|
|
16
16
|
|
|
17
|
-
|
|
18
17
|
jobs:
|
|
19
18
|
release:
|
|
20
19
|
uses: relaton/support/.github/workflows/release.yml@main
|
|
@@ -22,3 +21,4 @@ jobs:
|
|
|
22
21
|
next_version: ${{ github.event.inputs.next_version }}
|
|
23
22
|
secrets:
|
|
24
23
|
rubygems-api-key: ${{ secrets.RELATON_CI_RUBYGEMS_API_KEY }}
|
|
24
|
+
|
data/.rubocop.yml
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# Auto-generated by Cimas: Do not edit it manually!
|
|
2
2
|
# See https://github.com/metanorma/cimas
|
|
3
3
|
inherit_from:
|
|
4
|
-
- https://raw.githubusercontent.com/riboseinc/oss-guides/
|
|
4
|
+
- https://raw.githubusercontent.com/riboseinc/oss-guides/main/ci/rubocop.yml
|
|
5
5
|
|
|
6
6
|
# local repo-specific modifications
|
|
7
7
|
# ...
|
|
8
8
|
|
|
9
9
|
AllCops:
|
|
10
|
-
TargetRubyVersion:
|
|
10
|
+
TargetRubyVersion: 3.4
|
data/Gemfile
CHANGED
|
@@ -3,9 +3,22 @@ Encoding.default_internal = Encoding::UTF_8
|
|
|
3
3
|
|
|
4
4
|
source "https://rubygems.org"
|
|
5
5
|
|
|
6
|
-
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
|
6
|
+
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
|
7
7
|
|
|
8
8
|
gemspec
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
group :development, :test do
|
|
11
|
+
gem "canon"
|
|
12
|
+
gem "relaton", ">= 3.0.0.pre.alpha", "< 4" # the model fixtures; the engine itself is model-agnostic
|
|
13
|
+
gem "debug"
|
|
14
|
+
gem "iso-690-test-suite", github: "relaton/iso-690-test-suite"
|
|
15
|
+
gem "rake", ">= 12.3.3"
|
|
16
|
+
gem "rspec", "~> 3.0"
|
|
17
|
+
gem "simplecov"
|
|
18
|
+
end
|
|
11
19
|
|
|
20
|
+
begin
|
|
21
|
+
eval_gemfile("Gemfile.devel")
|
|
22
|
+
rescue StandardError
|
|
23
|
+
nil
|
|
24
|
+
end
|
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
at_url: より入手可能
|
|
2
|
+
at_venue: にて
|
|
3
|
+
at_institution: 所蔵
|
|
4
|
+
at_time: 時点で
|
|
5
|
+
at_location: 所在
|
|
6
|
+
in_document: 所載
|
|
7
|
+
in_series: 所収
|
|
8
|
+
in_archive: 所蔵
|
|
3
9
|
and: と
|
|
4
10
|
author_and: ","
|
|
5
11
|
updated: 更新しました
|
|
@@ -7,7 +13,7 @@ viewed: 参照
|
|
|
7
13
|
version:
|
|
8
14
|
also_pub_as: 次のようにも出版されています
|
|
9
15
|
no_date: 日付なし。
|
|
10
|
-
no_place:
|
|
16
|
+
no_place: 出版地不明
|
|
11
17
|
date_formats:
|
|
12
18
|
month_year: yMMMM
|
|
13
19
|
day_month_year: to_long_s
|
|
@@ -38,8 +44,8 @@ extent:
|
|
|
38
44
|
sg: "巻%"
|
|
39
45
|
pl: "巻%"
|
|
40
46
|
issue:
|
|
41
|
-
sg: "
|
|
42
|
-
pl: "
|
|
47
|
+
sg: "%号"
|
|
48
|
+
pl: "%号"
|
|
43
49
|
size:
|
|
44
50
|
page:
|
|
45
51
|
sg: "%頁"
|
|
@@ -48,5 +54,5 @@ size:
|
|
|
48
54
|
sg: "巻%"
|
|
49
55
|
pl: "巻%"
|
|
50
56
|
issue:
|
|
51
|
-
sg: "
|
|
52
|
-
pl: "
|
|
57
|
+
sg: "%号"
|
|
58
|
+
pl: "%号"
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Render
|
|
5
|
+
module Iso690
|
|
6
|
+
# Base data element (ISO 690 clause 7). An element wraps typed data
|
|
7
|
+
# taken from the relaton model instance; #present? is the omission
|
|
8
|
+
# predicate, #render the element's formatting method. Punctuation
|
|
9
|
+
# between elements belongs to the kind/style, not the element.
|
|
10
|
+
class Element
|
|
11
|
+
def initialize(model, style:, i18n:)
|
|
12
|
+
@model = model
|
|
13
|
+
@style = style
|
|
14
|
+
@i18n = i18n
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def present?
|
|
18
|
+
false
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def render
|
|
22
|
+
nil
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def localized(value)
|
|
28
|
+
value&.content.to_s
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def contributors(role)
|
|
32
|
+
Array(@model.contributor).select { |c| has_role?(c, role) }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def has_role?(contributor, role)
|
|
36
|
+
Array(contributor.role).any? do |r|
|
|
37
|
+
r.is_a?(String) ? r == role : r.type == role
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Render
|
|
5
|
+
module Iso690
|
|
6
|
+
module Elements
|
|
7
|
+
# Component part within a host (ISO 690 clause 7.4): "In: host
|
|
8
|
+
# title, edition of host". Host data comes from the typed
|
|
9
|
+
# partOf relation.
|
|
10
|
+
class ComponentPart < Element
|
|
11
|
+
def present?
|
|
12
|
+
!host_title.empty?
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def render
|
|
16
|
+
"#{@i18n.label('in')} " \
|
|
17
|
+
"#{@style.templates.title_open}#{host_title}" \
|
|
18
|
+
"#{@style.templates.title_close}" \
|
|
19
|
+
"#{host_edition}"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def relation
|
|
25
|
+
Array(@model.relation).find { |r| r.type == "partOf" }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def host
|
|
29
|
+
relation&.bibitem
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def host_title
|
|
33
|
+
return localized(relation&.description) if host.nil?
|
|
34
|
+
|
|
35
|
+
Array(host.title).map { |t| localized(t) }.join(" ").strip
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def host_edition
|
|
39
|
+
return "" if host.nil?
|
|
40
|
+
|
|
41
|
+
edition = Edition.new(host, style: @style, i18n: @i18n)
|
|
42
|
+
return "" unless edition.present?
|
|
43
|
+
|
|
44
|
+
". #{edition.render}"
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Render
|
|
5
|
+
module Iso690
|
|
6
|
+
module Elements
|
|
7
|
+
# Name(s) of creator(s) (ISO 690 clause 7.2). The first creator is
|
|
8
|
+
# given inverted per the style's name form (SURNAME, forenames),
|
|
9
|
+
# subsequent creators in direct order (forenames SURNAME); name
|
|
10
|
+
# parts come from the typed model, never decomposed from a
|
|
11
|
+
# rendered string.
|
|
12
|
+
class Creator < Element
|
|
13
|
+
def present?
|
|
14
|
+
!creators.empty?
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def render
|
|
18
|
+
"#{join(names)}#{role_suffix}"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# In-text (name-and-date) form: the principal creator only
|
|
22
|
+
def in_text
|
|
23
|
+
principal = creators.first or return ""
|
|
24
|
+
person = principal.person or return org_name(principal)
|
|
25
|
+
completename(person) || surname(person)&.upcase || ""
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# The principal creator's given names, as the name form declares
|
|
29
|
+
def principal_given
|
|
30
|
+
principal = creators.first or return ""
|
|
31
|
+
person = principal.person or return ""
|
|
32
|
+
complete = completename(person)
|
|
33
|
+
return "" if complete
|
|
34
|
+
|
|
35
|
+
given_names(person)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
private
|
|
39
|
+
|
|
40
|
+
def creators
|
|
41
|
+
@creators ||= begin
|
|
42
|
+
found = contributors("author")
|
|
43
|
+
found = contributors("editor") if found.empty?
|
|
44
|
+
found
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def names
|
|
49
|
+
creators.each_with_index
|
|
50
|
+
.map do |contributor, index|
|
|
51
|
+
format(contributor,
|
|
52
|
+
first: index.zero?)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def format(contributor, first:)
|
|
57
|
+
person = contributor.person or return org_name(contributor)
|
|
58
|
+
name = completename(person) ||
|
|
59
|
+
personal_name(person, first: first)
|
|
60
|
+
name.empty? ? org_name(contributor) : name
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def personal_name(person, first:)
|
|
64
|
+
surname = surname(person).to_s
|
|
65
|
+
given = given_names(person)
|
|
66
|
+
if first && !name_form.given_name_first
|
|
67
|
+
@style.render_name(surname: surname, given: given)
|
|
68
|
+
else
|
|
69
|
+
[given, surname.upcase].reject(&:empty?).join(" ")
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def name_form
|
|
74
|
+
@style.scheme.name_form
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def join(names)
|
|
78
|
+
case names.size
|
|
79
|
+
when 0 then ""
|
|
80
|
+
when 1 then names.first
|
|
81
|
+
when 2 then names.join(" #{@i18n.label('and')} ")
|
|
82
|
+
else
|
|
83
|
+
"#{names[0..-2].join(', ')}#{@i18n.label('oxford_comma')} " \
|
|
84
|
+
"#{@i18n.label('and')} #{names.last}"
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def role_suffix
|
|
89
|
+
return "" unless editors?
|
|
90
|
+
|
|
91
|
+
suffix = creators.one? ? @i18n.label("ed") : @i18n.label("eds")
|
|
92
|
+
" (#{suffix})"
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def editors?
|
|
96
|
+
!creators.empty? && creators.all? { |c| has_role?(c, "editor") }
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def completename(person)
|
|
100
|
+
value = localized(person.name&.completename)
|
|
101
|
+
value.empty? ? nil : value
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def surname(person)
|
|
105
|
+
value = localized(person.name&.surname)
|
|
106
|
+
value.empty? ? nil : value
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def given_names(person)
|
|
110
|
+
names = Array(person.name&.forename).map { |f| localized(f) }
|
|
111
|
+
.reject(&:empty?)
|
|
112
|
+
return names.map { |n| "#{n[0]}." }.join(" ") if name_form.initials
|
|
113
|
+
|
|
114
|
+
names.join(" ")
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def org_name(contributor)
|
|
118
|
+
name = Array(contributor.organization&.name)
|
|
119
|
+
.map { |n| localized(n).upcase }.join(", ")
|
|
120
|
+
abbrev = localized(contributor.organization&.abbreviation)
|
|
121
|
+
return name if name.empty? || abbrev.empty?
|
|
122
|
+
|
|
123
|
+
"#{name} (#{abbrev})"
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Render
|
|
5
|
+
module Iso690
|
|
6
|
+
module Elements
|
|
7
|
+
# Edition and version (ISO 690 clause 7.6). The model numbers the
|
|
8
|
+
# edition through Edition#number (falling back to its content).
|
|
9
|
+
class Edition < Element
|
|
10
|
+
def present?
|
|
11
|
+
!number.zero?
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def render
|
|
15
|
+
"#{ordinalize(number)} #{@i18n.label('edition')}"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
def number
|
|
21
|
+
raw = @model.edition&.number || @model.edition&.content
|
|
22
|
+
Integer(raw)
|
|
23
|
+
rescue ArgumentError, TypeError
|
|
24
|
+
0
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def ordinalize(num)
|
|
28
|
+
"#{num}#{ordinal_suffix(num)}"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def ordinal_suffix(num)
|
|
32
|
+
case num % 100
|
|
33
|
+
when 11, 12, 13 then "th"
|
|
34
|
+
else
|
|
35
|
+
case num % 10
|
|
36
|
+
when 1 then "st"
|
|
37
|
+
when 2 then "nd"
|
|
38
|
+
when 3 then "rd"
|
|
39
|
+
else "th"
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Render
|
|
5
|
+
module Iso690
|
|
6
|
+
module Elements
|
|
7
|
+
# Standard and persistent identifiers, rendered by kind
|
|
8
|
+
class Identifier < Element
|
|
9
|
+
INTERNAL_TYPES = %w[metanorma metanorma-ordinal metanorma-objid]
|
|
10
|
+
.freeze
|
|
11
|
+
|
|
12
|
+
def present?
|
|
13
|
+
!identifiers.empty?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def render
|
|
17
|
+
identifiers.map { |d| IdentifierKinds.render(d) }
|
|
18
|
+
.join(@i18n.punct_fetch("identifier_join", ". "))
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def identifiers
|
|
24
|
+
Array(@model.docidentifier).reject do |d|
|
|
25
|
+
INTERNAL_TYPES.include?(d.type) || d.content.to_s.strip.empty?
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Render
|
|
5
|
+
module Iso690
|
|
6
|
+
module Elements
|
|
7
|
+
# Availability and location (ISO 690 clause 7.12): access location
|
|
8
|
+
# (URI) of the resource
|
|
9
|
+
class Location < Element
|
|
10
|
+
def present?
|
|
11
|
+
!uri.empty?
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def render
|
|
15
|
+
"#{@i18n.label('available_from')} #{uri}"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
def uri
|
|
21
|
+
Array(@model.accesslocation).reject(&:empty?).first.to_s
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Render
|
|
5
|
+
module Iso690
|
|
6
|
+
module Elements
|
|
7
|
+
# Medium designation (ISO 690 clause 7.5), bracketed per the
|
|
8
|
+
# standard's worked examples, e.g. "[online]"
|
|
9
|
+
class Medium < Element
|
|
10
|
+
def present?
|
|
11
|
+
!medium.empty?
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def render
|
|
15
|
+
"[#{medium}]"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
def medium
|
|
21
|
+
localized(@model.medium)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Render
|
|
5
|
+
module Iso690
|
|
6
|
+
module Elements
|
|
7
|
+
# Numeration within a series (ISO 690 clause 7.9): report numbers
|
|
8
|
+
class Numeration < Element
|
|
9
|
+
def present?
|
|
10
|
+
!docnumber.to_s.empty?
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def render
|
|
14
|
+
"#{@i18n.label('report_no')} #{docnumber}"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
def docnumber
|
|
20
|
+
@model.docnumber
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Render
|
|
5
|
+
module Iso690
|
|
6
|
+
module Elements
|
|
7
|
+
# Production information: place and publisher (ISO 690 clause 7.8).
|
|
8
|
+
# Place comes from the model's typed city; publishers from
|
|
9
|
+
# organization contributors.
|
|
10
|
+
class Production < Element
|
|
11
|
+
def present?
|
|
12
|
+
!places.empty? || !publishers.empty?
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def render
|
|
16
|
+
[places.join("; "), publishers.join("; ")]
|
|
17
|
+
.reject(&:empty?).join(@i18n.punct_fetch("production_sep", ": "))
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
def places
|
|
23
|
+
Array(@model.place).map { |p| p.city.to_s }
|
|
24
|
+
.reject { |c| c.strip.empty? }
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def publishers
|
|
28
|
+
contributors("publisher").map do |c|
|
|
29
|
+
Array(c.organization&.name).map { |n| localized(n) }.join(", ")
|
|
30
|
+
end.reject(&:empty?)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|