im_onix 1.0.2 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -0
- data/.yardopts +1 -0
- data/Gemfile +8 -0
- data/LICENSE.md +7 -0
- data/README.md +3 -3
- data/Rakefile +10 -0
- data/bin/html_codelist_to_yml.rb +14 -15
- data/bin/onix_bench.rb +1 -0
- data/bin/onix_pp.rb +4 -8
- data/bin/onix_serialize.rb +27 -0
- data/doc-src/handlers.rb +154 -0
- data/im_onix.gemspec +32 -0
- data/lib/im_onix.rb +0 -1
- data/lib/onix/addressee.rb +10 -0
- data/lib/onix/code.rb +108 -282
- data/lib/onix/collateral_detail.rb +24 -17
- data/lib/onix/collection.rb +38 -0
- data/lib/onix/collection_sequence.rb +7 -0
- data/lib/onix/contributor.rb +40 -39
- data/lib/onix/date.rb +73 -109
- data/lib/onix/descriptive_detail.rb +90 -417
- data/lib/onix/discount_coded.rb +3 -16
- data/lib/onix/entity.rb +28 -62
- data/lib/onix/epub_usage_constraint.rb +7 -0
- data/lib/onix/epub_usage_limit.rb +6 -0
- data/lib/onix/extent.rb +39 -0
- data/lib/onix/helper.rb +25 -25
- data/lib/onix/identifier.rb +13 -54
- data/lib/onix/language.rb +8 -0
- data/lib/onix/market.rb +5 -0
- data/lib/onix/market_publishing_detail.rb +20 -0
- data/lib/onix/onix21.rb +76 -139
- data/lib/onix/onix_message.rb +87 -100
- data/lib/onix/price.rb +19 -39
- data/lib/onix/product.rb +141 -637
- data/lib/onix/product_form_feature.rb +7 -0
- data/lib/onix/product_part.rb +89 -0
- data/lib/onix/product_supplies_extractor.rb +275 -0
- data/lib/onix/product_supply.rb +17 -58
- data/lib/onix/publishing_detail.rb +16 -32
- data/lib/onix/related_material.rb +4 -3
- data/lib/onix/related_product.rb +9 -29
- data/lib/onix/related_work.rb +3 -17
- data/lib/onix/sales_outlet.rb +2 -10
- data/lib/onix/sales_restriction.rb +8 -21
- data/lib/onix/sales_rights.rb +1 -5
- data/lib/onix/sender.rb +12 -0
- data/lib/onix/serializer.rb +156 -0
- data/lib/onix/subject.rb +9 -30
- data/lib/onix/subset.rb +88 -78
- data/lib/onix/supply_detail.rb +42 -0
- data/lib/onix/supporting_resource.rb +29 -86
- data/lib/onix/tax.rb +9 -18
- data/lib/onix/territory.rb +23 -17
- data/lib/onix/title_detail.rb +22 -0
- data/lib/onix/title_element.rb +32 -0
- data/lib/onix/website.rb +3 -16
- metadata +53 -34
@@ -1,438 +1,74 @@
|
|
1
|
-
require 'onix/
|
1
|
+
require 'onix/collection'
|
2
|
+
require 'onix/collection_sequence'
|
3
|
+
require 'onix/epub_usage_constraint'
|
4
|
+
require 'onix/epub_usage_limit'
|
5
|
+
require 'onix/extent'
|
6
|
+
require 'onix/language'
|
7
|
+
require 'onix/product_form_feature'
|
8
|
+
require 'onix/product_part'
|
9
|
+
require 'onix/title_detail'
|
10
|
+
require 'onix/contributor'
|
11
|
+
require 'onix/subject'
|
2
12
|
|
3
13
|
module ONIX
|
4
|
-
class TitleElement < SubsetDSL
|
5
|
-
element "TitleElementLevel", :subset
|
6
|
-
element "TitleText", :text
|
7
|
-
element "TitlePrefix", :text
|
8
|
-
element "TitleWithoutPrefix", :text
|
9
|
-
element "Subtitle", :text
|
10
|
-
element "PartNumber", :integer
|
11
|
-
element "SequenceNumber", :integer
|
12
|
-
|
13
|
-
scope :product_level, lambda { human_code_match(:title_element_level, /Product/)}
|
14
|
-
scope :collection_level, lambda { human_code_match(:title_element_level, /collection/i)}
|
15
|
-
|
16
|
-
# shortcuts
|
17
|
-
def level
|
18
|
-
@title_element_level
|
19
|
-
end
|
20
|
-
|
21
|
-
# :category: High level
|
22
|
-
# flatten title string
|
23
|
-
def title
|
24
|
-
if @title_text
|
25
|
-
@title_text
|
26
|
-
else
|
27
|
-
if @title_without_prefix
|
28
|
-
if @title_prefix
|
29
|
-
"#{@title_prefix} #{@title_without_prefix}"
|
30
|
-
else
|
31
|
-
@title_without_prefix
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
class TitleDetail < SubsetDSL
|
39
|
-
element "TitleType", :subset
|
40
|
-
elements "TitleElement", :subset
|
41
|
-
|
42
|
-
scope :distinctive_title, lambda { human_code_match(:title_type, /DistinctiveTitle/)}
|
43
|
-
|
44
|
-
def type
|
45
|
-
@title_type
|
46
|
-
end
|
47
|
-
|
48
|
-
# :category: High level
|
49
|
-
# flatten title string
|
50
|
-
def title
|
51
|
-
title_element = @title_elements.product_level #select { |te| te.level.human=~/Product/ }
|
52
|
-
if title_element.size > 0
|
53
|
-
title_element.first.title
|
54
|
-
else
|
55
|
-
nil
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
class CollectionSequence < SubsetDSL
|
61
|
-
element "CollectionSequenceType", :subset
|
62
|
-
element "CollectionSequenceTypeName", :string
|
63
|
-
element "CollectionSequenceNumber", :string
|
64
|
-
|
65
|
-
def type
|
66
|
-
@collection_sequence_number
|
67
|
-
end
|
68
|
-
|
69
|
-
def number
|
70
|
-
@collection_sequence_number
|
71
|
-
end
|
72
|
-
|
73
|
-
def type_name
|
74
|
-
@collection_sequence_type_name
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
class Collection < SubsetDSL
|
79
|
-
element "CollectionType", :subset
|
80
|
-
elements "CollectionIdentifier", :subset
|
81
|
-
elements "TitleDetail", :subset
|
82
|
-
elements "CollectionSequence", :subset
|
83
|
-
|
84
|
-
scope :publisher, lambda { human_code_match(:collection_type, "PublisherCollection")}
|
85
|
-
|
86
|
-
# shortcuts
|
87
|
-
def type
|
88
|
-
@collection_type
|
89
|
-
end
|
90
|
-
|
91
|
-
def identifiers
|
92
|
-
@collection_identifiers
|
93
|
-
end
|
94
|
-
|
95
|
-
def sequences
|
96
|
-
@collection_sequences
|
97
|
-
end
|
98
|
-
|
99
|
-
# :category: High level
|
100
|
-
# collection title string
|
101
|
-
def title
|
102
|
-
if collection_title_element
|
103
|
-
collection_title_element.title
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
# :category: High level
|
108
|
-
# collection subtitle string
|
109
|
-
def subtitle
|
110
|
-
if collection_title_element
|
111
|
-
collection_title_element.subtitle
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
def collection_title_element
|
116
|
-
distinctive_title=@title_details.distinctive_title.first
|
117
|
-
#select { |td| td.type.human=~/DistinctiveTitle/}.first
|
118
|
-
if distinctive_title
|
119
|
-
distinctive_title.title_elements.collection_level.first
|
120
|
-
#select { |te| te.level.human=~/CollectionLevel/ or te.level.human=~/Subcollection/ }.first
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
end
|
125
|
-
|
126
|
-
# product part use full Product to provide file protection and file size
|
127
|
-
class ProductPart < SubsetDSL
|
128
|
-
include EanMethods
|
129
|
-
include ProprietaryIdMethods
|
130
|
-
|
131
|
-
elements "ProductIdentifier", :subset
|
132
|
-
element "ProductForm", :subset
|
133
|
-
element "ProductFormDescription", :text
|
134
|
-
elements "ProductFormDetail", :subset
|
135
|
-
elements "ProductContentType", :subset
|
136
|
-
element "NumberOfCopies", :integer
|
137
|
-
|
138
|
-
# shortcuts
|
139
|
-
def identifiers
|
140
|
-
@product_identifiers
|
141
|
-
end
|
142
|
-
|
143
|
-
def form
|
144
|
-
@product_form
|
145
|
-
end
|
146
|
-
|
147
|
-
def form_details
|
148
|
-
@product_form_details
|
149
|
-
end
|
150
|
-
|
151
|
-
def content_types
|
152
|
-
@product_content_types
|
153
|
-
end
|
154
|
-
|
155
|
-
# full Product if referenced in ONIXMessage
|
156
|
-
def product
|
157
|
-
@product
|
158
|
-
end
|
159
|
-
|
160
|
-
def product=v
|
161
|
-
@product=v
|
162
|
-
end
|
163
|
-
|
164
|
-
# this ProductPart is part of Product
|
165
|
-
def part_of
|
166
|
-
@part_of
|
167
|
-
end
|
168
|
-
|
169
|
-
def part_of=v
|
170
|
-
@part_of=v
|
171
|
-
end
|
172
|
-
|
173
|
-
# :category: High level
|
174
|
-
# digital file format string (Epub,Pdf,AmazonKindle)
|
175
|
-
def file_format
|
176
|
-
self.file_formats.first.human if self.file_formats.first
|
177
|
-
end
|
178
|
-
|
179
|
-
def file_mimetype
|
180
|
-
if self.file_formats.first
|
181
|
-
self.file_formats.first.mimetype
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
def file_formats
|
186
|
-
@product_form_details.select { |fd| fd.code =~ /^E1.*/ }
|
187
|
-
end
|
188
|
-
|
189
|
-
def reflowable?
|
190
|
-
return true if @product_form_details.select { |fd| fd.code == "E200" }.length > 0
|
191
|
-
return false if @product_form_details.select { |fd| fd.code == "E201" }.length > 0
|
192
|
-
end
|
193
|
-
|
194
|
-
# :category: High level
|
195
|
-
# part file description string
|
196
|
-
def file_description
|
197
|
-
@product_form_description
|
198
|
-
end
|
199
|
-
|
200
|
-
# :category: High level
|
201
|
-
# raw part file description string without HTML
|
202
|
-
def raw_file_description
|
203
|
-
if @product_form_description
|
204
|
-
Helper.strip_html(@product_form_description).gsub(/\s+/, " ").strip
|
205
|
-
else
|
206
|
-
nil
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
# :category: High level
|
211
|
-
# Protection type string (None, Watermarking, DRM, AdobeDRM)
|
212
|
-
def protection_type
|
213
|
-
if product
|
214
|
-
product.protection_type
|
215
|
-
else
|
216
|
-
if part_of
|
217
|
-
part_of.protection_type
|
218
|
-
else
|
219
|
-
nil
|
220
|
-
end
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
|
-
# :category: High level
|
225
|
-
# List of protections type string (None, Watermarking, DRM, AdobeDRM)
|
226
|
-
def protections
|
227
|
-
if product
|
228
|
-
product.protections
|
229
|
-
else
|
230
|
-
if part_of
|
231
|
-
part_of.protections
|
232
|
-
else
|
233
|
-
nil
|
234
|
-
end
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
|
-
# :category: High level
|
239
|
-
# digital file filesize in bytes
|
240
|
-
def filesize
|
241
|
-
if product
|
242
|
-
product.filesize
|
243
|
-
else
|
244
|
-
nil
|
245
|
-
end
|
246
|
-
end
|
247
|
-
end
|
248
|
-
|
249
|
-
class Extent < SubsetDSL
|
250
|
-
element "ExtentType", :subset
|
251
|
-
element "ExtentUnit", :subset
|
252
|
-
element "ExtentValue", :text
|
253
|
-
|
254
|
-
scope :filesize, lambda { human_code_match(:extent_type, /Filesize/)}
|
255
|
-
scope :page, lambda { human_code_match(:extent_type, /Page/)}
|
256
|
-
|
257
|
-
# shortcuts
|
258
|
-
def type
|
259
|
-
@extent_type
|
260
|
-
end
|
261
|
-
|
262
|
-
def unit
|
263
|
-
@extent_unit
|
264
|
-
end
|
265
|
-
|
266
|
-
def value
|
267
|
-
@extent_value
|
268
|
-
end
|
269
|
-
|
270
|
-
def bytes
|
271
|
-
case @extent_unit.human
|
272
|
-
when "Bytes"
|
273
|
-
@extent_value.to_i
|
274
|
-
when "Kbytes"
|
275
|
-
(@extent_value.to_f*1024).to_i
|
276
|
-
when "Mbytes"
|
277
|
-
(@extent_value.to_f*1024*1024).to_i
|
278
|
-
else
|
279
|
-
nil
|
280
|
-
end
|
281
|
-
end
|
282
|
-
|
283
|
-
def pages
|
284
|
-
if @extent_unit.human=="Pages"
|
285
|
-
@extent_value.to_i
|
286
|
-
else
|
287
|
-
nil
|
288
|
-
end
|
289
|
-
end
|
290
|
-
end
|
291
|
-
|
292
|
-
class EpubUsageLimit < SubsetDSL
|
293
|
-
element "EpubUsageUnit", :subset
|
294
|
-
element "Quantity", :integer
|
295
|
-
|
296
|
-
def unit
|
297
|
-
@epub_usage_unit
|
298
|
-
end
|
299
|
-
end
|
300
|
-
|
301
|
-
class EpubUsageConstraint < SubsetDSL
|
302
|
-
element "EpubUsageType", :subset
|
303
|
-
element "EpubUsageStatus", :subset
|
304
|
-
elements "EpubUsageLimit", :subset
|
305
|
-
|
306
|
-
# shortcuts
|
307
|
-
def type
|
308
|
-
@epub_usage_type
|
309
|
-
end
|
310
|
-
|
311
|
-
def status
|
312
|
-
@epub_usage_status
|
313
|
-
end
|
314
|
-
|
315
|
-
def limits
|
316
|
-
@epub_usage_limits
|
317
|
-
end
|
318
|
-
end
|
319
|
-
|
320
|
-
class Language < SubsetDSL
|
321
|
-
element "LanguageRole", :subset
|
322
|
-
element "LanguageCode", :subset
|
323
|
-
|
324
|
-
scope :of_text, lambda{human_code_match(:language_role, "LanguageOfText")}
|
325
|
-
|
326
|
-
# shortcuts
|
327
|
-
def role
|
328
|
-
@language_role
|
329
|
-
end
|
330
|
-
|
331
|
-
def code
|
332
|
-
@language_code
|
333
|
-
end
|
334
|
-
end
|
335
|
-
|
336
|
-
class ProductFormFeature < SubsetDSL
|
337
|
-
element "ProductFormFeatureType", :subset
|
338
|
-
element "ProductFormFeatureValue", :text
|
339
|
-
elements "ProductFormFeatureDescription", :text
|
340
|
-
|
341
|
-
# shortcuts
|
342
|
-
def type
|
343
|
-
@product_form_feature_type
|
344
|
-
end
|
345
|
-
|
346
|
-
def value
|
347
|
-
@product_form_feature_value
|
348
|
-
end
|
349
|
-
|
350
|
-
def descriptions
|
351
|
-
@product_form_feature_descriptions
|
352
|
-
end
|
353
|
-
end
|
354
|
-
|
355
14
|
class DescriptiveDetail < SubsetDSL
|
356
|
-
element "ProductComposition", :subset
|
357
|
-
element "ProductForm", :subset
|
358
|
-
elements "ProductFormDetail", :subset
|
359
|
-
elements "ProductFormFeature", :subset
|
360
|
-
element "ProductFormDescription", :text
|
361
|
-
element "PrimaryContentType", :subset, {:klass=>"ProductContentType"}
|
362
|
-
elements "ProductContentType", :subset
|
15
|
+
element "ProductComposition", :subset, :shortcut => :composition
|
16
|
+
element "ProductForm", :subset, :shortcut => :form
|
17
|
+
elements "ProductFormDetail", :subset, :shortcut => :form_details
|
18
|
+
elements "ProductFormFeature", :subset, :shortcut => :form_features
|
19
|
+
element "ProductFormDescription", :text, :shortcut => :file_description
|
20
|
+
element "PrimaryContentType", :subset, {:klass => "ProductContentType"}
|
21
|
+
elements "ProductContentType", :subset, :shortcut => :content_types
|
363
22
|
elements "EpubTechnicalProtection", :subset
|
364
23
|
elements "EpubUsageConstraint", :subset
|
365
|
-
elements "ProductPart", :subset
|
366
|
-
|
24
|
+
elements "ProductPart", :subset, :shortcut => :parts
|
367
25
|
elements "Collection", :subset
|
368
26
|
element "NoCollection", :ignore
|
369
|
-
|
370
27
|
elements "TitleDetail", :subset
|
371
|
-
|
372
28
|
elements "Contributor", :subset
|
373
|
-
|
374
29
|
element "EditionType", :subset
|
375
30
|
element "EditionNumber", :integer
|
376
31
|
element "NoEdition", :ignore
|
377
|
-
|
378
32
|
elements "Language", :subset
|
379
|
-
|
380
33
|
elements "Extent", :subset
|
381
|
-
|
382
34
|
elements "Subject", :subset
|
383
|
-
|
384
35
|
elements "AudienceCode", :subset
|
385
36
|
|
386
|
-
#
|
387
|
-
def form
|
388
|
-
@product_form
|
389
|
-
end
|
37
|
+
# @!group Shortcuts
|
390
38
|
|
391
|
-
def
|
392
|
-
@
|
39
|
+
def pages_extent
|
40
|
+
@extents.page.first
|
393
41
|
end
|
394
42
|
|
395
|
-
def
|
396
|
-
@
|
43
|
+
def product_title_element
|
44
|
+
@title_details.distinctive_title.first.title_elements.product_level.first if @title_details.distinctive_title.first
|
397
45
|
end
|
398
46
|
|
399
|
-
def
|
400
|
-
@
|
47
|
+
def file_formats
|
48
|
+
@product_form_details.select { |fd| fd.code =~ /^E1.*/ }
|
401
49
|
end
|
402
50
|
|
403
|
-
|
404
|
-
@product_parts
|
405
|
-
end
|
51
|
+
# @!endgroup
|
406
52
|
|
407
|
-
|
408
|
-
@product_content_types
|
409
|
-
end
|
53
|
+
# @!group High level
|
410
54
|
|
411
|
-
# :category: High level
|
412
55
|
# product title string
|
56
|
+
# @return [String]
|
413
57
|
def title
|
414
58
|
product_title_element.title if product_title_element
|
415
59
|
end
|
416
60
|
|
417
|
-
# :category: High level
|
418
61
|
# product subtitle string
|
62
|
+
# @return [String]
|
419
63
|
def subtitle
|
420
64
|
product_title_element.subtitle if product_title_element
|
421
65
|
end
|
422
66
|
|
423
|
-
|
424
|
-
|
425
|
-
end
|
426
|
-
|
427
|
-
def pages_extent
|
428
|
-
@extents.page.first
|
429
|
-
end
|
430
|
-
|
67
|
+
# page count
|
68
|
+
# @return [Integer]
|
431
69
|
def pages
|
432
70
|
if pages_extent
|
433
71
|
pages_extent.pages
|
434
|
-
else
|
435
|
-
nil
|
436
72
|
end
|
437
73
|
end
|
438
74
|
|
@@ -440,6 +76,8 @@ module ONIX
|
|
440
76
|
@extents.filesize.first
|
441
77
|
end
|
442
78
|
|
79
|
+
# file size in bytes
|
80
|
+
# @return [Integer]
|
443
81
|
def filesize
|
444
82
|
if filesize_extent
|
445
83
|
filesize_extent.bytes
|
@@ -448,18 +86,30 @@ module ONIX
|
|
448
86
|
end
|
449
87
|
end
|
450
88
|
|
89
|
+
# is digital ?
|
90
|
+
# @return [Boolean]
|
451
91
|
def digital?
|
452
|
-
if @product_form and @product_form.human
|
92
|
+
if @product_form and @product_form.human =~ /Digital/
|
453
93
|
true
|
454
94
|
else
|
455
95
|
false
|
456
96
|
end
|
457
97
|
end
|
458
98
|
|
99
|
+
# digital offer has DRM ?
|
100
|
+
# @return [Boolean]
|
101
|
+
def drmized?
|
102
|
+
@protections.any? { |p| p =~ /Drm/ }
|
103
|
+
end
|
104
|
+
|
105
|
+
# is digital offer streaming ?
|
106
|
+
# @return [Boolean]
|
459
107
|
def streaming?
|
460
|
-
@product_form.code=="EC"
|
108
|
+
@product_form.code == "EC"
|
461
109
|
end
|
462
110
|
|
111
|
+
# is digital offer audio ?
|
112
|
+
# @return [Boolean]
|
463
113
|
def audio?
|
464
114
|
not audio_formats.empty?
|
465
115
|
end
|
@@ -472,33 +122,35 @@ module ONIX
|
|
472
122
|
@product_form_details.select { |fd| fd.code =~ /^A.*/ }
|
473
123
|
end
|
474
124
|
|
125
|
+
# is digital offer a bundle ?
|
126
|
+
# @return [Boolean]
|
475
127
|
def bundle?
|
476
|
-
@product_composition.human=="MultipleitemRetailProduct"
|
128
|
+
@product_composition.human == "MultipleitemRetailProduct"
|
477
129
|
end
|
478
130
|
|
131
|
+
# digital file format string (Epub,Pdf,AmazonKindle)
|
132
|
+
# @return [String]
|
479
133
|
def file_format
|
480
|
-
|
134
|
+
file_formats.first.human if file_formats.first
|
481
135
|
end
|
482
136
|
|
137
|
+
# digital file format mimetype
|
138
|
+
# @return [String]
|
483
139
|
def file_mimetype
|
484
|
-
if
|
485
|
-
|
140
|
+
if file_formats.first
|
141
|
+
file_formats.first.mimetype
|
486
142
|
end
|
487
143
|
end
|
488
144
|
|
489
|
-
|
490
|
-
|
491
|
-
end
|
492
|
-
|
145
|
+
# is digital file reflowable ?
|
146
|
+
# @return [Boolean]
|
493
147
|
def reflowable?
|
494
148
|
return true if @product_form_details.select { |fd| fd.code == "E200" }.length > 0
|
495
149
|
return false if @product_form_details.select { |fd| fd.code == "E201" }.length > 0
|
496
150
|
end
|
497
151
|
|
498
|
-
|
499
|
-
|
500
|
-
end
|
501
|
-
|
152
|
+
# protection type string
|
153
|
+
# @return [String]
|
502
154
|
def protection_type
|
503
155
|
if @epub_technical_protections.length > 0
|
504
156
|
if @epub_technical_protections.length == 1
|
@@ -509,18 +161,18 @@ module ONIX
|
|
509
161
|
end
|
510
162
|
end
|
511
163
|
|
164
|
+
# protections string array
|
165
|
+
# @return [Array<String>]
|
512
166
|
def protections
|
513
167
|
return nil if @epub_technical_protections.length == 0
|
514
|
-
|
515
168
|
@epub_technical_protections.map(&:human)
|
516
169
|
end
|
517
170
|
|
171
|
+
# language of text
|
518
172
|
def language_of_text
|
519
|
-
l
|
173
|
+
l = @languages.of_text.first
|
520
174
|
if l
|
521
175
|
l.code
|
522
|
-
else
|
523
|
-
nil
|
524
176
|
end
|
525
177
|
end
|
526
178
|
|
@@ -528,25 +180,46 @@ module ONIX
|
|
528
180
|
@collections.publisher.first
|
529
181
|
end
|
530
182
|
|
183
|
+
# publisher collection title
|
184
|
+
# @return [String]
|
531
185
|
def publisher_collection_title
|
532
186
|
if self.publisher_collection
|
533
187
|
self.publisher_collection.title
|
534
188
|
end
|
535
189
|
end
|
536
190
|
|
191
|
+
# BISAC categories
|
192
|
+
# @return [Array<Subject>]
|
537
193
|
def bisac_categories
|
538
194
|
@subjects.bisac
|
539
195
|
end
|
540
196
|
|
197
|
+
# BISAC categories identifiers string array (eg: FIC000000)
|
198
|
+
# @return [Array<String>]
|
199
|
+
def bisac_categories_codes
|
200
|
+
self.bisac_categories.map { |c| c.code }.uniq
|
201
|
+
end
|
202
|
+
|
203
|
+
# BISAC categories
|
204
|
+
# @return [Array<Subject>]
|
541
205
|
def clil_categories
|
542
206
|
@subjects.clil
|
543
207
|
end
|
544
208
|
|
209
|
+
# CLIL categories identifier string array
|
210
|
+
# @return [Array<String>]
|
211
|
+
def clil_categories_codes
|
212
|
+
self.clil_categories.map { |c| c.code }.uniq
|
213
|
+
end
|
214
|
+
|
215
|
+
# keywords string array
|
545
216
|
def keywords
|
546
|
-
kws
|
547
|
-
kws=kws.flat_map { |kw| kw.split(/;|,|\n/) }.map { |kw| kw.strip }
|
548
|
-
kws.reject!{|k| k==""}
|
217
|
+
kws = @subjects.keyword.map { |kw| kw.heading_text }.compact
|
218
|
+
kws = kws.flat_map { |kw| kw.split(/;|,|\n/) }.map { |kw| kw.strip }
|
219
|
+
kws.reject! { |k| k == "" }
|
549
220
|
kws
|
550
221
|
end
|
222
|
+
|
223
|
+
# @!endgroup
|
551
224
|
end
|
552
225
|
end
|