File Coverage

blib/lib/Regexp/CharClasses/Thai.pm
Criterion Covered Total %
statement 232 232 100.0
branch n/a
condition n/a
subroutine 223 223 100.0
pod 42 218 19.2
total 497 673 73.8


line stmt bran cond sub pod time code
1             package Regexp::CharClasses::Thai;
2              
3             # Regexp::CharClasses::Thai is designed to enable detailed
4             # regular expressions, with the ability to identify important
5             # characteristics of Thai alphabetic characters, digits and symbols.
6             #
7             # Copyright (C) 2023 Erik Mundall
8             #
9             # This program is free software: you can redistribute it and/or
10             # modify it under the terms of the GNU General Public License as
11             # published by the Free Software Foundation, either version 3 of
12             # the License, or (at your option) any later version.
13             #
14             # This program is distributed in the hope that it will be useful,
15             # but WITHOUT ANY WARRANTY; without even the implied warranty of
16             # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17             # GNU General Public License for more details.
18             #
19             # You should have received a copy of the GNU General Public License
20             # along with this program. If not, see: https://www.gnu.org/licenses/.
21              
22              
23 1     1   8186 use 5.008003;
  1         3  
24 1     1   4 use strict;
  1         1  
  1         21  
25 1     1   3 use warnings;
  1         1  
  1         81  
26 1     1   5 use utf8;
  1         1  
  1         5  
27 1     1   24 use Exporter;
  1         2  
  1         2805  
28              
29             our @ISA = qw(Exporter);
30              
31             our %EXPORT_TAGS = (
32              
33             classes =>
34             [ qw(InThai InThaiAlpha InThaiWord InThaiCons InThaiHCons
35             InThaiMCons InThaiLCons InThaiVowel InThaiPreVowel
36             InThaiPostVowel InThaiCompVowel InThaiDigit InThaiTone
37             InThaiMute InThaiPunct InThaiCurrency InThaiFinCons
38             InThaiDualCons InThaiDualC1 InThaiDualC2 InThaiConsVowel
39            
40             IsThai IsThaiAlpha IsThaiWord IsThaiCons IsThaiHCons
41             IsThaiMCons IsThaiLCons IsThaiVowel IsThaiPreVowel
42             IsThaiPostVowel IsThaiCompVowel IsThaiDigit IsThaiTone
43             IsThaiMute IsThaiPunct IsThaiCurrency IsThaiFinCons
44             IsThaiDualCons IsThaiDualC1 IsThaiDualC2 IsThaiConsVowel) ],
45            
46             characters =>
47             [ qw(InKokai InKhokhai InKhokhuat InKhokhwai InKhokhon
48             InKhorakhang InNgongu InChochan InChoching InChochang InSoso
49             InShochoe InYoying InDochada InTopatak InThothan InThonangmontho
50             InThophuthao InNonen InDodek InTotao InThothung InThothahan
51             InThothong InNonu InBobaimai InPopla InPhophung InFofa InPhophan
52             InFofan InPhosamphao InMoma InYoyak InRorua InRu InLoling InLu
53             InWowaen InSosala InSorusi InSosua InHohip InLochula InOang
54             InHonokhuk InPaiyannoi InSaraa InMaihanakat InSaraaa InSaraam
55             InSarai InSaraii InSaraue InSarauee InSarau InSarauu InPhinthu
56             InBaht InSarae InSaraae InSarao InSaraaimaimuan InSaraaimaimalai
57             InLakkhangyao InMaiyamok InMaitaikhu InMaiek InMaitho InMaitri
58             InMaichattawa InThanthakhat InGaran InNikhahit InYamakkan
59             InFongman InThZero InThOne InThTwo InThThree InThFour InThFive
60             InThSix InThSeven InThEight InThNine InAngkhankhu InKhomut
61            
62             IsKokai IsKhokhai IsKhokhuat IsKhokhwai IsKhokhon
63             IsKhorakhang IsNgongu IsChochan IsChoching IsChochang IsSoso
64             IsShochoe IsYoying IsDochada IsTopatak IsThothan IsThonangmontho
65             IsThophuthao IsNonen IsDodek IsTotao IsThothung IsThothahan
66             IsThothong IsNonu IsBobaimai IsPopla IsPhophung IsFofa IsPhophan
67             IsFofan IsPhosamphao IsMoma IsYoyak IsRorua IsRu IsLoling IsLu
68             IsWowaen IsSosala IsSorusi IsSosua IsHohip IsLochula IsOang
69             IsHonokhuk IsPaiyannoi IsSaraa IsMaihanakat IsSaraaa IsSaraam
70             IsSarai IsSaraii IsSaraue IsSarauee IsSarau IsSarauu IsPhinthu
71             IsBaht IsSarae IsSaraae IsSarao IsSaraaimaimuan IsSaraaimaimalai
72             IsLakkhangyao IsMaiyamok IsMaitaikhu IsMaiek IsMaitho IsMaitri
73             IsMaichattawa IsThanthakhat IsGaran IsNikhahit IsYamakkan
74             IsFongman IsThZero IsThOne IsThTwo IsThThree IsThFour IsThFive
75             IsThSix IsThSeven IsThEight IsThNine IsAngkhankhu IsKhomut) ],
76              
77             );
78             # add all the other tags to the ":all" class,
79             # deleting duplicates
80             {
81             my %seen;
82             push @{$EXPORT_TAGS{all}},
83             grep {!$seen{$_}++} @{$EXPORT_TAGS{$_}} foreach keys %EXPORT_TAGS;
84             }
85              
86             our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
87              
88             our @EXPORT = ( @{ $EXPORT_TAGS{'classes'} } );
89              
90             our $VERSION = '1.01';
91              
92             #--------------------------------------------------------------
93             # ALL THAI UNICODE CHARACTERS IN THIS MODULE
94             # FOLLOW THE UNICODE CODEPOINTS DETAILED HERE:
95             # http://www.unicode.org/charts/PDF/U0E00.pdf
96             #--------------------------------------------------------------
97              
98              
99             #--------------------------------------------------------------
100             # CREATE FUNCTIONALITY FOR SHOWING CONTENTS OF EACH CLASS
101             #--------------------------------------------------------------
102              
103             my %char_class_dispatch = (
104             InThai => \&InThai,
105             InThaiCons => \&InThaiCons,
106             InThaiHCons => \&InThaiHCons,
107             InThaiMCons => \&InThaiMCons,
108             InThaiLCons => \&InThaiLCons,
109             InThaiFinCons => \&InThaiFinCons,
110             InThaiDualCons => \&InThaiDualCons,
111             InThaiDualC1 => \&InThaiDualC1,
112             InThaiDualC2 => \&InThaiDualC2,
113             InThaiConsVowel => \&InThaiConsVowel,
114             InThaiAlpha => \&InThaiAlpha,
115             InThaiWord => \&InThaiWord,
116             InThaiTone => \&InThaiTone,
117             InThaiMute => \&InThaiMute,
118             InThaiPunct => \&InThaiPunct,
119             InThaiCurrency => \&InThaiCurrency,
120             InThaiDigit => \&InThaiDigit,
121             InThaiVowel => \&InThaiVowel,
122             InThaiCompVowel => \&InThaiCompVowel,
123             InThaiPreVowel => \&InThaiPreVowel,
124             InThaiPostVowel => \&InThaiPostVowel,
125             );
126              
127            
128             # IMPORTANT NOTE: ALL CHARACTER CLASSES IN THIS PACKAGE ARE
129             # SPELLED OUT IN THEIR ENTIRETY, RATHER THAN
130             # REPRESENTING EACH RANGE VIA OMISSION OF THE
131             # INTERVENING CODEPOINTS. THIS IS BOTH FOR
132             # EASIER READABILITY WHEN SEARCHING FOR A
133             # PARTICULAR CODEPOINT TO SEE IN WHICH CLASSES
134             # IT MAY BE FOUND, AND ALSO TO FACILITATE THE
135             # ABILITY TO IDENTIFY ALL THE CHARACTERS
136             # GROUPED IN A CLASS (MORE ON THIS IN POD).
137              
138             #--------------------------------------------------------------
139             # Start with the "Is..." versions
140             #--------------------------------------------------------------
141              
142             sub IsThai { #INCLUDES ENTIRE UNICODE CODEBLOCK FOR THAI
143 1     1 1 5 return join "\n",
144             '0E01', '0E02', '0E03', '0E04', '0E05', '0E06', '0E07',
145             '0E08', '0E09', '0E0A', '0E0B', '0E0C', '0E0D', '0E0E', '0E0F',
146             '0E10', '0E11', '0E12', '0E13', '0E14', '0E15', '0E16', '0E17',
147             '0E18', '0E19', '0E1A', '0E1B', '0E1C', '0E1D', '0E1E', '0E1F',
148             '0E20', '0E21', '0E22', '0E23', '0E24', '0E25', '0E26', '0E27',
149             '0E28', '0E29', '0E2A', '0E2B', '0E2C', '0E2D', '0E2E', '0E2F',
150             '0E30', '0E31', '0E32', '0E33', '0E34', '0E35', '0E36', '0E37',
151             '0E38', '0E39', '0E3A', '0E3B', '0E3C', '0E3D', '0E3E', '0E3F',
152             '0E40', '0E41', '0E42', '0E43', '0E44', '0E45', '0E46', '0E47',
153             '0E48', '0E49', '0E4A', '0E4B', '0E4C', '0E4D', '0E4E', '0E4F',
154             '0E50', '0E51', '0E52', '0E53', '0E54', '0E55', '0E56', '0E57',
155             '0E58', '0E59', '0E5A', '0E5B', '0E5C', '0E5D', '0E5E', '0E5F',
156             '0E60', '0E61', '0E62', '0E63', '0E64', '0E65', '0E66', '0E67',
157             '0E68', '0E69', '0E6A', '0E6B', '0E6C', '0E6D', '0E6E', '0E6F',
158             '0E70', '0E71', '0E72', '0E73', '0E74', '0E75', '0E76', '0E77',
159             '0E78', '0E79', '0E7A', '0E7B', '0E7C', '0E7D', '0E7E', '0E7F',
160             }
161              
162             sub IsThaiCons { #THAI CONSONANTS
163             # ก ข ฃ ค ฅ ฆ ง จ ฉ ช ซ ฌ ญ ฎ ฏ ฐ ฑ ฒ ณ ด ต ถ ท
164             # ธ น บ ป ผ ฝ พ ฟ ภ ม ย ร ฤ ล ฦ ว ศ ษ ส ห ฬ อ ฮ
165             #NOTE: Most consider 0E24 and 0E26 (ฤ ฦ), included,
166             # as vowels, but they act/function as consonants
167             # and are listed among the consonants in the
168             # official Unicode character chart for Thai.
169             # See https://en.wiktionary.org/wiki/%E0%B8%A4
170             # Thai: https://th.wikipedia.org/wiki/%E0%B8%A4
171 1     1 1 7 return join "\n",
172             '0E01', '0E02', '0E03', '0E04', '0E05', '0E06', '0E07',
173             '0E08', '0E09', '0E0A', '0E0B', '0E0C', '0E0D', '0E0E', '0E0F',
174             '0E10', '0E11', '0E12', '0E13', '0E14', '0E15', '0E16', '0E17',
175             '0E18', '0E19', '0E1A', '0E1B', '0E1C', '0E1D', '0E1E', '0E1F',
176             '0E20', '0E21', '0E22', '0E23', '0E24', '0E25', '0E26', '0E27',
177             '0E28', '0E29', '0E2A', '0E2B', '0E2C', '0E2D', '0E2E',
178             }
179              
180             sub IsThaiHCons { #THAI HIGH-CLASS CONSONANTS
181             # ข ฃ ฉ ฐ ถ ผ ฝ ศ ษ ส ห
182 1     1 1 5 return join "\n",
183             '0E02', '0E03', '0E09', '0E10', '0E16', '0E1C', '0E1D', '0E28',
184             '0E29', '0E2A', '0E2B',
185             }
186              
187             sub IsThaiMCons { #THAI MID-CLASS CONSONANTS
188             # ก จ ฎ ฏ ด ต บ ป อ
189 1     1 1 6 return join "\n",
190             '0E01', '0E08', '0E0E', '0E0F', '0E14', '0E15', '0E1A', '0E1B',
191             '0E2D',
192             }
193              
194             sub IsThaiLCons { #THAI LOW-CLASS CONSONANTS
195             # ค ฅ ฆ ง ช ซ ฌ ญ ฑ ฒ ณ ท ธ น พ ฟ ภ ม ย ร ฤ ล ฦ ว ฬ ฮ
196             #NOTE: The included ฤ and ฦ are usually classed as vowels, but
197             #when they function as consonants they would be in this class.
198 1     1 1 6 return join "\n",
199             '0E04', '0E05', '0E06', '0E07', '0E0A', '0E0B', '0E0C', '0E0D',
200             '0E11', '0E12', '0E13', '0E17', '0E18', '0E19', '0E1E', '0E1F',
201             '0E20', '0E21', '0E22', '0E23', '0E24', '0E25', '0E26', '0E27',
202             '0E2C', '0E2E',
203             }
204              
205             sub IsThaiFinCons { #THAI SYLLABLE-ENDING CONSONANTS (FINAL)
206             #ALL CONSONANTS EXCEPT THESE: ฉ ซ ผ ฝ ห ฮ ห อ ฮ
207             #NOTE: Certain others (ย ว อ) may be at the end of a syllable,
208             # but as a vowel; so are not included here. These consonants
209             # may not, but can, be at the end of a syllable; useful for
210             # some regular expressions.
211 1     1 1 14 return join "\n",
212             '0E01', '0E02', '0E03', '0E04', '0E05', '0E06', '0E07', '0E08',
213             '0E0A', '0E0C', '0E0D', '0E0E', '0E0F', '0E10', '0E11', '0E12',
214             '0E13', '0E14', '0E15', '0E16', '0E17', '0E18', '0E19', '0E1A',
215             '0E1B', '0E1E', '0E1F', '0E20', '0E21', '0E23', '0E24', '0E25',
216             '0E26', '0E28', '0E29', '0E2A', '0E2C',
217             }
218              
219             sub IsThaiDualCons {
220             # BECAUSE EACH \p{...} CHARACTER DEFINED CAN BE ONLY A SINGLE
221             # CHARACTER, AND NOT A CHARACTER CLUSTER, THIS CHAR CLASS, AND
222             # THE TWO WHICH FOLLOW IT, ARE CONSIDERED EXPERIMENTAL AND OF
223             # LIMITED USEFULNESS.
224             #
225             # NON-EXHAUSTIVE LIST OF EXAMPLES (INITIAL CONSONANT CLUSTERS)
226             # กว กล กร ขร ขล ขว คร คล คว ตร ปร ปล บร บล ดร ผล พร พล ทร สร จร ซร
227             # [and with sonorant consonants] หม หน หล หย หง หว หญ อย
228 1     1 1 5 return join "\n",
229             '0E01', '0E02', '0E04', '0E07', '0E08', '0E0B', '0E0D', '0E14',
230             '0E15', '0E17', '0E19', '0E1A', '0E1B', '0E1C', '0E1E', '0E21',
231             '0E22', '0E23', '0E25', '0E27', '0E2A', '0E2B', '0E2D',
232             }
233              
234             sub IsThaiDualC1 { #INITIAL CONSONANTS OF DUAL-CONSONANT LIST
235             #ก ข ค จ ซ ด ต ท บ ป ผ พ ส ห อ
236 1     1 1 5 return join "\n",
237             '0E01', '0E02', '0E04', '0E08', '0E0B', '0E14', '0E15', '0E17',
238             '0E1A', '0E1B', '0E1C', '0E1E', '0E2A', '0E2B', '0E2D',
239             }
240              
241             sub IsThaiDualC2 { #SECOND CONSONANTS OF DUAL-CONSONANT LIST
242             #ง ญ น ม ย ร ล ว
243 1     1 1 5 return join "\n",
244             '0E07', '0E0D', '0E19', '0E21', '0E22', '0E23', '0E25', '0E27',
245             }
246              
247             sub IsThaiConsVowel { #THAI CONSONANTS WHICH CAN ALSO BE VOWELS
248             #NOTE: Thais consider 0E33 to be only a vowel, and it can never
249             # function as only a consonant (it must always have a
250             # vowel component), so it is NOT included here: but it is
251             # actually a vowel-consonant combination, phonetically,
252             # finishing with the "m" sound. This class addresses only
253             # Thai characters which can be either consonant or vowel,
254             # but not both at the same time. The 0E23 is only a vowel if
255             # it is doubled--but this doubling cannot be determined when
256             # examining an individual code point, so it is included here
257             # for thoroughness.
258             # ย ร ฤ ฦ ว อ
259 1     1 1 6 return join "\n",
260             '0E22', '0E23', '0E24', '0E26', '0E27', '0E2D',
261             }
262              
263             sub IsThaiAlpha { #THAI ALPHABETIC CHARACTERS
264             #Thai consonants + vowels only
265 1     1 1 8 return join "\n",
266             '0E01', '0E02', '0E03', '0E04', '0E05', '0E06', '0E07',
267             '0E08', '0E09', '0E0A', '0E0B', '0E0C', '0E0D', '0E0E', '0E0F',
268             '0E10', '0E11', '0E12', '0E13', '0E14', '0E15', '0E16', '0E17',
269             '0E18', '0E19', '0E1A', '0E1B', '0E1C', '0E1D', '0E1E', '0E1F',
270             '0E20', '0E21', '0E22', '0E23', '0E24', '0E25', '0E26', '0E27',
271             '0E28', '0E29', '0E2A', '0E2B', '0E2C', '0E2D', '0E2E', '0E30',
272             '0E31', '0E32', '0E33', '0E34', '0E35', '0E36', '0E37', '0E38',
273             '0E39', '0E3A', '0E40', '0E41', '0E42', '0E43', '0E44', '0E45',
274             '0E47', '0E4D',
275             }
276              
277             sub IsThaiWord { #THAI WORD CHARACTERS
278             #Thai consonants + vowels + tone marks/diacritics
279             #but not including punctuation, digits, etc., i.e.
280             #specifically characters used in Thai words
281 1     1 1 5 return join "\n",
282             '0E01', '0E02', '0E03', '0E04', '0E05', '0E06', '0E07',
283             '0E08', '0E09', '0E0A', '0E0B', '0E0C', '0E0D', '0E0E', '0E0F',
284             '0E10', '0E11', '0E12', '0E13', '0E14', '0E15', '0E16', '0E17',
285             '0E18', '0E19', '0E1A', '0E1B', '0E1C', '0E1D', '0E1E', '0E1F',
286             '0E20', '0E21', '0E22', '0E23', '0E24', '0E25', '0E26', '0E27',
287             '0E28', '0E29', '0E2A', '0E2B', '0E2C', '0E2D', '0E2E', '0E30',
288             '0E31', '0E32', '0E33', '0E34', '0E35', '0E36', '0E37', '0E38',
289             '0E39', '0E3A', '0E40', '0E41', '0E42', '0E43', '0E44', '0E45',
290             '0E47', '0E48', '0E49', '0E4A', '0E4B', '0E4C', '0E4D', '0E4E',
291             }
292              
293             sub IsThaiTone { #THAI TONE MARKS
294             # ่ ้ ๊ ๋
295 1     1 1 6 return join "\n",
296             '0E48', '0E49', '0E4A', '0E4B',
297             }
298              
299             sub IsThaiMute { #THAI MUTE CHARACTER (THANTHAKHAT/GARAN)
300             #A special tone mark which silences consonants: ์
301 1     1 1 5 return join "\n",
302             '0E4C',
303             }
304              
305             sub IsThaiPunct { #THAI PUNCTUATION
306             # ฯ ๆ ๏ ๚ ๛
307 1     1 1 6 return join "\n",
308             '0E2F', '0E46', '0E4F', '0E5A', '0E5B',
309             }
310              
311             sub IsThaiCurrency { #BAHT SIGN
312             # ฿
313 1     1 1 24 return join "\n",
314             '0E3F',
315             }
316              
317             sub IsThaiDigit { #THAI DIGITS
318             # ๐ ๑ ๒ ๓ ๔ ๕ ๖ ๗ ๘ ๙
319 1     1 1 5 return join "\n",
320             '0E50', '0E51', '0E52', '0E53', '0E54',
321             '0E55', '0E56', '0E57', '0E58', '0E59',
322             }
323              
324             sub IsThaiVowel { #THAI VOWELS
325             #NOTE: 0E4D combines with a consonant but may not be considered a vowel
326             # 0E47 looks/acts like a tone mark, but is actually a form of sara-a
327             # which is used in place of sara-a (0E30) when the syllable terminates
328             # in a consonant
329             # ย ฤ ฦ ว อ ะ ั า ํา ิ ี ึ ื ุ ู ฺ เ แ โ ใ ไ ๅ ็ ํ
330 2     2 1 11 return join "\n",
331             '0E22', '0E24', '0E26', '0E27', '0E2D', '0E30', '0E31', '0E32',
332             '0E33', '0E34', '0E35', '0E36', '0E37', '0E38', '0E39', '0E3A',
333             '0E40', '0E41', '0E42', '0E43', '0E44', '0E45', '0E47', '0E4D',
334             }
335              
336             sub IsThaiCompVowel { #VOWELS COMPOSITED/COMPILED VERTICALLY WITH CONSONANT
337             #NOTE: 0E4D combines with a consonant but may not be considered a vowel
338             #NOTE: 0E33 is a partially-combining vowel but also occupies its own space
339             # ั ิ ี ึ ื ุ ู ็ ํ
340 1     1 1 6 return join "\n",
341             '0E31', '0E34', '0E35', '0E36', '0E37', '0E38', '0E39', '0E3A',
342             '0E47', '0E4D',
343             }
344              
345             sub IsThaiPreVowel { #VOWELS PRECEDING CONSONANT
346             # เ แ โ ใ ไ
347 1     1 1 5 return join "\n",
348             '0E40', '0E41', '0E42', '0E43', '0E44',
349             }
350              
351             sub IsThaiPostVowel { #VOWELS AFTER CONSONANT
352             #NOTE: Consonants which act as vowels also appear after their
353             # consonants but are not included here.
354             #NOTE: Thais consider 0E33 to be only a vowel, so it is included
355             # here, but it is actually a vowel-consonant combination,
356             # phonetically, finishing with the "m" sound.
357             # ะ า ํา ๅ
358 1     1 1 10 return join "\n",
359             '0E30', '0E32', '0E33', '0E45',
360             }
361              
362             #--------------------------------------------------------------
363             # Alias the "In..." forms (same as above)
364             #--------------------------------------------------------------
365              
366 1     1 1 366943 sub InThai { &IsThai }
367 1     1 1 893 sub InThaiCons { &IsThaiCons }
368 1     1 1 1020 sub InThaiHCons { &IsThaiHCons }
369 1     1 1 1089 sub InThaiMCons { &IsThaiMCons }
370 1     1 1 913 sub InThaiLCons { &IsThaiLCons }
371 1     1 1 979 sub InThaiFinCons { &IsThaiFinCons }
372 1     1 1 985 sub InThaiDualCons { &IsThaiDualCons }
373 1     1 1 933 sub InThaiDualC1 { &IsThaiDualC1 }
374 1     1 1 937 sub InThaiDualC2 { &IsThaiDualC2 }
375 1     1 1 968 sub InThaiConsVowel { &IsThaiConsVowel }
376 1     1 1 960 sub InThaiAlpha { &IsThaiAlpha }
377 1     1 1 1054 sub InThaiWord { &IsThaiWord }
378 1     1 1 1021 sub InThaiTone { &IsThaiTone }
379 1     1 1 958 sub InThaiMute { &IsThaiMute }
380 1     1 1 961 sub InThaiPunct { &IsThaiPunct }
381 1     1 1 956 sub InThaiCurrency { &IsThaiCurrency }
382 1     1 1 968 sub InThaiDigit { &IsThaiDigit }
383 2     2 1 10705 sub InThaiVowel { &IsThaiVowel }
384 1     1 1 2763 sub InThaiCompVowel { &IsThaiCompVowel }
385 1     1 1 4019 sub InThaiPreVowel { &IsThaiPreVowel }
386 1     1 1 2800 sub InThaiPostVowel { &IsThaiPostVowel }
387              
388              
389             #--------------------------------------------------------------
390             # Provide spelled-out forms of the individual characters
391             #--------------------------------------------------------------
392 2     2 0 10007 sub IsKokai { return '0E01' } # ก - THAI CHARACTER KO KAI
393 2     2 0 996 sub IsKhokhai { return '0E02' } # ข - THAI CHARACTER KHO KHAI
394 2     2 0 943 sub IsKhokhuat { return '0E03' } # ฃ - THAI CHARACTER KHO KHUAT
395 2     2 0 912 sub IsKhokhwai { return '0E04' } # ค - THAI CHARACTER KHO KHWAI
396 2     2 0 943 sub IsKhokhon { return '0E05' } # ฅ - THAI CHARACTER KHO KHON
397 2     2 0 965 sub IsKhorakhang { return '0E06' } # ฆ - THAI CHARACTER KHO RAKHANG
398 2     2 0 1217 sub IsNgongu { return '0E07' } # ง - THAI CHARACTER NGO NGU
399 2     2 0 906 sub IsChochan { return '0E08' } # จ - THAI CHARACTER CHO CHAN
400 2     2 0 935 sub IsChoching { return '0E09' } # ฉ - THAI CHARACTER CHO CHING
401 2     2 0 929 sub IsChochang { return '0E0A' } # ช - THAI CHARACTER CHO CHANG
402 2     2 0 924 sub IsSoso { return '0E0B' } # ซ - THAI CHARACTER SO SO
403 2     2 0 983 sub IsShochoe { return '0E0C' } # ฌ - THAI CHARACTER CHO CHOE
404 2     2 0 955 sub IsYoying { return '0E0D' } # ญ - THAI CHARACTER YO YING
405 2     2 0 955 sub IsDochada { return '0E0E' } # ฎ - THAI CHARACTER DO CHADA
406 2     2 0 931 sub IsTopatak { return '0E0F' } # ฏ - THAI CHARACTER TO PATAK
407 2     2 0 962 sub IsThothan { return '0E10' } # ฐ - THAI CHARACTER THO THAN
408 2     2 0 945 sub IsThonangmontho { return '0E11' } # ฑ - THAI CHARACTER THO NANGMONTHO
409 2     2 0 943 sub IsThophuthao { return '0E12' } # ฒ - THAI CHARACTER THO PHUTHAO
410 2     2 0 938 sub IsNonen { return '0E13' } # ณ - THAI CHARACTER NO NEN
411 2     2 0 962 sub IsDodek { return '0E14' } # ด - THAI CHARACTER DO DEK
412 2     2 0 915 sub IsTotao { return '0E15' } # ต - THAI CHARACTER TO TAO
413 2     2 0 945 sub IsThothung { return '0E16' } # ถ - THAI CHARACTER THO THUNG
414 2     2 0 934 sub IsThothahan { return '0E17' } # ท - THAI CHARACTER THO THAHAN
415 2     2 0 944 sub IsThothong { return '0E18' } # ธ - THAI CHARACTER THO THONG
416 2     2 0 942 sub IsNonu { return '0E19' } # น - THAI CHARACTER NO NU
417 2     2 0 861 sub IsBobaimai { return '0E1A' } # บ - THAI CHARACTER BO BAIMAI
418 2     2 0 944 sub IsPopla { return '0E1B' } # ป - THAI CHARACTER PO PLA
419 2     2 0 964 sub IsPhophung { return '0E1C' } # ผ - THAI CHARACTER PHO PHUNG
420 2     2 0 895 sub IsFofa { return '0E1D' } # ฝ - THAI CHARACTER FO FA
421 2     2 0 938 sub IsPhophan { return '0E1E' } # พ - THAI CHARACTER PHO PHAN
422 2     2 0 942 sub IsFofan { return '0E1F' } # ฟ - THAI CHARACTER FO FAN
423 2     2 0 931 sub IsPhosamphao { return '0E20' } # ภ - THAI CHARACTER PHO SAMPHAO
424 2     2 0 962 sub IsMoma { return '0E21' } # ม - THAI CHARACTER MO MA
425 2     2 0 961 sub IsYoyak { return '0E22' } # ย - THAI CHARACTER YO YAK
426 2     2 0 954 sub IsRorua { return '0E23' } # ร - THAI CHARACTER RO RUA
427 2     2 0 946 sub IsRu { return '0E24' } # ฤ - THAI CHARACTER RU
428 2     2 0 931 sub IsLoling { return '0E25' } # ล - THAI CHARACTER LO LING
429 2     2 0 936 sub IsLu { return '0E26' } # ฦ - THAI CHARACTER LU
430 2     2 0 932 sub IsWowaen { return '0E27' } # ว - THAI CHARACTER WO WAEN
431 2     2 0 957 sub IsSosala { return '0E28' } # ศ - THAI CHARACTER SO SALA
432 2     2 0 944 sub IsSorusi { return '0E29' } # ษ - THAI CHARACTER SO RUSI
433 2     2 0 905 sub IsSosua { return '0E2A' } # ส - THAI CHARACTER SO SUA
434 2     2 0 948 sub IsHohip { return '0E2B' } # ห - THAI CHARACTER HO HIP
435 2     2 0 948 sub IsLochula { return '0E2C' } # ฬ - THAI CHARACTER LO CHULA
436 2     2 0 969 sub IsOang { return '0E2D' } # อ - THAI CHARACTER O ANG
437 2     2 0 922 sub IsHonokhuk { return '0E2E' } # ฮ - THAI CHARACTER HO NOKHUK
438 2     2 0 930 sub IsPaiyannoi { return '0E2F' } # ฯ - THAI CHARACTER PAIYANNOI
439 2     2 0 944 sub IsSaraa { return '0E30' } # ะ - THAI CHARACTER SARA A
440 2     2 0 924 sub IsMaihanakat { return '0E31' } # ั - THAI CHARACTER MAI HAN-AKAT
441 2     2 0 868 sub IsSaraaa { return '0E32' } # า - THAI CHARACTER SARA AA
442 2     2 0 956 sub IsSaraam { return '0E33' } # ำ - THAI CHARACTER SARA AM
443 2     2 0 942 sub IsSarai { return '0E34' } # ิ - THAI CHARACTER SARA I
444 2     2 0 899 sub IsSaraii { return '0E35' } # ี - THAI CHARACTER SARA II
445 2     2 0 1051 sub IsSaraue { return '0E36' } # ึ - THAI CHARACTER SARA UE
446 2     2 0 908 sub IsSarauee { return '0E37' } # ื - THAI CHARACTER SARA UEE
447 2     2 0 913 sub IsSarau { return '0E38' } # ุ - THAI CHARACTER SARA U
448 2     2 0 892 sub IsSarauu { return '0E39' } # ู - THAI CHARACTER SARA UU
449 2     2 0 901 sub IsPhinthu { return '0E3A' } # ฺ - THAI CHARACTER PHINTHU
450 2     2 0 920 sub IsBaht { return '0E3F' } # ฿ - THAI CURRENCY SYMBOL BAHT
451 2     2 0 911 sub IsSarae { return '0E40' } # เ - THAI CHARACTER SARA E
452 2     2 0 926 sub IsSaraae { return '0E41' } # แ - THAI CHARACTER SARA AE
453 2     2 0 902 sub IsSarao { return '0E42' } # โ - THAI CHARACTER SARA O
454 2     2 0 893 sub IsSaraaimaimuan { return '0E43' } # ใ - THAI CHARACTER SARA AI MAIMUAN
455 2     2 0 903 sub IsSaraaimaimalai { return '0E44' } # ไ - THAI CHARACTER SARA AI MAIMALAI
456 2     2 0 851 sub IsLakkhangyao { return '0E45' } # ๅ - THAI CHARACTER LAKKHANGYAO
457 2     2 0 908 sub IsMaiyamok { return '0E46' } # ๆ - THAI CHARACTER MAIYAMOK
458 2     2 0 886 sub IsMaitaikhu { return '0E47' } # ็ - THAI CHARACTER MAITAIKHU
459 2     2 0 889 sub IsMaiek { return '0E48' } # ่ - THAI CHARACTER MAI EK
460 2     2 0 875 sub IsMaitho { return '0E49' } # ้ - THAI CHARACTER MAI THO
461 2     2 0 903 sub IsMaitri { return '0E4A' } # ๊ - THAI CHARACTER MAI TRI
462 2     2 0 1026 sub IsMaichattawa { return '0E4B' } # ๋ - THAI CHARACTER MAI CHATTAWA
463 2     2 0 908 sub IsThanthakhat { return '0E4C' } # ์ - THAI CHARACTER THANTHAKHAT/GARAN
464 2     2 0 917 sub IsGaran { return '0E4C' } # ์ - THAI CHARACTER THANTHAKHAT/GARAN
465 2     2 0 908 sub IsNikhahit { return '0E4D' } # ํ - THAI CHARACTER NIKHAHIT
466 2     2 0 874 sub IsYamakkan { return '0E4E' } # ๎ - THAI CHARACTER YAMAKKAN
467 2     2 0 870 sub IsFongman { return '0E4F' } # ๏ - THAI CHARACTER FONGMAN
468 2     2 0 882 sub IsThZero { return '0E50' } # ๐ - THAI DIGIT ZERO
469 2     2 0 926 sub IsThOne { return '0E51' } # ๑ - THAI DIGIT ONE
470 2     2 0 929 sub IsThTwo { return '0E52' } # ๒ - THAI DIGIT TWO
471 2     2 0 897 sub IsThThree { return '0E53' } # ๓ - THAI DIGIT THREE
472 2     2 0 917 sub IsThFour { return '0E54' } # ๔ - THAI DIGIT FOUR
473 2     2 0 912 sub IsThFive { return '0E55' } # ๕ - THAI DIGIT FIVE
474 2     2 0 4027 sub IsThSix { return '0E56' } # ๖ - THAI DIGIT SIX
475 2     2 0 939 sub IsThSeven { return '0E57' } # ๗ - THAI DIGIT SEVEN
476 2     2 0 4960 sub IsThEight { return '0E58' } # ๘ - THAI DIGIT EIGHT
477 2     2 0 951 sub IsThNine { return '0E59' } # ๙ - THAI DIGIT NINE
478 2     2 0 944 sub IsAngkhankhu { return '0E5A' } # ๚ - THAI CHARACTER ANGKHANKHU
479 2     2 0 907 sub IsKhomut { return '0E5B' } # ๛ - THAI CHARACTER KHOMUT
480              
481             #--------------------------------------------------------------
482             # Alias the spelled-out individual characters
483             #--------------------------------------------------------------
484              
485 1     1 0 928 sub InKokai { &IsKokai }
486 1     1 0 7860 sub InKhokhai { &IsKhokhai }
487 1     1 0 915 sub InKhokhuat { &IsKhokhuat }
488 1     1 0 938 sub InKhokhwai { &IsKhokhwai }
489 1     1 0 968 sub InKhokhon { &IsKhokhon }
490 1     1 0 903 sub InKhorakhang { &IsKhorakhang }
491 1     1 0 922 sub InNgongu { &IsNgongu }
492 1     1 0 906 sub InChochan { &IsChochan }
493 1     1 0 910 sub InChoching { &IsChoching }
494 1     1 0 876 sub InChochang { &IsChochang }
495 1     1 0 935 sub InSoso { &IsSoso }
496 1     1 0 887 sub InShochoe { &IsShochoe }
497 1     1 0 856 sub InYoying { &IsYoying }
498 1     1 0 883 sub InDochada { &IsDochada }
499 1     1 0 885 sub InTopatak { &IsTopatak }
500 1     1 0 910 sub InThothan { &IsThothan }
501 1     1 0 890 sub InThonangmontho { &IsThonangmontho }
502 1     1 0 873 sub InThophuthao { &IsThophuthao }
503 1     1 0 888 sub InNonen { &IsNonen }
504 1     1 0 900 sub InDodek { &IsDodek }
505 1     1 0 894 sub InTotao { &IsTotao }
506 1     1 0 866 sub InThothung { &IsThothung }
507 1     1 0 874 sub InThothahan { &IsThothahan }
508 1     1 0 917 sub InThothong { &IsThothong }
509 1     1 0 901 sub InNonu { &IsNonu }
510 1     1 0 926 sub InBobaimai { &IsBobaimai }
511 1     1 0 936 sub InPopla { &IsPopla }
512 1     1 0 991 sub InPhophung { &IsPhophung }
513 1     1 0 898 sub InFofa { &IsFofa }
514 1     1 0 930 sub InPhophan { &IsPhophan }
515 1     1 0 938 sub InFofan { &IsFofan }
516 1     1 0 957 sub InPhosamphao { &IsPhosamphao }
517 1     1 0 930 sub InMoma { &IsMoma }
518 1     1 0 963 sub InYoyak { &IsYoyak }
519 1     1 0 921 sub InRorua { &IsRorua }
520 1     1 0 891 sub InRu { &IsRu }
521 1     1 0 1100 sub InLoling { &IsLoling }
522 1     1 0 1179 sub InLu { &IsLu }
523 1     1 0 1124 sub InWowaen { &IsWowaen }
524 1     1 0 1068 sub InSosala { &IsSosala }
525 1     1 0 1058 sub InSorusi { &IsSorusi }
526 1     1 0 1080 sub InSosua { &IsSosua }
527 1     1 0 1074 sub InHohip { &IsHohip }
528 1     1 0 1113 sub InLochula { &IsLochula }
529 1     1 0 1096 sub InOang { &IsOang }
530 1     1 0 1077 sub InHonokhuk { &IsHonokhuk }
531 1     1 0 1239 sub InPaiyannoi { &IsPaiyannoi }
532 1     1 0 1097 sub InSaraa { &IsSaraa }
533 1     1 0 1124 sub InMaihanakat { &IsMaihanakat }
534 1     1 0 1144 sub InSaraaa { &IsSaraaa }
535 1     1 0 1089 sub InSaraam { &IsSaraam }
536 1     1 0 1113 sub InSarai { &IsSarai }
537 1     1 0 7613 sub InSaraii { &IsSaraii }
538 1     1 0 1171 sub InSaraue { &IsSaraue }
539 1     1 0 2200 sub InSarauee { &IsSarauee }
540 1     1 0 1146 sub InSarau { &IsSarau }
541 1     1 0 1050 sub InSarauu { &IsSarauu }
542 1     1 0 1080 sub InPhinthu { &IsPhinthu }
543 1     1 0 1079 sub InBaht { &IsBaht }
544 1     1 0 1075 sub InSarae { &IsSarae }
545 1     1 0 2886 sub InSaraae { &IsSaraae }
546 1     1 0 3789 sub InSarao { &IsSarao }
547 1     1 0 1095 sub InSaraaimaimuan { &IsSaraaimaimuan }
548 1     1 0 1199 sub InSaraaimaimalai { &IsSaraaimaimalai }
549 1     1 0 1116 sub InLakkhangyao { &IsLakkhangyao }
550 1     1 0 1106 sub InMaiyamok { &IsMaiyamok }
551 1     1 0 1080 sub InMaitaikhu { &IsMaitaikhu }
552 1     1 0 1060 sub InMaiek { &IsMaiek }
553 1     1 0 1087 sub InMaitho { &IsMaitho }
554 1     1 0 1051 sub InMaitri { &IsMaitri }
555 1     1 0 1139 sub InMaichattawa { &IsMaichattawa }
556 1     1 0 1086 sub InThanthakhat { &IsThanthakhat }
557 1     1 0 978 sub InGaran { &IsGaran }
558 1     1 0 934 sub InNikhahit { &IsNikhahit }
559 1     1 0 882 sub InYamakkan { &IsYamakkan }
560 1     1 0 923 sub InFongman { &IsFongman }
561 1     1 0 929 sub InThZero { &IsThZero }
562 1     1 0 935 sub InThOne { &IsThOne }
563 1     1 0 894 sub InThTwo { &IsThTwo }
564 1     1 0 938 sub InThThree { &IsThThree }
565 1     1 0 969 sub InThFour { &IsThFour }
566 1     1 0 924 sub InThFive { &IsThFive }
567 1     1 0 965 sub InThSix { &IsThSix }
568 1     1 0 943 sub InThSeven { &IsThSeven }
569 1     1 0 2523 sub InThEight { &IsThEight }
570 1     1 0 964 sub InThNine { &IsThNine }
571 1     1 0 931 sub InAngkhankhu { &IsAngkhankhu }
572 1     1 0 1024 sub InKhomut { &IsKhomut }
573              
574              
575              
576              
577             1;
578              
579             __END__