relaton-bib 1.3.1 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|