File Coverage

blib/lib/Business/ISBN/Data.pm
Criterion Covered Total %
statement 53 61 86.8
branch 8 14 57.1
condition 2 9 22.2
subroutine 9 12 75.0
pod n/a
total 72 96 75.0


line stmt bran cond sub pod time code
1 2     2   4059 use 5.008;
  2         7  
2              
3             package Business::ISBN::Data;
4 2     2   11 use strict;
  2         4  
  2         47  
5              
6 2     2   10 use Carp qw(carp);
  2         2  
  2         115  
7 2     2   22 use File::Basename qw(dirname);
  2         5  
  2         163  
8 2     2   484 use File::Spec::Functions qw(catfile);
  2         897  
  2         8139  
9              
10             our $VERSION = '20231013.001';
11              
12             =encoding utf8
13              
14             =head1 NAME
15              
16             Business::ISBN::Data - data pack for Business::ISBN
17              
18             =head1 SYNOPSIS
19              
20             see L
21              
22             =head1 DESCRIPTION
23              
24             You don't need to load this module yourself in most cases. L
25             will load it when it loads. You must use L 3.005 or later
26             because the data structure changed slightly to fix a bug with ISBN13
27             prefixes.
28              
29             These data are generated from the F file provided by
30             the ISBN Agency. The distributed version matches the date in the version
31             for this module. You can retrieve this yourself at L.
32             This file is included as part of the distribution and should be installed
33             at F<~lib/Business/ISBN/Data/RangeMessage.xml>.
34              
35             If you want to use a different F file, you can set
36             the C environment variable to the alternate location
37             before you load C. This way, you can use the latest (or
38             even earlier) data without having to install something new or wait for
39             an update to this module.
40              
41             If the default F or your alternate one is not available,
42             the module falls back to data included in F. However, that data
43             are likely to be older. If it does not find that file, it looks
44             for F in the current directory.
45              
46             The data are in C<%Business::ISBN::country_data> (although the "country"
47             part is historical). If you want to see where the data are from, check
48             C<$Business::ISBN::country_data{_source}>.
49              
50             =head2 Packaging this module
51              
52             The included F is in under F at the same level
53             as F. The same data exist as the default data in the code, so
54             you don't need to pass along the distributed F.
55             However, you can include a newer F.
56              
57             With PAR, you can add extra files to the archive with C<-a>. Put the
58             new file somewhere the module will find it (or use C
59             to lead it there):
60              
61             pp ... -a '..../RangeMessage.xml;RangeMessage.xml'
62              
63             If you put the F in the current working directory of
64             the application, the module should find it.
65              
66             =head2 Updating the default data
67              
68             In the repo, find the F program. Run
69             that against the latest F:
70              
71             % perl -Ilib examples/make_default_data.pl RangeMessage.xml
72              
73             That produces the code you need to replace in the module. Check that
74             that data aren't weird: sometimes the group names have errors or
75             oddities. The program handles escaping single quotes and trimming
76             white space.
77              
78             =head1 SOURCE AVAILABILITY
79              
80             This module lives in a Github repository:
81              
82             https://github.com/briandfoy/business-isbn-data
83              
84             You are probably also interested in the module that uses it:
85              
86             https://github.com/briandfoy/business-isbn
87              
88             If you have something to add, create a fork on Github and send a
89             pull request.
90              
91             =head1 AUTHOR
92              
93             brian d foy, C<< >>
94              
95             Yakov Shafranovich updated the data in October 2008.
96              
97             Daniel Jakubik updated the data in July 2012.
98              
99             Markus Spann suggested looking for F in the current
100             directory to make it work with Perl app bundlers.
101              
102             Josef Moravec C<< >> updated the data in January 2019.
103              
104             Peter Williams fixed a serious issue with ISBN-13 (GitHub #5). You must
105             use Business::ISBN 3.005 or later because the data structure changed.
106              
107             =head1 COPYRIGHT AND LICENSE
108              
109             Copyright © 2002-2023, brian d foy . All rights reserved.
110              
111             You may redistribute this under the terms of the Artistic License 2.0.
112              
113             =cut
114              
115             sub _default_data {
116             # BEGIN REPLACE
117             (
118 2     2   4154 _data_date => 'Fri, 13 Oct 2023 04:41:02 BST',
119             _serial => '05a5062c-63ec-4328-a835-c4fb7a75dedc',
120             _source => __FILE__,
121             978 => {
122             0 => [ 'English language' => [ '00', '19', '200', '227', '2280', '2289', '229', '368', '3690', '3699', '370', '638', '6390', '6397', '6398000', '6399999', '640', '644', '6450000', '6459999', '646', '647', '6480000', '6489999', '649', '654', '6550', '6559', '656', '699', '7000', '8499', '85000', '89999', '900000', '900370', '9003710', '9003719', '900372', '949999', '9500000', '9999999' ] ],
123             1 => [ 'English language' => [ '000', '009', '01', '02', '030', '034', '0350', '0399', '040', '049', '05', '06', '0700', '0999', '100', '397', '3980', '5499', '55000', '64999', '6500', '6799', '68000', '68599', '6860', '7139', '714', '716', '7170', '7319', '7320000', '7399999', '74000', '77499', '7750000', '7753999', '77540', '77639', '7764000', '7764999', '77650', '77699', '7770000', '7782999', '77830', '78999', '7900', '7999', '80000', '80049', '80050', '80499', '80500', '83799', '8380000', '8384999', '83850', '86719', '8672', '8675', '86760', '86979', '869800', '915999', '9160000', '9165059', '916506', '916869', '9168700', '9169079', '916908', '919599', '9196000', '9196549', '919655', '972999', '9730', '9877', '987800', '991149', '9911500', '9911999', '991200', '998989', '9989900', '9999999' ] ],
124             2 => [ 'French language' => [ '00', '19', '200', '349', '35000', '39999', '400', '486', '487000', '494999', '495', '495', '4960', '4966', '49670', '49699', '497', '527', '5280', '5299', '530', '699', '7000', '8399', '84000', '89999', '900000', '919799', '91980', '91980', '919810', '919942', '9199430', '9199689', '919969', '949999', '9500000', '9999999' ] ],
125             3 => [ 'German language' => [ '00', '02', '030', '033', '0340', '0369', '03700', '03999', '04', '19', '200', '688', '68900', '69499', '6950', '8499', '85000', '89999', '900000', '949999', '9500000', '9539999', '95400', '96999', '9700000', '9849999', '98500', '99999' ] ],
126             4 => [ 'Japan' => [ '00', '19', '200', '699', '7000', '8499', '85000', '89999', '900000', '949999', '9500000', '9999999' ] ],
127             5 => [ 'former U.S.S.R' => [ '00000', '00499', '0050', '0099', '01', '19', '200', '361', '3620', '3623', '36240', '36299', '363', '420', '4210', '4299', '430', '430', '4310', '4399', '440', '440', '4410', '4499', '450', '603', '6040000', '6049999', '605', '699', '7000', '8499', '85000', '89999', '900000', '909999', '91000', '91999', '9200', '9299', '93000', '94999', '9500000', '9500999', '9501', '9799', '98000', '98999', '9900000', '9909999', '9910', '9999' ] ],
128             7 => [ 'China, People\'s Republic' => [ '00', '09', '100', '499', '5000', '7999', '80000', '89999', '900000', '999999' ] ],
129             65 => [ 'Brazil' => [ '00', '01', '250', '299', '300', '302', '5000', '5129', '5350', '6149', '80000', '81824', '84500', '89999', '900000', '902449', '980000', '999999' ] ],
130             80 => [ 'former Czechoslovakia' => [ '00', '19', '200', '529', '53000', '54999', '550', '689', '69000', '69999', '7000', '8499', '85000', '89999', '900000', '998999', '99900', '99999' ] ],
131             81 => [ 'India' => [ '00', '18', '19000', '19999', '200', '699', '7000', '8499', '85000', '89999', '900000', '999999' ] ],
132             82 => [ 'Norway' => [ '00', '19', '200', '689', '690000', '699999', '7000', '8999', '90000', '98999', '990000', '999999' ] ],
133             83 => [ 'Poland' => [ '00', '19', '200', '599', '60000', '69999', '7000', '8499', '85000', '89999', '900000', '999999' ] ],
134             84 => [ 'Spain' => [ '00', '09', '10000', '10499', '1050', '1199', '120000', '129999', '1300', '1399', '140', '149', '15000', '19999', '200', '699', '7000', '8499', '85000', '89999', '9000', '9199', '920000', '923999', '92400', '92999', '930000', '949999', '95000', '96999', '9700', '9999' ] ],
135             85 => [ 'Brazil' => [ '00', '19', '200', '454', '455000', '455299', '45530', '45599', '456', '528', '52900', '53199', '5320', '5339', '534', '539', '54000', '54029', '54030', '54039', '540400', '540499', '54050', '54089', '540900', '540999', '54100', '54399', '5440', '5479', '54800', '54999', '5500', '5999', '60000', '69999', '7000', '8499', '85000', '89999', '900000', '924999', '92500', '94499', '9450', '9599', '96', '97', '98000', '99999' ] ],
136             86 => [ 'former Yugoslavia' => [ '00', '29', '300', '599', '6000', '7999', '80000', '89999', '900000', '999999' ] ],
137             87 => [ 'Denmark' => [ '00', '29', '400', '649', '7000', '7999', '85000', '94999', '970000', '999999' ] ],
138             88 => [ 'Italy' => [ '00', '19', '200', '311', '31200', '31499', '315', '318', '31900', '32299', '323', '326', '3270', '3389', '339', '360', '3610', '3629', '363', '548', '5490', '5549', '555', '599', '6000', '8499', '85000', '89999', '900000', '909999', '910', '926', '9270', '9399', '940000', '947999', '94800', '99999' ] ],
139             89 => [ 'Korea, Republic' => [ '00', '24', '250', '549', '5500', '8499', '85000', '94999', '950000', '969999', '97000', '98999', '990', '999' ] ],
140             90 => [ 'Netherlands' => [ '00', '19', '200', '499', '5000', '6999', '70000', '79999', '800000', '849999', '8500', '8999', '90', '90', '94', '94' ] ],
141             91 => [ 'Sweden' => [ '0', '1', '20', '49', '500', '649', '7000', '8199', '85000', '94999', '970000', '999999' ] ],
142             92 => [ 'International NGO Publishers and EU Organizations' => [ '0', '5', '60', '79', '800', '899', '9000', '9499', '95000', '98999', '990000', '999999' ] ],
143             93 => [ 'India' => [ '00', '09', '100', '499', '5000', '7999', '80000', '95999', '960000', '999999' ] ],
144             94 => [ 'Netherlands' => [ '000', '599', '6000', '8999', '90000', '99999' ] ],
145             600 => [ 'Iran' => [ '00', '09', '100', '499', '5000', '8999', '90000', '98679', '9868', '9929', '993', '995', '99600', '99999' ] ],
146             601 => [ 'Kazakhstan' => [ '00', '19', '200', '699', '7000', '7999', '80000', '84999', '85', '99' ] ],
147             602 => [ 'Indonesia' => [ '00', '06', '0700', '1399', '14000', '14999', '1500', '1699', '17000', '19999', '200', '499', '50000', '53999', '5400', '5999', '60000', '61999', '6200', '6999', '70000', '74999', '7500', '9499', '95000', '99999' ] ],
148             603 => [ 'Saudi Arabia' => [ '00', '04', '05', '49', '500', '799', '8000', '8999', '90000', '99999' ] ],
149             604 => [ 'Vietnam' => [ '0', '2', '300', '399', '40', '46', '470', '497', '4980', '4999', '50', '89', '900', '979', '9800', '9999' ] ],
150             605 => [ 'Turkey' => [ '00', '02', '030', '039', '04', '05', '06000', '06999', '07', '09', '100', '199', '2000', '2399', '240', '399', '4000', '5999', '60000', '74999', '7500', '7999', '80000', '89999', '9000', '9999' ] ],
151             606 => [ 'Romania' => [ '000', '099', '10', '49', '500', '799', '8000', '9099', '910', '919', '92000', '95999', '9600', '9749', '975', '999' ] ],
152             607 => [ 'Mexico' => [ '00', '39', '400', '588', '5890', '5929', '59300', '59999', '600', '749', '7500', '9499', '95000', '99999' ] ],
153             608 => [ 'North Macedonia' => [ '0', '0', '10', '19', '200', '449', '4500', '6499', '65000', '69999', '7', '9' ] ],
154             609 => [ 'Lithuania' => [ '00', '39', '400', '799', '8000', '9499', '95000', '99999' ] ],
155             611 => [ 'Thailand' => [ ] ],
156             612 => [ 'Peru' => [ '00', '29', '300', '399', '4000', '4499', '45000', '49999', '5000', '5149' ] ],
157             613 => [ 'Mauritius' => [ '0', '9' ] ],
158             614 => [ 'Lebanon' => [ '00', '39', '400', '799', '8000', '9499', '95000', '99999' ] ],
159             615 => [ 'Hungary' => [ '00', '09', '100', '499', '5000', '7999', '80000', '89999' ] ],
160             616 => [ 'Thailand' => [ '00', '19', '200', '699', '7000', '8999', '90000', '99999' ] ],
161             617 => [ 'Ukraine' => [ '00', '49', '500', '699', '7000', '8999', '90000', '99999' ] ],
162             618 => [ 'Greece' => [ '00', '19', '200', '499', '5000', '7999', '80000', '99999' ] ],
163             619 => [ 'Bulgaria' => [ '00', '14', '150', '699', '7000', '8999', '90000', '99999' ] ],
164             620 => [ 'Mauritius' => [ '0', '9' ] ],
165             621 => [ 'Philippines' => [ '00', '29', '400', '599', '8000', '8999', '95000', '99999' ] ],
166             622 => [ 'Iran' => [ '00', '10', '200', '424', '5200', '8499', '90000', '99999' ] ],
167             623 => [ 'Indonesia' => [ '00', '09', '110', '499', '5250', '8799', '88000', '99999' ] ],
168             624 => [ 'Sri Lanka' => [ '00', '04', '200', '249', '5000', '6699', '93000', '99999' ] ],
169             625 => [ 'Turkey' => [ '00', '01', '365', '442', '44300', '44499', '445', '449', '6000', '7793', '77940', '77949', '7795', '8499', '94000', '99999' ] ],
170             626 => [ 'Taiwan' => [ '00', '04', '300', '499', '7000', '7999', '95000', '99999' ] ],
171             627 => [ 'Pakistan' => [ '30', '31', '500', '524', '7500', '7999' ] ],
172             628 => [ 'Colombia' => [ '00', '09', '500', '549', '7500', '8499', '95000', '99999' ] ],
173             629 => [ 'Malaysia' => [ '00', '02', '470', '499', '7500', '7999', '96500', '99999' ] ],
174             630 => [ 'Romania' => [ '300', '349', '6500', '6849' ] ],
175             631 => [ 'Argentina' => [ '00', '09', '300', '399', '6500', '7499', '90000', '99999' ] ],
176             950 => [ 'Argentina' => [ '00', '49', '500', '899', '9000', '9899', '99000', '99999' ] ],
177             951 => [ 'Finland' => [ '0', '1', '20', '54', '550', '889', '8900', '9499', '95000', '99999' ] ],
178             952 => [ 'Finland' => [ '00', '19', '200', '499', '5000', '5999', '60', '64', '65000', '65999', '6600', '6699', '67000', '69999', '7000', '7999', '80', '94', '9500', '9899', '99000', '99999' ] ],
179             953 => [ 'Croatia' => [ '0', '0', '10', '14', '150', '479', '48000', '49999', '500', '500', '50100', '50999', '51', '54', '55000', '59999', '6000', '9499', '95000', '99999' ] ],
180             954 => [ 'Bulgaria' => [ '00', '28', '2900', '2999', '300', '799', '8000', '8999', '90000', '92999', '9300', '9999' ] ],
181             955 => [ 'Sri Lanka' => [ '0000', '1999', '20', '33', '3400', '3549', '35500', '35999', '3600', '3799', '38000', '38999', '3900', '4099', '41000', '44999', '4500', '4999', '50000', '54999', '550', '710', '71100', '71499', '7150', '9499', '95000', '99999' ] ],
182             956 => [ 'Chile' => [ '00', '08', '09000', '09999', '10', '19', '200', '599', '6000', '6999', '7000', '9999' ] ],
183             957 => [ 'Taiwan' => [ '00', '02', '0300', '0499', '05', '19', '2000', '2099', '21', '27', '28000', '30999', '31', '43', '440', '819', '8200', '9699', '97000', '99999' ] ],
184             958 => [ 'Colombia' => [ '00', '49', '500', '509', '5100', '5199', '52000', '53999', '5400', '5599', '56000', '59999', '600', '799', '8000', '9499', '95000', '99999' ] ],
185             959 => [ 'Cuba' => [ '00', '19', '200', '699', '7000', '8499', '85000', '99999' ] ],
186             960 => [ 'Greece' => [ '00', '19', '200', '659', '6600', '6899', '690', '699', '7000', '8499', '85000', '92999', '93', '93', '9400', '9799', '98000', '99999' ] ],
187             961 => [ 'Slovenia' => [ '00', '19', '200', '599', '6000', '8999', '90000', '97999' ] ],
188             962 => [ 'Hong Kong, China' => [ '00', '19', '200', '699', '7000', '8499', '85000', '86999', '8700', '8999', '900', '999' ] ],
189             963 => [ 'Hungary' => [ '00', '19', '200', '699', '7000', '8499', '85000', '89999', '9000', '9999' ] ],
190             964 => [ 'Iran' => [ '00', '14', '150', '249', '2500', '2999', '300', '549', '5500', '8999', '90000', '96999', '970', '989', '9900', '9999' ] ],
191             965 => [ 'Israel' => [ '00', '19', '200', '599', '7000', '7999', '90000', '99999' ] ],
192             966 => [ 'Ukraine' => [ '00', '12', '130', '139', '14', '14', '1500', '1699', '170', '199', '2000', '2789', '279', '289', '2900', '2999', '300', '699', '7000', '8999', '90000', '90999', '910', '949', '95000', '97999', '980', '999' ] ],
193             967 => [ 'Malaysia' => [ '0000', '0999', '10000', '19999', '2000', '2499', '250', '254', '25500', '26999', '2700', '2799', '2800', '2999', '300', '499', '5000', '5999', '60', '89', '900', '989', '9900', '9989', '99900', '99999' ] ],
194             968 => [ 'Mexico' => [ '01', '39', '400', '499', '5000', '7999', '800', '899', '9000', '9999' ] ],
195             969 => [ 'Pakistan' => [ '0', '1', '20', '20', '210', '219', '2200', '2299', '23000', '23999', '24', '39', '400', '749', '7500', '9999' ] ],
196             970 => [ 'Mexico' => [ '01', '59', '600', '899', '9000', '9099', '91000', '96999', '9700', '9999' ] ],
197             971 => [ 'Philippines' => [ '000', '015', '0160', '0199', '02', '02', '0300', '0599', '06', '49', '500', '849', '8500', '9099', '91000', '95999', '9600', '9699', '97', '98', '9900', '9999' ] ],
198             972 => [ 'Portugal' => [ '0', '1', '20', '54', '550', '799', '8000', '9499', '95000', '99999' ] ],
199             973 => [ 'Romania' => [ '0', '0', '100', '169', '1700', '1999', '20', '54', '550', '759', '7600', '8499', '85000', '88999', '8900', '9499', '95000', '99999' ] ],
200             974 => [ 'Thailand' => [ '00', '19', '200', '699', '7000', '8499', '85000', '89999', '90000', '94999', '9500', '9999' ] ],
201             975 => [ 'Turkey' => [ '00000', '01999', '02', '23', '2400', '2499', '250', '599', '6000', '9199', '92000', '98999', '990', '999' ] ],
202             976 => [ 'Caribbean Community' => [ '0', '3', '40', '59', '600', '799', '8000', '9499', '95000', '99999' ] ],
203             977 => [ 'Egypt' => [ '00', '19', '200', '499', '5000', '6999', '700', '849', '85000', '89299', '893', '894', '8950', '8999', '90', '98', '990', '999' ] ],
204             978 => [ 'Nigeria' => [ '000', '199', '2000', '2999', '30000', '77999', '780', '799', '8000', '8999', '900', '999' ] ],
205             979 => [ 'Indonesia' => [ '000', '099', '1000', '1499', '15000', '19999', '20', '29', '3000', '3999', '400', '799', '8000', '9499', '95000', '99999' ] ],
206             980 => [ 'Venezuela' => [ '00', '19', '200', '599', '6000', '9999' ] ],
207             981 => [ 'Singapore' => [ '00', '16', '17000', '17999', '18', '19', '200', '299', '3000', '3099', '310', '399', '4000', '9499', '97', '99' ] ],
208             982 => [ 'South Pacific' => [ '00', '09', '100', '699', '70', '89', '9000', '9799', '98000', '99999' ] ],
209             983 => [ 'Malaysia' => [ '00', '01', '020', '199', '2000', '3999', '40000', '44999', '45', '49', '50', '79', '800', '899', '9000', '9899', '99000', '99999' ] ],
210             984 => [ 'Bangladesh' => [ '00', '39', '400', '799', '8000', '8999', '90000', '99999' ] ],
211             985 => [ 'Belarus' => [ '00', '39', '400', '599', '6000', '8799', '880', '899', '90000', '99999' ] ],
212             986 => [ 'Taiwan' => [ '00', '05', '06000', '06999', '0700', '0799', '08', '11', '120', '539', '5400', '7999', '80000', '99999' ] ],
213             987 => [ 'Argentina' => [ '00', '09', '1000', '1999', '20000', '29999', '30', '35', '3600', '4199', '42', '43', '4400', '4499', '45000', '48999', '4900', '4999', '500', '824', '8250', '8279', '82800', '82999', '8300', '8499', '85', '88', '8900', '9499', '95000', '99999' ] ],
214             988 => [ 'Hong Kong, China' => [ '00', '11', '12000', '19999', '200', '699', '70000', '79999', '8000', '9699', '97000', '99999' ] ],
215             989 => [ 'Portugal' => [ '0', '1', '20', '34', '35000', '36999', '37', '52', '53000', '54999', '550', '799', '8000', '9499', '95000', '99999' ] ],
216             9910 => [ 'Uzbekistan' => [ '01', '05', '730', '799', '9400', '9999' ] ],
217             9911 => [ 'Montenegro' => [ '20', '24', '550', '749' ] ],
218             9912 => [ 'Tanzania' => [ '40', '44', '750', '799', '9800', '9999' ] ],
219             9913 => [ 'Uganda' => [ '00', '07', '600', '699', '9550', '9999' ] ],
220             9914 => [ 'Kenya' => [ '40', '52', '700', '774', '9600', '9999' ] ],
221             9915 => [ 'Uruguay' => [ '40', '59', '650', '799', '9300', '9999' ] ],
222             9916 => [ 'Estonia' => [ '0', '0', '10', '39', '4', '5', '600', '799', '80', '84', '850', '899', '90', '91', '9250', '9999' ] ],
223             9917 => [ 'Bolivia' => [ '0', '0', '30', '34', '600', '699', '9700', '9999' ] ],
224             9918 => [ 'Malta' => [ '0', '0', '20', '29', '600', '799', '9500', '9999' ] ],
225             9919 => [ 'Mongolia' => [ '0', '0', '20', '29', '500', '599', '9000', '9999' ] ],
226             9920 => [ 'Morocco' => [ '30', '42', '500', '799', '8750', '9999' ] ],
227             9921 => [ 'Kuwait' => [ '0', '0', '30', '39', '700', '899', '9700', '9999' ] ],
228             9922 => [ 'Iraq' => [ '20', '29', '600', '799', '8500', '9999' ] ],
229             9923 => [ 'Jordan' => [ '0', '0', '10', '59', '700', '899', '9400', '9999' ] ],
230             9924 => [ 'Cambodia' => [ '30', '39', '500', '649', '9000', '9999' ] ],
231             9925 => [ 'Cyprus' => [ '0', '2', '30', '54', '550', '734', '7350', '9999' ] ],
232             9926 => [ 'Bosnia and Herzegovina' => [ '0', '1', '20', '39', '400', '799', '8000', '9999' ] ],
233             9927 => [ 'Qatar' => [ '00', '09', '100', '399', '4000', '4999' ] ],
234             9928 => [ 'Albania' => [ '00', '09', '100', '399', '4000', '4999', '800', '899', '90', '99' ] ],
235             9929 => [ 'Guatemala' => [ '0', '3', '40', '54', '550', '799', '8000', '9999' ] ],
236             9930 => [ 'Costa Rica' => [ '00', '49', '500', '939', '9400', '9999' ] ],
237             9931 => [ 'Algeria' => [ '00', '23', '240', '899', '9000', '9999' ] ],
238             9932 => [ 'Lao People\'s Democratic Republic' => [ '00', '39', '400', '849', '8500', '9999' ] ],
239             9933 => [ 'Syria' => [ '0', '0', '10', '39', '400', '899', '9000', '9999' ] ],
240             9934 => [ 'Latvia' => [ '0', '0', '10', '49', '500', '799', '8000', '9999' ] ],
241             9935 => [ 'Iceland' => [ '0', '0', '10', '39', '400', '899', '9000', '9999' ] ],
242             9936 => [ 'Afghanistan' => [ '0', '1', '20', '39', '400', '799', '8000', '9999' ] ],
243             9937 => [ 'Nepal' => [ '0', '2', '30', '49', '500', '799', '8000', '9999' ] ],
244             9938 => [ 'Tunisia' => [ '00', '79', '800', '949', '9500', '9749', '975', '990', '9910', '9999' ] ],
245             9939 => [ 'Armenia' => [ '0', '3', '40', '79', '800', '899', '9000', '9599', '960', '979', '98', '99' ] ],
246             9940 => [ 'Montenegro' => [ '0', '1', '20', '49', '500', '839', '84', '86', '8700', '9999' ] ],
247             9941 => [ 'Georgia' => [ '0', '0', '10', '39', '400', '799', '8', '8', '9000', '9999' ] ],
248             9942 => [ 'Ecuador' => [ '00', '59', '600', '699', '7000', '7499', '750', '849', '8500', '8999', '900', '984', '9850', '9999' ] ],
249             9943 => [ 'Uzbekistan' => [ '00', '29', '300', '399', '4000', '9749', '975', '999' ] ],
250             9944 => [ 'Turkey' => [ '0000', '0999', '100', '499', '5000', '5999', '60', '69', '700', '799', '80', '89', '900', '999' ] ],
251             9945 => [ 'Dominican Republic' => [ '00', '00', '010', '079', '08', '39', '400', '569', '57', '57', '580', '799', '80', '80', '810', '849', '8500', '9999' ] ],
252             9946 => [ 'Korea, P.D.R.' => [ '0', '1', '20', '39', '400', '899', '9000', '9999' ] ],
253             9947 => [ 'Algeria' => [ '0', '1', '20', '79', '800', '999' ] ],
254             9948 => [ 'United Arab Emirates' => [ '00', '39', '400', '849', '8500', '9999' ] ],
255             9949 => [ 'Estonia' => [ '00', '08', '090', '099', '10', '39', '400', '699', '70', '71', '7200', '7499', '75', '89', '9000', '9999' ] ],
256             9950 => [ 'Palestine' => [ '00', '29', '300', '849', '8500', '9999' ] ],
257             9951 => [ 'Kosova' => [ '00', '38', '390', '849', '8500', '9799', '980', '999' ] ],
258             9952 => [ 'Azerbaijan' => [ '0', '1', '20', '39', '400', '799', '8000', '9999' ] ],
259             9953 => [ 'Lebanon' => [ '0', '0', '10', '39', '400', '599', '60', '89', '9000', '9299', '93', '96', '970', '999' ] ],
260             9954 => [ 'Morocco' => [ '0', '1', '20', '39', '400', '799', '8000', '9899', '99', '99' ] ],
261             9955 => [ 'Lithuania' => [ '00', '39', '400', '929', '9300', '9999' ] ],
262             9956 => [ 'Cameroon' => [ '0', '0', '10', '39', '400', '899', '9000', '9999' ] ],
263             9957 => [ 'Jordan' => [ '00', '39', '400', '649', '65', '67', '680', '699', '70', '84', '8500', '8799', '88', '99' ] ],
264             9958 => [ 'Bosnia and Herzegovina' => [ '00', '01', '020', '029', '0300', '0399', '040', '089', '0900', '0999', '10', '18', '1900', '1999', '20', '49', '500', '899', '9000', '9999' ] ],
265             9959 => [ 'Libya' => [ '0', '1', '20', '79', '800', '949', '9500', '9699', '970', '979', '98', '99' ] ],
266             9960 => [ 'Saudi Arabia' => [ '00', '59', '600', '899', '9000', '9999' ] ],
267             9961 => [ 'Algeria' => [ '0', '2', '30', '69', '700', '949', '9500', '9999' ] ],
268             9962 => [ 'Panama' => [ '00', '54', '5500', '5599', '56', '59', '600', '849', '8500', '9999' ] ],
269             9963 => [ 'Cyprus' => [ '0', '1', '2000', '2499', '250', '279', '2800', '2999', '30', '54', '550', '734', '7350', '7499', '7500', '9999' ] ],
270             9964 => [ 'Ghana' => [ '0', '6', '70', '94', '950', '999' ] ],
271             9965 => [ 'Kazakhstan' => [ '00', '39', '400', '899', '9000', '9999' ] ],
272             9966 => [ 'Kenya' => [ '000', '139', '14', '14', '1500', '1999', '20', '69', '7000', '7499', '750', '820', '8210', '8249', '825', '825', '8260', '8289', '829', '959', '9600', '9999' ] ],
273             9967 => [ 'Kyrgyz Republic' => [ '00', '39', '400', '899', '9000', '9999' ] ],
274             9968 => [ 'Costa Rica' => [ '00', '49', '500', '939', '9400', '9999' ] ],
275             9969 => [ 'Algeria' => [ '00', '06', '500', '649', '9700', '9999' ] ],
276             9970 => [ 'Uganda' => [ '00', '39', '400', '899', '9000', '9999' ] ],
277             9971 => [ 'Singapore' => [ '0', '5', '60', '89', '900', '989', '9900', '9999' ] ],
278             9972 => [ 'Peru' => [ '00', '09', '1', '1', '200', '249', '2500', '2999', '30', '59', '600', '899', '9000', '9999' ] ],
279             9973 => [ 'Tunisia' => [ '00', '05', '060', '089', '0900', '0999', '10', '69', '700', '969', '9700', '9999' ] ],
280             9974 => [ 'Uruguay' => [ '0', '2', '30', '54', '550', '749', '7500', '8799', '880', '909', '91', '94', '95', '99' ] ],
281             9975 => [ 'Moldova' => [ '0', '0', '100', '299', '3000', '3999', '4000', '4499', '45', '89', '900', '949', '9500', '9999' ] ],
282             9976 => [ 'Tanzania' => [ '0', '4', '5000', '5799', '580', '589', '59', '89', '900', '989', '9900', '9999' ] ],
283             9977 => [ 'Costa Rica' => [ '00', '89', '900', '989', '9900', '9999' ] ],
284             9978 => [ 'Ecuador' => [ '00', '29', '300', '399', '40', '94', '950', '989', '9900', '9999' ] ],
285             9979 => [ 'Iceland' => [ '0', '4', '50', '64', '650', '659', '66', '75', '760', '899', '9000', '9999' ] ],
286             9980 => [ 'Papua New Guinea' => [ '0', '3', '40', '89', '900', '989', '9900', '9999' ] ],
287             9981 => [ 'Morocco' => [ '00', '09', '100', '159', '1600', '1999', '20', '79', '800', '949', '9500', '9999' ] ],
288             9982 => [ 'Zambia' => [ '00', '79', '800', '989', '9900', '9999' ] ],
289             9983 => [ 'Gambia' => [ '80', '94', '950', '989', '9900', '9999' ] ],
290             9984 => [ 'Latvia' => [ '00', '49', '500', '899', '9000', '9999' ] ],
291             9985 => [ 'Estonia' => [ '0', '4', '50', '79', '800', '899', '9000', '9999' ] ],
292             9986 => [ 'Lithuania' => [ '00', '39', '400', '899', '9000', '9399', '940', '969', '97', '99' ] ],
293             9987 => [ 'Tanzania' => [ '00', '39', '400', '879', '8800', '9999' ] ],
294             9988 => [ 'Ghana' => [ '0', '3', '40', '54', '550', '749', '7500', '9999' ] ],
295             9989 => [ 'North Macedonia' => [ '0', '0', '100', '199', '2000', '2999', '30', '59', '600', '949', '9500', '9999' ] ],
296             99901 => [ 'Bahrain' => [ '00', '49', '500', '799', '80', '99' ] ],
297             99902 => [ 'Reserved Agency' => [ ] ],
298             99903 => [ 'Mauritius' => [ '0', '1', '20', '89', '900', '999' ] ],
299             99904 => [ 'Curaçao' => [ '0', '5', '60', '89', '900', '999' ] ],
300             99905 => [ 'Bolivia' => [ '0', '3', '40', '79', '800', '999' ] ],
301             99906 => [ 'Kuwait' => [ '0', '2', '30', '59', '600', '699', '70', '89', '90', '94', '950', '999' ] ],
302             99908 => [ 'Malawi' => [ '0', '0', '10', '89', '900', '999' ] ],
303             99909 => [ 'Malta' => [ '0', '3', '40', '94', '950', '999' ] ],
304             99910 => [ 'Sierra Leone' => [ '0', '2', '30', '89', '900', '999' ] ],
305             99911 => [ 'Lesotho' => [ '00', '59', '600', '999' ] ],
306             99912 => [ 'Botswana' => [ '0', '3', '400', '599', '60', '89', '900', '999' ] ],
307             99913 => [ 'Andorra' => [ '0', '2', '30', '35', '600', '604' ] ],
308             99914 => [ 'International NGO Publishers' => [ '0', '4', '50', '69', '7', '7', '80', '86', '870', '879', '88', '89', '900', '999' ] ],
309             99915 => [ 'Maldives' => [ '0', '4', '50', '79', '800', '999' ] ],
310             99916 => [ 'Namibia' => [ '0', '2', '30', '69', '700', '999' ] ],
311             99917 => [ 'Brunei Darussalam' => [ '0', '2', '30', '88', '890', '999' ] ],
312             99918 => [ 'Faroe Islands' => [ '0', '3', '40', '79', '800', '999' ] ],
313             99919 => [ 'Benin' => [ '0', '2', '300', '399', '40', '79', '800', '999' ] ],
314             99920 => [ 'Andorra' => [ '0', '4', '50', '89', '900', '999' ] ],
315             99921 => [ 'Qatar' => [ '0', '1', '20', '69', '700', '799', '8', '8', '90', '99' ] ],
316             99922 => [ 'Guatemala' => [ '0', '3', '40', '69', '700', '999' ] ],
317             99923 => [ 'El Salvador' => [ '0', '1', '20', '79', '800', '999' ] ],
318             99924 => [ 'Nicaragua' => [ '0', '1', '20', '79', '800', '999' ] ],
319             99925 => [ 'Paraguay' => [ '0', '0', '10', '19', '200', '299', '3', '3', '40', '79', '800', '999' ] ],
320             99926 => [ 'Honduras' => [ '0', '0', '10', '59', '600', '869', '87', '89', '90', '99' ] ],
321             99927 => [ 'Albania' => [ '0', '2', '30', '59', '600', '999' ] ],
322             99928 => [ 'Georgia' => [ '0', '0', '10', '79', '800', '999' ] ],
323             99929 => [ 'Mongolia' => [ '0', '4', '50', '79', '800', '999' ] ],
324             99930 => [ 'Armenia' => [ '0', '4', '50', '79', '800', '999' ] ],
325             99931 => [ 'Seychelles' => [ '0', '4', '50', '79', '800', '999' ] ],
326             99932 => [ 'Malta' => [ '0', '0', '10', '59', '600', '699', '7', '7', '80', '99' ] ],
327             99933 => [ 'Nepal' => [ '0', '2', '30', '59', '600', '999' ] ],
328             99934 => [ 'Dominican Republic' => [ '0', '1', '20', '79', '800', '999' ] ],
329             99935 => [ 'Haiti' => [ '0', '2', '30', '59', '600', '699', '7', '8', '90', '99' ] ],
330             99936 => [ 'Bhutan' => [ '0', '0', '10', '59', '600', '999' ] ],
331             99937 => [ 'Macau' => [ '0', '1', '20', '59', '600', '999' ] ],
332             99938 => [ 'Srpska, Republic of' => [ '0', '1', '20', '59', '600', '899', '90', '99' ] ],
333             99939 => [ 'Guatemala' => [ '0', '2', '30', '59', '60', '89', '900', '999' ] ],
334             99940 => [ 'Georgia' => [ '0', '0', '10', '69', '700', '999' ] ],
335             99941 => [ 'Armenia' => [ '0', '2', '30', '79', '800', '999' ] ],
336             99942 => [ 'Sudan' => [ '0', '4', '50', '79', '800', '999' ] ],
337             99943 => [ 'Albania' => [ '0', '2', '30', '59', '600', '999' ] ],
338             99944 => [ 'Ethiopia' => [ '0', '4', '50', '79', '800', '999' ] ],
339             99945 => [ 'Namibia' => [ '0', '4', '50', '89', '900', '999' ] ],
340             99946 => [ 'Nepal' => [ '0', '2', '30', '59', '600', '999' ] ],
341             99947 => [ 'Tajikistan' => [ '0', '2', '30', '69', '700', '999' ] ],
342             99948 => [ 'Eritrea' => [ '0', '4', '50', '79', '800', '999' ] ],
343             99949 => [ 'Mauritius' => [ '0', '1', '20', '79', '8', '8', '900', '989', '99', '99' ] ],
344             99950 => [ 'Cambodia' => [ '0', '4', '50', '79', '800', '999' ] ],
345             99951 => [ 'Reserved Agency' => [ ] ],
346             99952 => [ 'Mali' => [ '0', '4', '50', '79', '800', '999' ] ],
347             99953 => [ 'Paraguay' => [ '0', '2', '30', '79', '800', '939', '94', '99' ] ],
348             99954 => [ 'Bolivia' => [ '0', '2', '30', '69', '700', '879', '88', '99' ] ],
349             99955 => [ 'Srpska, Republic of' => [ '0', '1', '20', '59', '600', '799', '80', '99' ] ],
350             99956 => [ 'Albania' => [ '00', '59', '600', '859', '86', '99' ] ],
351             99957 => [ 'Malta' => [ '0', '1', '20', '79', '800', '949', '95', '99' ] ],
352             99958 => [ 'Bahrain' => [ '0', '4', '50', '93', '940', '949', '950', '999' ] ],
353             99959 => [ 'Luxembourg' => [ '0', '2', '30', '59', '600', '999' ] ],
354             99960 => [ 'Malawi' => [ '070', '099', '10', '94', '950', '999' ] ],
355             99961 => [ 'El Salvador' => [ '0', '2', '300', '369', '37', '89', '900', '999' ] ],
356             99962 => [ 'Mongolia' => [ '0', '4', '50', '79', '800', '999' ] ],
357             99963 => [ 'Cambodia' => [ '00', '49', '500', '919', '92', '99' ] ],
358             99964 => [ 'Nicaragua' => [ '0', '1', '20', '79', '800', '999' ] ],
359             99965 => [ 'Macau' => [ '0', '2', '300', '359', '36', '62', '630', '999' ] ],
360             99966 => [ 'Kuwait' => [ '0', '2', '30', '69', '700', '799', '80', '96', '970', '999' ] ],
361             99967 => [ 'Paraguay' => [ '0', '0', '10', '59', '600', '999' ] ],
362             99968 => [ 'Botswana' => [ '0', '3', '400', '599', '60', '89', '900', '999' ] ],
363             99969 => [ 'Oman' => [ '0', '4', '50', '79', '800', '949', '95', '99' ] ],
364             99970 => [ 'Haiti' => [ '0', '4', '50', '89', '900', '999' ] ],
365             99971 => [ 'Myanmar' => [ '0', '3', '40', '84', '850', '999' ] ],
366             99972 => [ 'Faroe Islands' => [ '0', '4', '50', '89', '900', '999' ] ],
367             99973 => [ 'Mongolia' => [ '0', '3', '40', '79', '800', '999' ] ],
368             99974 => [ 'Bolivia' => [ '0', '0', '10', '25', '260', '399', '40', '63', '640', '649', '65', '79', '800', '999' ] ],
369             99975 => [ 'Tajikistan' => [ '0', '2', '300', '399', '40', '79', '800', '999' ] ],
370             99976 => [ 'Srpska, Republic of' => [ '0', '0', '10', '15', '160', '199', '20', '59', '600', '819', '82', '89', '900', '999' ] ],
371             99977 => [ 'Rwanda' => [ '0', '1', '40', '69', '700', '799', '975', '999' ] ],
372             99978 => [ 'Mongolia' => [ '0', '4', '50', '69', '700', '999' ] ],
373             99979 => [ 'Honduras' => [ '0', '3', '40', '79', '800', '999' ] ],
374             99980 => [ 'Bhutan' => [ '0', '0', '30', '59', '750', '999' ] ],
375             99981 => [ 'Macau' => [ '0', '1', '200', '219', '24', '74', '750', '999' ] ],
376             99982 => [ 'Benin' => [ '0', '1', '50', '68', '900', '999' ] ],
377             99983 => [ 'El Salvador' => [ '0', '0', '35', '69', '900', '999' ] ],
378             99984 => [ 'Brunei Darussalam' => [ '0', '0', '50', '69', '950', '999' ] ],
379             99985 => [ 'Tajikistan' => [ '0', '1', '35', '79', '850', '999' ] ],
380             99986 => [ 'Myanmar' => [ '0', '0', '50', '69', '950', '999' ] ],
381             99987 => [ 'Luxembourg' => [ '700', '999' ] ],
382             99988 => [ 'Sudan' => [ '0', '0', '50', '54', '800', '824' ] ],
383             99989 => [ 'Paraguay' => [ '0', '0', '50', '64', '900', '999' ] ],
384             99990 => [ 'Ethiopia' => [ '0', '0', '50', '54', '975', '999' ] ],
385             99992 => [ 'Oman' => [ '0', '1', '50', '64', '950', '999' ] ],
386             99993 => [ 'Mauritius' => [ '0', '1', '50', '54', '980', '999' ] ],
387             },
388             979 => {
389             8 => [ 'United States' => [ '200', '229', '3200', '3499', '3500', '8849', '88500', '89999', '90000', '90999', '9850000', '9899999', '9900000', '9929999' ] ],
390             10 => [ 'France' => [ '00', '19', '200', '699', '7000', '8999', '90000', '97599', '976000', '999999' ] ],
391             11 => [ 'Korea, Republic' => [ '00', '24', '250', '549', '5500', '8499', '85000', '94999', '950000', '999999' ] ],
392             12 => [ 'Italy' => [ '200', '299', '5450', '5999', '80000', '84999' ] ],
393             },
394             );
395             # END REPLACE
396             }
397              
398             sub _get_data {
399             # eventually fetch this from the internet
400             # http://www.isbn-international.org/agency?rmxml=1
401              
402 4 50 66 4   410981 if( defined $ENV{ISBN_RANGE_MESSAGE} and ! -e $ENV{ISBN_RANGE_MESSAGE} ) {
403 0         0 carp "ISBN_RANGE_MESSAGE is set to [$ENV{ISBN_RANGE_MESSAGE}] but that file does not exist!\nTrying to use the default locations\n";
404             }
405              
406 4         10 my $file = 'RangeMessage.xml';
407 2     2   19 no warnings 'uninitialized';
  2         4  
  2         1874  
408 12         194 my @candidates = grep { -e } (
409             $ENV{ISBN_RANGE_MESSAGE}, # env
410 4         458 catfile( dirname( __FILE__ ), $file ), # next to the module
411             $file, # current directory
412             );
413              
414 4         14 my $hash;
415              
416 4 100       32 $hash = _parse_range_message( $candidates[0] ) if @candidates;
417              
418 4 100       31 if( defined $hash ) { return %$hash }
  3         39  
419 1         5 else { _default_data() }
420             }
421              
422             sub _parse_range_message {
423 3     3   10 my( $file ) = @_;
424              
425 3 50       198 open my $fh, '<:utf8', $file or do {
426 0         0 carp "Could not open $file to get ISBN range data [$!]\n";
427             return
428 0         0 };
429              
430 3         7 my $data = do { local $/; <$fh> };
  3         16  
  3         1313  
431              
432 3         18 my $ds;
433              
434 3         51 my( $serial_number ) = $data =~ m|(.*?)|;
435 3         29 my( $date ) = $data =~ m|(.*?)|;
436              
437 3         18 $ds->{'_source'} = $file;
438 3         8 $ds->{'_serial'} = $serial_number;
439 3         7 $ds->{'_date'} = $date;
440              
441 3         8842 my( $registration_groups ) = $data =~ m|(.*?)|s;
442              
443 3         9944 my @groups = $registration_groups =~ m|(.*?)|sg;
444              
445 3         19 foreach my $group ( @groups ) {
446 807         3764 my( $isbn_prefix, $prefix ) = $group =~ m|(97[89]-)?([0-9]+?)|;
447 807 100       1897 $isbn_prefix = $isbn_prefix eq '979-' ? "979" : "978";
448 807         2714 my( $agency ) = $group =~ m|(.*?)|;
449 807         2814 $agency =~ s/^\s+|\s+$//g; # 'Croatia ' ???
450             my @rules =
451             map {
452 4251         15762 my( $range ) = m|(.*?)|;
453 4251         14028 my( $length ) = m|(.*?)|;
454 4251         11096 my( $low, $high ) = split /-/, $range, 2;
455 4251         13866 ( substr($low, 0, $length), substr($high, 0, $length) );
456             }
457             grep {
458 807         12025 ! m|0|
  4674         9309  
459             }
460             $group =~ m|(.*?)|sg;
461              
462 807         4228 $ds->{$isbn_prefix}->{$prefix} = [ $agency => \@rules ];
463             }
464              
465 3         142 $ds;
466             }
467              
468             %Business::ISBN::country_data = _get_data();
469              
470             # I cheat a little bit here. I know that that the max length is
471             # 5, and that I know that those will start with 999xx. :)
472             # however, if the data changes I should think about this again.
473             $Business::ISBN::MAX_COUNTRY_CODE_LENGTH = length(
474             ( sort { $a <=> $b } grep { ! /\A_/ } map { keys %$_ } @Business::ISBN::country_data{qw(978 979)} )[-1]
475             );
476              
477             package # Hide from PAUSE
478             Business::ISBN;
479              
480             sub isbn_group_code_string_from_number {
481 0 0   0     return if $_[0] =~ /\A_/;
482 0   0       return $Business::ISBN::country_data{ $_[0] }[0] || '';
483             }
484              
485             sub isbn_publisher_ranges_from_group_number {
486 0 0   0     return if $_[0] =~ /\A_/;
487 0   0       return $Business::ISBN::country_data{ $_[0] }[1] || [];
488             }
489              
490             sub isbn_data_source {
491 0   0 0     return $Business::ISBN::country_data{ '_source' } || __FILE__
492             }
493              
494             1;