[PATCH9 BigInt v1.60 fix for "\n"
[p5sagit/p5-mst-13.2.git] / lib / Locale / Script.pm
CommitLineData
6b14ceb7 1#
2# Locale::Script - ISO codes for script identification (ISO 15924)
3#
4# $Id: Script.pm,v 2.1 2002/02/06 04:07:10 neilb Exp $
5#
6b6e008c 6
7package Locale::Script;
8use strict;
9require 5.002;
10
6b6e008c 11require Exporter;
12use Carp;
13use Locale::Constants;
14
15
16#-----------------------------------------------------------------------
17# Public Global Variables
18#-----------------------------------------------------------------------
19use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
6b14ceb7 20$VERSION = sprintf("%d.%02d", q$Revision: 2.1 $ =~ /(\d+)\.(\d+)/);
6b6e008c 21@ISA = qw(Exporter);
22@EXPORT = qw(code2script script2code
23 all_script_codes all_script_names
24 script_code2code
25 LOCALE_CODE_ALPHA_2 LOCALE_CODE_ALPHA_3 LOCALE_CODE_NUMERIC);
26
27#-----------------------------------------------------------------------
28# Private Global Variables
29#-----------------------------------------------------------------------
30my $CODES = [];
31my $COUNTRIES = [];
32
33
34#=======================================================================
6b14ceb7 35#
36# code2script ( CODE [, CODESET ] )
37#
6b6e008c 38#=======================================================================
39sub code2script
40{
41 my $code = shift;
42 my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
43
44
45 return undef unless defined $code;
46
47 #-------------------------------------------------------------------
48 # Make sure the code is in the right form before we use it
49 # to look up the corresponding script.
50 # We have to sprintf because the codes are given as 3-digits,
51 # with leading 0's. Eg 070 for Egyptian demotic.
52 #-------------------------------------------------------------------
53 if ($codeset == LOCALE_CODE_NUMERIC)
54 {
55 return undef if ($code =~ /\D/);
56 $code = sprintf("%.3d", $code);
57 }
58 else
59 {
60 $code = lc($code);
61 }
62
63 if (exists $CODES->[$codeset]->{$code})
64 {
65 return $CODES->[$codeset]->{$code};
66 }
67 else
68 {
69 #---------------------------------------------------------------
70 # no such script code!
71 #---------------------------------------------------------------
72 return undef;
73 }
74}
75
6b14ceb7 76
77#=======================================================================
78#
79# script2code ( SCRIPT [, CODESET ] )
80#
81#=======================================================================
6b6e008c 82sub script2code
83{
84 my $script = shift;
85 my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
86
87
88 return undef unless defined $script;
89 $script = lc($script);
90 if (exists $COUNTRIES->[$codeset]->{$script})
91 {
92 return $COUNTRIES->[$codeset]->{$script};
93 }
94 else
95 {
96 #---------------------------------------------------------------
97 # no such script!
98 #---------------------------------------------------------------
99 return undef;
100 }
101}
102
6b14ceb7 103
104#=======================================================================
105#
106# script_code2code ( CODE, IN-CODESET, OUT-CODESET )
107#
108#=======================================================================
6b6e008c 109sub script_code2code
110{
111 (@_ == 3) or croak "script_code2code() takes 3 arguments!";
112
113 my $code = shift;
114 my $inset = shift;
115 my $outset = shift;
6b14ceb7 116 my $outcode;
6b6e008c 117 my $script;
118
119
120 return undef if $inset == $outset;
121 $script = code2script($code, $inset);
122 return undef if not defined $script;
123 $outcode = script2code($script, $outset);
124 return $outcode;
125}
126
6b6e008c 127
128#=======================================================================
6b14ceb7 129#
130# all_script_codes()
131#
132#=======================================================================
6b6e008c 133sub all_script_codes
134{
135 my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
136
137 return keys %{ $CODES->[$codeset] };
138}
139
6b14ceb7 140
141#=======================================================================
142#
143# all_script_names()
144#
145#=======================================================================
6b6e008c 146sub all_script_names
147{
148 my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
149
150 return values %{ $CODES->[$codeset] };
151}
152
153
6b6e008c 154#=======================================================================
6b14ceb7 155#
6b6e008c 156# initialisation code - stuff the DATA into the ALPHA2 hash
6b14ceb7 157#
6b6e008c 158#=======================================================================
159{
160 my ($alpha2, $alpha3, $numeric);
161 my $script;
162
163
164 while (<DATA>)
165 {
166 next unless /\S/;
167 chop;
168 ($alpha2, $alpha3, $numeric, $script) = split(/:/, $_, 4);
169
170 $CODES->[LOCALE_CODE_ALPHA_2]->{$alpha2} = $script;
171 $COUNTRIES->[LOCALE_CODE_ALPHA_2]->{"\L$script"} = $alpha2;
172
173 if ($alpha3)
174 {
175 $CODES->[LOCALE_CODE_ALPHA_3]->{$alpha3} = $script;
176 $COUNTRIES->[LOCALE_CODE_ALPHA_3]->{"\L$script"} = $alpha3;
177 }
178
179 if ($numeric)
180 {
181 $CODES->[LOCALE_CODE_NUMERIC]->{$numeric} = $script;
182 $COUNTRIES->[LOCALE_CODE_NUMERIC]->{"\L$script"} = $numeric;
183 }
184
185 }
186}
187
1881;
189
190__DATA__
191am:ama:130:Aramaic
192ar:ara:160:Arabic
193av:ave:151:Avestan
194bh:bhm:300:Brahmi (Ashoka)
195bi:bid:372:Buhid
196bn:ben:325:Bengali
197bo:bod:330:Tibetan
198bp:bpm:285:Bopomofo
199br:brl:570:Braille
200bt:btk:365:Batak
201bu:bug:367:Buginese (Makassar)
202by:bys:550:Blissymbols
203ca:cam:358:Cham
204ch:chu:221:Old Church Slavonic
205ci:cir:291:Cirth
206cm:cmn:402:Cypro-Minoan
207co:cop:205:Coptic
208cp:cpr:403:Cypriote syllabary
209cy:cyr:220:Cyrillic
210ds:dsr:250:Deserel (Mormon)
211dv:dvn:315:Devanagari (Nagari)
212ed:egd:070:Egyptian demotic
213eg:egy:050:Egyptian hieroglyphs
214eh:egh:060:Egyptian hieratic
215el:ell:200:Greek
216eo:eos:210:Etruscan and Oscan
217et:eth:430:Ethiopic
218gl:glg:225:Glagolitic
219gm:gmu:310:Gurmukhi
220gt:gth:206:Gothic
221gu:guj:320:Gujarati
222ha:han:500:Han ideographs
223he:heb:125:Hebrew
224hg:hgl:420:Hangul
225hm:hmo:450:Pahawh Hmong
226ho:hoo:371:Hanunoo
227hr:hrg:410:Hiragana
228hu:hun:176:Old Hungarian runic
229hv:hvn:175:Kok Turki runic
230hy:hye:230:Armenian
231iv:ivl:610:Indus Valley
232ja:jap:930:(alias for Han + Hiragana + Katakana)
233jl:jlg:445:Cherokee syllabary
234jw:jwi:360:Javanese
235ka:kam:241:Georgian (Mxedruli)
236kh:khn:931:(alias for Hangul + Han)
237kk:kkn:411:Katakana
238km:khm:354:Khmer
239kn:kan:345:Kannada
240kr:krn:357:Karenni (Kayah Li)
241ks:kst:305:Kharoshthi
242kx:kax:240:Georgian (Xucuri)
243la:lat:217:Latin
244lf:laf:215:Latin (Fraktur variant)
245lg:lag:216:Latin (Gaelic variant)
246lo:lao:356:Lao
247lp:lpc:335:Lepcha (Rong)
248md:mda:140:Mandaean
249me:mer:100:Meroitic
250mh:may:090:Mayan hieroglyphs
251ml:mlm:347:Malayalam
252mn:mon:145:Mongolian
253my:mya:350:Burmese
254na:naa:400:Linear A
255nb:nbb:401:Linear B
256og:ogm:212:Ogham
257or:ory:327:Oriya
258os:osm:260:Osmanya
259ph:phx:115:Phoenician
260ph:pah:150:Pahlavi
261pl:pld:282:Pollard Phonetic
262pq:pqd:295:Klingon plQaD
263pr:prm:227:Old Permic
264ps:pst:600:Phaistos Disk
265rn:rnr:211:Runic (Germanic)
266rr:rro:620:Rongo-rongo
267sa:sar:110:South Arabian
268si:sin:348:Sinhala
269sj:syj:137:Syriac (Jacobite variant)
270sl:slb:440:Unified Canadian Aboriginal Syllabics
271sn:syn:136:Syriac (Nestorian variant)
272sw:sww:281:Shavian (Shaw)
273sy:syr:135:Syriac (Estrangelo)
274ta:tam:346:Tamil
275tb:tbw:373:Tagbanwa
276te:tel:340:Telugu
277tf:tfn:120:Tifnagh
278tg:tag:370:Tagalog
279th:tha:352:Thai
280tn:tna:170:Thaana
281tw:twr:290:Tengwar
282va:vai:470:Vai
283vs:vsp:280:Visible Speech
284xa:xas:000:Cuneiform, Sumero-Akkadian
285xf:xfa:105:Cuneiform, Old Persian
286xk:xkn:412:(alias for Hiragana + Katakana)
287xu:xug:106:Cuneiform, Ugaritic
288yi:yii:460:Yi
289zx:zxx:997:Unwritten language
290zy:zyy:998:Undetermined script
291zz:zzz:999:Uncoded script