relaton-iso-bib 0.1.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 +7 -0
- data/.gitignore +13 -0
- data/.rspec +3 -0
- data/.rubocop.yml +10 -0
- data/.travis.yml +14 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +78 -0
- data/LICENSE.txt +21 -0
- data/README.adoc +419 -0
- data/README.md +39 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/relaton_iso_bib/editorial_group.rb +95 -0
- data/lib/relaton_iso_bib/ics.rb +25 -0
- data/lib/relaton_iso_bib/iso_bibliographic_item.rb +357 -0
- data/lib/relaton_iso_bib/iso_document_relation.rb +13 -0
- data/lib/relaton_iso_bib/structured_identifier.rb +71 -0
- data/lib/relaton_iso_bib/typed_title_string.rb +32 -0
- data/lib/relaton_iso_bib/version.rb +3 -0
- data/lib/relaton_iso_bib/xml_parser.rb +89 -0
- data/lib/relaton_iso_bib.rb +7 -0
- data/relaton_iso_bib.gemspec +40 -0
- metadata +234 -0
data/README.md
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# RelatonIsoBib
|
2
|
+
|
3
|
+
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/relaton_iso_bib`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
|
+
|
5
|
+
TODO: Delete this and the text above, and describe your gem
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'relaton_iso_bib'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install relaton_iso_bib
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
TODO: Write usage instructions here
|
26
|
+
|
27
|
+
## Development
|
28
|
+
|
29
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
30
|
+
|
31
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
|
+
|
33
|
+
## Contributing
|
34
|
+
|
35
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/relaton_iso_bib.
|
36
|
+
|
37
|
+
## License
|
38
|
+
|
39
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "relaton_iso_bib"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RelatonIsoBib
|
4
|
+
# ISO project group.
|
5
|
+
class EditorialGroup
|
6
|
+
# @return [Array<RelatonIsoBib::IsoSubgroup>]
|
7
|
+
attr_reader :technical_committee
|
8
|
+
|
9
|
+
# @return [RelatonIsoBib::IsoSubgroup]
|
10
|
+
attr_reader :subcommittee
|
11
|
+
|
12
|
+
# @return [RelatonIsoBib::IsoSubgroup]
|
13
|
+
attr_reader :workgroup
|
14
|
+
|
15
|
+
# @return [String]
|
16
|
+
attr_reader :secretariat
|
17
|
+
|
18
|
+
# @param technical_committee [Array<Hash, RelatonIsoBib::IsoSubgroup>]
|
19
|
+
# @option technical_committee [String] :name
|
20
|
+
# @option technical_committee [String] :type
|
21
|
+
# @option technical_committee [Integer] :number
|
22
|
+
#
|
23
|
+
# @param subcommittee [Array<Hash, RelatonIsoBib::IsoSubgroup>]
|
24
|
+
# @option subcommittee [String] :name
|
25
|
+
# @option subcommittee [String] :type
|
26
|
+
# @option subcommittee [Integer] :number
|
27
|
+
#
|
28
|
+
# @param workgroup [Array<Hash, RelatonIsoBib::IsoSubgroup>]
|
29
|
+
# @option workgroup [String] :name
|
30
|
+
# @option workgroup [String] :type
|
31
|
+
# @option workgroup [Integer] :number
|
32
|
+
#
|
33
|
+
# @param secretariat [String, NilClass]
|
34
|
+
def initialize(technical_committee:, **args)
|
35
|
+
@technical_committee = technical_committee.map do |tc|
|
36
|
+
tc.is_a?(Hash) ? IsoSubgroup.new(tc) : tc
|
37
|
+
end
|
38
|
+
@subcommittee = args.fetch(:subcommittee, []).map do |sc|
|
39
|
+
sc.is_a?(Hash) ? IsoSubgroup.new(sc) : sc
|
40
|
+
end
|
41
|
+
@workgroup = args.fetch(:workgroup, []).map do |wg|
|
42
|
+
wg.is_a?(Hash) ? IsoSubgroup.new(wg) : wg
|
43
|
+
end
|
44
|
+
@secretariat = args[:secretariat]
|
45
|
+
end
|
46
|
+
|
47
|
+
# rubocop:disable Metrics/AbcSize
|
48
|
+
|
49
|
+
# @param builder [Nokogiri::XML::Builder]
|
50
|
+
def to_xml(builder)
|
51
|
+
return unless technical_committee || subcommittee || workgroup || secretariat
|
52
|
+
builder.editorialgroup do
|
53
|
+
technical_committee.each do |tc|
|
54
|
+
builder.technical_committee { tc.to_xml builder }
|
55
|
+
end
|
56
|
+
subcommittee.each do |sc|
|
57
|
+
builder.subcommittee { sc.to_xml builder }
|
58
|
+
end
|
59
|
+
workgroup.each do |wg|
|
60
|
+
builder.workgroup { wg.to_xml builder }
|
61
|
+
end
|
62
|
+
builder.secretariat secretariat if secretariat
|
63
|
+
end
|
64
|
+
end
|
65
|
+
# rubocop:enable Metrics/AbcSize
|
66
|
+
end
|
67
|
+
|
68
|
+
# ISO subgroup.
|
69
|
+
class IsoSubgroup
|
70
|
+
# @return [String, NilClass]
|
71
|
+
attr_reader :type
|
72
|
+
|
73
|
+
# @return [Integer, NilClass]
|
74
|
+
attr_reader :number
|
75
|
+
|
76
|
+
# @return [String]
|
77
|
+
attr_reader :name
|
78
|
+
|
79
|
+
# @param name [String]
|
80
|
+
# @param type [String, NilClass]
|
81
|
+
# @param number [Integer, NilClass]
|
82
|
+
def initialize(name:, type: nil, number: nil)
|
83
|
+
@name = name
|
84
|
+
@type = type
|
85
|
+
@number = number
|
86
|
+
end
|
87
|
+
|
88
|
+
# @param builder [Nokogiri::XML::Builder]
|
89
|
+
def to_xml(builder)
|
90
|
+
builder.parent[:number] = number if number
|
91
|
+
builder.parent[:type] = type if type
|
92
|
+
builder.text name
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module RelatonIsoBib
|
2
|
+
# Iso ICS classificator.
|
3
|
+
class Ics < Isoics::ICS
|
4
|
+
# @param code [String, NilClass]
|
5
|
+
# @param field [Integer, NilClass]
|
6
|
+
# @param group [Integer, NilClass]
|
7
|
+
# @param subgroup [Integer, NilClass]
|
8
|
+
def initialize(code = nil, field: nil, group: nil, subgroup: nil)
|
9
|
+
unless code || field
|
10
|
+
raise ArgumentError, "wrong arguments (should be string or { fieldcode: [String] }"
|
11
|
+
end
|
12
|
+
|
13
|
+
field, group, subgroup = code.split '.' if code
|
14
|
+
super fieldcode: field, groupcode: group, subgroupcode: subgroup
|
15
|
+
end
|
16
|
+
|
17
|
+
# @param builder [Nokogiri::XML::Builder]
|
18
|
+
def to_xml(builder)
|
19
|
+
builder.ics do
|
20
|
+
builder.code code
|
21
|
+
builder.text_ description
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,357 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
|
3
|
+
require "nokogiri"
|
4
|
+
require "isoics"
|
5
|
+
require "deep_clone"
|
6
|
+
require "relaton_bib"
|
7
|
+
require "relaton_iso_bib/typed_title_string"
|
8
|
+
require "relaton_iso_bib/editorial_group"
|
9
|
+
require "relaton_iso_bib/xml_parser"
|
10
|
+
require "relaton_iso_bib/structured_identifier"
|
11
|
+
require "relaton_iso_bib/ics"
|
12
|
+
|
13
|
+
# Add filter method to Array.
|
14
|
+
class Array
|
15
|
+
# @param type [String]
|
16
|
+
# @return [Array]
|
17
|
+
def filter(type:)
|
18
|
+
select { |e| e.type == type }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
module RelatonIsoBib
|
23
|
+
# Bibliographic item.
|
24
|
+
class IsoBibliographicItem < RelatonBib::BibliographicItem
|
25
|
+
TYPES = %w[
|
26
|
+
international-standard technical-specification technical-report
|
27
|
+
publicly-available-specification international-workshop-agreement guide
|
28
|
+
].freeze
|
29
|
+
|
30
|
+
# @return [RelatonIsoBib::StructuredIdentifier]
|
31
|
+
attr_reader :structuredidentifier
|
32
|
+
|
33
|
+
# @!attribute [r] title
|
34
|
+
# @return [Array<RelatonIsoBib::TypedTitleString>]
|
35
|
+
|
36
|
+
# @return [String, NilClass]
|
37
|
+
attr_reader :doctype
|
38
|
+
|
39
|
+
# @return [RelatonIsoBib::EditorialGroup]
|
40
|
+
attr_reader :editorialgroup
|
41
|
+
|
42
|
+
# @return [Array<RelatonIsoBib::Ics>]
|
43
|
+
attr_reader :ics
|
44
|
+
|
45
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
46
|
+
# rubocop:disable Metrics/MethodLength, Metrics/PerceivedComplexity
|
47
|
+
|
48
|
+
# @param edition [String]
|
49
|
+
# @param docnumber [String, NilClass]
|
50
|
+
# @param language [Array<String>]
|
51
|
+
# @param script [Arrra<String>]
|
52
|
+
# @param docstatus [RelatonBib::DocumentStatus, NilClass]
|
53
|
+
# @param type [String, NilClass]
|
54
|
+
# @param formattedref [RelatonBib::FormattedRef, NilClass]
|
55
|
+
# @param version [RelatonBib::BibliographicItem::Version, NilClass]
|
56
|
+
# @param biblionote [Array<RelatonBib::BiblioNote>]
|
57
|
+
# @param series [Array<RelatonBib::Series>]
|
58
|
+
# @param medium [RelatonBib::Medium, NilClas]
|
59
|
+
# @param place [Array<String>]
|
60
|
+
# @param extent [Array<Relaton::BibItemLocality>]
|
61
|
+
# @param accesslocation [Array<String>]
|
62
|
+
# @param classification [RelatonBib::Classification, NilClass]
|
63
|
+
# @param validity [RelatonBib:Validity, NilClass]
|
64
|
+
# @param docid [Array<RelatonBib::DocumentIdentifier>]
|
65
|
+
# @param structuredidentifier [RelatonIsoBib::StructuredIdentifier]
|
66
|
+
#
|
67
|
+
# @param titles [Array<Hash>]
|
68
|
+
# @option titles [String] :title_intro
|
69
|
+
# @option titles [String] :title_main
|
70
|
+
# @option titles [String] :title_part
|
71
|
+
# @option titles [String] :language
|
72
|
+
# @option titles [String] :script
|
73
|
+
#
|
74
|
+
# @param editorialgroup [Hash, RelatonIsoBib::EditorialGroup]
|
75
|
+
# @option workgrpup [String] :name
|
76
|
+
# @option workgrpup [String] :abbreviation
|
77
|
+
# @option workgrpup [String] :url
|
78
|
+
# @option workgrpup [Hash] :technical_committee
|
79
|
+
# @option technical_committee [String] :name
|
80
|
+
# @option technical_committee [String] :type
|
81
|
+
# @option technical_committee [Integer] :number
|
82
|
+
#
|
83
|
+
# @param ics [Array<Hash>]
|
84
|
+
# @option ics [Integer] :field
|
85
|
+
# @option ics [Integer] :group
|
86
|
+
# @option ics [Integer] :subgroup
|
87
|
+
#
|
88
|
+
# @param dates [Array<Hash>]
|
89
|
+
# @option dates [String] :type
|
90
|
+
# @option dates [String] :from
|
91
|
+
# @option dates [String] :to
|
92
|
+
#
|
93
|
+
# @param abstract [Array<Hash>]
|
94
|
+
# @option abstract [String] :content
|
95
|
+
# @option abstract [String] :language
|
96
|
+
# @option abstract [String] :script
|
97
|
+
# @option abstract [String] :type
|
98
|
+
#
|
99
|
+
# @param contributors [Array<Hash>]
|
100
|
+
# @option contributors [Hash] :entity
|
101
|
+
# @option entity [String] :name
|
102
|
+
# @option entity [String] :url
|
103
|
+
# @option entity [String] :abbreviation
|
104
|
+
# @option contributors [Array<String>] :roles
|
105
|
+
#
|
106
|
+
# @param copyright [Hash]
|
107
|
+
# @option copyright [Hash] :owner
|
108
|
+
# @option owner [String] :name
|
109
|
+
# @option owner [String] :abbreviation
|
110
|
+
# @option owner [String] :url
|
111
|
+
# @option copyright [String] :from
|
112
|
+
# @option copyright [String] :to
|
113
|
+
#
|
114
|
+
# @param link [Array<Hash, RelatonIsoBib::TypedUri>]
|
115
|
+
# @option link [String] :type
|
116
|
+
# @option link [String] :content
|
117
|
+
#
|
118
|
+
# @param relations [Array<Hash>]
|
119
|
+
# @option relations [String] :type
|
120
|
+
# @option relations [RelatonIsoBib::IsoBibliographicItem] :bibitem
|
121
|
+
# @option relations [Array<RelatonBib::BibItemLocality>] :bib_locality
|
122
|
+
#
|
123
|
+
# @raise [ArgumentError]
|
124
|
+
def initialize(**args)
|
125
|
+
if args[:type] && !TYPES.include?(args[:type])
|
126
|
+
raise ArgumentError, "invalid type: #{args[:type]}"
|
127
|
+
end
|
128
|
+
|
129
|
+
args.fetch(:language, []).each do |lang|
|
130
|
+
unless %w[en fr].include? lang
|
131
|
+
raise ArgumentError, "invalid language: #{lang}"
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
args.fetch(:script, []).each do |scr|
|
136
|
+
raise ArgumentError, "invalid script: #{scr}" unless scr == "Latn"
|
137
|
+
end
|
138
|
+
|
139
|
+
super_args = args.select do |k|
|
140
|
+
%i[id docnumber language script docstatus dates abstract contributors
|
141
|
+
edition version relations biblionote series medium place copyright
|
142
|
+
link fetched docid formattedref extent accesslocation classification
|
143
|
+
validity].include? k
|
144
|
+
end
|
145
|
+
super(super_args)
|
146
|
+
|
147
|
+
@structuredidentifier = args[:structuredidentifier]
|
148
|
+
|
149
|
+
@title = args.fetch(:titles, []).reduce([]) do |a, t|
|
150
|
+
if t.is_a? Hash
|
151
|
+
a + typed_titles(t)
|
152
|
+
else
|
153
|
+
a << t
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
if args[:editorialgroup]
|
158
|
+
@editorialgroup = if args[:editorialgroup].is_a?(Hash)
|
159
|
+
EditorialGroup.new(args[:editorialgroup])
|
160
|
+
else args[:editorialgroup]
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
@doctype = args[:type]
|
165
|
+
@ics = args.fetch(:ics, []).map { |i| i.is_a?(Hash) ? Ics.new(i) : i }
|
166
|
+
@link = args.fetch(:link, []).map do |s|
|
167
|
+
s.is_a?(Hash) ? RelatonBib::TypedUri.new(s) : s
|
168
|
+
end
|
169
|
+
@id_attribute = true
|
170
|
+
end
|
171
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
172
|
+
# rubocop:enable Metrics/MethodLength, Metrics/PerceivedComplexity
|
173
|
+
|
174
|
+
def disable_id_attribute
|
175
|
+
@id_attribute = false
|
176
|
+
end
|
177
|
+
|
178
|
+
# remove title part components and abstract
|
179
|
+
def to_all_parts
|
180
|
+
me = DeepClone.clone(self)
|
181
|
+
me.disable_id_attribute
|
182
|
+
@relations << RelatonBib::DocumentRelation.new(
|
183
|
+
type: "partOf", bibitem: me,
|
184
|
+
)
|
185
|
+
@title.delete_if { |t| t.type == "title-part" }
|
186
|
+
@abstract = []
|
187
|
+
@docidentifier.each(&:remove_part)
|
188
|
+
@docidentifier.each(&:all_parts)
|
189
|
+
@structuredidentifier.remove_part
|
190
|
+
@structuredidentifier.all_parts
|
191
|
+
@all_parts = true
|
192
|
+
end
|
193
|
+
|
194
|
+
# convert ISO:yyyy reference to reference to most recent
|
195
|
+
# instance of reference, removing date-specific infomration:
|
196
|
+
# date of publication, abstracts. Make dated reference Instance relation
|
197
|
+
# of the redacated document
|
198
|
+
def to_most_recent_reference
|
199
|
+
me = DeepClone.clone(self)
|
200
|
+
me.disable_id_attribute
|
201
|
+
@relations << RelatonBib::DocumentRelation.new(type: "instance", bibitem: me)
|
202
|
+
@abstract = []
|
203
|
+
@dates = []
|
204
|
+
@docidentifier.each &:remove_date
|
205
|
+
@structuredidentifier.remove_date
|
206
|
+
@id&.sub! /-[12]\d\d\d/, ""
|
207
|
+
end
|
208
|
+
|
209
|
+
# @param lang [String] language code Iso639
|
210
|
+
# @return [Array<RelatonIsoBib::TypedTitleString>]
|
211
|
+
def title(lang: nil)
|
212
|
+
if lang
|
213
|
+
@title.select { |t| t.title.language.include? lang }
|
214
|
+
else
|
215
|
+
@title
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
# @param type [Symbol] type of url, can be :src/:obp/:rss
|
220
|
+
# @return [String]
|
221
|
+
def url(type = :src)
|
222
|
+
@link.detect { |s| s.type == type.to_s }.content.to_s
|
223
|
+
end
|
224
|
+
|
225
|
+
# @return [String]
|
226
|
+
def to_xml(builder = nil, **opts, &block)
|
227
|
+
if opts[:note] && !opts[:note].empty?
|
228
|
+
opts.fetch(:note, []).each do |n|
|
229
|
+
@biblionote << RelatonBib::BiblioNote.new(
|
230
|
+
content: n[:text], type: n[:type], format: "text/plain"
|
231
|
+
)
|
232
|
+
end
|
233
|
+
end
|
234
|
+
super builder, **opts do |b|
|
235
|
+
if opts[:bibdata]
|
236
|
+
b.ext do
|
237
|
+
b.doctype doctype if doctype
|
238
|
+
editorialgroup&.to_xml b
|
239
|
+
ics.each { |i| i.to_xml b }
|
240
|
+
structuredidentifier.to_xml b
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
private
|
247
|
+
|
248
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
249
|
+
|
250
|
+
# @param title [Hash]
|
251
|
+
# @option title [String] :title_intro
|
252
|
+
# @option title [String] :title_main
|
253
|
+
# @option title [String] :title_part
|
254
|
+
# @option title [String] :language
|
255
|
+
# @option title [String] :script
|
256
|
+
# @return [Array<RelatonIsoBib::TypedTitleStrig>]
|
257
|
+
def typed_titles(title)
|
258
|
+
titles = []
|
259
|
+
if title[:title_main]
|
260
|
+
titles << TypedTitleString.new(
|
261
|
+
type: "title-main", content: title[:title_main],
|
262
|
+
language: title[:language], script: title[:script], format: "text/plain",
|
263
|
+
)
|
264
|
+
end
|
265
|
+
|
266
|
+
if title[:title_intro]
|
267
|
+
titles << TypedTitleString.new(
|
268
|
+
type: "title-intro", content: title[:title_intro],
|
269
|
+
language: title[:language], script: title[:script], format: "text/plain",
|
270
|
+
)
|
271
|
+
end
|
272
|
+
|
273
|
+
if title[:title_part]
|
274
|
+
titles << TypedTitleString.new(
|
275
|
+
type: "title-part", content: title[:title_part],
|
276
|
+
language: title[:language], script: title[:script], format: "text/plain",
|
277
|
+
)
|
278
|
+
end
|
279
|
+
|
280
|
+
unless titles.empty?
|
281
|
+
titles << TypedTitleString.new(
|
282
|
+
type: "main", content: titles.map { |t| t.title.content }.join(" - "),
|
283
|
+
language: title[:language], script: title[:script], format: "text/plain",
|
284
|
+
)
|
285
|
+
end
|
286
|
+
|
287
|
+
titles
|
288
|
+
end
|
289
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
290
|
+
|
291
|
+
def makeid(id, attribute, _delim = '')
|
292
|
+
return nil if attribute && !@id_attribute
|
293
|
+
|
294
|
+
id ||= @docidentifier.reject { |i| i&.type == "DOI" }[0]
|
295
|
+
# contribs = publishers.map { |p| p&.entity&.abbreviation }.join '/'
|
296
|
+
# idstr = "#{contribs}#{delim}#{id.project_number}"
|
297
|
+
# idstr = id.project_number.to_s
|
298
|
+
if id
|
299
|
+
idstr = id.id
|
300
|
+
idstr = "IEV" if structuredidentifier&.project_number == "IEV"
|
301
|
+
else
|
302
|
+
idstr = formattedref&.content
|
303
|
+
end
|
304
|
+
# if id.part_number&.size&.positive? then idstr += "-#{id.part_number}"
|
305
|
+
idstr&.gsub(/:/, "-")&.gsub(/\s/, "")&.strip
|
306
|
+
end
|
307
|
+
|
308
|
+
# def xml_attrs(type)
|
309
|
+
# attrs = {}
|
310
|
+
# attrs[:type] = type if type
|
311
|
+
# # attr_id = makeid(nil, true)&.gsub(/ /, "")
|
312
|
+
# # attrs[:id] = attr_id if attr_id
|
313
|
+
# attrs
|
314
|
+
# end
|
315
|
+
|
316
|
+
# @param builder [Nokogiri::XML::Builder]
|
317
|
+
# def render_xml(builder, **opts)
|
318
|
+
# builder.send("iso-standard", xml_attrs(type)) do
|
319
|
+
# builder.fetched fetched if fetched
|
320
|
+
# formattedref.to_xml builder if formattedref
|
321
|
+
# title.each { |t| t.to_xml builder }
|
322
|
+
# link.each { |s| s.to_xml builder }
|
323
|
+
# docidentifier.each { |i| i.to_xml builder }
|
324
|
+
# builder.docnumber docnumber if docnumber
|
325
|
+
# dates.each { |d| d.to_xml builder, opts }
|
326
|
+
# contributors.each do |c|
|
327
|
+
# builder.contributor do
|
328
|
+
# c.role.each { |r| r.to_xml builder }
|
329
|
+
# c.to_xml builder
|
330
|
+
# end
|
331
|
+
# end
|
332
|
+
# builder.edition edition if edition
|
333
|
+
# version.to_xml builder if version
|
334
|
+
# if opts[:note]
|
335
|
+
# builder.note("ISO DATE: #{opts[:note]}", format: 'text/plain')
|
336
|
+
# end
|
337
|
+
# language.each { |l| builder.language l }
|
338
|
+
# script.each { |s| builder.script s }
|
339
|
+
# abstract.each { |a| builder.abstract { a.to_xml(builder) } }
|
340
|
+
# status.to_xml builder if status
|
341
|
+
# copyright.to_xml builder if copyright
|
342
|
+
# relations.each { |r| r.to_xml builder }
|
343
|
+
# series.each { |s| s.to_xml builder } if series
|
344
|
+
# medium.to_xml builder if medium
|
345
|
+
# place.each { |pl| builder.place pl }
|
346
|
+
# extent.each { |e| e.to_xml builder }
|
347
|
+
# accesslocation.each { |al| builder.accesslocation al }
|
348
|
+
# classification.to_xml builder if classification
|
349
|
+
# validity.to_xml builder if validity
|
350
|
+
# editorialgroup.to_xml builder if editorialgroup
|
351
|
+
# ics.each { |i| i.to_xml builder }
|
352
|
+
# builder.allparts 'true' if @all_parts
|
353
|
+
# yield(builder) if block_given?
|
354
|
+
# end
|
355
|
+
# end
|
356
|
+
end
|
357
|
+
end
|