rbook 0.4.3 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. data/Rakefile +13 -176
  2. metadata +57 -117
  3. data/COPYING +0 -340
  4. data/LICENSE +0 -13
  5. data/README +0 -17
  6. data/examples/gbip.rb +0 -12
  7. data/examples/onix/stream_reader.rb +0 -13
  8. data/examples/pacstream.rb +0 -13
  9. data/examples/titlepage.rb +0 -14
  10. data/examples/titlepage_with_proxy.rb +0 -14
  11. data/examples/titlepage_www.rb +0 -18
  12. data/examples/www/find_all.rb +0 -23
  13. data/examples/www/find_cover_from_amazon.rb +0 -16
  14. data/examples/www/find_url_from_rainbow.rb +0 -12
  15. data/examples/www/list.rb +0 -13
  16. data/lib/rbook/bisac.rb +0 -31
  17. data/lib/rbook/bisac/message.rb +0 -99
  18. data/lib/rbook/bisac/po.rb +0 -97
  19. data/lib/rbook/bisac/po_line_item.rb +0 -33
  20. data/lib/rbook/bisac/product.rb +0 -176
  21. data/lib/rbook/errors.rb +0 -8
  22. data/lib/rbook/gbip.rb +0 -21
  23. data/lib/rbook/gbip/pos.rb +0 -118
  24. data/lib/rbook/gbip/title.rb +0 -36
  25. data/lib/rbook/gbip/warehouse.rb +0 -27
  26. data/lib/rbook/isbn.rb +0 -255
  27. data/lib/rbook/onix.rb +0 -70
  28. data/lib/rbook/onix/contributor.rb +0 -60
  29. data/lib/rbook/onix/lists.rb +0 -2
  30. data/lib/rbook/onix/lists/contributor_role.rb +0 -10
  31. data/lib/rbook/onix/lists/product_form.rb +0 -100
  32. data/lib/rbook/onix/message.rb +0 -112
  33. data/lib/rbook/onix/product.rb +0 -189
  34. data/lib/rbook/onix/sales_restriction.rb +0 -51
  35. data/lib/rbook/onix/stream_reader.rb +0 -120
  36. data/lib/rbook/onix/stream_writer.rb +0 -40
  37. data/lib/rbook/onix/supply_detail.rb +0 -68
  38. data/lib/rbook/onix/xchar.rb +0 -98
  39. data/lib/rbook/pacstream.rb +0 -64
  40. data/lib/rbook/titlepage.rb +0 -37
  41. data/lib/rbook/titlepage/client.rb +0 -126
  42. data/lib/rbook/titlepage/titlepage_driver.rb +0 -137
  43. data/lib/rbook/titlepage/titlepage_utils.rb +0 -379
  44. data/lib/rbook/titlepage/wwwclient.rb +0 -96
  45. data/lib/rbook/www.rb +0 -172
  46. data/lib/rbook/www/aau_scraper.rb +0 -76
  47. data/lib/rbook/www/amazon_uk_scraper.rb +0 -44
  48. data/lib/rbook/www/ban_scraper.rb +0 -62
  49. data/lib/rbook/www/base.rb +0 -87
  50. data/lib/rbook/www/harper_au_scraper.rb +0 -56
  51. data/lib/rbook/www/harper_us_scraper.rb +0 -55
  52. data/lib/rbook/www/hha_scraper.rb +0 -50
  53. data/lib/rbook/www/macmillan_scraper.rb +0 -62
  54. data/lib/rbook/www/orbis_scraper.rb +0 -48
  55. data/lib/rbook/www/oup_scraper.rb +0 -64
  56. data/lib/rbook/www/paulist_scraper.rb +0 -53
  57. data/lib/rbook/www/pearson_au_scraper.rb +0 -52
  58. data/lib/rbook/www/penguin_scraper.rb +0 -45
  59. data/lib/rbook/www/random_au_scraper.rb +0 -90
  60. data/lib/rbook/www/random_us_scraper.rb +0 -59
  61. data/lib/rbook/www/sas_scraper.rb +0 -54
  62. data/lib/rbook/www/unireps_scraper.rb +0 -58
  63. data/lib/rbook/www/wiley_us_scraper.rb +0 -54
  64. data/test/data/abingdon.xml +0 -38931
  65. data/test/data/augsburg.xml +0 -39009
  66. data/test/data/bisac_po.txt +0 -112
  67. data/test/data/chalice.xml +0 -10851
  68. data/test/data/eerdsman.xml +0 -36942
  69. data/test/data/invalid_no_product.xml +0 -9
  70. data/test/data/not_xml.csv +0 -1
  71. data/test/data/single_product.xml +0 -50
  72. data/test/data/valid_bisac.txt +0 -213
  73. data/test/data/xml_not_onix.xml +0 -7
  74. data/test/mocks/titlepage_driver.rb +0 -111
  75. data/test/unit/bisac/bisac_test.rb +0 -96
  76. data/test/unit/bisac/po_line_item_test.rb +0 -38
  77. data/test/unit/bisac/po_test.rb +0 -82
  78. data/test/unit/isbn_test.rb +0 -153
  79. data/test/unit/onix/contributor_test.rb +0 -50
  80. data/test/unit/onix/message_test.rb +0 -119
  81. data/test/unit/onix/product_test.rb +0 -101
  82. data/test/unit/onix/sales_restriction_test.rb +0 -48
  83. data/test/unit/onix/stream_reader_test.rb +0 -22
  84. data/test/unit/onix/stream_writer_test.rb +0 -32
  85. data/test/unit/onix/supply_detail_test.rb +0 -53
  86. data/test/unit/onix/xchar_test.rb +0 -37
  87. data/test/unit/titlepage_test.rb +0 -140
@@ -1,70 +0,0 @@
1
- $LOAD_PATH.unshift(File.dirname(__FILE__) + "/../")
2
-
3
- require 'rbook/onix/contributor'
4
- require 'rbook/onix/lists'
5
- require 'rbook/onix/message'
6
- require 'rbook/onix/product'
7
- require 'rbook/onix/sales_restriction'
8
- require 'rbook/onix/supply_detail'
9
- require 'rbook/onix/xchar'
10
- require 'rbook/onix/stream_reader'
11
- require 'rbook/onix/stream_writer'
12
- require 'rbook/isbn'
13
-
14
- module RBook
15
-
16
- # Ruby classes for working with ONIX files. Currently only supports a very limited
17
- # subset of the ONIX specification, but the core attributes are there. More will be
18
- # added over time.
19
- #
20
- # = Usage
21
- #
22
- # == Loading from an REXML document
23
- #
24
- # require 'rubygems'
25
- # require 'rbook/onix'
26
- # file = File.open("./onix_message.xml", "r")
27
- # doc = REXML::Document.new(file)
28
- # msg = Onix::Message.load_from_xmldoc(doc)
29
- #
30
- # puts msg.from_company
31
- #
32
- # == Creation
33
- #
34
- # require 'rubygems'
35
- # require 'rbook/onix'
36
- # msg = RBook::Onix::Message.new
37
- # msg.from_company = 'XYZ Books'
38
- # msg.from_name = 'Joe Blogs'
39
- # msg.message_note = "A sample ONIX file"
40
- #
41
- # product = RBook::Onix::Product.new
42
- # product.product_identifier = "020161622X"
43
- # product.title = "Pragmatic Programmer"
44
- # product.subtitle = "From Journeyman to Master"
45
- # product.form = "BB"
46
- # product.description = "A book about programming and stuff"
47
- #
48
- # contributor1 = RBook::Onix::Contributor.new
49
- # contributor1.name_inverted = "Hunt, Andrew"
50
- # contributor1.role = "A01"
51
- # contributor1.sequence = "01"
52
- # contributor2 = RBook::Onix::Contributor.new
53
- # contributor2.name_inverted = "Thomas, David"
54
- # contributor2.role = "A01"
55
- # contributor2.sequence = "02"
56
- # product.add_contributor(contributor1)
57
- # product.add_contributor(contributor2)
58
- #
59
- # supply_detail = RBook::Onix::SupplyDetail.new
60
- # supply_detail.supplier_name = "Rainbow Book Agencies"
61
- # supply_detail.price = BigDecimal.new(29.95)
62
- # supply_detail.availability = "CS"
63
- # product.add_supply_detail(supply_detail)
64
- #
65
- # msg.add_product(product)
66
- # puts msg.to_s
67
- module Onix
68
-
69
- end
70
- end
@@ -1,60 +0,0 @@
1
- require 'rexml/document'
2
- require 'rubygems'
3
-
4
- module RBook
5
- module Onix
6
-
7
- class Contributor
8
- attr_accessor :sequence_number, :role, :name, :name_inverted
9
-
10
- # Attempts to create a contributor object using the supplied xml element
11
- def Contributor.load_from_element(element)
12
- raise ArgumentError, 'load_from_element expects a REXML element object' unless element.class == REXML::Element
13
-
14
- if REXML::XPath.first(element, '//Contributor').nil?
15
- raise LoadError, 'supplied REXML document object does not appear contain a valid contributor fragment'
16
- end
17
-
18
- contributor = Contributor.new
19
-
20
- tmp = REXML::XPath.first(element, '//Contributor/SequenceNumber')
21
- contributor.sequence_number = tmp.text if tmp != nil
22
-
23
- tmp = REXML::XPath.first(element, '//Contributor/ContributorRole')
24
- contributor.role = tmp.text if tmp != nil
25
-
26
- tmp = REXML::XPath.first(element, '//Contributor/PersonName')
27
- contributor.name = tmp.text if tmp != nil
28
-
29
- tmp = REXML::XPath.first(element, '//Contributor/PersonNameInverted')
30
- contributor.name_inverted = tmp.text if tmp != nil
31
-
32
- return contributor
33
-
34
- end
35
-
36
- # Return an xml element representing this contributor
37
- def to_element
38
- raise 'Contributor must have a sequence number to create an element' if @sequence_number.nil?
39
- raise 'Contributor must have a role to create an element' if @role.nil?
40
- raise '' if @name_inverted.nil? && @name.nil?
41
-
42
- contributor = REXML::Element.new('Contributor')
43
- contributor.add_element('SequenceNumber').text = self.sequence_number
44
- contributor.add_element('ContributorRole').text = self.role.to_xs
45
- contributor.add_element('PersonName').text = name.to_xs unless self.name.nil?
46
- contributor.add_element('PersonNameInverted').text = self.name_inverted.to_xs unless self.name_inverted.nil?
47
-
48
- return contributor
49
- end
50
-
51
- # Return an XML string representing this contributor
52
- def to_s
53
- tmp = to_element
54
- output = ''
55
- tmp.write(output, 0)
56
- return output
57
- end
58
- end
59
- end
60
- end
@@ -1,2 +0,0 @@
1
- require File.dirname(__FILE__) + '/lists/contributor_role'
2
- require File.dirname(__FILE__) + '/lists/product_form'
@@ -1,10 +0,0 @@
1
- module RBook
2
- module Onix
3
- module Lists
4
- CONTRIBUTOR_ROLES = [
5
- ['Author','A01'],
6
- ['Illustrator','A02']
7
- ].freeze
8
- end
9
- end
10
- end
@@ -1,100 +0,0 @@
1
- module RBook
2
- module Onix
3
- module Lists
4
-
5
- FORM_CODES = [
6
- ['Undefined', '00'],
7
- ['Audio', 'AA'],
8
- ['Audio - Cassette', 'AB'],
9
- ['Audio - CD', 'AC'],
10
- ['Audio - DAT', 'AD'],
11
- ['Audio - Disk', 'AE'],
12
- ['Audio - Tape', 'AF'],
13
- ['Audio - Other', 'AZ'],
14
- ['Book', 'BA'],
15
- ['Book - Hardback', 'BB'],
16
- ['Book - Paperback', 'BC'],
17
- ['Book - Loose-leaf', 'BD'],
18
- ['Book - Spiral Bound', 'BE'],
19
- ['Book - Pamphlet', 'BF'],
20
- ['Book - Leather / Fine Binding', 'BG'],
21
- ['Book - Board', 'BH'],
22
- ['Book - Rag', 'BI'],
23
- ['Book - Bath', 'BJ'],
24
- ['Book - Other', 'BZ'],
25
- ['Cartographic - Sheet Map', 'CA'],
26
- ['Cartographic - Sheet Map, Folded', 'CB'],
27
- ['Cartographic - Sheet Map, Flat', 'CC'],
28
- ['Cartographic - Sheet Map, Rolled', 'CD'],
29
- ['Cartographic - Globe', 'CE'],
30
- ['Cartographic - Other', 'CZ'],
31
- ['Digital', 'DA'],
32
- ['Digital - CDROM', 'DB'],
33
- ['Digital - CD-Interactive', 'DC'],
34
- ['Digital - DVD', 'DD'],
35
- ['Digital - Game Cartridge', 'DE'],
36
- ['Digital - Diskette', 'DF'],
37
- ['Digital - Electronic Book Text', 'DG'],
38
- ['Digital - Online File', 'DH'],
39
- ['Digital - Other', 'DZ'],
40
- ['Film or Transparency', 'FA'],
41
- ['Film', 'FB'],
42
- ['Film - Slides', 'FC'],
43
- ['Film - OHP Transparencies', 'FD'],
44
- ['Film - Other ', 'FZ'],
45
- ['Microform', 'MA'],
46
- ['Microform - Microfiche', 'MB'],
47
- ['Microform - Microfilm', 'MC'],
48
- ['Microform - Other', 'MZ'],
49
- ['Print - Misc', 'PA'],
50
- ['Print - Address Book', 'PB'],
51
- ['Print - Calendar', 'PC'],
52
- ['Print - Cards', 'PD'],
53
- ['Print - Copymasters', 'PE'],
54
- ['Print - Diary', 'PF'],
55
- ['Print - Frieze', 'PG'],
56
- ['Print - Kit', 'PH'],
57
- ['Print - Sheet Music', 'PI'],
58
- ['Print - Postcard Book or Pack', 'PJ'],
59
- ['Print - Poster', 'PK'],
60
- ['Print - Record Book', 'PL'],
61
- ['Print - Wallet', 'PM'],
62
- ['Print - Pictures or Photographs', 'PN'],
63
- ['Print - Wallchart', 'PO'],
64
- ['Print - Other', 'PZ'],
65
- ['Video', 'VA'],
66
- ['Video - VHS, PAL', 'VB'],
67
- ['Video - VHA, NTSC', 'VC'],
68
- ['Video - Betamax, PAL', 'VD'],
69
- ['Video - Betamax, NTSC', 'VE'],
70
- ['Video - disk', 'VF'],
71
- ['Video - VHS, SECAM', 'VG'],
72
- ['Video - Betamax, SECAM', 'VH'],
73
- ['Video - Other Format','VZ'],
74
- ['Multiple - Mixed Media Product', 'WW'],
75
- ['Misc - Quantity Pack', 'WX'],
76
- ['Misc - Trade-only Material', 'XA'],
77
- ['Misc - Dumpbim - Empty', 'XB'],
78
- ['Misc - Dumpbin - Filled', 'XC'],
79
- ['Misc - Counterpack - Empty', 'XD'],
80
- ['Misc - Counterpack - Filled', 'XE'],
81
- ['Misc - Poster', 'XF'],
82
- ['Misc - Shelf Strip', 'XG'],
83
- ['Misc - Window Piece', 'XH'],
84
- ['Misc - Streamer', 'XI'],
85
- ['Misc - Spinner', 'XJ'],
86
- ['Misc - Large Book Display', 'XK'],
87
- ['Misc - Shrink Wrapped Pack', 'XL'],
88
- ['Misc - Other Point of Sale', 'XZ'],
89
- ['General Merchandise', 'ZA'],
90
- ['Misc - Doll', 'ZB'],
91
- ['Misc - Soft Toy', 'ZC'],
92
- ['Misc - Toy', 'ZD'],
93
- ['Misc - Game', 'ZE'],
94
- ['Misc - T-shirt', 'ZF'],
95
- ['Misc - Other Merchandise', 'ZZ'],
96
- ].freeze
97
-
98
- end
99
- end
100
- end
@@ -1,112 +0,0 @@
1
- require 'rubygems'
2
- require 'rexml/document'
3
-
4
- module RBook
5
- module Onix
6
-
7
- class Message
8
- attr_reader :products
9
- attr_accessor :from_company, :from_person, :from_email, :message_note, :sent_date, :to_person, :to_company
10
-
11
- VERSION = 0.1
12
- ONIX_DTD_URL = "http://www.editeur.org/onix/2.1/reference/onix-international.dtd"
13
-
14
- def initialize
15
- @products = []
16
- end
17
-
18
- # Attempts to create a message object using thge supplied xml string
19
- def self.load_from_string(str)
20
- doc = REXML::Document.new(str)
21
- self.load_from_xmldoc(doc)
22
- end
23
-
24
- # Attempts to create a message object using thge supplied xml document
25
- def self.load_from_xmldoc(doc)
26
- raise ArgumentError, 'load_from_xmldoc expects a REXML document object' unless doc.class == REXML::Document
27
- if REXML::XPath.first(doc, '/ONIXMessage/').nil? ||
28
- REXML::XPath.first(doc, '/ONIXMessage/Header').nil? ||
29
- REXML::XPath.first(doc, '/ONIXMessage/Product').nil?
30
- raise LoadError, 'supplied REXML document object does not appear to be a valid ONIX file'
31
- end
32
-
33
- msg = Onix::Message.new
34
-
35
- tmpelement = REXML::XPath.first(doc, '/ONIXMessage/Header/FromCompany')
36
- msg.from_company = tmpelement.text if tmpelement != nil
37
-
38
- tmpelement = REXML::XPath.first(doc, '/ONIXMessage/Header/FromPerson')
39
- msg.from_person = tmpelement.text if tmpelement != nil
40
-
41
- tmpelement = REXML::XPath.first(doc, '/ONIXMessage/Header/FromEmail')
42
- msg.from_email = tmpelement.text if tmpelement != nil
43
-
44
- tmpelement = REXML::XPath.first(doc, '/ONIXMessage/Header/SentDate')
45
- tmpdate = Date.civil(tmpelement.text[0,4].to_i, tmpelement.text[4,2].to_i, tmpelement.text[6,2].to_i) if tmpelement != nil
46
- msg.sent_date = tmpdate if tmpdate != nil
47
-
48
- tmpelement = REXML::XPath.first(doc, '/ONIXMessage/Header/ToCompany')
49
- msg.to_company = tmpelement.text if tmpelement != nil
50
-
51
- tmpelement = REXML::XPath.first(doc, '/ONIXMessage/Header/ToPerson')
52
- msg.to_person = tmpelement.text if tmpelement != nil
53
-
54
- products = REXML::XPath.each(doc, '/ONIXMessage/Product') { |product|
55
- msg.add_product(Onix::Product.load_from_element(product))
56
- }
57
-
58
- return msg
59
- end
60
-
61
- # Adds a new product to this message
62
- def add_product(product)
63
- raise ArgumentError, 'Argument must be a Onix::Product' if product.class != Onix::Product
64
- @products << product
65
- end
66
-
67
- # Returns an XML string representing this message
68
- def to_s
69
- doc = to_xml
70
- output = ''
71
- doc.write(output, 0)
72
- return output
73
- end
74
-
75
- def header
76
- raise 'from_compnay must be set to create an onix message' if from_company == nil
77
- raise 'from_person must be set to create an onix message' if from_person == nil
78
-
79
- header = REXML::Element.new('Header')
80
- header.add_element('FromCompany').text = from_company.to_xs
81
- header.add_element('FromPerson').text = from_person.to_xs
82
- header.add_element('FromEmail').text = from_email.to_xs unless from_email.nil?
83
- header.add_element('MessageNote').text = message_note.to_xs unless message_note.nil?
84
- header.add_element('ToCompany').text = to_company.to_xs unless to_company.nil?
85
- header.add_element('ToPerson').text = to_person.to_xs unless to_person.nil?
86
-
87
- now = Time.now
88
- header.add_element('SentDate').text = "%.4d%.2d%.2d" % [ now.year, now.month, now.day ]
89
- return header
90
- end
91
-
92
- # Returns an XML document representing this message
93
- def to_xml
94
- raise 'There must be at least 1 product to burn' if @products.size < 1
95
-
96
- doc = REXML::Document.new
97
- doc << REXML::XMLDecl.new
98
- doc << REXML::DocType.new('ONIXMessage', "SYSTEM \"#{ONIX_DTD_URL}\"")
99
- msg = doc.add_element('ONIXMessage')
100
- msg.add_element(header)
101
-
102
- @products.each do |product|
103
- prod = msg.add_element(product.to_element)
104
- end
105
-
106
- return doc
107
- end
108
-
109
- end
110
-
111
- end
112
- end
@@ -1,189 +0,0 @@
1
- require 'rexml/document'
2
- require 'rubygems'
3
-
4
- module RBook
5
- module Onix
6
- class Product
7
-
8
- attr_accessor :record_reference, :notification_type, :product_identifier, :title, :subtitle, :pages, :publication_date, :price, :description, :form, :bicmainsubject, :publisher, :supplier, :website, :edition
9
- attr_reader :contributors, :sales_restrictions, :supply_details
10
-
11
- def initialize
12
- @contributors = []
13
- @supply_details = []
14
- @sales_restrictions = []
15
- end
16
-
17
- # Attempts to create a product object using the supplied xml element
18
- def Product.load_from_element(element)
19
- raise ArgumentError, 'load_from_element expects a REXML element object' unless element.class == REXML::Element
20
-
21
- if REXML::XPath.first(element, '//Product').nil?
22
- raise LoadError, 'supplied REXML document object does not appear contain a valid product fragment'
23
- end
24
-
25
- product = Product.new
26
-
27
- tmp = REXML::XPath.first(element, '//Product/RecordReference')
28
- product.record_reference = tmp.text if tmp != nil
29
-
30
- tmp = REXML::XPath.first(element, '//Product/NotificationType')
31
- product.notification_type = tmp.text if tmp != nil
32
-
33
- tmp = REXML::XPath.first(element, '//Product/ProductIdentifier/IDValue')
34
- product.product_identifier = tmp.text if tmp != nil
35
-
36
- tmp = REXML::XPath.first(element, '//Product/ProductForm')
37
- product.form = tmp.text if tmp != nil
38
-
39
- tmp = REXML::XPath.first(element, '//Product/NumberOfPages')
40
- product.pages = tmp.text if tmp != nil
41
-
42
- tmp = REXML::XPath.first(element, '//Product/BICMainSubject')
43
- product.bicmainsubject = tmp.text if tmp != nil
44
-
45
- tmp = REXML::XPath.first(element, '//Product/DistinctiveTitle')
46
- if !tmp.nil?
47
- product.title = tmp.text
48
- tmp = REXML::XPath.first(element, '//Product/Subtitle') if !tmp.nil?
49
- product.subtitle = tmp.text
50
- else
51
- tmp = REXML::XPath.first(element, '//Product/Title/TitleText')
52
- product.title = tmp.text unless tmp.nil?
53
- tmp = REXML::XPath.first(element, '//Product/Title/Subtitle')
54
- product.subtitle = tmp.text unless tmp.nil?
55
- end
56
-
57
- tmp = REXML::XPath.first(element, '//Product/EditionNumber')
58
- product.edition = tmp.text if tmp != nil
59
-
60
- tmp = REXML::XPath.first(element, '//Product/PublicationDate')
61
- tmpdate = Date.civil(tmp.text[0,4].to_i, tmp.text[4,2].to_i, tmp.text[6,2].to_i) if tmp != nil
62
- product.publication_date = tmpdate if tmpdate != nil
63
-
64
- tmp = REXML::XPath.first(element, '//Product/Publisher/PublisherName')
65
- product.publisher = tmp.text if tmp != nil
66
-
67
- REXML::XPath.each(element, '//Product/Contributor') { |contributor|
68
- product.add_contributor(Onix::Contributor.load_from_element(contributor))
69
- }
70
-
71
- REXML::XPath.each(element, '//Product/SupplyDetail') { |detail|
72
- product.add_supply_detail(Onix::SupplyDetail.load_from_element(detail))
73
- }
74
-
75
- return product
76
- end
77
-
78
- # Add a new contributor to this product
79
- def add_contributor(newAuthor)
80
- raise ArgumentError, 'Argument to add_contributor must be an ONIX::Contributor' if newAuthor.class != Contributor
81
- @contributors << newAuthor
82
- end
83
-
84
- # Add a new contributor to this product
85
- def add_sales_restriction(restriction)
86
- raise ArgumentError, 'Argument to add_sales_restriction must be an ONIX::SalesRestriction' if restriction.class != SalesRestriction
87
- @sales_restrictions << restriction
88
- end
89
-
90
- # Add a new contributor to this product
91
- def add_supply_detail(detail)
92
- raise ArgumentError, 'Argument to add_supply_detail must be an ONIX::SupplyDetail' if detail.class != SupplyDetail
93
- @supply_details << detail
94
- end
95
-
96
- # Return an xml element representing this contributor
97
- def to_element
98
- raise 'product_identifier must be set' if self.product_identifier.nil?
99
-
100
- product = REXML::Element.new('Product')
101
-
102
- if self.record_reference
103
- product.add_element('RecordReference').text = self.record_reference
104
- else
105
- product.add_element('RecordReference').text = self.product_identifier
106
- end
107
-
108
- product.add_element('NotificationType').text = '03'
109
-
110
- product_identifier = REXML::Element.new('ProductIdentifier')
111
- if ISBN::valid_isbn13?(self.product_identifier)
112
- product_identifier.add_element('ProductIDType').text = '03'
113
- elsif ISBN::valid_isbn10?(self.product_identifier)
114
- product_identifier.add_element('ProductIDType').text = '02'
115
- else
116
- product_identifier.add_element('ProductIDType').text = '01'
117
- end
118
- product_identifier.add_element('IDValue').text = self.product_identifier.to_xs
119
- product.add_element(product_identifier)
120
-
121
- if form != nil
122
- product.add_element('ProductForm').text = self.form.to_xs
123
- end
124
-
125
- product.add_element('NoSeries')
126
-
127
- title = REXML::Element.new('Title')
128
- title.add_element('TitleType').text = '01'
129
- title.add_element('TitleText').text = self.title.to_xs unless self.title.nil?
130
- title.add_element('Subtitle').text = self.subtitle.to_xs unless self.subtitle.nil?
131
- product.add_element(title)
132
-
133
- if website != nil
134
- product_website = REXML::Element.new('Website')
135
- product_website.add_element('WebsiteLink').text = self.website.to_xs
136
- product.add_element(product_website)
137
- end
138
-
139
- contributors.each do |contributor|
140
- product.add_element(contributor.to_element)
141
- end
142
-
143
- product.add_element('NoEdition')
144
-
145
- product.add_element('NumberOfPages').text = self.pages.to_s unless self.pages.nil?
146
-
147
- if bicmainsubject != nil
148
- product.add_element('BICMainSubject').text = self.bicmainsubject.to_xs
149
- end
150
-
151
- if description != nil
152
- other_text = REXML::Element.new('OtherText')
153
- other_text.add_element('TextTypeCode').text = '01'
154
- other_text.add_element('Text').text = self.description.to_xs
155
- product.add_element(other_text)
156
- end
157
-
158
- if publisher != nil
159
- publisher = REXML::Element.new('Publisher')
160
- publisher.add_element('PublishingRole').text = '01'
161
- publisher.add_element('PublisherName').text = self.publisher.to_xs
162
- product.add_element(publisher)
163
- end
164
-
165
- supply_details.each do |detail|
166
- product.add_element(detail.to_element)
167
- end
168
-
169
- sales_restrictions.each do |restriction|
170
- product.add_element(restriction.to_element)
171
- end
172
-
173
- if publication_date != nil
174
- product.add_element('PublicationDate').text = "%.4d%.2d%.2d" % [ publication_date.year, publication_date.month, publication_date.day ]
175
- end
176
-
177
- return product
178
- end
179
-
180
- # return an XML string representing this contributor
181
- def to_s
182
- output = ''
183
- to_element.write(output, 0)
184
- return output
185
- end
186
- end
187
-
188
- end
189
- end