File Coverage

blib/lib/Font/TTF/OTTags.pm
Criterion Covered Total %
statement 9 18 50.0
branch 0 2 0.0
condition n/a
subroutine 3 4 75.0
pod 1 1 100.0
total 13 25 52.0


line stmt bran cond sub pod time code
1 1     1   14397 use utf8; # NB: This file includes non-ASCII string constants in UTF-8 encoding
  1         9  
  1         5  
2              
3             package Font::TTF::OTTags;
4              
5             =head1 NAME
6              
7             Font::TTF::OTTags - Utilities for TrueType/OpenType tags
8              
9             =head1 SYNOPSIS
10              
11             use Font::TTF::OTTags qw( %tttags %ttnames %iso639 readtagsfile );
12            
13             # Look at built-in stuff:
14             $script_tag = $tttags{'SCRIPT'}{'Cypriot Syllabary'}; # returns 'cprt'
15             $lang_name = $ttnames{'LANGUAGE'}{'ALT '}; # returns 'Altai'
16            
17             # Map iso639-2 tag to/from OT lang tag
18             @isotags = $iso639{'ALT '}; # returns [ 'atv', 'alt' ]
19             $lang_tag = $iso639{'atv'}; # returns 'ALT '
20            
21             # Read latest tags file to add to built-in definitions
22             readtagsfile ("C:\\Program Files\\Microsoft VOLT\\TAGS.txt");
23              
24             First-level keys to %tttags and %ttnames are:
25              
26             =over
27              
28             =item SCRIPT
29              
30             retrieve script tag or name
31              
32             =item LANGUAGE
33              
34             retrieve language tag or name
35              
36             =item FEATURE
37              
38             retrieve feature tag or name
39              
40             =back
41              
42             Built-in data has been derived from the 2014-07-11 draft of the
43             3rd edition of ISO/IEC 14496-22
44             (Information technology - Coding of audio-visual objects - Part 22: Open Font Format)
45             which, when finalized and approved, will replace the second edition (ISO/IEC 14496-22:2009).
46              
47             =head1 METHODS
48              
49             =cut
50              
51 1     1   94 use strict;
  1         3  
  1         59  
52 1     1   4 use vars qw( %tttags %ttnames %iso639 @EXPORT_OK @ISA );
  1         5  
  1         3721  
53             require Exporter;
54             @ISA = qw( Exporter );
55             @EXPORT_OK = qw( %tttags %ttnames %iso639 readtagsfile);
56              
57              
58             # All data below derived Microsoft OpenType specification 1.6
59              
60             %tttags = (
61              
62             'SCRIPT' => {
63             "Arabic" => 'arab',
64             "Armenian" => 'armn',
65             "Avestan" => 'avst',
66             "Balinese" => 'bali',
67             "Bamum" => 'bamu',
68             "Batak" => 'batk',
69             "Bengali" => 'beng',
70             "Bengali v.2" => 'bng2',
71             "Bopomofo" => 'bopo',
72             "Brahmi" => 'brah',
73             "Braille" => 'brai',
74             "Buginese" => 'bugi',
75             "Buhid" => 'buhd',
76             "Byzantine Music" => 'byzm',
77             "Canadian Syllabics" => 'cans',
78             "Carian" => 'cari',
79             "Chakma" => 'cakm',
80             "Cham" => 'cham',
81             "Cherokee" => 'cher',
82             "CJK Ideographic" => 'hani',
83             "Coptic" => 'copt',
84             "Cypriot Syllabary" => 'cprt',
85             "Cyrillic" => 'cyrl',
86             "Default" => 'DFLT',
87             "Deseret" => 'dsrt',
88             "Devanagari" => 'deva',
89             "Devanagari v.2" => 'dev2',
90             "Egyptian hieroglyphs" => 'egyp',
91             "Ethiopic" => 'ethi',
92             "Georgian" => 'geor',
93             "Glagolitic" => 'glag',
94             "Gothic" => 'goth',
95             "Greek" => 'grek',
96             "Gujarati" => 'gujr',
97             "Gujarati v.2" => 'gjr2',
98             "Gurmukhi" => 'guru',
99             "Gurmukhi v.2" => 'gur2',
100             "Hangul" => 'hang',
101             "Hangul Jamo" => 'jamo',
102             "Hanunoo" => 'hano',
103             "Hebrew" => 'hebr',
104             "Hiragana" => 'kana',
105             "Imperial Aramaic" => 'armi',
106             "Inscriptional Pahlavi" => 'phli',
107             "Inscriptional Parthian" => 'prti',
108             "Javanese" => 'java',
109             "Kaithi" => 'kthi',
110             "Kannada" => 'knda',
111             "Kannada v.2" => 'knd2',
112             "Katakana" => 'kana',
113             "Kayah Li" => 'kali',
114             "Kharosthi" => 'khar',
115             "Khmer" => 'khmr',
116             "Lao" => 'lao ',
117             "Latin" => 'latn',
118             "Lepcha" => 'lepc',
119             "Limbu" => 'limb',
120             "Linear B" => 'linb',
121             "Lisu (Fraser)" => 'lisu',
122             "Lycian" => 'lyci',
123             "Lydian" => 'lydi',
124             "Malayalam" => 'mlym',
125             "Malayalam v.2" => 'mlm2',
126             "Mandaic, Mandaean" => 'mand',
127             "Mathematical Alphanumeric Symbols" => 'math',
128             "Meitei Mayek (Meithei, Meetei)" => 'mtei',
129             "Meroitic Cursive" => 'merc',
130             "Meroitic Hieroglyphs" => 'mero',
131             "Miao" => 'plrd',
132             "Mongolian" => 'mong',
133             "Musical Symbols" => 'musc',
134             "Myanmar" => 'mymr',
135             "Myanmar v.2" => 'mym2',
136             "New Tai Lue" => 'talu',
137             "N'Ko" => 'nko ',
138             "Ogham" => 'ogam',
139             "Ol Chiki" => 'olck',
140             "Old Italic" => 'ital',
141             "Old Persian Cuneiform" => 'xpeo',
142             "Old South Arabian" => 'sarb',
143             "Old Turkic, Orkhon Runic" => 'orkh',
144             "Odia (formerly Oriya)" => 'orya',
145             "Odia (formerly Oriya) v.2" => 'ory2',
146             "Osmanya" => 'osma',
147             "Phags-pa" => 'phag',
148             "Phoenician" => 'phnx',
149             "Rejang" => 'rjng',
150             "Runic" => 'runr',
151             "Samaritan" => 'samr',
152             "Saurashtra" => 'saur',
153             "Sharada" => 'shrd',
154             "Shavian" => 'shaw',
155             "Sinhala" => 'sinh',
156             "Sora Sompeng" => 'sora',
157             "Sumero-Akkadian Cuneiform" => 'xsux',
158             "Sundanese" => 'sund',
159             "Syloti Nagri" => 'sylo',
160             "Syriac" => 'syrc',
161             "Tagalog" => 'tglg',
162             "Tagbanwa" => 'tagb',
163             "Tai Le" => 'tale',
164             "Tai Tham (Lanna)" => 'lana',
165             "Tai Viet" => 'tavt',
166             "Takri" => 'takr',
167             "Tamil" => 'taml',
168             "Tamil v.2" => 'tml2',
169             "Telugu" => 'telu',
170             "Telugu v.2" => 'tel2',
171             "Thaana" => 'thaa',
172             "Thai" => 'thai',
173             "Tibetan" => 'tibt',
174             "Tifinagh" => 'tfng',
175             "Ugaritic Cuneiform" => 'ugar',
176             "Vai" => 'vai ',
177             "Yi" => 'yi ',
178             },
179              
180             'LANGUAGE' => {
181             "Aari" => 'ARI ',
182             "Abaza" => 'ABA ',
183             "Abkhazian" => 'ABK ',
184             "Achi" => 'ACR ',
185             "Acholi" => 'ACH ',
186             "Adyghe" => 'ADY ',
187             "Afar" => 'AFR ',
188             "Afrikaans" => 'AFK ',
189             "Agaw" => 'AGW ',
190             "Aiton" => 'AIO ',
191             "Akan" => 'AKA ',
192             "Albanian" => 'SQI ',
193             "Alsatian" => 'ALS ',
194             "Altai" => 'ALT ',
195             "Amharic" => 'AMH ',
196             "Anglo-Saxon" => 'ANG ',
197             "Arabic" => 'ARA ',
198             "Aragonese" => 'ARG ',
199             "Arakwal" => 'RKW ',
200             "Armenian East" => 'HYE0',
201             "Armenian" => 'HYE ',
202             "Aromanian" => 'RUP ',
203             "Arpitan" => 'FRP ',
204             "Assamese" => 'ASM ',
205             "Asturian" => 'AST ',
206             "Athapaskan" => 'ATH ',
207             "Avar" => 'AVR ',
208             "Awadhi" => 'AWA ',
209             "Aymara" => 'AYM ',
210             "Azerbaijani" => 'AZE ',
211             "Badaga" => 'BAD ',
212             "Baghelkhandi" => 'BAG ',
213             "Bagri" => 'BGQ ',
214             "Balante" => 'BLN ',
215             "Balinese" => 'BAN ',
216             "Balkar" => 'BAL ',
217             "Balti" => 'BLT ',
218             "Baluchi" => 'BLI ',
219             "Bambara (Bamanankan)" => 'BMB ',
220             "Bamileke" => 'BML ',
221             "Banda" => 'BAD0',
222             "Bandjalang" => 'BDY ',
223             "Baoulé" => 'BAU ',
224             "Bashkir" => 'BSH ',
225             "Basque" => 'EUQ ',
226             "Batak Simalungun" => 'BTS ',
227             "Batak Toba" => 'BBC ',
228             "Bavarian" => 'BAR ',
229             "Belarusian" => 'BEL ',
230             "Bemba" => 'BEM ',
231             "Bench" => 'BCH ',
232             "Bengali" => 'BEN ',
233             "Berber" => 'BBR ',
234             "Beti" => 'BTI ',
235             "Bhili" => 'BHI ',
236             "Bhojpuri" => 'BHO ',
237             "Bible Cree" => 'BCR ',
238             "Bikol" => 'BIK ',
239             "Bilen" => 'BIL ',
240             "Bishnupriya Manipuri" => 'BPY ',
241             "Bislama" => 'BIS ',
242             "Blackfoot" => 'BKF ',
243             "Bodo" => 'BRX ',
244             "Bosnian" => 'BOS ',
245             "Bouyei" => 'PCC ',
246             "Brahui" => 'BRH ',
247             "Braj Bhasha" => 'BRI ',
248             "Breton" => 'BRE ',
249             "Bugis" => 'BUG ',
250             "Bulgarian" => 'BGR ',
251             "Burmese" => 'BRM ',
252             "Cajun French" => 'FRC ',
253             "Carrier" => 'CRR ',
254             "Catalan" => 'CAT ',
255             "Cebuano" => 'CEB ',
256             "Central Yupik" => 'ESU ',
257             "Chaha Gurage" => 'CHG ',
258             "Chamorro" => 'CHA ',
259             "Chattisgarhi" => 'CHH ',
260             "Chechen" => 'CHE ',
261             "Cherokee" => 'CHR ',
262             "Cheyenne" => 'CHY ',
263             "Chichewa (Chewa, Nyanja)" => 'CHI ',
264             "Chiga" => 'CGG ',
265             "Chin" => 'QIN ',
266             "Chinese Phonetic" => 'ZHP ',
267             "Chinese Simplified" => 'ZHS ',
268             "Chinese Traditional" => 'ZHT ',
269             "Chinese, Hong Kong SAR" => 'ZHH ',
270             "Chipewyan" => 'CHP ',
271             "Chittagonian" => 'CTG ',
272             "Choctaw" => 'CHO ',
273             "Chukchi" => 'CHK ',
274             "Church Slavonic" => 'CSL ',
275             "Chuukese" => 'CHK0',
276             "Chuvash" => 'CHU ',
277             "Comorian" => 'CMR ',
278             "Coptic" => 'COP ',
279             "Cornish" => 'COR ',
280             "Corsican" => 'COS ',
281             "Cree" => 'CRE ',
282             "Creoles" => 'CPP ',
283             "Crimean Tatar" => 'CRT ',
284             "Croatian" => 'HRV ',
285             "Czech" => 'CSY ',
286             "Dan" => 'DNJ ',
287             "Dangme" => 'DNG ',
288             "Danish" => 'DAN ',
289             "Dargwa" => 'DAR ',
290             "Dari" => 'DRI ',
291             "Dayi" => 'DAX ',
292             "Dehong Dai" => 'TDD ',
293             "Dhangu" => 'DHG ',
294             "Dhuwal" => 'DUJ ',
295             "Dimli" => 'DIQ ',
296             "Dinka" => 'DNK ',
297             "Divehi (Dhivehi, Maldivian) (deprecated)" => 'DHV ',
298             "Divehi (Dhivehi, Maldivian)" => 'DIV ',
299             "Djambarrpuyngu" => 'DJR0',
300             "Dogri" => 'DGO ',
301             "Dogri" => 'DGR ',
302             "Dungan" => 'DUN ',
303             "Dutch (Flemish)" => 'FLE ',
304             "Dutch" => 'NLD ',
305             "Dzongkha" => 'DZN ',
306             "Eastern Cree" => 'ECR ',
307             "Eastern Maninkakan" => 'EMK ',
308             "Eastern Pwo Karen" => 'KJP ',
309             "Ebira" => 'EBI ',
310             "Edo" => 'EDO ',
311             "Efik" => 'EFI ',
312             "English" => 'ENG ',
313             "Erzya" => 'ERZ ',
314             "Esperanto" => 'NTO ',
315             "Estonian" => 'ETI ',
316             "Even" => 'EVN ',
317             "Evenki" => 'EVK ',
318             "Ewe" => 'EWE ',
319             "Fang" => 'FAN0',
320             "Fanti" => 'FAT ',
321             "Faroese" => 'FOS ',
322             "Fijian" => 'FJI ',
323             "Filipino" => 'PIL ',
324             "Finnish" => 'FIN ',
325             "Fon" => 'FON ',
326             "Forest Nenets" => 'FNE ',
327             "French Antillean" => 'FAN ',
328             "French" => 'FRA ',
329             "Frisian" => 'FRI ',
330             "Friulian" => 'FRL ',
331             "Fulah" => 'FUL ',
332             "Futa" => 'FTA ',
333             "Ga" => 'GAD ',
334             "Gagauz" => 'GAG ',
335             "Galician" => 'GAL ',
336             "Ganda" => 'LUG ',
337             "Garhwali" => 'GAW ',
338             "Garo" => 'GRO ',
339             "Garshuni" => 'GAR ',
340             "Ge'ez" => 'GEZ ',
341             "Georgian" => 'KAT ',
342             "German" => 'DEU ',
343             "Gilaki" => 'GLK ',
344             "Gilyak" => 'GIL ',
345             "Githabul" => 'GIH ',
346             "Gogo" => 'GOG ',
347             "Gondi" => 'GON ',
348             "Greek" => 'ELL ',
349             "Greenlandic" => 'GRN ',
350             "Guarani" => 'GUA ',
351             "Gujarati" => 'GUJ ',
352             "Gumatj" => 'GNN ',
353             "Gumuz" => 'GMZ ',
354             "Gupapuyngu" => 'GUF ',
355             "Gusii" => 'GUZ ',
356             "Haitian (Haitian Creole)" => 'HAI ',
357             "Halam" => 'HAL ',
358             "Hammer-Banna" => 'HBN ',
359             "Harari" => 'HRI ',
360             "Harauti" => 'HAR ',
361             "Haryanvi" => 'BGC ',
362             "Hausa" => 'HAU ',
363             "Hawaiian" => 'HAW ',
364             "Haya" => 'HAY ',
365             "Hazaragi" => 'HAZ ',
366             "Hebrew" => 'IWR ',
367             "Herero" => 'HER ',
368             "High Mari" => 'HMA ',
369             "Hiligaynon" => 'HIL ',
370             "Hindi" => 'HIN ',
371             "Hindko" => 'HND ',
372             "Hiri Motu" => 'HMO ',
373             "Hmong Daw" => 'MWW ',
374             "Hmong" => 'HMN ',
375             "Ho" => 'HO ',
376             "Hungarian" => 'HUN ',
377             "Iban" => 'IBA ',
378             "Ibibio" => 'IBB ',
379             "Icelandic" => 'ISL ',
380             "Ido" => 'IDO ',
381             "Igbo" => 'IBO ',
382             "Ijo languages" => 'IJO ',
383             "Ilokano" => 'ILO ',
384             "Inari Sami" => 'ISM ',
385             "Indonesian" => 'IND ',
386             "Ingush" => 'ING ',
387             "Interlingua" => 'INA ',
388             "Interlingue" => 'ILE ',
389             "Inuktitut" => 'INU ',
390             "Inupiat" => 'IPK ',
391             "Irish Traditional" => 'IRT ',
392             "Irish" => 'IRI ',
393             "Italian" => 'ITA ',
394             "Jamaican Creole" => 'JAM ',
395             "Japanese" => 'JAN ',
396             "Javanese" => 'JAV ',
397             "Jula" => 'JUL ',
398             "Kabardian" => 'KAB ',
399             "Kabuverdianu (Crioulo)" => 'KEA ',
400             "Kabyle" => 'KAB0',
401             "Kachchi" => 'KAC ',
402             "Kalenjin" => 'KAL ',
403             "Kalmyk" => 'KLM ',
404             "Kamba" => 'KMB ',
405             "Kanauji" => 'BJJ ',
406             "Kannada" => 'KAN ',
407             "Kanuri" => 'KNR ',
408             "Kaqchikel" => 'CAK ',
409             "Karachay" => 'KAR ',
410             "Karaim" => 'KRM ',
411             "Karakalpak" => 'KRK ',
412             "Karelian" => 'KRL ',
413             "Karen" => 'KRN ',
414             "Kashmiri" => 'KSH ',
415             "Kashubian" => 'CSB ',
416             "Kazakh" => 'KAZ ',
417             "Kebena" => 'KEB ',
418             "Kekchi" => 'KEK ',
419             "Khakass" => 'KHA ',
420             "Khamti Shan" => 'KHT ',
421             "Khanty-Kazim" => 'KHK ',
422             "Khanty-Shurishkar" => 'KHS ',
423             "Khanty-Vakhi" => 'KHV ',
424             "Khasi" => 'KSI ',
425             "Khmer" => 'KHM ',
426             "Khowar" => 'KHW ',
427             "Khutsuri Georgian" => 'KGE ',
428             "Kikongo" => 'KON ',
429             "Kikuyu (Gikuyu)" => 'KIK ',
430             "Kildin Sami" => 'KSM ',
431             "Kinyarwanda" => 'RUA ',
432             "Kirghiz (Kyrgyz)" => 'KIR ',
433             "Kiribati (Gilbertese)" => 'GIL0',
434             "Kirmanjki" => 'KIU ',
435             "Kisii" => 'KIS ',
436             "Kituba" => 'MKW ',
437             "Kodagu" => 'KOD ',
438             "Kokni" => 'KKN ',
439             "Komi" => 'KOM ',
440             "Komi-Permyak" => 'KOP ',
441             "Komi-Zyrian" => 'KOZ ',
442             "Komo" => 'KMO ',
443             "Komso" => 'KMS ',
444             "Kongo" => 'KON0',
445             "Konkani" => 'KOK ',
446             "Koorete" => 'KRT ',
447             "Korean Old Hangul" => 'KOH ',
448             "Korean" => 'KOR ',
449             "Koryak" => 'KYK ',
450             "Kosraean" => 'KOS ',
451             "Kpelle (Guinea)" => 'GKP ',
452             "Kpelle (Liberia)" => 'XPE ',
453             "Kpelle" => 'KPL ',
454             "Krio" => 'KRI ',
455             "Kuanyama" => 'KUA ',
456             "Kui" => 'KUI ',
457             "Kulvi" => 'KUL ',
458             "Kumaoni" => 'KMN ',
459             "Kumyk" => 'KUM ',
460             "Kurdish" => 'KUR ',
461             "Kurukh" => 'KUU ',
462             "Kuy" => 'KUY ',
463             "K'iche'" => 'QUC ',
464             "L-Cree" => 'LCR ',
465             "Ladakhi" => 'LDK ',
466             "Ladin" => 'LAD ',
467             "Ladino" => 'JUD ',
468             "Lahuli" => 'LAH ',
469             "Lak" => 'LAK ',
470             "Laki" => 'LKI ',
471             "Lambani" => 'LAM ',
472             "Lampung" => 'LJP ',
473             "Lao" => 'LAO ',
474             "Latin" => 'LAT ',
475             "Latvian" => 'LVI ',
476             "Laz" => 'LAZ ',
477             "Lezgi" => 'LEZ ',
478             "Ligurian" => 'LIJ ',
479             "Limbu" => 'LMB ',
480             "Limburgish" => 'LIM ',
481             "Lingala" => 'LIN ',
482             "Lisu" => 'LIS ',
483             "Lithuanian" => 'LTH ',
484             "Lojban" => 'JBO ',
485             "Loma" => 'LOM ',
486             "Lombard" => 'LMO ',
487             "Lomwe" => 'LMW ',
488             "Low Mari" => 'LMA ',
489             "Low Saxon" => 'NDS ',
490             "Lower Sorbian" => 'LSB ',
491             "Luba-Katanga" => 'LUB ',
492             "Luba-Lulua" => 'LUA ',
493             "Lule Sami" => 'LSM ',
494             "Luo" => 'LUO ',
495             "Luri" => 'LRC ',
496             "Luxembourgish" => 'LTZ ',
497             "Luyia" => 'LUH ',
498             "Lü" => 'XBD ',
499             "Macedonian" => 'MKD ',
500             "Madura" => 'MAD ',
501             "Magahi" => 'MAG ',
502             "Maithili" => 'MTH ',
503             "Majang" => 'MAJ ',
504             "Makasar" => 'MKR ',
505             "Makhuwa" => 'MAK ',
506             "Makonde" => 'KDE ',
507             "Malagasy" => 'MLG ',
508             "Malay" => 'MLY ',
509             "Malayalam Reformed" => 'MLR ',
510             "Malayalam Traditional" => 'MAL ',
511             "Male" => 'MLE ',
512             "Malinke" => 'MLN ',
513             "Maltese" => 'MTS ',
514             "Mam" => 'MAM ',
515             "Manchu" => 'MCH ',
516             "Mandar" => 'MDR ',
517             "Mandinka" => 'MND ',
518             "Maninka" => 'MNK ',
519             "Manipuri" => 'MNI ',
520             "Mansi" => 'MAN ',
521             "Manx" => 'MNX ',
522             "Maori" => 'MRI ',
523             "Mapudungun" => 'MAP ',
524             "Marathi" => 'MAR ',
525             "Marshallese" => 'MAH ',
526             "Marwari" => 'MAW ',
527             "Mayan" => 'MYN ',
528             "Mazanderani" => 'MZN ',
529             "Mbundu" => 'MBN ',
530             "Me'en" => 'MEN ',
531             "Mende" => 'MDE ',
532             "Meru" => 'MER ',
533             "Mewati" => 'WTM ',
534             "Minangkabau" => 'MIN ',
535             "Minjangbal" => 'XJB ',
536             "Mirandese" => 'MWL ',
537             "Mizo" => 'MIZ ',
538             "Mohawk" => 'MOH ',
539             "Moksha" => 'MOK ',
540             "Moldavian" => 'MOL ',
541             "Mon" => 'MON ',
542             "Mongolian" => 'MNG ',
543             "Moose Cree" => 'MCR ',
544             "Morisyen" => 'MFE ',
545             "Moroccan" => 'MOR ',
546             "Mossi" => 'MOS ',
547             "Mundari" => 'MUN ',
548             "Muscogee" => 'MUS ',
549             "N'Ko" => 'NKO ',
550             "N-Cree" => 'NCR ',
551             "Naga-Assamese" => 'NAG ',
552             "Nagari" => 'NGR ',
553             "Nahuatl" => 'NAH ',
554             "Nanai" => 'NAN ',
555             "Naskapi" => 'NAS ',
556             "Nauruan" => 'NAU ',
557             "Navajo" => 'NAV ',
558             "Ndau" => 'NDC ',
559             "Ndebele" => 'NDB ',
560             "Ndonga" => 'NDG ',
561             "Neapolitan" => 'NAP ',
562             "Nepali" => 'NEP ',
563             "Newari" => 'NEW ',
564             "Ngbaka" => 'NGA ',
565             "Nigerian Fulfulde" => 'FUV ',
566             "Nimadi" => 'NOE ',
567             "Nisi" => 'NIS ',
568             "Niuean" => 'NIU ',
569             "Nogai" => 'NOG ',
570             "Norfolk" => 'PIH ',
571             "Northern Sami" => 'NSM ',
572             "Northern Thai" => 'NTA ',
573             "Norway House Cree" => 'NHC ',
574             "Norwegian Nynorsk (Nynorsk, Norwegian)" => 'NYN ',
575             "Norwegian" => 'NOR ',
576             "Novial" => 'NOV ',
577             "Nyamwezi" => 'NYM ',
578             "Nyankole" => 'NKL ',
579             "Occitan" => 'OCI ',
580             "Odia (formerly Oriya)" => 'ORI ',
581             "Oji-Cree" => 'OCR ',
582             "Ojibway" => 'OJB ',
583             "Old Irish" => 'SGA ',
584             "Oromo" => 'ORO ',
585             "Ossetian" => 'OSS ',
586             "Pa'o Karen" => 'BLK ',
587             "Palauan" => 'PAU ',
588             "Palaung" => 'PLG ',
589             "Palestinian Aramaic" => 'PAA ',
590             "Pali" => 'PAL ',
591             "Palpa" => 'PAP ',
592             "Pampangan" => 'PAM ',
593             "Pangasinan" => 'PAG ',
594             "Papiamentu" => 'PAP0',
595             "Pashto" => 'PAS ',
596             "Pennsylvania German" => 'PDC ',
597             "Persian" => 'FAR ',
598             "Phake" => 'PHK ',
599             "Phonetic transcription - Americanist conventions" => 'APPH',
600             "Phonetic transcription - IPA conventions" => 'IPPH',
601             "Picard" => 'PCD ',
602             "Piemontese" => 'PMS ',
603             "Pocomchi" => 'POH ',
604             "Pohnpeian" => 'PON ',
605             "Polish" => 'PLK ',
606             "Polytonic Greek" => 'PGR ',
607             "Portuguese" => 'PTG ',
608             "Provencal" => 'PRO ',
609             "Punjabi" => 'PAN ',
610             "Quechua (Bolivia)" => 'QUH ',
611             "Quechua (Ecuador)" => 'QVI ',
612             "Quechua (Peru)" => 'QWH ',
613             "Quechua" => 'QUZ ',
614             "R-Cree" => 'RCR ',
615             "Rajasthani" => 'RAJ ',
616             "Rakhine" => 'ARK ',
617             "Rarotongan" => 'RAR ',
618             "Rejang" => 'REJ ',
619             "Riang" => 'RIA ',
620             "Ripuarian" => 'KSH0',
621             "Ritarungo" => 'RIT ',
622             "Romanian" => 'ROM ',
623             "Romansh" => 'RMS ',
624             "Romany" => 'ROY ',
625             "Rotuman" => 'RTM ',
626             "Rundi" => 'RUN ',
627             "Russian Buriat" => 'RBU ',
628             "Russian" => 'RUS ',
629             "Rusyn" => 'RSY ',
630             "Sadri" => 'SAD ',
631             "Sakha" => 'YAK ',
632             "Samoan" => 'SMO ',
633             "Samogitian" => 'SGS ',
634             "San Blas Kuna" => 'CUK ',
635             "Sango" => 'SGO ',
636             "Sanskrit" => 'SAN ',
637             "Santali" => 'SAT ',
638             "Sardinian" => 'SRD ',
639             "Sasak" => 'SAS ',
640             "Saterland Frisian" => 'STQ ',
641             "Sayisi" => 'SAY ',
642             "Scots" => 'SCO ',
643             "Scottish Gaelic (Gaelic)" => 'GAE ',
644             "Sekota" => 'SEK ',
645             "Selkup" => 'SEL ',
646             "Sena" => 'SNA ',
647             "Seraiki" => 'SRK ',
648             "Serbian" => 'SRB ',
649             "Serer" => 'SRR ',
650             "Shan" => 'SHN ',
651             "Shona" => 'SNA0',
652             "Sibe" => 'SIB ',
653             "Sicilian" => 'SCN ',
654             "Sidamo" => 'SID ',
655             "Silesian" => 'SZL ',
656             "Silte Gurage" => 'SIG ',
657             "Sindhi" => 'SND ',
658             "Sinhala (Sinhalese)" => 'SNH ',
659             "Skolt Sami" => 'SKS ',
660             "Slavey" => 'SLA ',
661             "Slovak" => 'SKY ',
662             "Slovenian" => 'SLV ',
663             "Sodo Gurage" => 'SOG ',
664             "Soga" => 'XOG ',
665             "Somali" => 'SML ',
666             "Songe" => 'SOP ',
667             "Soninke" => 'SNK ',
668             "Sotho, Northern" => 'NSO ',
669             "Sotho, Southern" => 'SOT ',
670             "South Slavey" => 'SSL ',
671             "Southern Kiwai" => 'KJD ',
672             "Southern Sami" => 'SSM ',
673             "Spanish" => 'ESP ',
674             "Standard Morrocan Tamazigh" => 'ZGH ',
675             "Sukuma" => 'SUK ',
676             "Sundanese" => 'SUN ',
677             "Suri" => 'SUR ',
678             "Sutu" => 'SXT ',
679             "Svan" => 'SVA ',
680             "Swadaya Aramaic" => 'SWA ',
681             "Swahili" => 'SWK ',
682             "Swati" => 'SWZ ',
683             "Swedish" => 'SVE ',
684             "Sylheti" => 'SYL ',
685             "Syriac" => 'SYR ',
686             "S'gaw Karen" => 'KSW ',
687             "TH-Cree" => 'TCR ',
688             "Tabasaran" => 'TAB ',
689             "Tachelhit" => 'SHI ',
690             "Tagalog" => 'TGL ',
691             "Tahitian" => 'THT ',
692             "Tajik" => 'TAJ ',
693             "Tamashek" => 'TMH ',
694             "Tamazight" => 'TZM ',
695             "Tamil" => 'TAM ',
696             "Tarifit" => 'RIF ',
697             "Tatar" => 'TAT ',
698             "Telugu" => 'TEL ',
699             "Temne" => 'TMN ',
700             "Tetum" => 'TET ',
701             "Thai" => 'THA ',
702             "Tibetan" => 'TIB ',
703             "Tigre" => 'TGR ',
704             "Tigrinya" => 'TGY ',
705             "Tiv" => 'TIV ',
706             "Todo" => 'TOD ',
707             "Tok Pisin" => 'TPI ',
708             "Toma" => 'TOD0',
709             "Tonga" => 'TNG ',
710             "Tongan" => 'TGN ',
711             "Torki" => 'AZB ',
712             "Tsonga" => 'TSG ',
713             "Tswana" => 'TNA ',
714             "Tulu" => 'TUL ',
715             "Tumbuka" => 'TUM ',
716             "Tundra Nenets" => 'TNE ',
717             "Turkish" => 'TRK ',
718             "Turkmen" => 'TKM ',
719             "Turoyo Aramaic" => 'TUA ',
720             "Tuvalu" => 'TVL ',
721             "Tuvin" => 'TUV ',
722             "Twi" => 'TWI ',
723             "Tzotzil" => 'TZO ',
724             "Tày" => 'TYZ ',
725             "Udmurt" => 'UDM ',
726             "Ukrainian" => 'UKR ',
727             "Umbundu" => 'UMB ',
728             "Upper Saxon" => 'SXU ',
729             "Upper Sorbian" => 'USB ',
730             "Urdu" => 'URD ',
731             "Uyghur" => 'UYG ',
732             "Uzbek" => 'UZB ',
733             "Venda" => 'VEN ',
734             "Venetian" => 'VEC ',
735             "Vietnamese" => 'VIT ',
736             "Vlax Romani" => 'RMY ',
737             "Volapük" => 'VOL ',
738             "Võro" => 'VRO ',
739             "Wa" => 'WA ',
740             "Wagdi" => 'WAG ',
741             "Walloon" => 'WLN ',
742             "Waray-Waray" => 'WAR ',
743             "Wayuu" => 'GUC ',
744             "Welsh" => 'WEL ',
745             "West-Cree" => 'WCR ',
746             "Western Kayah" => 'KYU ',
747             "Western Panjabi" => 'PNB ',
748             "Western Pwo Karen" => 'PWO ',
749             "Wolof" => 'WLF ',
750             "Woods Cree" => 'DCR ',
751             "Xhosa" => 'XHS ',
752             "Y-Cree" => 'YCR ',
753             "Yao" => 'YAO ',
754             "Yapese" => 'YAP ',
755             "Yi Classic" => 'YIC ',
756             "Yi Modern" => 'YIM ',
757             "Yiddish" => 'JII ',
758             "Yoruba" => 'YBA ',
759             "Zamboanga Chavacano" => 'CBK ',
760             "Zande" => 'ZND ',
761             "Zarma" => 'DJR ',
762             "Zazaki" => 'ZZA ',
763             "Zealandic" => 'ZEA ',
764             "Zhuang" => 'ZHA ',
765             "Zulu" => 'ZUL ',
766             },
767              
768             'FEATURE' => {
769             "Above-base Forms" => 'abvf',
770             "Above-base Mark Positioning" => 'abvm',
771             "Above-base Substitutions" => 'abvs',
772             "Access All Alternates" => 'aalt',
773             "Akhands" => 'akhn',
774             "Alternate Annotation Forms" => 'nalt',
775             "Alternate Half Widths" => 'halt',
776             "Alternate Vertical Half Metrics" => 'vhal',
777             "Alternate Vertical Metrics" => 'valt',
778             "Alternative Fractions" => 'afrc',
779             "Below-base Forms" => 'blwf',
780             "Below-base Mark Positioning" => 'blwm',
781             "Below-base Substitutions" => 'blws',
782             "Capital Spacing" => 'cpsp',
783             "Case-Sensitive Forms" => 'case',
784             "Centered CJK Punctuation" => 'cpct',
785             "Character Variants 01" => 'cv01',
786             "Character Variants 02" => 'cv02',
787             "Character Variants 03" => 'cv03',
788             "Character Variants 04" => 'cv04',
789             "Character Variants 05" => 'cv05',
790             "Character Variants 06" => 'cv06',
791             "Character Variants 07" => 'cv07',
792             "Character Variants 08" => 'cv08',
793             "Character Variants 09" => 'cv09',
794             "Character Variants 10" => 'cv10',
795             "Character Variants 11" => 'cv11',
796             "Character Variants 12" => 'cv12',
797             "Character Variants 13" => 'cv13',
798             "Character Variants 14" => 'cv14',
799             "Character Variants 15" => 'cv15',
800             "Character Variants 16" => 'cv16',
801             "Character Variants 17" => 'cv17',
802             "Character Variants 18" => 'cv18',
803             "Character Variants 19" => 'cv19',
804             "Character Variants 20" => 'cv20',
805             "Character Variants 21" => 'cv21',
806             "Character Variants 22" => 'cv22',
807             "Character Variants 23" => 'cv23',
808             "Character Variants 24" => 'cv24',
809             "Character Variants 25" => 'cv25',
810             "Character Variants 26" => 'cv26',
811             "Character Variants 27" => 'cv27',
812             "Character Variants 28" => 'cv28',
813             "Character Variants 29" => 'cv29',
814             "Character Variants 30" => 'cv30',
815             "Character Variants 31" => 'cv31',
816             "Character Variants 32" => 'cv32',
817             "Character Variants 33" => 'cv33',
818             "Character Variants 34" => 'cv34',
819             "Character Variants 35" => 'cv35',
820             "Character Variants 36" => 'cv36',
821             "Character Variants 37" => 'cv37',
822             "Character Variants 38" => 'cv38',
823             "Character Variants 39" => 'cv39',
824             "Character Variants 40" => 'cv40',
825             "Character Variants 41" => 'cv41',
826             "Character Variants 42" => 'cv42',
827             "Character Variants 43" => 'cv43',
828             "Character Variants 44" => 'cv44',
829             "Character Variants 45" => 'cv45',
830             "Character Variants 46" => 'cv46',
831             "Character Variants 47" => 'cv47',
832             "Character Variants 48" => 'cv48',
833             "Character Variants 49" => 'cv49',
834             "Character Variants 50" => 'cv50',
835             "Character Variants 51" => 'cv51',
836             "Character Variants 52" => 'cv52',
837             "Character Variants 53" => 'cv53',
838             "Character Variants 54" => 'cv54',
839             "Character Variants 55" => 'cv55',
840             "Character Variants 56" => 'cv56',
841             "Character Variants 57" => 'cv57',
842             "Character Variants 58" => 'cv58',
843             "Character Variants 59" => 'cv59',
844             "Character Variants 60" => 'cv60',
845             "Character Variants 61" => 'cv61',
846             "Character Variants 62" => 'cv62',
847             "Character Variants 63" => 'cv63',
848             "Character Variants 64" => 'cv64',
849             "Character Variants 65" => 'cv65',
850             "Character Variants 66" => 'cv66',
851             "Character Variants 67" => 'cv67',
852             "Character Variants 68" => 'cv68',
853             "Character Variants 69" => 'cv69',
854             "Character Variants 70" => 'cv70',
855             "Character Variants 71" => 'cv71',
856             "Character Variants 72" => 'cv72',
857             "Character Variants 73" => 'cv73',
858             "Character Variants 74" => 'cv74',
859             "Character Variants 75" => 'cv75',
860             "Character Variants 76" => 'cv76',
861             "Character Variants 77" => 'cv77',
862             "Character Variants 78" => 'cv78',
863             "Character Variants 79" => 'cv79',
864             "Character Variants 80" => 'cv80',
865             "Character Variants 81" => 'cv81',
866             "Character Variants 82" => 'cv82',
867             "Character Variants 83" => 'cv83',
868             "Character Variants 84" => 'cv84',
869             "Character Variants 85" => 'cv85',
870             "Character Variants 86" => 'cv86',
871             "Character Variants 87" => 'cv87',
872             "Character Variants 88" => 'cv88',
873             "Character Variants 89" => 'cv89',
874             "Character Variants 90" => 'cv90',
875             "Character Variants 91" => 'cv91',
876             "Character Variants 92" => 'cv92',
877             "Character Variants 93" => 'cv93',
878             "Character Variants 94" => 'cv94',
879             "Character Variants 95" => 'cv95',
880             "Character Variants 96" => 'cv96',
881             "Character Variants 97" => 'cv97',
882             "Character Variants 98" => 'cv98',
883             "Character Variants 99" => 'cv99',
884             "Conjunct Form After Ro" => 'cfar',
885             "Conjunct Forms" => 'cjct',
886             "Contextual Alternates" => 'calt',
887             "Contextual Ligatures" => 'clig',
888             "Contextual Swash" => 'cswh',
889             "Cursive Positioning" => 'curs',
890             "Denominators" => 'dnom',
891             "Discretionary Ligatures" => 'dlig',
892             "Distances" => 'dist',
893             "Dotless Forms" => 'dtls',
894             "Expert Forms" => 'expt',
895             "Final Glyph on Line Alternates" => 'falt',
896             "Flattened ascent forms" => 'flac',
897             "Fractions" => 'frac',
898             "Full Widths" => 'fwid',
899             "Glyph Composition / Decomposition" => 'ccmp',
900             "Halant Forms" => 'haln',
901             "Half Forms" => 'half',
902             "Half Widths" => 'hwid',
903             "Hangul" => 'hngl',
904             "Historical Forms" => 'hist',
905             "Historical Ligatures" => 'hlig',
906             "Hojo Kanji Forms (JIS X 0212-1990 Kanji Forms)" => 'hojo',
907             "Horizontal Kana Alternates" => 'hkna',
908             "Initial Forms" => 'init',
909             "Isolated Forms" => 'isol',
910             "Italics" => 'ital',
911             "JIS2004 Forms" => 'jp04',
912             "JIS78 Forms" => 'jp78',
913             "JIS83 Forms" => 'jp83',
914             "JIS90 Forms" => 'jp90',
915             "Justification Alternates" => 'jalt',
916             "Kerning" => 'kern',
917             "Leading Jamo Forms" => 'ljmo',
918             "Left Bounds" => 'lfbd',
919             "Left-to-right glyph alternates" => 'ltra',
920             "Left-to-right mirrored forms" => 'ltrm',
921             "Lining Figures" => 'lnum',
922             "Localized Forms" => 'locl',
923             "Mark Positioning via Substitution" => 'mset',
924             "Mark Positioning" => 'mark',
925             "Mark to Mark Positioning" => 'mkmk',
926             "Math script style alternates" => 'ssty',
927             "Mathematical Greek" => 'mgrk',
928             "Medial Forms #2" => 'med2',
929             "Medial Forms" => 'medi',
930             "NLC Kanji Forms" => 'nlck',
931             "Nukta Forms" => 'nukt',
932             "Numerators" => 'numr',
933             "Oldstyle Figures" => 'onum',
934             "Optical Bounds" => 'opbd',
935             "Optical size" => 'size',
936             "Ordinals" => 'ordn',
937             "Ornaments" => 'ornm',
938             "Petite Capitals From Capitals" => 'c2pc',
939             "Petite Capitals" => 'pcap',
940             "Post-base Forms" => 'pstf',
941             "Post-base Substitutions" => 'psts',
942             "Pre-Base Forms" => 'pref',
943             "Pre-base Substitutions" => 'pres',
944             "Proportional Alternate Vertical Metrics" => 'vpal',
945             "Proportional Alternate Widths" => 'palt',
946             "Proportional Figures" => 'pnum',
947             "Proportional Kana" => 'pkna',
948             "Proportional Widths" => 'pwid',
949             "Quarter Widths" => 'qwid',
950             "Rakar Forms" => 'rkrf',
951             "Randomize" => 'rand',
952             "Reph Forms" => 'rphf',
953             "Required Contextual Alternates" => 'rclt',
954             "Required Ligatures" => 'rlig',
955             "Right Bounds" => 'rtbd',
956             "Right-to-left alternates" => 'rtla',
957             "Right-to-left mirrored forms" => 'rtlm',
958             "Ruby Notation Forms" => 'ruby',
959             "Scientific Inferiors" => 'sinf',
960             "Simplified Forms" => 'smpl',
961             "Slashed Zero" => 'zero',
962             "Small Capitals From Capitals" => 'c2sc',
963             "Small Capitals" => 'smcp',
964             "Standard Ligatures" => 'liga',
965             "Stretching Glyph Decomposition" => 'stch',
966             "Stylistic Alternates" => 'salt',
967             "Stylistic Set 1" => 'ss01',
968             "Stylistic Set 10" => 'ss10',
969             "Stylistic Set 11" => 'ss11',
970             "Stylistic Set 12" => 'ss12',
971             "Stylistic Set 13" => 'ss13',
972             "Stylistic Set 14" => 'ss14',
973             "Stylistic Set 15" => 'ss15',
974             "Stylistic Set 16" => 'ss16',
975             "Stylistic Set 17" => 'ss17',
976             "Stylistic Set 18" => 'ss18',
977             "Stylistic Set 19" => 'ss19',
978             "Stylistic Set 2" => 'ss02',
979             "Stylistic Set 20" => 'ss20',
980             "Stylistic Set 3" => 'ss03',
981             "Stylistic Set 4" => 'ss04',
982             "Stylistic Set 5" => 'ss05',
983             "Stylistic Set 6" => 'ss06',
984             "Stylistic Set 7" => 'ss07',
985             "Stylistic Set 8" => 'ss08',
986             "Stylistic Set 9" => 'ss09',
987             "Subscript" => 'subs',
988             "Superscript" => 'sups',
989             "Swash" => 'swsh',
990             "Tabular Figures" => 'tnum',
991             "Terminal Forms #2" => 'fin2',
992             "Terminal Forms #3" => 'fin3',
993             "Terminal Forms" => 'fina',
994             "Third Widths" => 'twid',
995             "Titling" => 'titl',
996             "Traditional Forms" => 'trad',
997             "Traditional Name Forms" => 'tnam',
998             "Trailing Jamo Forms" => 'tjmo',
999             "Unicase" => 'unic',
1000             "Vattu Variants" => 'vatu',
1001             "Vertical Alternates and Rotation" => 'vrt2',
1002             "Vertical Kana Alternates" => 'vkna',
1003             "Vertical Kerning" => 'vkrn',
1004             "Vertical Writing" => 'vert',
1005             "Vowel Jamo Forms" => 'vjmo',
1006             },
1007              
1008             );
1009              
1010             %iso639 = (
1011             'ABA ' => 'abq',
1012             'ABK ' => 'abk',
1013             'ACH ' => 'ach',
1014             'ACR ' => 'acr',
1015             'ADY ' => 'ady',
1016             'AFK ' => 'afr',
1017             'AFR ' => 'aar',
1018             'AGW ' => 'ahg',
1019             'AIO ' => 'aio',
1020             'AKA ' => 'aka',
1021             'ALS ' => 'gsw',
1022             'ALT ' => 'atv alt',
1023             'AMH ' => 'amh',
1024             'ANG ' => 'ang',
1025             'ARA ' => 'ara',
1026             'ARG ' => 'arg',
1027             'ARI ' => 'aiw',
1028             'ARK ' => 'mhv rmz rki',
1029             'ASM ' => 'asm',
1030             'AST ' => 'ast',
1031             'ATH ' => 'apk apj apl apm apw nav bea sek bcr caf crx clc gwi haa chp dgr scs xsl srs ing hoi koy hup ktw mvb wlk coq ctc gce tol tuu kkz tgx tht aht tfn taa tau tcb kuu tce ttm txc',
1032             'AVR ' => 'ava',
1033             'AWA ' => 'awa',
1034             'AYM ' => 'aym',
1035             'AZB ' => 'azb',
1036             'AZE ' => 'aze',
1037             'BAD ' => 'bfq',
1038             'BAD0' => 'bad',
1039             'BAG ' => 'bfy',
1040             'BAL ' => 'krc',
1041             'BAN ' => 'ban',
1042             'BAR ' => 'bar',
1043             'BAU ' => 'bci',
1044             'BBC ' => 'bbc',
1045             'BCH ' => 'bcq',
1046             'BDY ' => 'bdy',
1047             'BEL ' => 'bel',
1048             'BEM ' => 'bem',
1049             'BEN ' => 'ben',
1050             'BGC ' => 'bgc',
1051             'BGQ ' => 'bgq',
1052             'BGR ' => 'bul',
1053             'BHI ' => 'bhi bhb',
1054             'BHO ' => 'bho',
1055             'BIK ' => 'bik bhk bcl bto cts bln',
1056             'BIL ' => 'byn',
1057             'BIS ' => 'bis',
1058             'BJJ ' => 'bjj',
1059             'BKF ' => 'bla',
1060             'BLI ' => 'bal',
1061             'BLK ' => 'blk',
1062             'BLN ' => 'bjt ble',
1063             'BLT ' => 'bft',
1064             'BMB ' => 'bam',
1065             'BOS ' => 'bos',
1066             'BPY ' => 'bpy',
1067             'BRE ' => 'bre',
1068             'BRH ' => 'brh',
1069             'BRI ' => 'bra',
1070             'BRM ' => 'mya',
1071             'BRX ' => 'brx',
1072             'BSH ' => 'bak',
1073             'BTI ' => 'btb',
1074             'BTS ' => 'bts',
1075             'BUG ' => 'bug',
1076             'CAK ' => 'cak',
1077             'CAT ' => 'cat',
1078             'CBK ' => 'cbk',
1079             'CEB ' => 'ceb',
1080             'CGG ' => 'cgg',
1081             'CHA ' => 'cha',
1082             'CHE ' => 'che',
1083             'CHG ' => 'sgw',
1084             'CHH ' => 'hne',
1085             'CHI ' => 'nya',
1086             'CHK ' => 'ckt',
1087             'CHK0' => 'chk',
1088             'CHO ' => 'cho',
1089             'CHP ' => 'chp',
1090             'CHR ' => 'chr',
1091             'CHU ' => 'chv',
1092             'CHY ' => 'chy',
1093             'CMR ' => 'swb wlc wni zdj',
1094             'COP ' => 'cop',
1095             'COR ' => 'cor',
1096             'COS ' => 'cos',
1097             'CPP ' => 'cpp',
1098             'CRE ' => 'cre',
1099             'CRR ' => 'crx caf',
1100             'CRT ' => 'crh',
1101             'CSB ' => 'csb',
1102             'CSL ' => 'chu',
1103             'CSY ' => 'ces',
1104             'CTG ' => 'ctg',
1105             'CUK ' => 'cuk',
1106             'DAN ' => 'dan',
1107             'DAR ' => 'dar',
1108             'DAX ' => 'dax',
1109             'DCR ' => 'cwd',
1110             'DEU ' => 'deu',
1111             'DGO ' => 'dgo',
1112             'DGR ' => 'doi',
1113             'DHG ' => 'dhg',
1114             'DHV ' => 'div',
1115             'DIQ ' => 'diq',
1116             'DIV ' => 'div',
1117             'DJR ' => 'dje',
1118             'DJR0' => 'djr',
1119             'DNG ' => 'ada',
1120             'DNJ ' => 'dnj',
1121             'DNK ' => 'din',
1122             'DRI ' => 'prs',
1123             'DUJ ' => 'duj',
1124             'DUN ' => 'dng',
1125             'DZN ' => 'dzo',
1126             'EBI ' => 'igb',
1127             'ECR ' => 'crj crl',
1128             'EDO ' => 'bin',
1129             'EFI ' => 'efi',
1130             'ELL ' => 'ell',
1131             'EMK ' => 'emk',
1132             'ENG ' => 'eng',
1133             'ERZ ' => 'myv',
1134             'ESP ' => 'spa',
1135             'ESU ' => 'esu',
1136             'ETI ' => 'est',
1137             'EUQ ' => 'eus',
1138             'EVK ' => 'evn',
1139             'EVN ' => 'eve',
1140             'EWE ' => 'ewe',
1141             'FAN ' => 'acf',
1142             'FAN0' => 'fan',
1143             'FAR ' => 'fas',
1144             'FAT ' => 'fat',
1145             'FIN ' => 'fin',
1146             'FJI ' => 'fij',
1147             'FLE ' => 'vls',
1148             'FNE ' => 'enf',
1149             'FON ' => 'fon',
1150             'FOS ' => 'fao',
1151             'FRA ' => 'fra',
1152             'FRC ' => 'frc',
1153             'FRI ' => 'fry',
1154             'FRL ' => 'fur',
1155             'FRP ' => 'frp',
1156             'FTA ' => 'fuf',
1157             'FUL ' => 'ful',
1158             'FUV ' => 'fuv',
1159             'GAD ' => 'gaa',
1160             'GAE ' => 'gla',
1161             'GAG ' => 'gag',
1162             'GAL ' => 'glg',
1163             'GAW ' => 'gbm',
1164             'GEZ ' => 'gez',
1165             'GIH ' => 'gih',
1166             'GIL ' => 'niv',
1167             'GIL0' => 'gil',
1168             'GKP ' => 'gkp',
1169             'GLK ' => 'glk',
1170             'GMZ ' => 'guk',
1171             'GNN ' => 'gnn',
1172             'GOG ' => 'gog',
1173             'GON ' => 'gon gno ggo',
1174             'GRN ' => 'kal',
1175             'GRO ' => 'grt',
1176             'GUA ' => 'grn',
1177             'GUC ' => 'guc',
1178             'GUF ' => 'guf',
1179             'GUJ ' => 'guj',
1180             'GUZ ' => 'guz',
1181             'HAI ' => 'hat',
1182             'HAL ' => 'flm',
1183             'HAR ' => 'hoj',
1184             'HAU ' => 'hau',
1185             'HAW ' => 'haw',
1186             'HAY ' => 'hay',
1187             'HAZ ' => 'haz',
1188             'HBN ' => 'amf',
1189             'HER ' => 'her',
1190             'HIL ' => 'hil',
1191             'HIN ' => 'hin',
1192             'HMA ' => 'mrj',
1193             'HMN ' => 'hmn',
1194             'HMO ' => 'hmo',
1195             'HND ' => 'hno hnd',
1196             'HO ' => 'hoc',
1197             'HRI ' => 'har',
1198             'HRV ' => 'hrv',
1199             'HUN ' => 'hun',
1200             'HYE ' => 'hye',
1201             'HYE0' => 'hye',
1202             'IBA ' => 'iba',
1203             'IBB ' => 'ibb',
1204             'IBO ' => 'ibo',
1205             'IDO ' => 'ido',
1206             'IJO ' => 'ijc',
1207             'ILE ' => 'ile',
1208             'ILO ' => 'ilo',
1209             'INA ' => 'ina',
1210             'IND ' => 'ind',
1211             'ING ' => 'inh',
1212             'INU ' => 'iku',
1213             'IPK ' => 'ipk',
1214             'IRI ' => 'gle',
1215             'IRT ' => 'gle',
1216             'ISL ' => 'isl',
1217             'ISM ' => 'smn',
1218             'ITA ' => 'ita',
1219             'IWR ' => 'heb',
1220             'JAM ' => 'jam',
1221             'JAN ' => 'jpn',
1222             'JAV ' => 'jav',
1223             'JBO ' => 'jbo',
1224             'JII ' => 'yid',
1225             'JUD ' => 'lad',
1226             'JUL ' => 'dyu',
1227             'KAB ' => 'kbd',
1228             'KAB0' => 'kab',
1229             'KAC ' => 'kfr',
1230             'KAL ' => 'kln',
1231             'KAN ' => 'kan',
1232             'KAR ' => 'krc',
1233             'KAT ' => 'kat',
1234             'KAZ ' => 'kaz',
1235             'KDE ' => 'kde',
1236             'KEA ' => 'kea',
1237             'KEB ' => 'ktb',
1238             'KEK ' => 'kek',
1239             'KGE ' => 'kat',
1240             'KHA ' => 'kjh',
1241             'KHK ' => 'kca',
1242             'KHM ' => 'khm',
1243             'KHS ' => 'kca',
1244             'KHT ' => 'kht',
1245             'KHV ' => 'kca',
1246             'KHW ' => 'khw',
1247             'KIK ' => 'kik',
1248             'KIR ' => 'kir',
1249             'KIS ' => 'kqs kss',
1250             'KIU ' => 'kiu',
1251             'KJD ' => 'kjd',
1252             'KJP ' => 'kjp',
1253             'KKN ' => 'kex',
1254             'KLM ' => 'xal',
1255             'KMB ' => 'kam',
1256             'KMN ' => 'kfy',
1257             'KMO ' => 'kmw',
1258             'KMS ' => 'kxc',
1259             'KNR ' => 'kau',
1260             'KOD ' => 'kfa',
1261             'KOH ' => 'okm',
1262             'KOK ' => 'kok',
1263             'KOM ' => 'kom',
1264             'KON ' => 'ktu',
1265             'KON0' => 'kon',
1266             'KOP ' => 'koi',
1267             'KOR ' => 'kor',
1268             'KOS ' => 'kos',
1269             'KOZ ' => 'kpv',
1270             'KPL ' => 'kpe',
1271             'KRI ' => 'kri',
1272             'KRK ' => 'kaa',
1273             'KRL ' => 'krl',
1274             'KRM ' => 'kdr',
1275             'KRN ' => 'kar',
1276             'KRT ' => 'kqy',
1277             'KSH ' => 'kas',
1278             'KSH0' => 'ksh',
1279             'KSI ' => 'kha',
1280             'KSM ' => 'sjd',
1281             'KSW ' => 'ksw',
1282             'KUA ' => 'kua',
1283             'KUI ' => 'kxu',
1284             'KUL ' => 'kfx',
1285             'KUM ' => 'kum',
1286             'KUR ' => 'kur',
1287             'KUU ' => 'kru',
1288             'KUY ' => 'kdt',
1289             'KYK ' => 'kpy',
1290             'KYU ' => 'kyu',
1291             'LAD ' => 'lld',
1292             'LAH ' => 'bfu',
1293             'LAK ' => 'lbe',
1294             'LAM ' => 'lmn',
1295             'LAO ' => 'lao',
1296             'LAT ' => 'lat',
1297             'LAZ ' => 'lzz',
1298             'LCR ' => 'crm',
1299             'LDK ' => 'lbj',
1300             'LEZ ' => 'lez',
1301             'LIJ ' => 'lij',
1302             'LIM ' => 'lim',
1303             'LIN ' => 'lin',
1304             'LIS ' => 'lis',
1305             'LJP ' => 'ljp',
1306             'LKI ' => 'lki',
1307             'LMA ' => 'mhr',
1308             'LMB ' => 'lif',
1309             'LMO ' => 'lmo',
1310             'LMW ' => 'ngl',
1311             'LOM ' => 'lom',
1312             'LRC ' => 'lrc luz bqi zum',
1313             'LSB ' => 'dsb',
1314             'LSM ' => 'smj',
1315             'LTH ' => 'lit',
1316             'LTZ ' => 'ltz',
1317             'LUA ' => 'lua',
1318             'LUB ' => 'lub',
1319             'LUG ' => 'lug',
1320             'LUH ' => 'luy',
1321             'LUO ' => 'luo',
1322             'LVI ' => 'lav',
1323             'MAD ' => 'mad',
1324             'MAG ' => 'mag',
1325             'MAH ' => 'mah',
1326             'MAJ ' => 'mpe',
1327             'MAK ' => 'vmw',
1328             'MAL ' => 'mal',
1329             'MAM ' => 'mam',
1330             'MAN ' => 'mns',
1331             'MAP ' => 'arn',
1332             'MAR ' => 'mar',
1333             'MAW ' => 'mwr dhd rwr mve wry mtr swv',
1334             'MBN ' => 'kmb',
1335             'MCH ' => 'mnc',
1336             'MCR ' => 'crm',
1337             'MDE ' => 'men',
1338             'MDR ' => 'mdr',
1339             'MEN ' => 'mym',
1340             'MER ' => 'mer',
1341             'MFE ' => 'mfe',
1342             'MIN ' => 'min',
1343             'MIZ ' => 'lus',
1344             'MKD ' => 'mkd',
1345             'MKR ' => 'mak',
1346             'MKW ' => 'mkw',
1347             'MLE ' => 'mdy',
1348             'MLG ' => 'mlg',
1349             'MLN ' => 'mlq',
1350             'MLR ' => 'mal',
1351             'MLY ' => 'msa',
1352             'MND ' => 'mnk',
1353             'MNG ' => 'mon',
1354             'MNI ' => 'mni',
1355             'MNK ' => 'man mnk myq mku msc emk mwk mlq',
1356             'MNX ' => 'glv',
1357             'MOH ' => 'mho',
1358             'MOK ' => 'mdf',
1359             'MOL ' => 'mol',
1360             'MON ' => 'mnw',
1361             'MOS ' => 'mos',
1362             'MRI ' => 'mri',
1363             'MTH ' => 'mai',
1364             'MTS ' => 'mlt',
1365             'MUN ' => 'unr',
1366             'MUS ' => 'mus',
1367             'MWL ' => 'mwl',
1368             'MWW ' => 'mww',
1369             'MYN ' => 'myn',
1370             'MZN ' => 'mzn',
1371             'NAG ' => 'nag',
1372             'NAH ' => 'nah',
1373             'NAN ' => 'gld',
1374             'NAP ' => 'nap',
1375             'NAS ' => 'nsk',
1376             'NAU ' => 'nau',
1377             'NAV ' => 'nav',
1378             'NCR ' => 'csw',
1379             'NDB ' => 'nbl nde',
1380             'NDC ' => 'ndc',
1381             'NDG ' => 'ndo',
1382             'NDS ' => 'nds',
1383             'NEP ' => 'nep',
1384             'NEW ' => 'new',
1385             'NGA ' => 'nga',
1386             'NHC ' => 'csw',
1387             'NIS ' => 'dap',
1388             'NIU ' => 'niu',
1389             'NKL ' => 'nyn',
1390             'NKO ' => 'ngo',
1391             'NLD ' => 'nld',
1392             'NOE ' => 'noe',
1393             'NOG ' => 'nog',
1394             'NOR ' => 'nob',
1395             'NOV ' => 'nov',
1396             'NSM ' => 'sme',
1397             'NSO ' => 'nso',
1398             'NTA ' => 'nod',
1399             'NTO ' => 'epo',
1400             'NYM ' => 'nym',
1401             'NYN ' => 'nno',
1402             'OCI ' => 'oci',
1403             'OCR ' => 'ojs',
1404             'OJB ' => 'oji',
1405             'ORI ' => 'ori',
1406             'ORO ' => 'orm',
1407             'OSS ' => 'oss',
1408             'PAA ' => 'sam',
1409             'PAG ' => 'pag',
1410             'PAL ' => 'pli',
1411             'PAM ' => 'pam',
1412             'PAN ' => 'pan',
1413             'PAP ' => 'plp',
1414             'PAP0' => 'pap',
1415             'PAS ' => 'pus',
1416             'PAU ' => 'pau',
1417             'PCC ' => 'pcc',
1418             'PCD ' => 'pcd',
1419             'PDC ' => 'pdc',
1420             'PGR ' => 'ell',
1421             'PHK ' => 'phk',
1422             'PIH ' => 'pih',
1423             'PIL ' => 'fil',
1424             'PLG ' => 'pce rbb pll',
1425             'PLK ' => 'pol',
1426             'PMS ' => 'pms',
1427             'PNB ' => 'pnb',
1428             'POH ' => 'poh',
1429             'PON ' => 'pon',
1430             'PRO ' => 'pro',
1431             'PTG ' => 'por',
1432             'PWO ' => 'pwo',
1433             'QIN ' => 'bgr cnh cnw czt sez tcp csy ctd flm pck tcz zom cmr dao hlt cka cnk mrh mwg cbl cnb csh',
1434             'QUC ' => 'quc',
1435             'QUH ' => 'quh',
1436             'QUZ ' => 'quz',
1437             'QVI ' => 'qvi',
1438             'QWH ' => 'qwh',
1439             'RAJ ' => 'raj',
1440             'RAR ' => 'rar',
1441             'RBU ' => 'bxr',
1442             'RCR ' => 'atj',
1443             'REJ ' => 'rej',
1444             'RIA ' => 'ria',
1445             'RIF ' => 'rif',
1446             'RIT ' => 'rit',
1447             'RKW ' => 'rkw',
1448             'RMS ' => 'roh',
1449             'RMY ' => 'rmy',
1450             'ROM ' => 'ron',
1451             'ROY ' => 'rom',
1452             'RSY ' => 'rue',
1453             'RTM ' => 'rtm',
1454             'RUA ' => 'kin',
1455             'RUN ' => 'run',
1456             'RUP ' => 'rup',
1457             'RUS ' => 'rus',
1458             'SAD ' => 'sck',
1459             'SAN ' => 'san',
1460             'SAS ' => 'sas',
1461             'SAT ' => 'sat',
1462             'SAY ' => 'chp',
1463             'SCN ' => 'scn',
1464             'SCO ' => 'sco',
1465             'SEK ' => 'xan',
1466             'SEL ' => 'sel',
1467             'SGA ' => 'sga',
1468             'SGO ' => 'sag',
1469             'SGS ' => 'sgs',
1470             'SHI ' => 'shi',
1471             'SHN ' => 'shn',
1472             'SIB ' => 'sjo',
1473             'SID ' => 'sid',
1474             'SIG ' => 'xst',
1475             'SKS ' => 'sms',
1476             'SKY ' => 'slk',
1477             'SLA ' => 'scs',
1478             'SLV ' => 'slv',
1479             'SML ' => 'som',
1480             'SMO ' => 'smo',
1481             'SNA ' => 'she',
1482             'SNA0' => 'sna',
1483             'SND ' => 'snd',
1484             'SNH ' => 'sin',
1485             'SNK ' => 'snk',
1486             'SOG ' => 'gru',
1487             'SOP ' => 'sop',
1488             'SOT ' => 'sot',
1489             'SQI ' => 'gsw',
1490             'SRB ' => 'srp',
1491             'SRD ' => 'srd',
1492             'SRK ' => 'skr',
1493             'SRR ' => 'srr',
1494             'SSL ' => 'xsl',
1495             'SSM ' => 'sma',
1496             'STQ ' => 'stq',
1497             'SUK ' => 'suk',
1498             'SUN ' => 'sun',
1499             'SUR ' => 'suq',
1500             'SVA ' => 'sva',
1501             'SVE ' => 'swe',
1502             'SWA ' => 'aii',
1503             'SWK ' => 'swa',
1504             'SWZ ' => 'ssw',
1505             'SXT ' => 'ngo',
1506             'SXU ' => 'sxu',
1507             'SYL ' => 'syl',
1508             'SYR ' => 'syr',
1509             'SZL ' => 'szl',
1510             'TAB ' => 'tab',
1511             'TAJ ' => 'tgk',
1512             'TAM ' => 'tam',
1513             'TAT ' => 'tat',
1514             'TCR ' => 'cwd',
1515             'TDD ' => 'tdd',
1516             'TEL ' => 'tel',
1517             'TET ' => 'tet',
1518             'TGL ' => 'tgl',
1519             'TGN ' => 'ton',
1520             'TGR ' => 'tig',
1521             'TGY ' => 'tir',
1522             'THA ' => 'tha',
1523             'THT ' => 'tah',
1524             'TIB ' => 'bod',
1525             'TIV ' => 'tiv',
1526             'TKM ' => 'tuk',
1527             'TMH ' => 'tmh',
1528             'TMN ' => 'tem',
1529             'TNA ' => 'tsn',
1530             'TNE ' => 'enh',
1531             'TNG ' => 'toi',
1532             'TOD ' => 'xal',
1533             'TOD0' => 'tod',
1534             'TPI ' => 'tpi',
1535             'TRK ' => 'tur',
1536             'TSG ' => 'tso',
1537             'TUA ' => 'tru',
1538             'TUL ' => 'tcy',
1539             'TUM ' => 'tum',
1540             'TUV ' => 'tyv',
1541             'TVL ' => 'tvl',
1542             'TWI ' => 'twi',
1543             'TYZ ' => 'tyz',
1544             'TZM ' => 'tzm',
1545             'TZO ' => 'tzo',
1546             'UDM ' => 'udm',
1547             'UKR ' => 'ukr',
1548             'UMB ' => 'umb',
1549             'URD ' => 'urd',
1550             'USB ' => 'hsb',
1551             'UYG ' => 'uig',
1552             'UZB ' => 'uzb uzn uzs',
1553             'VEC ' => 'vec',
1554             'VEN ' => 'ven',
1555             'VIT ' => 'vie',
1556             'VOL ' => 'vol',
1557             'VRO ' => 'vro',
1558             'WA ' => 'wbm',
1559             'WAG ' => 'wbr',
1560             'WAR ' => 'war',
1561             'WCR ' => 'crk',
1562             'WEL ' => 'cym',
1563             'WLF ' => 'wol',
1564             'WLN ' => 'wln',
1565             'WTM ' => 'wtm',
1566             'XBD ' => 'khb',
1567             'XHS ' => 'xho',
1568             'XJB ' => 'xjb',
1569             'XOG ' => 'xog',
1570             'XPE ' => 'xpe',
1571             'YAK ' => 'sah',
1572             'YAO ' => 'yao',
1573             'YAP ' => 'yap',
1574             'YBA ' => 'yor',
1575             'YCR ' => 'cre',
1576             'YIM ' => 'iii',
1577             'ZEA ' => 'zea',
1578             'ZGH ' => 'zgh',
1579             'ZHA ' => 'zha',
1580             'ZHH ' => 'zho',
1581             'ZHP ' => 'zho',
1582             'ZHS ' => 'zho',
1583             'ZHT ' => 'zho',
1584             'ZND ' => 'zne',
1585             'ZUL ' => 'zul',
1586             'ZZA ' => 'zza',
1587             );
1588              
1589             {
1590             foreach my $s (qw ( SCRIPT LANGUAGE FEATURE ) )
1591             {
1592             map { $ttnames{$s}{$tttags{$s}{$_}} = $_ } keys %{$tttags{$s}};
1593             }
1594            
1595             # For ISO639 info, the raw data is a space-separated list of ISO639
1596             # language IDs. We convert that list to an array.
1597            
1598             foreach my $tag (keys %iso639)
1599             {
1600             my $list = $iso639{$tag};
1601             $iso639{$tag} = [ split(' ', $list) ];
1602             # Also set the reverse mapping:
1603             map { $iso639{$_} = $tag } @{$iso639{$tag}};
1604             }
1605             }
1606              
1607              
1608             =head2 readtagsfile ( filename )
1609              
1610             Read a file in the syntax of Tags.txt (included with Microsoft VOLT) to obtain additional/replacement tag definitions.
1611              
1612             Returns 0 if cannot open the file; else 1.
1613              
1614             =cut
1615              
1616             sub readtagsfile
1617             {
1618 0     0 1   my $fname = shift;
1619 0 0         open (TAGS, $fname) or return 0;
1620 0           my ($what, $name, $tag);
1621 0           while ()
1622             {
1623 0           ($what, $name, $tag) = (m/"([^"]*)", "([^"]*)", "([^"]*)"/); #"
1624 0           $ttnames{$what}{$tag} = $name;
1625 0           $tttags{$what}{$name} = $tag;
1626             }
1627 0           close TAGS;
1628 0           return 1;
1629             }
1630              
1631             1;
1632              
1633             =head1 AUTHOR
1634              
1635             Bob Hallissy. L.
1636              
1637              
1638             =head1 LICENSING
1639              
1640             Copyright (c) 1998-2014, SIL International (http://www.sil.org)
1641              
1642             This module is released under the terms of the Artistic License 2.0.
1643             For details, see the full text of the license in the file LICENSE.
1644              
1645              
1646              
1647             =cut