relaton-bib 1.3.1 → 1.5.0
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/README.adoc +44 -18
- data/grammars/isodoc.rng +136 -21
- data/grammars/reqt.rng +2 -8
- data/lib/relaton_bib.rb +3 -1
- data/lib/relaton_bib/biblio_note.rb +27 -0
- data/lib/relaton_bib/bibliographic_date.rb +2 -1
- data/lib/relaton_bib/bibliographic_item.rb +60 -40
- data/lib/relaton_bib/bibtex_parser.rb +16 -15
- data/lib/relaton_bib/contribution_info.rb +14 -8
- data/lib/relaton_bib/contributor.rb +10 -6
- data/lib/relaton_bib/copyright_association.rb +7 -5
- data/lib/relaton_bib/document_identifier.rb +38 -9
- data/lib/relaton_bib/document_relation.rb +2 -2
- data/lib/relaton_bib/document_relation_collection.rb +0 -2
- data/lib/relaton_bib/document_status.rb +0 -3
- data/lib/relaton_bib/editorial_group.rb +5 -0
- data/lib/relaton_bib/hash_converter.rb +11 -13
- data/lib/relaton_bib/hit.rb +10 -6
- data/lib/relaton_bib/hit_collection.rb +8 -3
- data/lib/relaton_bib/localized_string.rb +3 -3
- data/lib/relaton_bib/organization.rb +26 -15
- data/lib/relaton_bib/person.rb +26 -14
- data/lib/relaton_bib/place.rb +1 -1
- data/lib/relaton_bib/typed_title_string.rb +67 -0
- data/lib/relaton_bib/version.rb +1 -1
- data/lib/relaton_bib/xml_parser.rb +16 -7
- metadata +2 -2
@@ -38,19 +38,21 @@ module RelatonBib
|
|
38
38
|
@scope = scope
|
39
39
|
end
|
40
40
|
|
41
|
-
# @param
|
42
|
-
|
43
|
-
|
41
|
+
# @param opts [Hash]
|
42
|
+
# @option opts [Nokogiri::XML::Builder] :builder XML builder
|
43
|
+
# @option opts [String, Symbol] :lang language
|
44
|
+
def to_xml(**opts)
|
45
|
+
opts[:builder].copyright do |builder|
|
44
46
|
builder.from from ? from.year : "unknown"
|
45
47
|
builder.to to.year if to
|
46
|
-
owner.each { |o| builder.owner { o.to_xml
|
48
|
+
owner.each { |o| builder.owner { o.to_xml **opts } }
|
47
49
|
builder.scope scope if scope
|
48
50
|
end
|
49
51
|
end
|
50
52
|
# rubocop:enable Metrics/AbcSize
|
51
53
|
|
52
54
|
# @return [Hash]
|
53
|
-
def to_hash
|
55
|
+
def to_hash # rubocop:disable Metrics/AbcSize
|
54
56
|
owners = single_element_array(owner.map { |o| o.to_hash["organization"] })
|
55
57
|
hash = {
|
56
58
|
"owner" => owners,
|
@@ -20,30 +20,40 @@ module RelatonBib
|
|
20
20
|
def remove_part
|
21
21
|
case @type
|
22
22
|
when "Chinese Standard" then @id.sub!(/\.\d+/, "")
|
23
|
-
|
24
|
-
|
23
|
+
when "ISO", "IEC" then @id.sub!(/-[^:]+/, "")
|
24
|
+
when "URN" then remove_urn_part
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
28
|
def remove_date
|
29
29
|
case @type
|
30
30
|
when "Chinese Standard" then @id.sub!(/-[12]\d\d\d/, "")
|
31
|
-
|
32
|
-
|
31
|
+
when "ISO", "IEC" then @id.sub!(/:[12]\d\d\d/, "")
|
32
|
+
when "URN"
|
33
|
+
@id.sub!(/^(urn:iec:std:[^:]+:[^:]+:)[^:]*/, '\1')
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
36
37
|
def all_parts
|
37
|
-
|
38
|
+
if type == "URN"
|
39
|
+
@id.sub!(%r{^(urn:iec:std(?::[^:]*){4}).*}, '\1:ser')
|
40
|
+
else
|
41
|
+
@id += " (all parts)"
|
42
|
+
end
|
38
43
|
end
|
39
44
|
|
40
45
|
#
|
41
46
|
# Add docidentifier xml element
|
42
47
|
#
|
43
|
-
# @param [
|
44
|
-
#
|
45
|
-
|
46
|
-
|
48
|
+
# @param opts [Hash]
|
49
|
+
# @option opts [Nokogiri::XML::Builder] :builder XML builder
|
50
|
+
# @option opts [String] :lang language
|
51
|
+
def to_xml(**opts) # rubocop:disable Metrics/AbcSize
|
52
|
+
lid = if type == "URN" && opts[:lang]
|
53
|
+
id.sub %r{(?<=:)(?:\w{2},)*?(#{opts[:lang]})(?:,\w{2})*}, '\1'
|
54
|
+
else id
|
55
|
+
end
|
56
|
+
element = opts[:builder].docidentifier lid
|
47
57
|
element[:type] = type if type
|
48
58
|
element[:scope] = scope if scope
|
49
59
|
end
|
@@ -67,5 +77,24 @@ module RelatonBib
|
|
67
77
|
out += "#{pref}docid.id:: #{id}\n"
|
68
78
|
out
|
69
79
|
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def remove_urn_part # rubocop:disable Metrics/MethodLength
|
84
|
+
@id.sub!(%r{^
|
85
|
+
(urn:iso:std:[^:]+ # ISO prefix and originator
|
86
|
+
(?::(?:data|guide|isp|iwa|pas|r|tr|ts|tta)) # type
|
87
|
+
?:\d+) # docnumber
|
88
|
+
(?::-[^:]+)? # partnumber
|
89
|
+
(?::(draft|cancelled|stage-[^:]+))? # status
|
90
|
+
(?::ed-\d+)?(?::v[^:]+)? # edition and version
|
91
|
+
(?::\w{2}(?:,\w{2})*)? # langauge
|
92
|
+
}x, '\1') # remove partnumber, status, version, and language
|
93
|
+
@id.sub!(%r{^
|
94
|
+
(urn:iec:std:[^:]+ # IEC prefix and originator
|
95
|
+
:\d+) # docnumber
|
96
|
+
(?:-[^:]+)? # partnumber
|
97
|
+
}x, '\1') # remove partnumber
|
98
|
+
end
|
70
99
|
end
|
71
100
|
end
|
@@ -63,7 +63,7 @@ module RelatonBib
|
|
63
63
|
opts.delete :note
|
64
64
|
builder.relation(type: type) do
|
65
65
|
builder.description { description.to_xml builder } if description
|
66
|
-
bibitem.to_xml(
|
66
|
+
bibitem.to_xml(**opts.merge(builder: builder, embedded: true))
|
67
67
|
locality.each { |l| l.to_xml builder }
|
68
68
|
source_locality.each { |l| l.to_xml builder }
|
69
69
|
end
|
@@ -71,7 +71,7 @@ module RelatonBib
|
|
71
71
|
# rubocop:enable Metrics/AbcSize
|
72
72
|
|
73
73
|
# @return [Hash]
|
74
|
-
def to_hash
|
74
|
+
def to_hash # rubocop:disable Metrics/AbcSize
|
75
75
|
hash = { "type" => type, "bibitem" => bibitem.to_hash }
|
76
76
|
hash["description"] = description.to_hash if description
|
77
77
|
hash["locality"] = single_element_array(locality) if locality&.any?
|
@@ -58,7 +58,8 @@ module RelatonBib
|
|
58
58
|
def title_hash_to_bib(ret)
|
59
59
|
return unless ret[:title]
|
60
60
|
|
61
|
-
ret[:title] = array(ret[:title])
|
61
|
+
ret[:title] = array(ret[:title])
|
62
|
+
.reduce(TypedTitleStringCollection.new) do |m, t|
|
62
63
|
if t.is_a?(Hash) then m << t
|
63
64
|
else
|
64
65
|
m + TypedTitleString.from_string(t)
|
@@ -139,20 +140,14 @@ module RelatonBib
|
|
139
140
|
)
|
140
141
|
end
|
141
142
|
|
142
|
-
def biblionote_hash_to_bib(ret) # rubocop:disable Metrics/MethodLength
|
143
|
+
def biblionote_hash_to_bib(ret) # rubocop:disable Metrics/MethodLength,Metrics/AbcSize
|
143
144
|
return unless ret[:biblionote]
|
144
145
|
|
145
146
|
ret[:biblionote] = array(ret[:biblionote])
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
BiblioNote.new(
|
151
|
-
content: n[:content], type: n[:type],
|
152
|
-
language: n[:language], script: n[:script],
|
153
|
-
format: n[:format]
|
154
|
-
)
|
155
|
-
end
|
147
|
+
.reduce(BiblioNoteCollection.new([])) do |mem, n|
|
148
|
+
mem << if n.is_a?(String) then BiblioNote.new content: n
|
149
|
+
else BiblioNote.new(n)
|
150
|
+
end
|
156
151
|
end
|
157
152
|
end
|
158
153
|
|
@@ -178,7 +173,7 @@ module RelatonBib
|
|
178
173
|
DocumentStatus::Stage.new(**args)
|
179
174
|
end
|
180
175
|
|
181
|
-
def contributors_hash_to_bib(ret) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
176
|
+
def contributors_hash_to_bib(ret) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength,Metrics/PerceivedComplexity
|
182
177
|
return unless ret[:contributor]
|
183
178
|
|
184
179
|
ret[:contributor] = array(ret[:contributor])
|
@@ -209,6 +204,9 @@ module RelatonBib
|
|
209
204
|
org[:identifier] = array(org[:identifier])&.map do |a|
|
210
205
|
OrgIdentifier.new(a[:type], a[:id])
|
211
206
|
end
|
207
|
+
org[:subdivision] = array(org[:subdivision]).map do |sd|
|
208
|
+
LocalizedString.new sd
|
209
|
+
end
|
212
210
|
org
|
213
211
|
end
|
214
212
|
|
data/lib/relaton_bib/hit.rb
CHANGED
@@ -20,7 +20,7 @@ module RelatonBib
|
|
20
20
|
|
21
21
|
# @return [String]
|
22
22
|
def inspect
|
23
|
-
"<#{self.class}:#{format('
|
23
|
+
"<#{self.class}:#{format('%<id>#.14x', id: object_id << 1)} "\
|
24
24
|
"@text=\"#{@hit_collection&.text}\" "\
|
25
25
|
"@fetched=\"#{!@fetch.nil?}\" "\
|
26
26
|
"@fullIdentifier=\"#{@fetch&.shortref(nil)}\" "\
|
@@ -31,13 +31,17 @@ module RelatonBib
|
|
31
31
|
raise "Not implemented"
|
32
32
|
end
|
33
33
|
|
34
|
-
# @param
|
35
|
-
|
36
|
-
|
37
|
-
|
34
|
+
# @param opts [Hash]
|
35
|
+
# @option opts [Nokogiri::XML::Builder] :builder XML builder
|
36
|
+
# @option opts [Boolean] :bibdata
|
37
|
+
# @option opts [String, Symbol] :lang language
|
38
|
+
# @return [String] XML
|
39
|
+
def to_xml(**opts)
|
40
|
+
if opts[:builder]
|
41
|
+
fetch.to_xml **opts
|
38
42
|
else
|
39
43
|
builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml|
|
40
|
-
fetch.to_xml
|
44
|
+
fetch.to_xml **opts.merge(builder: xml)
|
41
45
|
end
|
42
46
|
builder.doc.root.to_xml
|
43
47
|
end
|
@@ -36,12 +36,17 @@ module RelatonBib
|
|
36
36
|
self
|
37
37
|
end
|
38
38
|
|
39
|
+
# @param opts [Hash]
|
40
|
+
# @option opts [Nokogiri::XML::Builder] :builder XML builder
|
41
|
+
# @option opts [Boolean] :bibdata
|
42
|
+
# @option opts [String, Symbol] :lang language
|
43
|
+
# @return [String] XML
|
39
44
|
def to_xml(**opts)
|
40
45
|
builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml|
|
41
46
|
xml.documents do
|
42
47
|
@array.each do |hit|
|
43
48
|
hit.fetch
|
44
|
-
hit.to_xml
|
49
|
+
hit.to_xml **opts.merge(builder: xml)
|
45
50
|
end
|
46
51
|
end
|
47
52
|
end
|
@@ -49,8 +54,8 @@ module RelatonBib
|
|
49
54
|
end
|
50
55
|
|
51
56
|
def select(&block)
|
52
|
-
me =
|
53
|
-
array_dup =
|
57
|
+
me = deep_dup
|
58
|
+
array_dup = instance_variable_get(:@array).deep_dup
|
54
59
|
me.instance_variable_set(:@array, array_dup)
|
55
60
|
array_dup.select!(&block)
|
56
61
|
me
|
@@ -49,7 +49,7 @@ module RelatonBib
|
|
49
49
|
end
|
50
50
|
|
51
51
|
# @param builder [Nokogiri::XML::Builder]
|
52
|
-
def to_xml(builder) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
52
|
+
def to_xml(builder) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
53
53
|
return unless content
|
54
54
|
|
55
55
|
if content.is_a?(Array)
|
@@ -62,7 +62,7 @@ module RelatonBib
|
|
62
62
|
end
|
63
63
|
|
64
64
|
# @return [Hash]
|
65
|
-
def to_hash # rubocop:disable Metrics/AbcSize,
|
65
|
+
def to_hash # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
66
66
|
if content.is_a? String
|
67
67
|
return content unless language || script
|
68
68
|
|
@@ -77,7 +77,7 @@ module RelatonBib
|
|
77
77
|
# @param prefix [String]
|
78
78
|
# @param count [Integer] number of elements
|
79
79
|
# @return [String]
|
80
|
-
def to_asciibib(prefix = "", count = 1) # rubocop:disable Metrics/AbcSize,
|
80
|
+
def to_asciibib(prefix = "", count = 1) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
81
81
|
pref = prefix.empty? ? prefix : prefix + "."
|
82
82
|
if content.is_a? String
|
83
83
|
out = count > 1 ? "#{prefix}::\n" : ""
|
@@ -55,7 +55,7 @@ module RelatonBib
|
|
55
55
|
# @return [RelatonBib::LocalizedString, NilClass]
|
56
56
|
attr_reader :abbreviation
|
57
57
|
|
58
|
-
# @return [RelatonBib::LocalizedString
|
58
|
+
# @return [Array<RelatonBib::LocalizedString>]
|
59
59
|
attr_reader :subdivision
|
60
60
|
|
61
61
|
# @return [Array<RelatonBib::OrgIdentifier>]
|
@@ -63,11 +63,11 @@ module RelatonBib
|
|
63
63
|
|
64
64
|
# @param name [String, Hash, Array<String, Hash>]
|
65
65
|
# @param abbreviation [RelatoBib::LocalizedString, String]
|
66
|
-
# @param subdivision [RelatoBib::LocalizedString
|
66
|
+
# @param subdivision [Array<RelatoBib::LocalizedString>]
|
67
67
|
# @param url [String]
|
68
68
|
# @param identifier [Array<RelatonBib::OrgIdentifier>]
|
69
69
|
# @param contact [Array<RelatonBib::Address, RelatonBib::Contact>]
|
70
|
-
def initialize(**args) # rubocop:disable Metrics/AbcSize
|
70
|
+
def initialize(**args) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
|
71
71
|
raise ArgumentError, "missing keyword: name" unless args[:name]
|
72
72
|
|
73
73
|
super(url: args[:url], contact: args.fetch(:contact, []))
|
@@ -79,17 +79,23 @@ module RelatonBib
|
|
79
79
|
end
|
80
80
|
|
81
81
|
@abbreviation = localized_string args[:abbreviation]
|
82
|
-
@subdivision =
|
82
|
+
@subdivision = (args[:subdivision] || []).map do |sd|
|
83
|
+
localized_string sd
|
84
|
+
end
|
83
85
|
@identifier = args.fetch(:identifier, [])
|
84
86
|
end
|
85
87
|
|
86
|
-
# @param
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
88
|
+
# @param opts [Hash]
|
89
|
+
# @option opts [Nokogiri::XML::Builder] :builder XML builder
|
90
|
+
# @option opts [String] :lang language
|
91
|
+
def to_xml(**opts) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity,Metrics/MethodLength
|
92
|
+
opts[:builder].organization do |builder|
|
93
|
+
nm = name.select { |n| n.language&.include? opts[:lang] }
|
94
|
+
nm = name unless nm.any?
|
95
|
+
nm.each { |n| builder.name { |b| n.to_xml b } }
|
96
|
+
sbdv = subdivision.select { |sd| sd.language&.include? opts[:lang] }
|
97
|
+
sbdv = subdivision unless sbdv.any?
|
98
|
+
sbdv.each { |sd| builder.subdivision { sd.to_xml builder } }
|
93
99
|
builder.abbreviation { |a| abbreviation.to_xml a } if abbreviation
|
94
100
|
builder.uri url if uri
|
95
101
|
identifier.each { |identifier| identifier.to_xml builder }
|
@@ -98,23 +104,28 @@ module RelatonBib
|
|
98
104
|
end
|
99
105
|
|
100
106
|
# @return [Hash]
|
101
|
-
def to_hash
|
107
|
+
def to_hash # rubocop:disable Metrics/AbcSize
|
102
108
|
hash = { "name" => single_element_array(name) }
|
103
109
|
hash["abbreviation"] = abbreviation.to_hash if abbreviation
|
104
110
|
hash["identifier"] = single_element_array(identifier) if identifier&.any?
|
105
|
-
|
111
|
+
if subdivision&.any?
|
112
|
+
hash["subdivision"] = single_element_array(subdivision)
|
113
|
+
end
|
106
114
|
{ "organization" => hash.merge(super) }
|
107
115
|
end
|
108
116
|
|
109
117
|
# @param prefix [String]
|
110
118
|
# @param count [Integer]
|
111
119
|
# @return [String]
|
112
|
-
def to_asciibib(prefix = "", count = 1) # rubocop:disable Metrics/AbcSize,
|
120
|
+
def to_asciibib(prefix = "", count = 1) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength
|
113
121
|
pref = prefix.sub /\*$/, "organization"
|
114
122
|
out = count > 1 ? "#{pref}::\m" : ""
|
115
123
|
name.each { |n| out += n.to_asciibib "#{pref}.name", name.size }
|
116
124
|
out += abbreviation.to_asciibib "#{pref}.abbreviation" if abbreviation
|
117
|
-
|
125
|
+
subdivision.each do |sd|
|
126
|
+
out += "#{pref}.subdivision::" if subdivision.size > 1
|
127
|
+
out += sd.to_asciibib "#{pref}.subdivision"
|
128
|
+
end
|
118
129
|
identifier.each { |n| out += n.to_asciibib pref, identifier.size }
|
119
130
|
out += super pref
|
120
131
|
out
|
data/lib/relaton_bib/person.rb
CHANGED
@@ -44,23 +44,33 @@ module RelatonBib
|
|
44
44
|
@completename = args[:completename]
|
45
45
|
end
|
46
46
|
|
47
|
-
# @param
|
48
|
-
|
49
|
-
|
47
|
+
# @param opts [Hash]
|
48
|
+
# @option opts [Nokogiri::XML::Builder] :builder XML builder
|
49
|
+
# @option opts [String] :lang language
|
50
|
+
def to_xml(**opts) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
51
|
+
opts[:builder].name do |builder|
|
50
52
|
if completename
|
51
53
|
builder.completename { completename.to_xml builder }
|
52
54
|
else
|
53
|
-
prefix.
|
54
|
-
|
55
|
-
|
55
|
+
pref = prefix.select { |p| p.language&.include? opts[:lang] }
|
56
|
+
pref = prefix unless pref.any?
|
57
|
+
pref.each { |p| builder.prefix { p.to_xml builder } }
|
58
|
+
frnm = forename.select { |f| f.language&.include? opts[:lang] }
|
59
|
+
frnm = forename unless frnm.any?
|
60
|
+
frnm.each { |f| builder.forename { f.to_xml builder } }
|
61
|
+
init = initial.select { |i| i.language&.include? opts[:lang] }
|
62
|
+
init = initial unless init.any?
|
63
|
+
init.each { |i| builder.initial { i.to_xml builder } }
|
56
64
|
builder.surname { surname.to_xml builder }
|
57
|
-
addition.
|
65
|
+
addn = addition.select { |a| a.language&.include? opts[:lang] }
|
66
|
+
addn = addition unless addn.any?
|
67
|
+
addn.each { |a| builder.addition { a.to_xml builder } }
|
58
68
|
end
|
59
69
|
end
|
60
70
|
end
|
61
71
|
|
62
72
|
# @return [Hash]
|
63
|
-
def to_hash # rubocop:disable Metrics/AbcSize,
|
73
|
+
def to_hash # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
64
74
|
hash = {}
|
65
75
|
hash["forename"] = single_element_array(forename) if forename&.any?
|
66
76
|
hash["initial"] = single_element_array(initial) if initial&.any?
|
@@ -73,7 +83,7 @@ module RelatonBib
|
|
73
83
|
|
74
84
|
# @param pref [String]
|
75
85
|
# @return [String]
|
76
|
-
def to_asciibib(pref) # rubocop:disable Metrics/AbcSize,
|
86
|
+
def to_asciibib(pref) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
77
87
|
prf = pref.empty? ? pref : pref + "."
|
78
88
|
prf += "name."
|
79
89
|
out = forename.map do |fn|
|
@@ -170,11 +180,13 @@ module RelatonBib
|
|
170
180
|
@identifier = identifier
|
171
181
|
end
|
172
182
|
|
173
|
-
# @param
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
183
|
+
# @param opts [Hash]
|
184
|
+
# @option opts [Nokogiri::XML::Builder] :builder XML builder
|
185
|
+
# @option opts [String, Symbol] :lang language
|
186
|
+
def to_xml(**opts)
|
187
|
+
opts[:builder].person do |builder|
|
188
|
+
name.to_xml **opts
|
189
|
+
affiliation.each { |a| a.to_xml **opts }
|
178
190
|
identifier.each { |id| id.to_xml builder }
|
179
191
|
contact.each { |contact| contact.to_xml builder }
|
180
192
|
end
|