onix2 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG +209 -0
- data/README.markdown +69 -0
- data/TODO +14 -0
- data/dtd/2.1r3/iso-amsa.ent +173 -0
- data/dtd/2.1r3/iso-amsb.ent +146 -0
- data/dtd/2.1r3/iso-amsc.ent +49 -0
- data/dtd/2.1r3/iso-amsn.ent +117 -0
- data/dtd/2.1r3/iso-amso.ent +77 -0
- data/dtd/2.1r3/iso-amsr.ent +205 -0
- data/dtd/2.1r3/iso-box.ent +67 -0
- data/dtd/2.1r3/iso-cyr1.ent +94 -0
- data/dtd/2.1r3/iso-cyr2.ent +53 -0
- data/dtd/2.1r3/iso-dia.ent +41 -0
- data/dtd/2.1r3/iso-grk3.ent +70 -0
- data/dtd/2.1r3/iso-lat1.ent +89 -0
- data/dtd/2.1r3/iso-lat2.ent +148 -0
- data/dtd/2.1r3/iso-mfrk.ent +79 -0
- data/dtd/2.1r3/iso-mopf.ent +53 -0
- data/dtd/2.1r3/iso-mscr.ent +79 -0
- data/dtd/2.1r3/iso-num.ent +103 -0
- data/dtd/2.1r3/iso-num.old.ent +103 -0
- data/dtd/2.1r3/iso-pub.ent +110 -0
- data/dtd/2.1r3/iso-tech.ent +183 -0
- data/dtd/2.1r3/onix-international.dtd +1012 -0
- data/dtd/2.1r3/onix-xhtml.elt +672 -0
- data/dtd/2.1r3/reference.elt +4758 -0
- data/dtd/2.1r3/xhtml-special.ent +79 -0
- data/dtd/2.1r3/xhtml-symbol.ent +242 -0
- data/lib/onix2.rb +85 -0
- data/lib/onix2/addressee_identifier.rb +29 -0
- data/lib/onix2/apa_product.rb +785 -0
- data/lib/onix2/audience_range.rb +37 -0
- data/lib/onix2/code_list_extractor.rb +69 -0
- data/lib/onix2/contributor.rb +55 -0
- data/lib/onix2/discount_coded.rb +29 -0
- data/lib/onix2/header.rb +68 -0
- data/lib/onix2/imprint.rb +31 -0
- data/lib/onix2/language.rb +29 -0
- data/lib/onix2/lists.rb +134 -0
- data/lib/onix2/market_representation.rb +38 -0
- data/lib/onix2/measure.rb +29 -0
- data/lib/onix2/media_file.rb +33 -0
- data/lib/onix2/other_text.rb +35 -0
- data/lib/onix2/price.rb +47 -0
- data/lib/onix2/product.rb +97 -0
- data/lib/onix2/product_identifier.rb +27 -0
- data/lib/onix2/publisher.rb +33 -0
- data/lib/onix2/reader.rb +157 -0
- data/lib/onix2/sales_restriction.rb +25 -0
- data/lib/onix2/sales_rights.rb +28 -0
- data/lib/onix2/sender_identifier.rb +29 -0
- data/lib/onix2/series.rb +28 -0
- data/lib/onix2/series_identifier.rb +27 -0
- data/lib/onix2/simple_product.rb +47 -0
- data/lib/onix2/stock.rb +29 -0
- data/lib/onix2/subject.rb +33 -0
- data/lib/onix2/supply_detail.rb +53 -0
- data/lib/onix2/title.rb +33 -0
- data/lib/onix2/version.rb +3 -0
- data/lib/onix2/website.rb +29 -0
- data/lib/onix2/writer.rb +86 -0
- data/spec/addressee_identifier_spec.rb +33 -0
- data/spec/apa_product_spec.rb +116 -0
- data/spec/audience_range_spec.rb +44 -0
- data/spec/contributor_spec.rb +38 -0
- data/spec/discount_coded_spec.rb +34 -0
- data/spec/header_spec.rb +153 -0
- data/spec/imprint_spec.rb +31 -0
- data/spec/language_spec.rb +38 -0
- data/spec/lists_spec.rb +33 -0
- data/spec/market_representation_spec.rb +33 -0
- data/spec/measure_spec.rb +38 -0
- data/spec/media_file_spec.rb +38 -0
- data/spec/other_text_spec.rb +33 -0
- data/spec/price_spec.rb +52 -0
- data/spec/product_identifier_spec.rb +34 -0
- data/spec/product_spec.rb +102 -0
- data/spec/publisher_spec.rb +33 -0
- data/spec/reader_spec.rb +155 -0
- data/spec/sales_restriction_spec.rb +27 -0
- data/spec/sender_identifier.rb +33 -0
- data/spec/series_identifier_spec.rb +33 -0
- data/spec/series_spec.rb +47 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/stock_spec.rb +39 -0
- data/spec/subject_spec.rb +34 -0
- data/spec/supply_detail_spec.rb +97 -0
- data/spec/title_spec.rb +38 -0
- data/spec/website_spec.rb +33 -0
- data/spec/writer_spec.rb +78 -0
- data/support/codes/001.tsv +10 -0
- data/support/codes/002.tsv +5 -0
- data/support/codes/003.tsv +7 -0
- data/support/codes/005.tsv +13 -0
- data/support/codes/006.tsv +76 -0
- data/support/codes/007.tsv +123 -0
- data/support/codes/008.tsv +7 -0
- data/support/codes/009.tsv +7 -0
- data/support/codes/010.tsv +34 -0
- data/support/codes/011.tsv +11 -0
- data/support/codes/012.tsv +11 -0
- data/support/codes/013.tsv +7 -0
- data/support/codes/014.tsv +4 -0
- data/support/codes/015.tsv +13 -0
- data/support/codes/016.tsv +6 -0
- data/support/codes/017.tsv +90 -0
- data/support/codes/018.tsv +3 -0
- data/support/codes/019.tsv +7 -0
- data/support/codes/020.tsv +0 -0
- data/support/codes/021.tsv +31 -0
- data/support/codes/022.tsv +9 -0
- data/support/codes/023.tsv +9 -0
- data/support/codes/024.tsv +11 -0
- data/support/codes/025.tsv +29 -0
- data/support/codes/026.tsv +75 -0
- data/support/codes/027.tsv +75 -0
- data/support/codes/028.tsv +8 -0
- data/support/codes/029.tsv +16 -0
- data/support/codes/030.tsv +15 -0
- data/support/codes/031.tsv +3 -0
- data/support/codes/032.tsv +2 -0
- data/support/codes/033.tsv +36 -0
- data/support/codes/034.tsv +14 -0
- data/support/codes/035.tsv +6 -0
- data/support/codes/036.tsv +3 -0
- data/support/codes/037.tsv +6 -0
- data/support/codes/038.tsv +36 -0
- data/support/codes/039.tsv +8 -0
- data/support/codes/040.tsv +6 -0
- data/support/codes/041.tsv +6 -0
- data/support/codes/042.tsv +16 -0
- data/support/codes/043.tsv +4 -0
- data/support/codes/044.tsv +13 -0
- data/support/codes/045.tsv +12 -0
- data/support/codes/046.tsv +3 -0
- data/support/codes/047.tsv +4 -0
- data/support/codes/048.tsv +11 -0
- data/support/codes/049.tsv +84 -0
- data/support/codes/050.tsv +8 -0
- data/support/codes/051.tsv +27 -0
- data/support/codes/052.tsv +1 -0
- data/support/codes/053.tsv +3 -0
- data/support/codes/054.tsv +23 -0
- data/support/codes/055.tsv +13 -0
- data/support/codes/056.tsv +2 -0
- data/support/codes/057.tsv +5 -0
- data/support/codes/058.tsv +21 -0
- data/support/codes/059.tsv +4 -0
- data/support/codes/060.tsv +2 -0
- data/support/codes/061.tsv +3 -0
- data/support/codes/062.tsv +5 -0
- data/support/codes/063.tsv +0 -0
- data/support/codes/064.tsv +13 -0
- data/support/codes/065.tsv +25 -0
- data/support/codes/066.tsv +4 -0
- data/support/codes/067.tsv +2 -0
- data/support/codes/068.tsv +15 -0
- data/support/codes/069.tsv +4 -0
- data/support/codes/070.tsv +2 -0
- data/support/codes/071.tsv +9 -0
- data/support/codes/072.tsv +7 -0
- data/support/codes/073.tsv +36 -0
- data/support/codes/074.tsv +489 -0
- data/support/codes/075.tsv +2 -0
- data/support/codes/076.tsv +12 -0
- data/support/codes/077.tsv +19 -0
- data/support/codes/078.tsv +148 -0
- data/support/codes/079.tsv +17 -0
- data/support/codes/080.tsv +19 -0
- data/support/codes/081.tsv +11 -0
- data/support/codes/082.tsv +17 -0
- data/support/codes/083.tsv +68 -0
- data/support/codes/084.tsv +10 -0
- data/support/codes/085.tsv +23 -0
- data/support/codes/086.tsv +5 -0
- data/support/codes/087.tsv +6 -0
- data/support/codes/088.tsv +0 -0
- data/support/codes/089.tsv +1 -0
- data/support/codes/090.tsv +11 -0
- data/support/codes/091.tsv +248 -0
- data/support/codes/092.tsv +7 -0
- data/support/codes/093.tsv +13 -0
- data/support/codes/094.tsv +3 -0
- data/support/codes/095.tsv +3 -0
- data/support/codes/096.tsv +185 -0
- data/support/codes/097.tsv +1 -0
- data/support/codes/098.tsv +21 -0
- data/support/codes/099.tsv +24 -0
- data/support/codes/100.tsv +4 -0
- data/support/codes/101.tsv +2 -0
- data/support/codes/102.tsv +3 -0
- data/support/codes/121.tsv +127 -0
- data/support/codes/138.tsv +6 -0
- data/support/codes/139.tsv +70 -0
- data/support/codes/140.tsv +7 -0
- data/support/codes/141.tsv +10 -0
- data/support/codes/142.tsv +12 -0
- data/support/codes/143.tsv +7 -0
- data/support/codes/144.tsv +4 -0
- data/support/codes/145.tsv +5 -0
- data/support/codes/146.tsv +3 -0
- data/support/codes/147.tsv +7 -0
- data/support/codes/148.tsv +3 -0
- data/support/codes/149.tsv +4 -0
- data/support/codes/150.tsv +124 -0
- data/support/codes/151.tsv +7 -0
- data/support/codes/152.tsv +2 -0
- data/support/codes/153.tsv +14 -0
- data/support/codes/154.tsv +9 -0
- data/support/codes/155.tsv +5 -0
- data/support/codes/156.tsv +4 -0
- data/support/codes/157.tsv +4 -0
- data/support/codes/158.tsv +24 -0
- data/support/codes/159.tsv +6 -0
- data/support/codes/160.tsv +0 -0
- data/support/codes/161.tsv +3 -0
- data/support/codes/162.tsv +3 -0
- data/support/codes/163.tsv +7 -0
- data/support/codes/164.tsv +2 -0
- data/support/codes/165.tsv +2 -0
- data/support/codes/166.tsv +2 -0
- data/support/codes/167.tsv +3 -0
- data/support/codes/168.tsv +2 -0
- data/support/codes/169.tsv +3 -0
- data/support/codes/170.tsv +0 -0
- data/support/codes/171.tsv +2 -0
- data/support/codes/172.tsv +1 -0
- data/support/codes/173.tsv +2 -0
- data/support/codes/174.tsv +2 -0
- data/support/codes/175.tsv +175 -0
- data/support/codes/176.tsv +12 -0
- data/support/codes/177.tsv +2 -0
- data/support/codes/178.tsv +17 -0
- data/support/entities.txt +1499 -0
- data/support/extract.rb +25 -0
- data/support/switch-onix-2.1-short-to-reference.xsl +24 -0
- data/support/switch-onix-tagnames-1.1.xsl +25 -0
- data/support/switch-onix-tagnames-2.0.xsl +37 -0
- metadata +440 -0
@@ -0,0 +1,79 @@
|
|
1
|
+
<!-- Special characters for HTML -->
|
2
|
+
|
3
|
+
<!-- Character entity set. Typical invocation:
|
4
|
+
<!ENTITY % HTMLspecial PUBLIC
|
5
|
+
"-//W3C//ENTITIES Special for XHTML//EN"
|
6
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent">
|
7
|
+
%HTMLspecial;
|
8
|
+
-->
|
9
|
+
|
10
|
+
<!-- Portions (C) International Organization for Standardization 1986:
|
11
|
+
Permission to copy in any form is granted for use with
|
12
|
+
conforming SGML systems and applications as defined in
|
13
|
+
ISO 8879, provided this notice is included in all copies.
|
14
|
+
-->
|
15
|
+
|
16
|
+
<!-- Relevant ISO entity set is given unless names are newly introduced.
|
17
|
+
New names (i.e., not in ISO 8879 list) do not clash with any
|
18
|
+
existing ISO 8879 entity names. ISO 10646 character numbers
|
19
|
+
are given for each character, in hex. values are decimal
|
20
|
+
conversions of the ISO 10646 values and refer to the document
|
21
|
+
character set. Names are Unicode names.
|
22
|
+
-->
|
23
|
+
|
24
|
+
<!-- C0 Controls and Basic Latin -->
|
25
|
+
<!ENTITY quot """> <!-- quotation mark = APL quote,
|
26
|
+
U+0022 ISOnum -->
|
27
|
+
<!ENTITY amp "&#38;"> <!-- ampersand, U+0026 ISOnum -->
|
28
|
+
<!ENTITY lt "&#60;"> <!-- less-than sign, U+003C ISOnum -->
|
29
|
+
<!ENTITY gt ">"> <!-- greater-than sign, U+003E ISOnum -->
|
30
|
+
<!ENTITY apos "'"> <!-- apostrophe mark, U+0027 ISOnum -->
|
31
|
+
|
32
|
+
<!-- Latin Extended-A -->
|
33
|
+
<!ENTITY OElig "Œ"> <!-- latin capital ligature OE,
|
34
|
+
U+0152 ISOlat2 -->
|
35
|
+
<!ENTITY oelig "œ"> <!-- latin small ligature oe, U+0153 ISOlat2 -->
|
36
|
+
<!-- ligature is a misnomer, this is a separate character in some languages -->
|
37
|
+
<!ENTITY Scaron "Š"> <!-- latin capital letter S with caron,
|
38
|
+
U+0160 ISOlat2 -->
|
39
|
+
<!ENTITY scaron "š"> <!-- latin small letter s with caron,
|
40
|
+
U+0161 ISOlat2 -->
|
41
|
+
<!ENTITY Yuml "Ÿ"> <!-- latin capital letter Y with diaeresis,
|
42
|
+
U+0178 ISOlat2 -->
|
43
|
+
|
44
|
+
<!-- Spacing Modifier Letters -->
|
45
|
+
<!ENTITY circ "ˆ"> <!-- modifier letter circumflex accent,
|
46
|
+
U+02C6 ISOpub -->
|
47
|
+
<!ENTITY tilde "˜"> <!-- small tilde, U+02DC ISOdia -->
|
48
|
+
|
49
|
+
<!-- General Punctuation -->
|
50
|
+
<!ENTITY ensp " "> <!-- en space, U+2002 ISOpub -->
|
51
|
+
<!ENTITY emsp " "> <!-- em space, U+2003 ISOpub -->
|
52
|
+
<!ENTITY thinsp " "> <!-- thin space, U+2009 ISOpub -->
|
53
|
+
<!ENTITY zwnj "‌"> <!-- zero width non-joiner,
|
54
|
+
U+200C NEW RFC 2070 -->
|
55
|
+
<!ENTITY zwj "‍"> <!-- zero width joiner, U+200D NEW RFC 2070 -->
|
56
|
+
<!ENTITY lrm "‎"> <!-- left-to-right mark, U+200E NEW RFC 2070 -->
|
57
|
+
<!ENTITY rlm "‏"> <!-- right-to-left mark, U+200F NEW RFC 2070 -->
|
58
|
+
<!ENTITY ndash "–"> <!-- en dash, U+2013 ISOpub -->
|
59
|
+
<!ENTITY mdash "—"> <!-- em dash, U+2014 ISOpub -->
|
60
|
+
<!ENTITY lsquo "‘"> <!-- left single quotation mark,
|
61
|
+
U+2018 ISOnum -->
|
62
|
+
<!ENTITY rsquo "’"> <!-- right single quotation mark,
|
63
|
+
U+2019 ISOnum -->
|
64
|
+
<!ENTITY sbquo "‚"> <!-- single low-9 quotation mark, U+201A NEW -->
|
65
|
+
<!ENTITY ldquo "“"> <!-- left double quotation mark,
|
66
|
+
U+201C ISOnum -->
|
67
|
+
<!ENTITY rdquo "”"> <!-- right double quotation mark,
|
68
|
+
U+201D ISOnum -->
|
69
|
+
<!ENTITY bdquo "„"> <!-- double low-9 quotation mark, U+201E NEW -->
|
70
|
+
<!ENTITY dagger "†"> <!-- dagger, U+2020 ISOpub -->
|
71
|
+
<!ENTITY Dagger "‡"> <!-- double dagger, U+2021 ISOpub -->
|
72
|
+
<!ENTITY permil "‰"> <!-- per mille sign, U+2030 ISOtech -->
|
73
|
+
<!ENTITY lsaquo "‹"> <!-- single left-pointing angle quotation mark,
|
74
|
+
U+2039 ISO proposed -->
|
75
|
+
<!-- lsaquo is proposed but not yet ISO standardized -->
|
76
|
+
<!ENTITY rsaquo "›"> <!-- single right-pointing angle quotation mark,
|
77
|
+
U+203A ISO proposed -->
|
78
|
+
<!-- rsaquo is proposed but not yet ISO standardized -->
|
79
|
+
<!ENTITY euro "€"> <!-- euro sign, U+20AC NEW -->
|
@@ -0,0 +1,242 @@
|
|
1
|
+
<!-- Mathematical, Greek and Symbolic characters for HTML -->
|
2
|
+
|
3
|
+
<!-- Character entity set. Typical invocation:
|
4
|
+
<!ENTITY % HTMLsymbol PUBLIC
|
5
|
+
"-//W3C//ENTITIES Symbols for XHTML//EN"
|
6
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent">
|
7
|
+
%HTMLsymbol;
|
8
|
+
-->
|
9
|
+
|
10
|
+
<!-- Portions (C) International Organization for Standardization 1986:
|
11
|
+
Permission to copy in any form is granted for use with
|
12
|
+
conforming SGML systems and applications as defined in
|
13
|
+
ISO 8879, provided this notice is included in all copies.
|
14
|
+
-->
|
15
|
+
|
16
|
+
<!-- Relevant ISO entity set is given unless names are newly introduced.
|
17
|
+
New names (i.e., not in ISO 8879 list) do not clash with any
|
18
|
+
existing ISO 8879 entity names. ISO 10646 character numbers
|
19
|
+
are given for each character, in hex. values are decimal
|
20
|
+
conversions of the ISO 10646 values and refer to the document
|
21
|
+
character set. Names are Unicode names.
|
22
|
+
-->
|
23
|
+
|
24
|
+
<!-- Latin Extended-B -->
|
25
|
+
<!ENTITY fnof "ƒ"> <!-- latin small f with hook = function
|
26
|
+
= florin, U+0192 ISOtech -->
|
27
|
+
|
28
|
+
<!-- Greek -->
|
29
|
+
<!ENTITY Alpha "Α"> <!-- greek capital letter alpha, U+0391 -->
|
30
|
+
<!ENTITY Beta "Β"> <!-- greek capital letter beta, U+0392 -->
|
31
|
+
<!ENTITY Gamma "Γ"> <!-- greek capital letter gamma,
|
32
|
+
U+0393 ISOgrk3 -->
|
33
|
+
<!ENTITY Delta "Δ"> <!-- greek capital letter delta,
|
34
|
+
U+0394 ISOgrk3 -->
|
35
|
+
<!ENTITY Epsilon "Ε"> <!-- greek capital letter epsilon, U+0395 -->
|
36
|
+
<!ENTITY Zeta "Ζ"> <!-- greek capital letter zeta, U+0396 -->
|
37
|
+
<!ENTITY Eta "Η"> <!-- greek capital letter eta, U+0397 -->
|
38
|
+
<!ENTITY Theta "Θ"> <!-- greek capital letter theta,
|
39
|
+
U+0398 ISOgrk3 -->
|
40
|
+
<!ENTITY Iota "Ι"> <!-- greek capital letter iota, U+0399 -->
|
41
|
+
<!ENTITY Kappa "Κ"> <!-- greek capital letter kappa, U+039A -->
|
42
|
+
<!ENTITY Lambda "Λ"> <!-- greek capital letter lambda,
|
43
|
+
U+039B ISOgrk3 -->
|
44
|
+
<!ENTITY Mu "Μ"> <!-- greek capital letter mu, U+039C -->
|
45
|
+
<!ENTITY Nu "Ν"> <!-- greek capital letter nu, U+039D -->
|
46
|
+
<!ENTITY Xi "Ξ"> <!-- greek capital letter xi, U+039E ISOgrk3 -->
|
47
|
+
<!ENTITY Omicron "Ο"> <!-- greek capital letter omicron, U+039F -->
|
48
|
+
<!ENTITY Pi "Π"> <!-- greek capital letter pi, U+03A0 ISOgrk3 -->
|
49
|
+
<!ENTITY Rho "Ρ"> <!-- greek capital letter rho, U+03A1 -->
|
50
|
+
<!-- there is no Sigmaf, and no U+03A2 character either -->
|
51
|
+
<!ENTITY Sigma "Σ"> <!-- greek capital letter sigma,
|
52
|
+
U+03A3 ISOgrk3 -->
|
53
|
+
<!ENTITY Tau "Τ"> <!-- greek capital letter tau, U+03A4 -->
|
54
|
+
<!ENTITY Upsilon "Υ"> <!-- greek capital letter upsilon,
|
55
|
+
U+03A5 ISOgrk3 -->
|
56
|
+
<!ENTITY Phi "Φ"> <!-- greek capital letter phi,
|
57
|
+
U+03A6 ISOgrk3 -->
|
58
|
+
<!ENTITY Chi "Χ"> <!-- greek capital letter chi, U+03A7 -->
|
59
|
+
<!ENTITY Psi "Ψ"> <!-- greek capital letter psi,
|
60
|
+
U+03A8 ISOgrk3 -->
|
61
|
+
<!ENTITY Omega "Ω"> <!-- greek capital letter omega,
|
62
|
+
U+03A9 ISOgrk3 -->
|
63
|
+
|
64
|
+
<!ENTITY alpha "α"> <!-- greek small letter alpha,
|
65
|
+
U+03B1 ISOgrk3 -->
|
66
|
+
<!ENTITY beta "β"> <!-- greek small letter beta, U+03B2 ISOgrk3 -->
|
67
|
+
<!ENTITY gamma "γ"> <!-- greek small letter gamma,
|
68
|
+
U+03B3 ISOgrk3 -->
|
69
|
+
<!ENTITY delta "δ"> <!-- greek small letter delta,
|
70
|
+
U+03B4 ISOgrk3 -->
|
71
|
+
<!ENTITY epsilon "ε"> <!-- greek small letter epsilon,
|
72
|
+
U+03B5 ISOgrk3 -->
|
73
|
+
<!ENTITY zeta "ζ"> <!-- greek small letter zeta, U+03B6 ISOgrk3 -->
|
74
|
+
<!ENTITY eta "η"> <!-- greek small letter eta, U+03B7 ISOgrk3 -->
|
75
|
+
<!ENTITY theta "θ"> <!-- greek small letter theta,
|
76
|
+
U+03B8 ISOgrk3 -->
|
77
|
+
<!ENTITY iota "ι"> <!-- greek small letter iota, U+03B9 ISOgrk3 -->
|
78
|
+
<!ENTITY kappa "κ"> <!-- greek small letter kappa,
|
79
|
+
U+03BA ISOgrk3 -->
|
80
|
+
<!ENTITY lambda "λ"> <!-- greek small letter lambda,
|
81
|
+
U+03BB ISOgrk3 -->
|
82
|
+
<!ENTITY mu "μ"> <!-- greek small letter mu, U+03BC ISOgrk3 -->
|
83
|
+
<!ENTITY nu "ν"> <!-- greek small letter nu, U+03BD ISOgrk3 -->
|
84
|
+
<!ENTITY xi "ξ"> <!-- greek small letter xi, U+03BE ISOgrk3 -->
|
85
|
+
<!ENTITY omicron "ο"> <!-- greek small letter omicron, U+03BF NEW -->
|
86
|
+
<!ENTITY pi "π"> <!-- greek small letter pi, U+03C0 ISOgrk3 -->
|
87
|
+
<!ENTITY rho "ρ"> <!-- greek small letter rho, U+03C1 ISOgrk3 -->
|
88
|
+
<!ENTITY sigmaf "ς"> <!-- greek small letter final sigma,
|
89
|
+
U+03C2 ISOgrk3 -->
|
90
|
+
<!ENTITY sigma "σ"> <!-- greek small letter sigma,
|
91
|
+
U+03C3 ISOgrk3 -->
|
92
|
+
<!ENTITY tau "τ"> <!-- greek small letter tau, U+03C4 ISOgrk3 -->
|
93
|
+
<!ENTITY upsilon "υ"> <!-- greek small letter upsilon,
|
94
|
+
U+03C5 ISOgrk3 -->
|
95
|
+
<!ENTITY phi "φ"> <!-- greek small letter phi, U+03C6 ISOgrk3 -->
|
96
|
+
<!ENTITY chi "χ"> <!-- greek small letter chi, U+03C7 ISOgrk3 -->
|
97
|
+
<!ENTITY psi "ψ"> <!-- greek small letter psi, U+03C8 ISOgrk3 -->
|
98
|
+
<!ENTITY omega "ω"> <!-- greek small letter omega,
|
99
|
+
U+03C9 ISOgrk3 -->
|
100
|
+
<!ENTITY thetasym "ϑ"> <!-- greek small letter theta symbol,
|
101
|
+
U+03D1 NEW -->
|
102
|
+
<!ENTITY upsih "ϒ"> <!-- greek upsilon with hook symbol,
|
103
|
+
U+03D2 NEW -->
|
104
|
+
<!ENTITY piv "ϖ"> <!-- greek pi symbol, U+03D6 ISOgrk3 -->
|
105
|
+
|
106
|
+
<!-- General Punctuation -->
|
107
|
+
<!ENTITY bull "•"> <!-- bullet = black small circle,
|
108
|
+
U+2022 ISOpub -->
|
109
|
+
<!-- bullet is NOT the same as bullet operator, U+2219 -->
|
110
|
+
<!ENTITY hellip "…"> <!-- horizontal ellipsis = three dot leader,
|
111
|
+
U+2026 ISOpub -->
|
112
|
+
<!ENTITY prime "′"> <!-- prime = minutes = feet, U+2032 ISOtech -->
|
113
|
+
<!ENTITY Prime "″"> <!-- double prime = seconds = inches,
|
114
|
+
U+2033 ISOtech -->
|
115
|
+
<!ENTITY oline "‾"> <!-- overline = spacing overscore,
|
116
|
+
U+203E NEW -->
|
117
|
+
<!ENTITY frasl "⁄"> <!-- fraction slash, U+2044 NEW -->
|
118
|
+
|
119
|
+
<!-- Letterlike Symbols -->
|
120
|
+
<!ENTITY weierp "℘"> <!-- script capital P = power set
|
121
|
+
= Weierstrass p, U+2118 ISOamso -->
|
122
|
+
<!ENTITY image "ℑ"> <!-- blackletter capital I = imaginary part,
|
123
|
+
U+2111 ISOamso -->
|
124
|
+
<!ENTITY real "ℜ"> <!-- blackletter capital R = real part symbol,
|
125
|
+
U+211C ISOamso -->
|
126
|
+
<!ENTITY trade "™"> <!-- trade mark sign, U+2122 ISOnum -->
|
127
|
+
<!ENTITY alefsym "ℵ"> <!-- alef symbol = first transfinite cardinal,
|
128
|
+
U+2135 NEW -->
|
129
|
+
<!-- alef symbol is NOT the same as hebrew letter alef,
|
130
|
+
U+05D0 although the same glyph could be used to depict both characters -->
|
131
|
+
|
132
|
+
<!-- Arrows -->
|
133
|
+
<!ENTITY larr "←"> <!-- leftwards arrow, U+2190 ISOnum -->
|
134
|
+
<!ENTITY uarr "↑"> <!-- upwards arrow, U+2191 ISOnum-->
|
135
|
+
<!ENTITY rarr "→"> <!-- rightwards arrow, U+2192 ISOnum -->
|
136
|
+
<!ENTITY darr "↓"> <!-- downwards arrow, U+2193 ISOnum -->
|
137
|
+
<!ENTITY harr "↔"> <!-- left right arrow, U+2194 ISOamsa -->
|
138
|
+
<!ENTITY crarr "↵"> <!-- downwards arrow with corner leftwards
|
139
|
+
= carriage return, U+21B5 NEW -->
|
140
|
+
<!ENTITY lArr "⇐"> <!-- leftwards double arrow, U+21D0 ISOtech -->
|
141
|
+
<!-- Unicode does not say that lArr is the same as the 'is implied by' arrow
|
142
|
+
but also does not have any other character for that function. So ? lArr can
|
143
|
+
be used for 'is implied by' as ISOtech suggests -->
|
144
|
+
<!ENTITY uArr "⇑"> <!-- upwards double arrow, U+21D1 ISOamsa -->
|
145
|
+
<!ENTITY rArr "⇒"> <!-- rightwards double arrow,
|
146
|
+
U+21D2 ISOtech -->
|
147
|
+
<!-- Unicode does not say this is the 'implies' character but does not have
|
148
|
+
another character with this function so ?
|
149
|
+
rArr can be used for 'implies' as ISOtech suggests -->
|
150
|
+
<!ENTITY dArr "⇓"> <!-- downwards double arrow, U+21D3 ISOamsa -->
|
151
|
+
<!ENTITY hArr "⇔"> <!-- left right double arrow,
|
152
|
+
U+21D4 ISOamsa -->
|
153
|
+
|
154
|
+
<!-- Mathematical Operators -->
|
155
|
+
<!ENTITY forall "∀"> <!-- for all, U+2200 ISOtech -->
|
156
|
+
<!ENTITY part "∂"> <!-- partial differential, U+2202 ISOtech -->
|
157
|
+
<!ENTITY exist "∃"> <!-- there exists, U+2203 ISOtech -->
|
158
|
+
<!ENTITY empty "∅"> <!-- empty set = null set = diameter,
|
159
|
+
U+2205 ISOamso -->
|
160
|
+
<!ENTITY nabla "∇"> <!-- nabla = backward difference,
|
161
|
+
U+2207 ISOtech -->
|
162
|
+
<!ENTITY isin "∈"> <!-- element of, U+2208 ISOtech -->
|
163
|
+
<!ENTITY notin "∉"> <!-- not an element of, U+2209 ISOtech -->
|
164
|
+
<!ENTITY ni "∋"> <!-- contains as member, U+220B ISOtech -->
|
165
|
+
<!-- should there be a more memorable name than 'ni'? -->
|
166
|
+
<!ENTITY prod "∏"> <!-- n-ary product = product sign,
|
167
|
+
U+220F ISOamsb -->
|
168
|
+
<!-- prod is NOT the same character as U+03A0 'greek capital letter pi' though
|
169
|
+
the same glyph might be used for both -->
|
170
|
+
<!ENTITY sum "∑"> <!-- n-ary sumation, U+2211 ISOamsb -->
|
171
|
+
<!-- sum is NOT the same character as U+03A3 'greek capital letter sigma'
|
172
|
+
though the same glyph might be used for both -->
|
173
|
+
<!ENTITY minus "−"> <!-- minus sign, U+2212 ISOtech -->
|
174
|
+
<!ENTITY lowast "∗"> <!-- asterisk operator, U+2217 ISOtech -->
|
175
|
+
<!ENTITY radic "√"> <!-- square root = radical sign,
|
176
|
+
U+221A ISOtech -->
|
177
|
+
<!ENTITY prop "∝"> <!-- proportional to, U+221D ISOtech -->
|
178
|
+
<!ENTITY infin "∞"> <!-- infinity, U+221E ISOtech -->
|
179
|
+
<!ENTITY ang "∠"> <!-- angle, U+2220 ISOamso -->
|
180
|
+
<!ENTITY and "∧"> <!-- logical and = wedge, U+2227 ISOtech -->
|
181
|
+
<!ENTITY or "∨"> <!-- logical or = vee, U+2228 ISOtech -->
|
182
|
+
<!ENTITY cap "∩"> <!-- intersection = cap, U+2229 ISOtech -->
|
183
|
+
<!ENTITY cup "∪"> <!-- union = cup, U+222A ISOtech -->
|
184
|
+
<!ENTITY int "∫"> <!-- integral, U+222B ISOtech -->
|
185
|
+
<!ENTITY there4 "∴"> <!-- therefore, U+2234 ISOtech -->
|
186
|
+
<!ENTITY sim "∼"> <!-- tilde operator = varies with = similar to,
|
187
|
+
U+223C ISOtech -->
|
188
|
+
<!-- tilde operator is NOT the same character as the tilde, U+007E,
|
189
|
+
although the same glyph might be used to represent both -->
|
190
|
+
<!ENTITY cong "≅"> <!-- approximately equal to, U+2245 ISOtech -->
|
191
|
+
<!ENTITY asymp "≈"> <!-- almost equal to = asymptotic to,
|
192
|
+
U+2248 ISOamsr -->
|
193
|
+
<!ENTITY ne "≠"> <!-- not equal to, U+2260 ISOtech -->
|
194
|
+
<!ENTITY equiv "≡"> <!-- identical to, U+2261 ISOtech -->
|
195
|
+
<!ENTITY le "≤"> <!-- less-than or equal to, U+2264 ISOtech -->
|
196
|
+
<!ENTITY ge "≥"> <!-- greater-than or equal to,
|
197
|
+
U+2265 ISOtech -->
|
198
|
+
<!ENTITY sub "⊂"> <!-- subset of, U+2282 ISOtech -->
|
199
|
+
<!ENTITY sup "⊃"> <!-- superset of, U+2283 ISOtech -->
|
200
|
+
<!-- note that nsup, 'not a superset of, U+2283' is not covered by the Symbol
|
201
|
+
font encoding and is not included. Should it be, for symmetry?
|
202
|
+
It is in ISOamsn -->
|
203
|
+
<!ENTITY nsub "⊄"> <!-- not a subset of, U+2284 ISOamsn -->
|
204
|
+
<!ENTITY sube "⊆"> <!-- subset of or equal to, U+2286 ISOtech -->
|
205
|
+
<!ENTITY supe "⊇"> <!-- superset of or equal to,
|
206
|
+
U+2287 ISOtech -->
|
207
|
+
<!ENTITY oplus "⊕"> <!-- circled plus = direct sum,
|
208
|
+
U+2295 ISOamsb -->
|
209
|
+
<!ENTITY otimes "⊗"> <!-- circled times = vector product,
|
210
|
+
U+2297 ISOamsb -->
|
211
|
+
<!ENTITY perp "⊥"> <!-- up tack = orthogonal to = perpendicular,
|
212
|
+
U+22A5 ISOtech -->
|
213
|
+
<!ENTITY sdot "⋅"> <!-- dot operator, U+22C5 ISOamsb -->
|
214
|
+
<!-- dot operator is NOT the same character as U+00B7 middle dot -->
|
215
|
+
|
216
|
+
<!-- Miscellaneous Technical -->
|
217
|
+
<!ENTITY lceil "⌈"> <!-- left ceiling = apl upstile,
|
218
|
+
U+2308 ISOamsc -->
|
219
|
+
<!ENTITY rceil "⌉"> <!-- right ceiling, U+2309 ISOamsc -->
|
220
|
+
<!ENTITY lfloor "⌊"> <!-- left floor = apl downstile,
|
221
|
+
U+230A ISOamsc -->
|
222
|
+
<!ENTITY rfloor "⌋"> <!-- right floor, U+230B ISOamsc -->
|
223
|
+
<!ENTITY lang "〈"> <!-- left-pointing angle bracket = bra,
|
224
|
+
U+2329 ISOtech -->
|
225
|
+
<!-- lang is NOT the same character as U+003C 'less than'
|
226
|
+
or U+2039 'single left-pointing angle quotation mark' -->
|
227
|
+
<!ENTITY rang "〉"> <!-- right-pointing angle bracket = ket,
|
228
|
+
U+232A ISOtech -->
|
229
|
+
<!-- rang is NOT the same character as U+003E 'greater than'
|
230
|
+
or U+203A 'single right-pointing angle quotation mark' -->
|
231
|
+
|
232
|
+
<!-- Geometric Shapes -->
|
233
|
+
<!ENTITY loz "◊"> <!-- lozenge, U+25CA ISOpub -->
|
234
|
+
|
235
|
+
<!-- Miscellaneous Symbols -->
|
236
|
+
<!ENTITY spades "♠"> <!-- black spade suit, U+2660 ISOpub -->
|
237
|
+
<!-- black here seems to mean filled as opposed to hollow -->
|
238
|
+
<!ENTITY clubs "♣"> <!-- black club suit = shamrock,
|
239
|
+
U+2663 ISOpub -->
|
240
|
+
<!ENTITY hearts "♥"> <!-- black heart suit = valentine,
|
241
|
+
U+2665 ISOpub -->
|
242
|
+
<!ENTITY diams "♦"> <!-- black diamond suit, U+2666 ISOpub -->
|
data/lib/onix2.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'active_support'
|
4
|
+
require 'bigdecimal'
|
5
|
+
require 'cgi'
|
6
|
+
require 'singleton'
|
7
|
+
require 'representable/xml'
|
8
|
+
require 'virtus'
|
9
|
+
|
10
|
+
module ONIX2
|
11
|
+
class Formatters
|
12
|
+
|
13
|
+
TWO_DIGITS = ->(value, *context) {
|
14
|
+
if value.is_a?(Array)
|
15
|
+
value.each_with_index do |val, index|
|
16
|
+
value[index] = ONIX2::Formatters::two_digits_format(val)
|
17
|
+
end
|
18
|
+
else
|
19
|
+
ONIX2::Formatters::two_digits_format(value)
|
20
|
+
end
|
21
|
+
}
|
22
|
+
|
23
|
+
def self.two_digits_format(value)
|
24
|
+
if value.nil?
|
25
|
+
nil
|
26
|
+
elsif value.to_i < 10
|
27
|
+
"%02i" % value
|
28
|
+
elsif value.to_i > 99
|
29
|
+
value.to_s[-2,2]
|
30
|
+
else
|
31
|
+
value.to_s
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
YYYYMMDD = ->(value, *context) { value.strftime("%Y%m%d") if value.respond_to? :strftime }
|
36
|
+
DECIMAL = ->(value, *context) {
|
37
|
+
case value
|
38
|
+
when nil then nil
|
39
|
+
when BigDecimal then value.to_s("F")
|
40
|
+
else value.to_s
|
41
|
+
end
|
42
|
+
}
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
# core files
|
47
|
+
# - ordering is important, classes need to be defined before any
|
48
|
+
# other class can use them
|
49
|
+
autoload :SenderIdentifier, "onix2/sender_identifier"
|
50
|
+
autoload :AddresseeIdentifier, "onix2/addressee_identifier"
|
51
|
+
autoload :Header, "onix2/header"
|
52
|
+
autoload :ProductIdentifier, "onix2/product_identifier"
|
53
|
+
autoload :SeriesIdentifier, "onix2/series_identifier"
|
54
|
+
autoload :Series, "onix2/series"
|
55
|
+
autoload :Title, "onix2/title"
|
56
|
+
autoload :Website, "onix2/website"
|
57
|
+
autoload :Contributor, "onix2/contributor"
|
58
|
+
autoload :Language, "onix2/language"
|
59
|
+
autoload :Subject, "onix2/subject"
|
60
|
+
autoload :AudienceRange, "onix2/audience_range"
|
61
|
+
autoload :Imprint, "onix2/imprint"
|
62
|
+
autoload :Publisher, "onix2/publisher"
|
63
|
+
autoload :OtherText, "onix2/other_text"
|
64
|
+
autoload :MediaFile, "onix2/media_file"
|
65
|
+
autoload :SalesRestriction, "onix2/sales_restriction"
|
66
|
+
autoload :Stock, "onix2/stock"
|
67
|
+
autoload :DiscountCoded, "onix2/discount_coded"
|
68
|
+
autoload :Price, "onix2/price"
|
69
|
+
autoload :SupplyDetail, "onix2/supply_detail"
|
70
|
+
autoload :MarketRepresentation, "onix2/market_representation"
|
71
|
+
autoload :Measure, "onix2/measure"
|
72
|
+
autoload :Product, "onix2/product"
|
73
|
+
autoload :Reader, "onix2/reader"
|
74
|
+
autoload :Writer, "onix2/writer"
|
75
|
+
autoload :SalesRights, "onix2/sales_rights"
|
76
|
+
|
77
|
+
# product wrappers
|
78
|
+
autoload :SimpleProduct, "onix2/simple_product"
|
79
|
+
autoload :APAProduct, "onix2/apa_product"
|
80
|
+
|
81
|
+
# misc
|
82
|
+
autoload :Lists, "onix2/lists"
|
83
|
+
autoload :CodeListExtractor, "onix2/code_list_extractor"
|
84
|
+
|
85
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ONIX2
|
4
|
+
class AddresseeIdentifier
|
5
|
+
include Virtus.model
|
6
|
+
|
7
|
+
attribute :addressee_id_type, Integer
|
8
|
+
attribute :id_type_name
|
9
|
+
attribute :id_value
|
10
|
+
|
11
|
+
def to_xml
|
12
|
+
AddresseeIdentifierRepresenter.new(self).to_xml
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.from_xml(data)
|
16
|
+
AddresseeIdentifierRepresenter.new(self.new).from_xml(data)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class AddresseeIdentifierRepresenter < Representable::Decorator
|
21
|
+
include Representable::XML
|
22
|
+
|
23
|
+
self.representation_wrap = :AddresseeIdentifier
|
24
|
+
|
25
|
+
property :addressee_id_type, as: "AddresseeIDType", render_filter: ::ONIX2::Formatters::TWO_DIGITS
|
26
|
+
property :id_type_name, as: "IDTypeName"
|
27
|
+
property :id_value, as: "IDValue"
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,785 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module ONIX2
|
4
|
+
class APAProduct < SimpleProduct
|
5
|
+
|
6
|
+
delegate :record_reference, :record_reference=
|
7
|
+
delegate :notification_type, :notification_type=
|
8
|
+
delegate :product_form, :product_form=
|
9
|
+
delegate :edition, :edition=
|
10
|
+
delegate :number_of_pages, :number_of_pages=
|
11
|
+
delegate :bic_main_subject, :bic_main_subject=
|
12
|
+
delegate :publishing_status, :publishing_status=
|
13
|
+
delegate :publication_date, :publication_date=
|
14
|
+
|
15
|
+
def measurement_system
|
16
|
+
@measurement_system ||= :metric
|
17
|
+
end
|
18
|
+
|
19
|
+
def measurement_system=(value)
|
20
|
+
if value == :metric || value == :imperial
|
21
|
+
@measurement_system = value
|
22
|
+
else
|
23
|
+
raise ArgumentError, "#{value} is not a recognised measurement system"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# retrieve the current EAN
|
28
|
+
def ean
|
29
|
+
identifier(3).try(:id_value)
|
30
|
+
end
|
31
|
+
|
32
|
+
# set a new EAN
|
33
|
+
def ean=(isbn)
|
34
|
+
identifier_set(3, isbn)
|
35
|
+
end
|
36
|
+
|
37
|
+
# retrieve the proprietary ID
|
38
|
+
def proprietary_id
|
39
|
+
identifier(1).try(:id_value)
|
40
|
+
end
|
41
|
+
|
42
|
+
# set a new proprietary ID
|
43
|
+
def proprietary_id=(isbn)
|
44
|
+
identifier_set(1, isbn)
|
45
|
+
end
|
46
|
+
|
47
|
+
# retrieve the current ISBN 10
|
48
|
+
def isbn10
|
49
|
+
identifier(2).try(:id_value)
|
50
|
+
end
|
51
|
+
|
52
|
+
# set a new ISBN 10
|
53
|
+
def isbn10=(isbn)
|
54
|
+
identifier_set(2, isbn)
|
55
|
+
end
|
56
|
+
|
57
|
+
# retrieve the current ISBN 13
|
58
|
+
def isbn13
|
59
|
+
identifier(15).try(:id_value)
|
60
|
+
end
|
61
|
+
|
62
|
+
# set a new ISBN 13
|
63
|
+
def isbn13=(isbn)
|
64
|
+
identifier_set(15, isbn)
|
65
|
+
end
|
66
|
+
|
67
|
+
# retrieve the current title
|
68
|
+
def title
|
69
|
+
composite = product.titles.first
|
70
|
+
if composite.nil?
|
71
|
+
nil
|
72
|
+
else
|
73
|
+
composite.title_text || composite.title_without_prefix
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# set a new title
|
78
|
+
def title=(str)
|
79
|
+
composite = product.titles.first
|
80
|
+
if composite.nil?
|
81
|
+
composite = ONIX2::Title.new
|
82
|
+
composite.title_type = 1
|
83
|
+
product.titles << composite
|
84
|
+
end
|
85
|
+
composite.title_text = str
|
86
|
+
end
|
87
|
+
|
88
|
+
# retrieve the current subtitle
|
89
|
+
def subtitle
|
90
|
+
composite = product.titles.first
|
91
|
+
if composite.nil?
|
92
|
+
nil
|
93
|
+
else
|
94
|
+
composite.subtitle
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# set a new subtitle
|
99
|
+
def subtitle=(str)
|
100
|
+
composite = product.titles.first
|
101
|
+
if composite.nil?
|
102
|
+
composite = ONIX2::Title.new
|
103
|
+
composite.title_type = 1
|
104
|
+
product.titles << composite
|
105
|
+
end
|
106
|
+
composite.subtitle = str
|
107
|
+
end
|
108
|
+
|
109
|
+
def series
|
110
|
+
composite = product.series.first
|
111
|
+
composite.try(:title_of_series)
|
112
|
+
end
|
113
|
+
|
114
|
+
def series=(val)
|
115
|
+
composite = product.series.first
|
116
|
+
if composite.nil?
|
117
|
+
composite = ONIX2::Series.new
|
118
|
+
product.series << composite
|
119
|
+
end
|
120
|
+
composite.title_of_series = val.to_s
|
121
|
+
end
|
122
|
+
|
123
|
+
# retrieve the current publisher website for this particular product
|
124
|
+
def publisher_website
|
125
|
+
website(2).try(:website_link)
|
126
|
+
end
|
127
|
+
|
128
|
+
# set a new publisher website for this particular product
|
129
|
+
def publisher_website=(str)
|
130
|
+
website_set(2, str)
|
131
|
+
end
|
132
|
+
|
133
|
+
# retrieve the current supplier website for this particular product
|
134
|
+
def supplier_website
|
135
|
+
website(12).try(:website_link)
|
136
|
+
end
|
137
|
+
|
138
|
+
# set a new supplier website for this particular product
|
139
|
+
def supplier_website=(str)
|
140
|
+
website_set(12, str)
|
141
|
+
end
|
142
|
+
|
143
|
+
# retrieve an array of all contributors
|
144
|
+
def contributors
|
145
|
+
product.contributors.collect { |contrib| contrib.person_name_inverted || contrib.person_name}
|
146
|
+
end
|
147
|
+
|
148
|
+
# set a new contributor to this product
|
149
|
+
# str should be the contributors name inverted (Healy, James)
|
150
|
+
def add_contributor(str, role = "A01")
|
151
|
+
contrib = ::ONIX2::Contributor.new
|
152
|
+
contrib.sequence_number = product.contributors.size + 1
|
153
|
+
contrib.contributor_role = role
|
154
|
+
contrib.person_name_inverted = str
|
155
|
+
product.contributors << contrib
|
156
|
+
end
|
157
|
+
|
158
|
+
# return an array of BIC subjects for this title
|
159
|
+
# could be version 1 or version 2, most ONIX files don't
|
160
|
+
# specifiy
|
161
|
+
def bic_subjects
|
162
|
+
subjects = product.subjects.select { |sub| sub.subject_scheme_id.to_i == 12 }
|
163
|
+
subjects.collect { |sub| sub.subject_code}
|
164
|
+
end
|
165
|
+
|
166
|
+
# add a BIC subject code to the product
|
167
|
+
def add_bic_subject(code)
|
168
|
+
add_subject code, "12"
|
169
|
+
end
|
170
|
+
|
171
|
+
# return an array of BISAC subjects for this title
|
172
|
+
def bisac_subjects
|
173
|
+
subjects = product.subjects.select { |sub| sub.subject_scheme_id.to_i == 10 }
|
174
|
+
subjects.collect { |sub| sub.subject_code}
|
175
|
+
end
|
176
|
+
|
177
|
+
# add a BISAC subject code to the product
|
178
|
+
def add_bisac_subject(code)
|
179
|
+
add_subject code, "10"
|
180
|
+
end
|
181
|
+
|
182
|
+
# retrieve the url to the product cover image
|
183
|
+
def cover_url
|
184
|
+
media_file(4).try(:media_file_link)
|
185
|
+
end
|
186
|
+
|
187
|
+
# set the url to the product cover image
|
188
|
+
def cover_url=(url)
|
189
|
+
# 4 - cover image
|
190
|
+
# 1 - URI
|
191
|
+
media_file_set(4,1,url)
|
192
|
+
end
|
193
|
+
|
194
|
+
# retrieve the url to the high quality product cover image
|
195
|
+
def cover_url_hq
|
196
|
+
media_file(6).try(:media_file_link)
|
197
|
+
end
|
198
|
+
|
199
|
+
# set the url to the high quality product cover image
|
200
|
+
def cover_url_hq=(url)
|
201
|
+
# 6 - hq cover image
|
202
|
+
# 1 - URI
|
203
|
+
media_file_set(6,1,url)
|
204
|
+
end
|
205
|
+
|
206
|
+
# retrieve the url to the product thumbnail
|
207
|
+
def thumbnail_url
|
208
|
+
media_file(7).try(:media_file_link)
|
209
|
+
end
|
210
|
+
|
211
|
+
# set the url to the product cover image
|
212
|
+
def thumbnail_url=(url)
|
213
|
+
# 7 - thumbnail image
|
214
|
+
# 1 - URI
|
215
|
+
media_file_set(7,1,url)
|
216
|
+
end
|
217
|
+
|
218
|
+
# retrieve the main description
|
219
|
+
def main_description
|
220
|
+
other_text(1).try(:text)
|
221
|
+
end
|
222
|
+
|
223
|
+
# set the main description
|
224
|
+
def main_description=(t)
|
225
|
+
other_text_set(1,t)
|
226
|
+
end
|
227
|
+
|
228
|
+
# retrieve the short description
|
229
|
+
def short_description
|
230
|
+
other_text(2).try(:text)
|
231
|
+
end
|
232
|
+
|
233
|
+
# set the short description
|
234
|
+
def short_description=(t)
|
235
|
+
other_text_set(2,t)
|
236
|
+
end
|
237
|
+
|
238
|
+
# retrieve the long description
|
239
|
+
def long_description
|
240
|
+
other_text(3).try(:text)
|
241
|
+
end
|
242
|
+
|
243
|
+
# set the long description
|
244
|
+
def long_description=(t)
|
245
|
+
other_text_set(3,t)
|
246
|
+
end
|
247
|
+
|
248
|
+
# retrieve the imprint
|
249
|
+
def imprint
|
250
|
+
composite = product.imprints.first
|
251
|
+
composite ? composite.imprint_name : nil
|
252
|
+
end
|
253
|
+
|
254
|
+
# set a new imprint
|
255
|
+
def imprint=(str)
|
256
|
+
composite = product.imprints.first
|
257
|
+
if composite.nil?
|
258
|
+
composite = ONIX2::Imprint.new
|
259
|
+
product.imprints << composite
|
260
|
+
end
|
261
|
+
composite.imprint_name = str
|
262
|
+
end
|
263
|
+
|
264
|
+
# retrieve the publisher
|
265
|
+
def publisher
|
266
|
+
publisher_get(1).try(:publisher_name)
|
267
|
+
end
|
268
|
+
|
269
|
+
# set a new publisher
|
270
|
+
def publisher=(str)
|
271
|
+
publisher_set(1, str)
|
272
|
+
end
|
273
|
+
|
274
|
+
# retrieve the sales restriction type
|
275
|
+
def sales_restriction_type
|
276
|
+
composite = product.sales_restrictions.first
|
277
|
+
composite.nil? ? nil : composite.imprint_name
|
278
|
+
end
|
279
|
+
|
280
|
+
# set a new sales restriction type
|
281
|
+
def sales_restriction_type=(type)
|
282
|
+
composite = product.sales_restrictions.first
|
283
|
+
if composite.nil?
|
284
|
+
composite = ONIX2::SalesRestriction.new
|
285
|
+
product.sales_restrictions << composite
|
286
|
+
end
|
287
|
+
composite.sales_restriction_type = type
|
288
|
+
end
|
289
|
+
|
290
|
+
# retrieve the supplier name
|
291
|
+
def supplier_name
|
292
|
+
composite = product.supply_details.first
|
293
|
+
composite.nil? ? nil : composite.supplier_name
|
294
|
+
end
|
295
|
+
|
296
|
+
# set a new supplier name
|
297
|
+
def supplier_name=(str)
|
298
|
+
composite = find_or_create_supply_detail
|
299
|
+
composite.supplier_name = str
|
300
|
+
end
|
301
|
+
|
302
|
+
# retrieve the supplier phone number
|
303
|
+
def supplier_phone
|
304
|
+
composite = product.supply_details.first
|
305
|
+
composite.nil? ? nil : composite.telephone_number
|
306
|
+
end
|
307
|
+
|
308
|
+
# set a new supplier phone number
|
309
|
+
def supplier_phone=(str)
|
310
|
+
composite = find_or_create_supply_detail
|
311
|
+
composite.telephone_number = str
|
312
|
+
end
|
313
|
+
|
314
|
+
# retrieve the supplier fax number
|
315
|
+
def supplier_fax
|
316
|
+
composite = product.supply_details.first
|
317
|
+
composite.nil? ? nil : composite.fax_number
|
318
|
+
end
|
319
|
+
|
320
|
+
# set a new supplier fax number
|
321
|
+
def supplier_fax=(str)
|
322
|
+
composite = find_or_create_supply_detail
|
323
|
+
composite.fax_number = str
|
324
|
+
end
|
325
|
+
|
326
|
+
# retrieve the supplier email address
|
327
|
+
def supplier_email
|
328
|
+
composite = product.supply_details.first
|
329
|
+
composite.nil? ? nil : composite.email_address
|
330
|
+
end
|
331
|
+
|
332
|
+
# set a new supplier email address
|
333
|
+
def supplier_email=(str)
|
334
|
+
composite = find_or_create_supply_detail
|
335
|
+
composite.email_address = str
|
336
|
+
end
|
337
|
+
|
338
|
+
# retrieve the supply country code
|
339
|
+
def supply_country
|
340
|
+
composite = product.supply_details.first
|
341
|
+
composite.nil? ? nil : composite.supply_to_country
|
342
|
+
end
|
343
|
+
|
344
|
+
# set a new supply country code
|
345
|
+
def supply_country=(str)
|
346
|
+
composite = find_or_create_supply_detail
|
347
|
+
composite.supply_to_country = str
|
348
|
+
end
|
349
|
+
|
350
|
+
# retrieve the product availability code
|
351
|
+
def product_availability
|
352
|
+
composite = product.supply_details.first
|
353
|
+
composite.nil? ? nil : composite.product_availability
|
354
|
+
end
|
355
|
+
|
356
|
+
# set a new product availability
|
357
|
+
def product_availability=(num)
|
358
|
+
composite = find_or_create_supply_detail
|
359
|
+
composite.product_availability = num
|
360
|
+
end
|
361
|
+
|
362
|
+
# retrieve the number in stock
|
363
|
+
def on_hand
|
364
|
+
supply = find_or_create_supply_detail
|
365
|
+
composite = supply.stock.first
|
366
|
+
if composite.nil?
|
367
|
+
composite = ONIX2::Stock.new
|
368
|
+
supply.stock << composite
|
369
|
+
end
|
370
|
+
composite.on_hand
|
371
|
+
end
|
372
|
+
|
373
|
+
# set a new in stock quantity
|
374
|
+
def on_hand=(num)
|
375
|
+
supply = find_or_create_supply_detail
|
376
|
+
composite = supply.stock.first
|
377
|
+
if composite.nil?
|
378
|
+
composite = ONIX2::Stock.new
|
379
|
+
supply.stock << composite
|
380
|
+
end
|
381
|
+
composite.on_hand = num
|
382
|
+
end
|
383
|
+
|
384
|
+
# retrieve the number on order
|
385
|
+
def on_order
|
386
|
+
supply = find_or_create_supply_detail
|
387
|
+
composite = supply.stock.first
|
388
|
+
if composite.nil?
|
389
|
+
composite = ONIX2::Stock.new
|
390
|
+
supply.stock << composite
|
391
|
+
end
|
392
|
+
composite.on_order
|
393
|
+
end
|
394
|
+
|
395
|
+
# set a new on order quantity
|
396
|
+
def on_order=(num)
|
397
|
+
supply = find_or_create_supply_detail
|
398
|
+
composite = supply.stock.first
|
399
|
+
if composite.nil?
|
400
|
+
composite = ONIX2::Stock.new
|
401
|
+
supply.stock << composite
|
402
|
+
end
|
403
|
+
composite.on_order = num
|
404
|
+
end
|
405
|
+
|
406
|
+
# retrieve the supplier phone number
|
407
|
+
def pack_quantity
|
408
|
+
composite = product.supply_details.first
|
409
|
+
composite.nil? ? nil : composite.pack_quantity
|
410
|
+
end
|
411
|
+
|
412
|
+
# set a new supplier phone number
|
413
|
+
def pack_quantity=(val)
|
414
|
+
composite = find_or_create_supply_detail
|
415
|
+
composite.pack_quantity = val.to_i
|
416
|
+
end
|
417
|
+
|
418
|
+
# retrieve the rrp excluding any sales tax
|
419
|
+
def rrp_exc_sales_tax
|
420
|
+
price_get(1).try(:price_amount)
|
421
|
+
end
|
422
|
+
|
423
|
+
# set the rrp excluding any sales tax
|
424
|
+
def rrp_exc_sales_tax=(num)
|
425
|
+
price_set(1, num)
|
426
|
+
end
|
427
|
+
|
428
|
+
# retrieve the rrp including any sales tax
|
429
|
+
def rrp_inc_sales_tax
|
430
|
+
price_get(2).try(:price_amount)
|
431
|
+
end
|
432
|
+
|
433
|
+
# set the rrp including any sales tax
|
434
|
+
def rrp_inc_sales_tax=(num)
|
435
|
+
price_set(2, num)
|
436
|
+
end
|
437
|
+
|
438
|
+
# retrieve the nett price including any sales tax
|
439
|
+
def nett_inc_sales_tax
|
440
|
+
price_get(7).try(:price_amount)
|
441
|
+
end
|
442
|
+
|
443
|
+
# set the rrp including any sales tax
|
444
|
+
def nett_inc_sales_tax=(num)
|
445
|
+
price_set(7, num)
|
446
|
+
end
|
447
|
+
|
448
|
+
# retrieve the discount code that describes the rrp in this file
|
449
|
+
def proprietry_discount_code_for_rrp
|
450
|
+
price = price_get(2)
|
451
|
+
return nil if price.nil?
|
452
|
+
|
453
|
+
discount = price.discounts_coded.find { |disc| disc.discount_code_type == 2 }
|
454
|
+
discount.try(:discount_code)
|
455
|
+
end
|
456
|
+
|
457
|
+
# set the discount code that describes the rrp in this file
|
458
|
+
def proprietry_discount_code_for_rrp=(code)
|
459
|
+
price = price_get(2)
|
460
|
+
if price.nil?
|
461
|
+
self.rrp_inc_sales_tax = 0
|
462
|
+
price = price_get(2)
|
463
|
+
end
|
464
|
+
|
465
|
+
discount = price.discounts_coded.find { |disc| disc.discount_code_type == 2 }
|
466
|
+
|
467
|
+
if discount.nil?
|
468
|
+
discount = ONIX2::DiscountCoded.new
|
469
|
+
discount.discount_code_type = 2
|
470
|
+
price.discounts_coded << discount
|
471
|
+
end
|
472
|
+
discount.discount_code = code
|
473
|
+
end
|
474
|
+
|
475
|
+
# just get the first price we can find, regardless of the type.
|
476
|
+
# useful as a backup for reading files from that don't contain a type
|
477
|
+
def price
|
478
|
+
price_get(nil).try(:price_amount)
|
479
|
+
end
|
480
|
+
|
481
|
+
# retrieve the height of the product
|
482
|
+
#
|
483
|
+
# If APAProduct#measurement_system is metric, these will be in mm, otherwise they
|
484
|
+
# will be in inches.
|
485
|
+
#
|
486
|
+
def height
|
487
|
+
# TODO: auto unit conversion
|
488
|
+
measurement(1).try(:measurement)
|
489
|
+
end
|
490
|
+
|
491
|
+
# set the height of the book
|
492
|
+
#
|
493
|
+
# If APAProduct#measurement_system is metric, this should be in mm, otherwise it
|
494
|
+
# will be in inches.
|
495
|
+
#
|
496
|
+
def height=(value)
|
497
|
+
if measurement_system == :metric
|
498
|
+
measurement_set(1,value, "mm")
|
499
|
+
elsif measurement_system == :imperial
|
500
|
+
measurement_set(1,value, "in")
|
501
|
+
end
|
502
|
+
end
|
503
|
+
|
504
|
+
# retrieve the width of the product
|
505
|
+
#
|
506
|
+
# If APAProduct#measurement_system is metric, these will be in mm, otherwise they
|
507
|
+
# will be in inches.
|
508
|
+
#
|
509
|
+
def width
|
510
|
+
# TODO: auto unit conversion
|
511
|
+
measurement(2).try(:measurement)
|
512
|
+
end
|
513
|
+
|
514
|
+
# set the width of the product
|
515
|
+
#
|
516
|
+
# If APAProduct#measurement_system is metric, this should be in mm, otherwise it
|
517
|
+
# will be in inches.
|
518
|
+
#
|
519
|
+
def width=(value)
|
520
|
+
if measurement_system == :metric
|
521
|
+
measurement_set(2,value, "mm")
|
522
|
+
elsif measurement_system == :imperial
|
523
|
+
measurement_set(2,value, "in")
|
524
|
+
end
|
525
|
+
end
|
526
|
+
|
527
|
+
# retrieve the weight of the product
|
528
|
+
#
|
529
|
+
# If APAProduct#measurement_system is metric, these will be in grams, otherwise they
|
530
|
+
# will be in ounces.
|
531
|
+
#
|
532
|
+
def weight
|
533
|
+
# TODO: auto unit conversion
|
534
|
+
measurement(8).try(:measurement)
|
535
|
+
end
|
536
|
+
|
537
|
+
# set the weight of the product
|
538
|
+
#
|
539
|
+
# If APAProduct#measurement_system is metric, this should be in grams, otherwise it
|
540
|
+
# will be in ounces.
|
541
|
+
#
|
542
|
+
def weight=(value)
|
543
|
+
if measurement_system == :metric
|
544
|
+
measurement_set(8,value, "gr")
|
545
|
+
elsif measurement_system == :imperial
|
546
|
+
measurement_set(8,value, "oz")
|
547
|
+
end
|
548
|
+
end
|
549
|
+
|
550
|
+
# retrieve the thickness of the product
|
551
|
+
#
|
552
|
+
# If APAProduct#measurement_system is metric, these will be in mm, otherwise they
|
553
|
+
# will be in inches.
|
554
|
+
#
|
555
|
+
def thickness
|
556
|
+
# TODO: auto unit conversion
|
557
|
+
measurement(3).try(:measurement)
|
558
|
+
end
|
559
|
+
|
560
|
+
# set the thickness of the product
|
561
|
+
#
|
562
|
+
# If APAProduct#measurement_system is metric, this should be in mm, otherwise it
|
563
|
+
# will be in inches.
|
564
|
+
#
|
565
|
+
def thickness=(value)
|
566
|
+
if measurement_system == :metric
|
567
|
+
measurement_set(3,value, "mm")
|
568
|
+
elsif measurement_system == :imperial
|
569
|
+
measurement_set(3,value, "in")
|
570
|
+
end
|
571
|
+
end
|
572
|
+
|
573
|
+
def agent_name
|
574
|
+
reps = product.market_representations.first
|
575
|
+
return nil if reps.nil?
|
576
|
+
reps.agent_name
|
577
|
+
end
|
578
|
+
|
579
|
+
def agent_name=(value)
|
580
|
+
reps = product.market_representations.first
|
581
|
+
if reps.nil?
|
582
|
+
reps = ONIX2::MarketRepresentation.new
|
583
|
+
product.market_representations << reps
|
584
|
+
end
|
585
|
+
reps.agent_name = value.to_s
|
586
|
+
end
|
587
|
+
|
588
|
+
def market_country
|
589
|
+
reps = product.market_representations.first
|
590
|
+
return nil if reps.nil?
|
591
|
+
reps.market_country
|
592
|
+
end
|
593
|
+
|
594
|
+
def market_country=(value)
|
595
|
+
reps = product.market_representations.first
|
596
|
+
if reps.nil?
|
597
|
+
reps = ONIX2::MarketRepresentation.new
|
598
|
+
product.market_representations << reps
|
599
|
+
end
|
600
|
+
reps.market_country = value.to_s
|
601
|
+
end
|
602
|
+
|
603
|
+
def market_publishing_status
|
604
|
+
reps = product.market_representations.first
|
605
|
+
return nil if reps.nil?
|
606
|
+
reps.market_publishing_status
|
607
|
+
end
|
608
|
+
|
609
|
+
def market_publishing_status=(value)
|
610
|
+
reps = product.market_representations.first
|
611
|
+
if reps.nil?
|
612
|
+
reps = ONIX2::MarketRepresentation.new
|
613
|
+
product.market_representations << reps
|
614
|
+
end
|
615
|
+
reps.market_publishing_status = value.to_i
|
616
|
+
end
|
617
|
+
|
618
|
+
private
|
619
|
+
|
620
|
+
# add a new subject to this product
|
621
|
+
# str should be the subject code
|
622
|
+
# type should be the code for the subject scheme you're using. See ONIX codelist 27.
|
623
|
+
# 12 is BIC
|
624
|
+
def add_subject(str, type = "12")
|
625
|
+
subject = ::ONIX2::Subject.new
|
626
|
+
subject.subject_scheme_id = type.to_i
|
627
|
+
subject.subject_code = str
|
628
|
+
product.subjects << subject
|
629
|
+
end
|
630
|
+
|
631
|
+
def find_or_create_supply_detail
|
632
|
+
composite = product.supply_details.first
|
633
|
+
if composite.nil?
|
634
|
+
composite = ONIX2::SupplyDetail.new
|
635
|
+
product.supply_details << composite
|
636
|
+
end
|
637
|
+
composite
|
638
|
+
end
|
639
|
+
|
640
|
+
# retrieve the value of a particular ID
|
641
|
+
def identifier(type)
|
642
|
+
product.product_identifiers.find { |id| id.product_id_type == type }
|
643
|
+
end
|
644
|
+
|
645
|
+
# set the value of a particular ID
|
646
|
+
def identifier_set(type, value)
|
647
|
+
isbn_id = identifier(type)
|
648
|
+
|
649
|
+
# create a new isbn record if we need to
|
650
|
+
if isbn_id.nil?
|
651
|
+
isbn_id = ONIX2::ProductIdentifier.new
|
652
|
+
isbn_id.product_id_type = type
|
653
|
+
product.product_identifiers << isbn_id
|
654
|
+
end
|
655
|
+
|
656
|
+
isbn_id.id_value = value
|
657
|
+
end
|
658
|
+
|
659
|
+
# retrieve the value of a particular measurement
|
660
|
+
def measurement(type)
|
661
|
+
product.measurements.find { |m| m.measure_type_code == type }
|
662
|
+
end
|
663
|
+
|
664
|
+
# set the value of a particular measurement
|
665
|
+
def measurement_set(type, value, unit)
|
666
|
+
measure = measurement(type)
|
667
|
+
|
668
|
+
# create a new isbn record if we need to
|
669
|
+
if measure.nil?
|
670
|
+
measure = ONIX2::Measure.new
|
671
|
+
measure.measure_type_code = type
|
672
|
+
product.measurements << measure
|
673
|
+
end
|
674
|
+
|
675
|
+
# store the new value
|
676
|
+
measure.measurement = value
|
677
|
+
measure.measure_unit_code = unit.to_s
|
678
|
+
end
|
679
|
+
|
680
|
+
# retrieve the value of a particular media file
|
681
|
+
def media_file(type)
|
682
|
+
product.media_files.find { |m| m.media_file_type_code == type }
|
683
|
+
end
|
684
|
+
|
685
|
+
# set the value of a particular ID
|
686
|
+
def media_file_set(type, link_type, value)
|
687
|
+
media = media_file(type)
|
688
|
+
|
689
|
+
# create a new isbn record if we need to
|
690
|
+
if media.nil?
|
691
|
+
media = ONIX2::MediaFile.new
|
692
|
+
media.media_file_type_code = type
|
693
|
+
media.media_file_link_type_code = link_type
|
694
|
+
product.media_files << media
|
695
|
+
end
|
696
|
+
|
697
|
+
# store the new value
|
698
|
+
media.media_file_link = value.to_s
|
699
|
+
end
|
700
|
+
|
701
|
+
# retrieve the value of a particular price
|
702
|
+
def price_get(type)
|
703
|
+
supply = find_or_create_supply_detail
|
704
|
+
if type.nil?
|
705
|
+
supply.prices.first
|
706
|
+
else
|
707
|
+
supply.prices.find { |p| p.price_type_code == type }
|
708
|
+
end
|
709
|
+
end
|
710
|
+
|
711
|
+
# set the value of a particular price
|
712
|
+
def price_set(type, num)
|
713
|
+
p = price_get(type)
|
714
|
+
|
715
|
+
# create a new isbn record if we need to
|
716
|
+
if p.nil?
|
717
|
+
supply = find_or_create_supply_detail
|
718
|
+
p = ONIX2::Price.new
|
719
|
+
p.price_type_code = type
|
720
|
+
supply.prices << p
|
721
|
+
end
|
722
|
+
|
723
|
+
# store the new value
|
724
|
+
p.price_amount = num
|
725
|
+
end
|
726
|
+
|
727
|
+
# retrieve the value of a particular publisher
|
728
|
+
def publisher_get(type)
|
729
|
+
product.publishers.find { |pub| pub.publishing_role == type }
|
730
|
+
end
|
731
|
+
|
732
|
+
# set the value of a particular ID
|
733
|
+
def publisher_set(type, value)
|
734
|
+
pub = publisher_get(type)
|
735
|
+
|
736
|
+
# create a new isbn record if we need to
|
737
|
+
if pub.nil?
|
738
|
+
pub = ONIX2::Publisher.new
|
739
|
+
pub.publishing_role = type
|
740
|
+
product.publishers << pub
|
741
|
+
end
|
742
|
+
|
743
|
+
# store the new value
|
744
|
+
pub.publisher_name = value.to_s
|
745
|
+
end
|
746
|
+
|
747
|
+
# retrieve the value of a particular other text value
|
748
|
+
def other_text(type)
|
749
|
+
product.text.find { |t| t.text_type_code == type }
|
750
|
+
end
|
751
|
+
|
752
|
+
# set the value of a particular other text value
|
753
|
+
def other_text_set(type, value)
|
754
|
+
text = other_text(type)
|
755
|
+
|
756
|
+
if text.nil?
|
757
|
+
text = ONIX2::OtherText.new
|
758
|
+
text.text_type_code = type
|
759
|
+
product.text << text
|
760
|
+
end
|
761
|
+
|
762
|
+
# store the new value
|
763
|
+
text.text = value.to_s
|
764
|
+
end
|
765
|
+
|
766
|
+
# retrieve the value of a particular website
|
767
|
+
def website(type)
|
768
|
+
product.websites.find { |site| site.website_role == type }
|
769
|
+
end
|
770
|
+
|
771
|
+
# set the value of a particular website
|
772
|
+
def website_set(type, value)
|
773
|
+
site = website(type)
|
774
|
+
|
775
|
+
# create a new website record if we need to
|
776
|
+
if site.nil?
|
777
|
+
site = ONIX2::Website.new
|
778
|
+
site.website_role = type
|
779
|
+
product.websites << site
|
780
|
+
end
|
781
|
+
|
782
|
+
site.website_link = value.to_s
|
783
|
+
end
|
784
|
+
end
|
785
|
+
end
|