Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
53.33% covered (warning)
53.33%
16 / 30
71.43% covered (warning)
71.43%
5 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
BanConverter
53.33% covered (warning)
53.33%
16 / 30
71.43% covered (warning)
71.43%
5 / 7
11.98
0.00% covered (danger)
0.00%
0 / 1
 getMainCode
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getLanguageVariants
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getVariantsFallbacks
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
 getVariantNames
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
2
 getIcuRules
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
1
 getTransliteratorAliases
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 guessVariant
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2/**
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 * http://www.gnu.org/copyleft/gpl.html
17 *
18 * @file
19 */
20
21/**
22 * Balinese specific code.
23 *
24 * @ingroup Languages
25 */
26class BanConverter extends LanguageConverterIcu {
27
28    public function getMainCode(): string {
29        return 'ban';
30    }
31
32    public function getLanguageVariants(): array {
33        return [ 'ban', 'ban-bali', 'ban-x-dharma', 'ban-x-palmleaf', 'ban-x-pku' ];
34    }
35
36    public function getVariantsFallbacks(): array {
37        return [
38            'ban-bali' => 'ban',
39            'ban-x-dharma' => 'ban',
40            'ban-x-palmleaf' => 'ban',
41            'ban-x-pku' => 'ban',
42        ];
43    }
44
45    public function getVariantNames(): array {
46        $names = [
47            'ban' => 'Basa Bali',
48            'ban-bali' => 'ᬩᬲᬩᬮᬶ',
49            'ban-x-dharma' => 'Basa Bali (alih aksara DHARMA)',
50            'ban-x-palmleaf' => 'Basa Bali (alih aksara Palmleaf.org)',
51            'ban-x-pku' => 'Basa Bali (alih aksara Puri Kauhan Ubud)',
52        ];
53        return array_merge( parent::getVariantNames(), $names );
54    }
55
56    protected function getIcuRules() {
57        $rules = [];
58
59        # transliteration rules developed for Palmleaf.org
60        $rules['ban-x-palmleaf'] = <<<'EOF'
61::NFC;
62
63ᬒᬁ → \uE050; # OM
64ᬁ → \uE001; # SIGN ULU CANDRA
65ᬂ → \uE002; # SIGN CECEK
66ᬄ → \uE003; # SIGN BISAH
67ᬅ → \uE005; # LETTER AKARA
68ᬆ → \uE006; # LETTER AKARA TEDUNG
69ᬇ → \uE007; # LETTER IKARA
70ᬈ → \uE008; # LETTER IKARA TEDUNG
71ᬉ → \uE009; # LETTER UKARA
72ᬊ → \uE00A; # LETTER UKARA TEDUNG
73ᬋ → \uE00B; # LETTER RA REPA
74ᬌ → \uE060; # LETTER RA REPA TEDUNG
75ᬍ → \uE00C; # LETTER LA LENGA
76ᬎ → \uE061; # LETTER LA LENGA TEDUNG
77ᬏ → \uE00F; # LETTER EKARA
78ᬐ → \uE010; # LETTER AIKARA
79ᬑ → \uE013; # LETTER OKARA
80ᬒ → \uE014; # LETTER OKARA TEDUNG
81ᬓ → \uE015; # LETTER KA
82ᬔ → \uE016; # LETTER KA MAHAPRANA
83ᬕ → \uE017; # LETTER GA
84ᬖ → \uE018; # LETTER GA GORA
85ᬗ → \uE019; # LETTER NGA
86ᬘ → \uE01A; # LETTER CA
87ᬙ → \uE01B; # LETTER CA LACA
88ᬚ → \uE01C; # LETTER JA
89ᬛ → \uE01D; # LETTER JA JERA
90ᬜ → \uE01E; # LETTER NYA
91ᬝ → \uE01F; # LETTER TA LATIK
92ᬞ → \uE020; # LETTER TA MURDA MAHAPRANA
93ᬟ → \uE021; # LETTER DA MURDA ALPAPRANA
94ᬠ → \uE022; # LETTER DA MURDA MAHAPRANA
95ᬡ → \uE023; # LETTER NA RAMBAT
96ᬢ → \uE024; # LETTER TA
97ᬣ → \uE025; # LETTER TA TAWA
98ᬤ → \uE026; # LETTER DA
99ᬥ → \uE027; # LETTER DA MADU
100ᬦ → \uE028; # LETTER NA
101ᬧ → \uE02A; # LETTER PA
102ᬨ → \uE02B; # LETTER PA KAPAL
103ᬩ → \uE02C; # LETTER BA
104ᬪ → \uE02D; # LETTER BA KEMBANG
105ᬫ → \uE02E; # LETTER MA
106ᬬ → \uE02F; # LETTER YA
107ᬭ → \uE030; # LETTER RA
108ᬮ → \uE032; # LETTER LA
109ᬯ → \uE035; # LETTER WA
110ᬰ → \uE036; # LETTER SA SAGA
111ᬱ → \uE037; # LETTER SA SAPA
112ᬲ → \uE038; # LETTER SA
113ᬳ → \uE039; # LETTER HA
114᬴ → \uE03C; # SIGN REREKAN
115ᬵ → \uE03E; # VOWEL SIGN TEDUNG
116ᬶ → \uE03F; # VOWEL SIGN ULU
117ᬷ → \uE040; # VOWEL SIGN ULU SARI
118ᬸ → \uE041; # VOWEL SIGN SUKU
119ᬹ → \uE042; # VOWEL SIGN SUKU ILUT
120ᬺ → \uE043; # VOWEL SIGN RA REPA
121ᬻ → \uE044; # VOWEL SIGN RA REPA TEDUNG
122ᬼ→ \uE062; # VOWEL SIGN LA LENGA
123ᬽ → \uE063; # VOWEL SIGN LA LENGA TEDUNG
124ᬾ → \uE047; # VOWEL SIGN TALING
125ᬿ → \uE048; # VOWEL SIGN TALING REPA
126ᭀ → \uE04B; # VOWEL SIGN TALING TEDUNG
127ᭁ → \uE04C; # VOWEL SIGN TALING REPA TEDUNG
128ᭂ → \uE045; # VOWEL SIGN PEPET
129ᭃ → \uE049; # VOWEL SIGN PEPET TEDUNG
130᭄ → \uE04D; # ADEG ADEG
131ᭅ → \uE058; # LETTER KAF SASAK
132ᭆ → \uE059; # LETTER KHOT SASAK
133ᭇ → \uE024\uE03C; # LETTER TZIR SASAK
134ᭈ → \uE05E; # LETTER EF SASAK
135ᭉ → \uE081; # LETTER VE SASAK
136ᭊ → \uE05B; # LETTER ZAL SASAK
137ᭋ → \uE038\uE03C; # LETTER ASYURA SASAK
138᭐ → \uE066; # DIGIT ZERO
139᭑ → \uE067; # DIGIT ONE
140᭒ → \uE068; # DIGIT TWO
141᭓ → \uE069; # DIGIT THREE
142᭔ → \uE06A; # DIGIT FO
143᭕ → \uE06B; # DIGIT FIVE
144᭖ → \uE06C; # DIGIT SIX
145᭗ → \uE06D; # DIGIT SEVEN
146᭘ → \uE06E; # DIGIT EIGHT
147᭙ → \uE06F; # DIGIT NINE
148᭚ → '//'; # PANTI
149᭛ → '///'; # PAMADA
150᭜ → •; # WINDU
151᭟᭜᭟ → '\\•\\';
152᭟ ' ' ᭜ ' ' ᭟ → '\\ • \\';
153᭝ → \:; # CARIK PAMUNGKAH
154᭞ → \uE064; # CARIK SIKI
155᭟ → \uE065; # CARIK PAREREN
156᭠ → ‐; # PAMENENG
157
158#consonants
159$chandrabindu=\uE001;
160$ardhachandra=\u1B00;
161$anusvara=\uE002;
162$visarga=\uE003;
163# w←vowel→ represents the stand-alone form
164$wa=\uE005;
165$waa=\uE006;
166$wi=\uE007;
167$wii=\uE008;
168$wu=\uE009;
169$wuu=\uE00A;
170$wr=\uE00B;
171$wl=\uE00C;
172$wce=\uE00D; # LETTER CANDRA E
173$wse=\uE00E; # LETTER SHORT E
174$we=\uE00F;  # ए LETTER E
175$wai=\uE010;
176$wco=\uE011; # LETTER CANDRA O
177$wso=\uE012; # LETTER SHORT O
178$wo=\uE013;  # ओ LETTER O
179$wau=\uE014;
180$ka=\uE015;
181$kha=\uE016;
182$ga=\uE017;
183$gha=\uE018;
184$nga=\uE019;
185$ca=\uE01A;
186$cha=\uE01B;
187$ja=\uE01C;
188$jha=\uE01D;
189$nya=\uE01E;
190$tta=\uE01F;
191$ttha=\uE020;
192$dda=\uE021;
193$ddha=\uE022;
194$nna=\uE023;
195$ta=\uE024;
196$tha=\uE025;
197$da=\uE026;
198$dha=\uE027;
199$na=\uE028;
200$ena=\uE029; #compatibility
201$pa=\uE02A;
202$pha=\uE02B;
203$ba=\uE02C;
204$bha=\uE02D;
205$ma=\uE02E;
206$ya=\uE02F;
207$ra=\uE030;
208$vva=\uE081;
209$rra=\uE031;
210$la=\uE032;
211$lla=\uE033;
212$ela=\uE034; #compatibility
213$va=\uE035;
214$sha=\uE036;
215$ssa=\uE037;
216$sa=\uE038;
217$ha=\uE039;
218$nukta=\uE03C;
219$avagraha=\uE03D; # SIGN AVAGRAHA
220# ←vowel→ represents the dependent form
221$aa=\uE03E;
222$i=\uE03F;
223$ii=\uE040;
224$u=\uE041;
225$uu=\uE042;
226$rh=\uE043;
227$rrh=\uE044;
228$ce=\uE045; #VOWEL SIGN CANDRA E
229$se=\uE046; #VOWEL SIGN SHORT E
230$e=\uE047;
231$ai=\uE048;
232$co=\uE049; # VOWEL SIGN CANDRA O
233$so=\uE04A; # VOWEL SIGN SHORT O
234$o=\uE04B;  # ो
235$au=\uE04C;
236$virama=\uE04D;
237$om=\uE050; # OM
238\uE051→;        # UNMAPPED STRESS SIGN UDATTA
239\uE052→;        # UNMAPPED STRESS SIGN ANUDATTA
240\uE053→;        # UNMAPPED GRAVE ACCENT
241\uE054→;        # UNMAPPED ACUTE ACCENT
242$lm = \uE055;#  Telugu Length Mark
243$ailm=\uE056;#  AI Length Mark
244$aulm=\uE057;#  AU Length Mark
245#urdu compatibity forms
246$uka=\uE058;
247$ukha=\uE059;
248$ugha=\uE05A;
249$ujha=\uE05B;
250$uddha=\uE05C;
251$udha=\uE05D;
252$ufa=\uE05E;
253$uya=\uE05F;
254$wrr=\uE060;
255$wll=\uE061;
256$lh=\uE062;
257$llh=\uE063;
258$danda=\uE064;
259$doubleDanda=\uE065;
260$zero=\uE066;     # DIGIT ZERO
261$one=\uE067;      # DIGIT ONE
262$two=\uE068;      # DIGIT TWO
263$three=\uE069;    # DIGIT THREE
264$four=\uE06A;     # DIGIT FOUR
265$five=\uE06B;     # DIGIT FIVE
266$six=\uE06C;      # DIGIT SIX
267$seven=\uE06D;    # DIGIT SEVEN
268$eight=\uE06E;    # DIGIT EIGHT
269$nine=\uE06F;     # DIGIT NINE
270# Glottal stop
271$dgs=\uE082;
272#Khanda-ta
273$kta=\uE083;
274$depVowelAbove=[\uE03E-\uE040\uE045-\uE04C];
275$depVowelBelow=[\uE041-\uE044];
276# $x was originally called '§'; $z was '%'
277$x=[$aa$ai$au$ii$i$uu$u$rrh$rh$lh$llh$e$o$se$ce$so$co];
278$z=[bcdfghjklmnpqrstvwxyz];
279$vowels=[aeiour̥̄̆];
280$forceIndependentMatra = [^[[:L:][̀-͌]]];
281$strike=\u0336;
282
283######################################################################
284# normalize input
285######################################################################
286
287# delete zwnj
288\u200C→;
289# reprocess from beginning
290::Null;
291
292######################################################################
293# convert from Native letters to Latin letters
294######################################################################
295
296#glottal stop
297$wa$virama → k'';
298
299#anusvara
300$anusvara → ng;
301
302#surang
303ᬃ → r̀;
304
305# Urdu compatibility
306$ya$nukta}$x        → y;
307$ya$nukta$virama    → y;
308$ya$nukta           → ya;
309$la$nukta }$x       → l;
310$la$nukta$virama    → l;
311$la$nukta           → la;
312$na$nukta }$x       → n;
313$na$nukta$virama    → n;
314$na$nukta           → na;
315$ena }$x            → n;
316$ena$virama         → n;
317$ena                → na;
318$uka                → qa;
319$ka$nukta }$x       → q;
320$ka$nukta$virama    → q;
321$ka$nukta           → qa;
322$kha$nukta }$x      → kh;
323$kha$nukta$virama   → kh;
324$kha$nukta          → kha;
325$ukha$virama        → kh;
326$ukha               → kha;
327$ugha               → gha;
328$ga$nukta }$x       → gh;
329$ga$nukta$virama    → gh;
330$ga$nukta           → gha;
331$ujha               → za;
332$ja$nukta }$x       → z;
333$ja$nukta$virama    → z;
334$ja$nukta           → za;
335$ddha$nukta}$x      → r;
336$ddha$nukta$virama  → r;
337$ddha$nukta         → ra;
338$uddha}$x           → r;
339$uddha$virama       → r;
340$uddha              → ra;
341$udha               → ra;
342$dda$nukta}$x       → r;
343$dda$nukta$virama   → r;
344$dda$nukta          → ra;
345$pha$nukta }$x      → f;
346$pha$nukta$virama   → f;
347$pha$nukta          → fa;
348$ufa }$x            → f;
349$ufa$virama         → f;
350$ufa                → fa;
351$ra$nukta}$x        → r;
352$ra$nukta$virama    → r;
353$ra$nukta           → ra;
354$lla$nukta}$x       → l;
355$lla$nukta$virama   → l;
356$lla$nukta          → la;
357$ela}$x             → l;
358$ela$virama         → l;
359$ela                → la;
360$uya}$x             → y;
361$uya$virama         → y;
362$uya                → ya;
363
364# normal consonants
365$ka$virama}$ha→k'';
366$ka}$x→k;
367$ka$virama→k;
368$ka→ka;
369$kha$i$u→k $strike h $strike;
370$kha}$x→kh;
371$kha$virama→kh;
372$kha→kha;
373$ga$virama}$ha→g'';
374$ga}$x→g;
375$ga$virama→g;
376$ga→ga;
377$gha$i$u→g $strike h $strike;
378$gha}$x→gh;
379$gha$virama→gh;
380$gha→gha;
381$nga$i$u→n $strike g $strike;
382$nga}$x→ng;
383$nga$virama→ng;
384$nga→nga;
385$ca$virama}$ha→c'';
386$ca}$x→c;
387$ca$virama→c;
388$ca→ca;
389$cha$i$u→c $strike h $strike;
390$cha}$x→ch;
391$cha$virama→ch;
392$cha→cha;
393$ja$virama}$ha→j'';
394$ja}$x→j;
395$ja$virama→j;
396$ja→ja;
397$jha$i$u→j $strike h $strike;
398$jha}$x→jh;
399$jha$virama→jh;
400$jha→jha;
401$nya }$x→ñ;
402$nya$virama→ñ;
403$nya → ña;
404$tta$virama}$ha→ṭ'';
405$tta}$x→ṭ;
406$tta$virama→ṭ;
407$tta→ṭa;
408$ttha$i$u→ṭ $strike h $strike;
409$ttha}$x→ṭh;
410$ttha$virama→ṭh;
411$ttha→ṭha;
412$dda}$x$ha→ḍ'';
413$dda}$x→ḍ;
414$dda$virama→ḍ;
415$dda→ḍa;
416$ddha$i$u→ḍ $strike h $strike;
417$ddha}$x→ḍh;
418$ddha$virama→ḍh;
419$ddha→ḍha;
420$nna}$x→ṇ;
421$nna$virama→ṇ;
422$nna→ṇa;
423$ta$virama}$ha→t'';
424$ta}$x→t;
425$ta$virama→t;
426$ta→ta;
427$tha$i$u→t $strike h $strike;
428$tha}$x→th;
429$tha$virama→th;
430$tha→tha;
431$da$virama}$ha→d'';
432$da}$x→d;
433$da$virama→d;
434$da→da;
435$dha$i$u→d $strike h $strike;
436$dha}$x→dh;
437$dha$virama→dh;
438$dha→dha;
439$na$virama}$ga→n'';
440$na}$x→n;
441$na$virama→n;
442$na→na;
443$pa$virama}$ha→p'';
444$pa}$x→p;
445$pa$virama→p;
446$pa→pa;
447$pha$i$u→p $strike h $strike;
448$pha}$x→ph;
449$pha$virama→ph;
450$pha→pha;
451$ba$virama}$ha→b'';
452$ba}$x→b;
453$ba$virama→b;
454$ba→ba;
455$bha$i$u→b $strike h $strike;
456$bha}$x→bh;
457$bha$virama→bh;
458$bha→bha;
459$ma}$x→m;
460$ma$virama→m;
461$ma→ma;
462$ya}$x→y;
463$ya$virama→y;
464$ya→ya;
465$ra}$x→r;
466$ra$virama→r;
467$ra→ra;
468$vva}$x→v;
469$vva$virama→v;
470$vva→va;
471$rra}$x→r;
472$rra$virama→r;
473$rra→ra;
474$la}$x→l;
475$la$virama→l;
476$la→la;
477$lla}$x→l;
478$lla$virama→l;
479$lla→la;
480$va}$x→w;
481$va$virama→w;
482$va→wa;
483$sa}$x→s;
484$sa$virama→s;
485#for gurmukhi
486$sa$nukta}$x→sy;
487$sa$nukta$virama→sy;
488$sa$nukta→sya;
489$sa→sa;
490$sha}$x→ś;
491$sha$virama→ś;
492$sha→śa;
493$ssa}$x→sy;
494$ssa$virama→ṣ;
495$ssa→ṣa;
496$ha}$x→h;
497$ha$virama→h;
498$ha→ha;
499
500# dependent vowels (should never occur except following consonants)
501$forceIndependentMatra{$aa  → ̔ā;
502$forceIndependentMatra{$ai  → ̔ai;
503$forceIndependentMatra{$au  → ̔au;
504$forceIndependentMatra{$ii  → ̔ī;
505$forceIndependentMatra{$i   → ̔i;
506$forceIndependentMatra{$uu  → ̔ū;
507$forceIndependentMatra{$u   → ̔u;
508$forceIndependentMatra{$rrh → ̔r̥ö;
509$forceIndependentMatra{$rh  → ̔r̥ĕ;
510$forceIndependentMatra{$llh → ̔l̥ö;
511$forceIndependentMatra{$lh  → ̔l̥ĕ;
512$forceIndependentMatra{$e   → ̔e;
513$forceIndependentMatra{$o   → ̔o;
514#extra vowels
515$forceIndependentMatra{$ce  → ̔ĕ;
516$forceIndependentMatra{$co  → ̔ö;
517$forceIndependentMatra{$se  → ̔ĕ;
518$forceIndependentMatra{$so  → ̔o;
519$forceIndependentMatra{$nukta  →; # Nukta cannot appear independently or as first character
520$forceIndependentMatra{$virama →; # Virama cannot appear independently or as first character
521$i$u → $strike;
522$aa  → ā;
523$ai  → ai;
524$au  → au;
525$ii  → ī;
526$i   → i;
527$uu  → ū;
528$u   → u;
529$rrh → r̥ö;
530$rh  → r̥ĕ;
531$llh → l̥ö;
532$lh  → l̥ĕ;
533$e   → e;
534$o   → o;
535#extra vowels
536$ce  → ĕ;
537$co  → ö;
538$se  → ĕ;
539$so  → o;
540
541#dependent vowels when following independent vowels. Generally Illegal only for roundtripping
542$waa} $x → ā;
543$wai} $x → ai;
544$wau} $x → au;
545$wii} $x → ī;
546$wi } $x → i;
547$wuu} $x → ū;
548$wu } $x → u;
549$wrr} $x → r̥ö;
550$wr } $x → r̥ĕ;
551$wll} $x → l̥ö;
552$wl } $x → l̥ĕ;
553$we } $x → e;
554$wo } $x → o;
555$wa } $x → a;
556#extra vowels
557$wce} $x → ĕ;
558$wco} $x → ö;
559$wse} $x → ĕ;
560$wso} $x → o;
561$om} $x → oṁ;
562
563# independent vowels when preceeded by vowels
564$vowels{$waa  → ''ā;
565$vowels{$wai  → ''ai;
566$vowels{$wau  → ''au;
567$vowels{$wii  → ''ī;
568$vowels{$wi   → ''i;
569$vowels{$wuu  → ''ū;
570$vowels{$wu   → ''u;
571$vowels{$we   → ''e;
572$vowels{$wo   → ''o;
573$vowels{$wa   → ''a;
574#extra vowels
575$vowels{$wce  → ''ĕ;
576$vowels{$wco  → ''ö;
577$vowels{$wse  → ''ĕ;
578$vowels{$wso  → ''o;
579$vowels{$om  → ''oṁ;
580
581# independent vowels (otherwise)
582$waa → ā;
583$wai → ai;
584$wau → au;
585$wii → ī;
586$wi  → i;
587$wuu → ū;
588$wu  → u;
589$wrr → r̥ö;
590$wr  → r̥ĕ;
591$wll → l̥ö;
592$wl  → l̥ĕ;
593$we  → e;
594$wo  → o;
595$wa  → a;
596#extra vowels
597$wce → ĕ;
598$wco → ö;
599$wse → ĕ;
600$wso → o;
601$om → oṁ;
602
603# stress marks
604$avagraha → ;
605$chandrabindu → ṅġ;
606$ardhachandra → ṃ;
607$visarga → ḥ;
608
609# numbers
610$zero  → 0;
611$one   → 1;
612$two   → 2;
613$three → 3;
614$four  → 4;
615$five  → 5;
616$six   → 6;
617$seven → 7;
618$eight → 8;
619$nine  → 9;
620$lm   →;
621$ailm →;
622$aulm →;
623$dgs→'';
624$kta→t;
625# Balinese numbers are surrounded by dandas which can be removed
626$danda } [$zero$one$two$three$four$five$six$seven$eight$nine] → ' ';
627[0123456789] { $danda → ' ';
628$danda→', ';
629$doubleDanda→'. ';
630
631\uE070→;       # ABBREVIATION SIGN
632# LETTER RA WITH MIDDLE DIAGONAL
633\uE071}$x→ra;
634\uE071$virama→r;
635\uE071→ra;
636# LETTER RA WITH LOWER DIAGONAL
637\uE072}$x→ra;
638\uE072$virama→r;
639\uE072→ra;
640\uE073→;       # RUPEE MARK
641\uE074→;       # RUPEE SIGN
642\uE075→;       # CURRENCY NUMERATOR ONE
643\uE076→;       # CURRENCY NUMERATOR TWO
644\uE077→;       # CURRENCY NUMERATOR THREE
645\uE078→;       # CURRENCY NUMERATOR FOUR
646\uE079→;       # CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR
647\uE07A→;       # CURRENCY DENOMINATOR SIXTEEN
648\uE07B→;       # ISSHAR
649\uE07C→;       # TIPPI
650\uE07D→;       # ADDAK
651\uE07E→;       # IRI
652\uE07F→;       # URA
653\uE080→;       # EK ONKAR
654\uE004→;       # DEVANAGARI VOWEL SIGN SHORT A
655
656::NFC;
657EOF;
658
659        # transliteration rules following DHARMA project "strict transliteration"
660        # mostly follows ISO-15919, with modifications for precision and broader coverage
661        # https://hal.inria.fr/halshs-02272407/
662        $rules['ban-x-dharma'] = <<<'EOF'
663::NFC;
664
665$dv_no_rerekan = [\u1B35-\u1B44];
666$dv = [\u1B34$dv_no_rerekan];
667$c = [\u1B13-\u1B33 \u1B45-\u1B4C];
668
669# disambiguation from aspirates
670[kgcjṭḍtdpb] { ᭄ } ᬳ → \:;
671
672# various signs
673ᬀ → ṁ\*; # ulu ricem / ardhacandra
674ᬁ → m̐; # ulu candra / candrabindu
675ᬂ → ṁ; # cecek / anusvara
676ᬃ → r\=; # surang / repha (note, "Indonesian mode" not "Indian mode")
677ᬄ → ḥ; # bisah / visarga
678
679# akara used as glottal
680ᬅ } $dv_no_rerekan → q;
681
682# independent vowels
683ᬅ → A; # LETTER AKARA
684ᬆ → A\:; # LETTER AKARA TEDUNG
685ᬇ → I; # LETTER IKARA
686ᬈ → I\:; # LETTER IKARA TEDUNG
687ᬉ → U; # LETTER UKARA
688ᬊ → U\:; # LETTER UKARA TEDUNG
689ᬋ → R̥; # LETTER RA REPA
690ᬌ → R̥\:; # LETTER RA REPA TEDUNG
691ᬍ → L̥; # LETTER LA LENGA
692ᬎ → L̥̄; # LETTER LA LENGA TEDUNG
693ᬏ → E; # LETTER EKARA
694ᬐ → Ai; # LETTER AIKARA
695ᬑ → O; # LETTER OKARA
696ᬒ → O\:; # LETTER OKARA TEDUNG
697
698# consonants
699ᬓ } $dv → k;
700ᬓ → ka; # LETTER KA
701ᬔ } $dv → kh;
702ᬔ → kha; # LETTER KA MAHAPRANA
703ᬕ } $dv → g;
704ᬕ → ga; # LETTER GA
705ᬖ } $dv → gh;
706ᬖ → gha; # LETTER GA GORA
707ᬗ } $dv → ṅ;
708ᬗ → ṅa; # LETTER NGA
709ᬘ } $dv → c;
710ᬘ → ca; # LETTER CA
711ᬙ } $dv → ch;
712ᬙ → cha; # LETTER CA LACA
713ᬚ } $dv → j;
714ᬚ → ja; # LETTER JA
715ᬛ } $dv → jh;
716ᬛ → jha; # LETTER JA JERA
717ᬜ } $dv → ñ;
718ᬜ → ña; # LETTER NYA
719ᬝ } $dv → ṭ;
720ᬝ → ṭa; # LETTER TA LATIK
721ᬞ } $dv → ṭh;
722ᬞ → ṭha; # LETTER TA MURDA MAHAPRANA
723ᬟ } $dv → ḍ;
724ᬟ → ḍa; # LETTER DA MURDA ALPAPRANA
725ᬠ } $dv → ḍh;
726ᬠ → ḍha; # LETTER DA MURDA MAHAPRANA
727ᬡ } $dv → ṇ;
728ᬡ → ṇa; # LETTER NA RAMBAT
729ᬢ } $dv → t;
730ᬢ → ta; # LETTER TA
731ᬣ } $dv → th;
732ᬣ → tha; # LETTER TA TAWA
733ᬤ } $dv → d;
734ᬤ → da; # LETTER DA
735ᬥ } $dv → dh;
736ᬥ → dha; # LETTER DA MADU
737ᬦ } $dv → n;
738ᬦ → na; # LETTER NA
739ᬧ } $dv → p;
740ᬧ → pa; # LETTER PA
741ᬨ } $dv → ph;
742ᬨ → pha; # LETTER PA KAPAL
743ᬩ } $dv → b;
744ᬩ → ba; # LETTER BA
745ᬪ } $dv → bh;
746ᬪ → bha; # LETTER BA KEMBANG
747ᬫ } $dv → m;
748ᬫ → ma; # LETTER MA
749ᬬ } $dv → y;
750ᬬ → ya; # LETTER YA
751ᬭ } $dv → r;
752ᬭ → ra; # LETTER RA
753ᬮ } $dv → l;
754ᬮ → la; # LETTER LA
755ᬯ } $dv → v;
756ᬯ → va; # LETTER WA
757ᬰ } $dv → ś;
758ᬰ → śa; # LETTER SA SAGA
759ᬱ } $dv → ṣ;
760ᬱ → ṣa; # LETTER SA SAPA
761ᬲ } $dv → s;
762ᬲ → sa; # LETTER SA
763ᬳ } $dv → h;
764ᬳ → ha; # LETTER HA
765\u1B4C } $dv → j\=ñ;
766\u1B4C → j\=ña; # LETTER ARCHAIC JNYA
767
768# rerekan (not present in DHARMA, "*" used as impromptu mark)
769᬴ } $dv_no_rerekan → \*;
770᬴ → \* a; # SIGN REREKAN
771
772# dependent vowels
773ᬵ → ā; # VOWEL SIGN TEDUNG
774ᬶ → i; # VOWEL SIGN ULU
775ᬷ → ī; # VOWEL SIGN ULU SARI
776ᬸ → u; # VOWEL SIGN SUKU
777ᬹ → ū; # VOWEL SIGN SUKU ILUT
778ᬺ → r̥; # VOWEL SIGN RA REPA
779ᬻ → r̥\:; # VOWEL SIGN RA REPA TEDUNG
780ᬼ→ l̥; # VOWEL SIGN LA LENGA
781ᬽ → l̥\:; # VOWEL SIGN LA LENGA TEDUNG
782ᬾ → e; # VOWEL SIGN TALING
783ᬿ → ai; # VOWEL SIGN TALING REPA
784ᭀ → o; # VOWEL SIGN TALING TEDUNG
785ᭁ → au; # VOWEL SIGN TALING REPA TEDUNG
786ᭂ → ə; # VOWEL SIGN PEPET
787ᭃ → ə\:; # VOWEL SIGN PEPET TEDUNG
788
789# adeg-adeg
790᭄\u200C → ·; # explicit ADEG ADEG
791᭄ } $c → ; # ADEG ADEG
792᭄ → ·; # ADEG ADEG
793
794# Sasak consonants (not present in DHARMA, "'" used as impromptu mark)
795ᭅ } $dv → k\';
796ᭅ → k\'a; # LETTER KAF SASAK
797ᭆ } $dv → kh\';
798ᭆ → kh\'a; # LETTER KHOT SASAK
799ᭇ } $dv → t\';
800ᭇ → t\'a; # LETTER TZIR SASAK
801ᭈ } $dv → p\';
802ᭈ → p\'a; # LETTER EF SASAK
803ᭉ } $dv → v\';
804ᭉ → v\'a; # LETTER VE SASAK
805ᭊ } $dv → j\';
806ᭊ → j\'a; # LETTER ZAL SASAK
807ᭋ } $dv → s\';
808ᭋ → s\'a; # LETTER ASYURA SASAK
809
810# digits
811᭐ → 0; # DIGIT ZERO
812᭑ → 1; # DIGIT ONE
813᭒ → 2; # DIGIT TWO
814᭓ → 3; # DIGIT THREE
815᭔ → 4; # DIGIT FOUR
816᭕ → 5; # DIGIT FIVE
817᭖ → 6; # DIGIT SIX
818᭗ → 7; # DIGIT SEVEN
819᭘ → 8; # DIGIT EIGHT
820᭙ → 9; # DIGIT NINE
821
822# punctuation
823᭚ → '<g type="panti"/>'; # PANTI
824᭛ → '<g type="pamada"/>'; # PAMADA
825᭜ → \@; # WINDU
826᭝ → '<g type="pamungkah"/>'; # CARIK PAMUNGKAH
827᭞ → \,; # CARIK SIKI
828᭟ → \,\,; # CARIK PAREREN
829᭠ → '<g type="pameneng"/>'; # PAMENENG
830\u1B7D → '<g type="pantiLantang"/>';
831\u1B7E → '<g type="pamadaLantang"/>';
832EOF;
833
834        # transliteration rules developed at Puri Kauhan Ubud and widely used in Bali
835        # default Balinese to Latin transliteration variant
836        $rules['ban-x-pku'] = <<<'EOF'
837::NFC;
838
839$dv_no_rerekan = [\u1B35-\u1B44];
840$dv = [\u1B34$dv_no_rerekan];
841$c = [\u1B13-\u1B33 \u1B45-\u1B4C];
842$base = [\u1B05-\u1B33 \u1B45-\u1B60];
843
844# ulu suku deletion mark
845$base ᬶᬸ → ∅;
846
847# disambiguation from aspirates
848[kgcjṭḍtdpb] { ᭄ } ᬳ → \:;
849
850# various signs
851ᬀ → ṃ; # ulu ricem / ardhacandra
852ᬁ → m̐; # ulu candra / candrabindu
853ᬂ → ŋ; # cecek / anusvara
854ᬃ → ŕ; # surang / repha (note, "Indonesian mode" not "Indian mode")
855ᬄ → ḥ; # bisah / visarga
856
857# akara used as glottal
858ᬅ } $dv_no_rerekan → \*;
859
860# independent vowels
861ᬅ → ᵒa; # LETTER AKARA
862ᬆ → ᵒā; # LETTER AKARA TEDUNG
863ᬇ → ᵒi; # LETTER IKARA
864ᬈ → ᵒī; # LETTER IKARA TEDUNG
865ᬉ → ᵒu; # LETTER UKARA
866ᬊ → ᵒū; # LETTER UKARA TEDUNG
867ᬋ → r̥; # LETTER RA REPA
868ᬌ → r̥̄; # LETTER RA REPA TEDUNG
869ᬍ → l̥; # LETTER LA LENGA
870ᬎ → l̥̄; # LETTER LA LENGA TEDUNG
871ᬏ → ᵒe; # LETTER EKARA
872ᬐ → ᵒai; # LETTER AIKARA
873ᬑ → ᵒo; # LETTER OKARA
874ᬒ → ᵒau; # LETTER OKARA TEDUNG
875
876# consonants
877ᬓ } $dv → k;
878ᬓ → ka; # LETTER KA
879ᬔ } $dv → kh;
880ᬔ → kha; # LETTER KA MAHAPRANA
881ᬕ } $dv → g;
882ᬕ → ga; # LETTER GA
883ᬖ } $dv → gh;
884ᬖ → gha; # LETTER GA GORA
885ᬗ } $dv → ṅ;
886ᬗ → ṅa; # LETTER NGA
887ᬘ } $dv → c;
888ᬘ → ca; # LETTER CA
889ᬙ } $dv → ch;
890ᬙ → cha; # LETTER CA LACA
891ᬚ } $dv → j;
892ᬚ → ja; # LETTER JA
893ᬛ } $dv → jh;
894ᬛ → jha; # LETTER JA JERA
895ᬜ } $dv → ñ;
896ᬜ → ña; # LETTER NYA
897ᬝ } $dv → ṭ;
898ᬝ → ṭa; # LETTER TA LATIK
899ᬞ } $dv → ṭh;
900ᬞ → ṭha; # LETTER TA MURDA MAHAPRANA
901ᬟ } $dv → ḍ;
902ᬟ → ḍa; # LETTER DA MURDA ALPAPRANA
903ᬠ } $dv → ḍh;
904ᬠ → ḍha; # LETTER DA MURDA MAHAPRANA
905ᬡ } $dv → ṇ;
906ᬡ → ṇa; # LETTER NA RAMBAT
907ᬢ } $dv → t;
908ᬢ → ta; # LETTER TA
909ᬣ } $dv → th;
910ᬣ → tha; # LETTER TA TAWA
911ᬤ } $dv → d;
912ᬤ → da; # LETTER DA
913ᬥ } $dv → dh;
914ᬥ → dha; # LETTER DA MADU
915ᬦ } $dv → n;
916ᬦ → na; # LETTER NA
917ᬧ } $dv → p;
918ᬧ → pa; # LETTER PA
919ᬨ } $dv → ph;
920ᬨ → pha; # LETTER PA KAPAL
921ᬩ } $dv → b;
922ᬩ → ba; # LETTER BA
923ᬪ } $dv → bh;
924ᬪ → bha; # LETTER BA KEMBANG
925ᬫ } $dv → m;
926ᬫ → ma; # LETTER MA
927ᬬ } $dv → y;
928ᬬ → ya; # LETTER YA
929ᬭ } $dv → r;
930ᬭ → ra; # LETTER RA
931ᬮ } $dv → l;
932ᬮ → la; # LETTER LA
933ᬯ } $dv → w;
934ᬯ → wa; # LETTER WA
935ᬰ } $dv → ś;
936ᬰ → śa; # LETTER SA SAGA
937ᬱ } $dv → ṣ;
938ᬱ → ṣa; # LETTER SA SAPA
939ᬲ } $dv → s;
940ᬲ → sa; # LETTER SA
941ᬳ } $dv → h;
942ᬳ → ha; # LETTER HA
943\u1B4C } $dv → j\=ñ;
944\u1B4C → j\=ña; # LETTER ARCHAIC JNYA
945
946# rerekan (not present in DHARMA, "*" used as impromptu mark)
947᬴ } $dv_no_rerekan → \*;
948᬴ → \* a; # SIGN REREKAN
949
950# dependent vowels
951ᬵ → ā; # VOWEL SIGN TEDUNG
952ᬶ → i; # VOWEL SIGN ULU
953ᬷ → ī; # VOWEL SIGN ULU SARI
954ᬸ → u; # VOWEL SIGN SUKU
955ᬹ → ū; # VOWEL SIGN SUKU ILUT
956ᬺᭂ → r̥ĕ;
957ᬺ → r̥ĕ; # VOWEL SIGN RA REPA
958ᬻ → r̥ö; # VOWEL SIGN RA REPA TEDUNG
959ᬼ→ lĕ; # VOWEL SIGN LA LENGA
960ᬽ → lö; # VOWEL SIGN LA LENGA TEDUNG
961ᬾ → e; # VOWEL SIGN TALING
962ᬿ → ai; # VOWEL SIGN TALING REPA
963ᭀ → o; # VOWEL SIGN TALING TEDUNG
964ᭁ → au; # VOWEL SIGN TALING REPA TEDUNG
965ᭂ → ĕ; # VOWEL SIGN PEPET
966ᭃ → ö; # VOWEL SIGN PEPET TEDUNG
967
968# adeg-adeg
969᭄\u200C → ·; # explicit ADEG ADEG
970᭄ } $c → ; # ADEG ADEG
971᭄ → ·; # ADEG ADEG
972
973# Sasak consonants (not present in DHARMA, "'" used as impromptu mark)
974ᭅ } $dv → k\';
975ᭅ → k\'a; # LETTER KAF SASAK
976ᭆ } $dv → kh\';
977ᭆ → kh\'a; # LETTER KHOT SASAK
978ᭇ } $dv → t\';
979ᭇ → t\'a; # LETTER TZIR SASAK
980ᭈ } $dv → p\';
981ᭈ → p\'a; # LETTER EF SASAK
982ᭉ } $dv → w\';
983ᭉ → w\'a; # LETTER VE SASAK
984ᭊ } $dv → j\';
985ᭊ → j\'a; # LETTER ZAL SASAK
986ᭋ } $dv → s\';
987ᭋ → s\'a; # LETTER ASYURA SASAK
988
989# digits
990᭐ → 0; # DIGIT ZERO
991᭑ → 1; # DIGIT ONE
992᭒ → 2; # DIGIT TWO
993᭓ → 3; # DIGIT THREE
994᭔ → 4; # DIGIT FOUR
995᭕ → 5; # DIGIT FIVE
996᭖ → 6; # DIGIT SIX
997᭗ → 7; # DIGIT SEVEN
998᭘ → 8; # DIGIT EIGHT
999᭙ → 9; # DIGIT NINE
1000
1001# punctuation
1002᭚ → '||'; # PANTI
1003᭛ → '//'; # PAMADA
1004᭜ → 0; # WINDU
1005᭝ → \=; # CARIK PAMUNGKAH
1006᭞ → \,; # CARIK SIKI
1007᭟ → \.; # CARIK PAREREN
1008᭠ → \-; # PAMENENG
1009\u1B7D → '|||';
1010\u1B7E → '///';
1011EOF;
1012
1013        return $rules;
1014    }
1015
1016    protected function getTransliteratorAliases() {
1017        return [
1018            'ban' => 'ban-x-pku',
1019            'ban-bali' => 'ban-x-pku',
1020        ];
1021    }
1022
1023    /**
1024     * Guess if a text is written in Balinese or Latin.
1025     * Overrides LanguageConverter::guessVariant()
1026     *
1027     * @param string $text The text to be checked
1028     * @param string $variant Language code of the variant to be checked for
1029     * @return bool True if $text appears to be written in $variant
1030     */
1031    public function guessVariant( $text, $variant ) {
1032        $hasBalinese = preg_match( "/[\x{1B00}-\x{1B7F}]/u", $text );
1033        return ( $variant == 'ban-bali' ) == $hasBalinese;
1034    }
1035
1036}