| 1 |
<?php |
| 2 |
|
| 3 |
class indic { |
| 4 |
|
| 5 |
function indic() { |
| 6 |
|
| 7 |
} |
| 8 |
|
| 9 |
|
| 10 |
function substituteIndic($earr, $lang, $font) { |
| 11 |
global $voltdata; |
| 12 |
|
| 13 |
if (!isset($voltdata[$font])) { |
| 14 |
include_once(_MPDF_PATH.'includes/'.$font.'.volt.php'); |
| 15 |
$voltdata[$font] = $volt; |
| 16 |
} |
| 17 |
|
| 18 |
foreach($earr as $eid=>$char) { |
| 19 |
$earr[$eid] = sprintf("%04s", strtoupper(dechex($char))); |
| 20 |
} |
| 21 |
$vstr = "0020 ".implode(" ",$earr)." 0020"; |
| 22 |
//============================ |
| 23 |
// Common Indic Punctuation marks |
| 24 |
// If NOT devanagari |
| 25 |
if ($lang!='hi') { |
| 26 |
$vstr = str_replace('0964','007C', $vstr); // U+0964 replace with "|" |
| 27 |
$vstr = str_replace('0965','007C 007C', $vstr); // U+0964 replace with "|" |
| 28 |
} |
| 29 |
//============================ |
| 30 |
// Tamil numeral for Zero missing Added mPDF 4.2 |
| 31 |
if ($lang=='ta') { |
| 32 |
$vstr = str_replace('0BE6','0030', $vstr); // U+0BEB replace with "0" |
| 33 |
} |
| 34 |
|
| 35 |
//============================ |
| 36 |
// Re-order vowels |
| 37 |
|
| 38 |
// DEVANAGARI vowel sign matraI[093F] before consonant |
| 39 |
if ($lang=='hi') { |
| 40 |
$prebasedvowels = "(093F)"; |
| 41 |
$nukta = "093C"; |
| 42 |
$halant = "094D"; |
| 43 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left |
| 44 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.' '.$nukta.'/','\\2 \\1 '.$nukta, $vstr); // before NUKTA |
| 45 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$prebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT == VIRAMA |
| 46 |
} |
| 47 |
|
| 48 |
// BENGALI vowels [09BF 09C7 09C8] |
| 49 |
else if ($lang=='bn') { |
| 50 |
|
| 51 |
// Khanda Ta 09CE not in font -> replace with 09A4|09CD |
| 52 |
$vstr = preg_replace('/09CE/','09A4 09CD 200D', $vstr); // mPDF 5.3.09 |
| 53 |
|
| 54 |
// BENGALI double-part vowels [09CB 09C7 09BE][09CC 09C7 09D7] |
| 55 |
$vstr = str_replace('09CB','09C7 09BE', $vstr); // convert to 2 parts |
| 56 |
$vstr = str_replace('09CC','09C7 09D7', $vstr); // 09C7 pre-based is then shifted below |
| 57 |
$prebasedvowels = "(09BF|09C7|09C8)"; |
| 58 |
$nukta = "09BC"; |
| 59 |
$halant = "09CD"; |
| 60 |
// mPDF 5.0.044 |
| 61 |
$bnfullcons = "0995|0996|0997|0998|0999|099A|099B|099C|099D|099F|09A0|09A1|09A2|09A3|09A4|09A5|09A6|09A7|09A8|09AA|09AB|09AC|09AD|09AE|09AF|09B0|09B2|09B6|09B7|09B8|09B9|09DC|09DD|09DF"; |
| 62 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left |
| 63 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.' '.$nukta.'/','\\2 \\1 '.$nukta, $vstr); // before NUKTA |
| 64 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$prebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT |
| 65 |
// mPDF 5.0.044 |
| 66 |
// .. and shifting left-based vowel further to the left in case 3 consonants together. |
| 67 |
$vstr = preg_replace('/('.$bnfullcons.') '.$halant.' '.$prebasedvowels.'/','\\2 \\1 '.$halant, $vstr); |
| 68 |
|
| 69 |
// mPDF 5.0.044 |
| 70 |
// If left-based vowel has now been shifted to left of RA/Halant (09B0/09CD) |
| 71 |
// Convert here to above-line form (E068) as it would get missed later |
| 72 |
// e.g. 09B0 09CD 09AD 09C7 would be changed above => |
| 73 |
// e.g. 09C7 09B0 09CD 09AD. The 09B0 09CD should => E068 |
| 74 |
// ??? need to add 09BF as well (09BF|09C7|09C8) |
| 75 |
$vstr = preg_replace('/(09C7|09C8) 09B0 09CD/', '\\1 E068', $vstr); |
| 76 |
|
| 77 |
} |
| 78 |
|
| 79 |
// GUJARATI pre-based vowel [0ABF] |
| 80 |
else if ($lang=='gu') { |
| 81 |
$prebasedvowels = "(0ABF)"; |
| 82 |
$nukta = "0ABC"; |
| 83 |
$halant = "0ACD"; |
| 84 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left |
| 85 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.' '.$nukta.'/','\\2 \\1 '.$nukta, $vstr); // before NUKTA |
| 86 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$prebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT |
| 87 |
} |
| 88 |
|
| 89 |
// GURMUKHI/PUNJABI pre-based vowel [0ABF] |
| 90 |
else if ($lang=='pa') { |
| 91 |
$prebasedvowels = "(0A3F)"; |
| 92 |
$nukta = "0A3C"; |
| 93 |
$halant = "0A4D"; |
| 94 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left |
| 95 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.' '.$nukta.'/','\\2 \\1 '.$nukta, $vstr); // before NUKTA |
| 96 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$prebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT |
| 97 |
} |
| 98 |
|
| 99 |
// TAMIL pre-based vowel [0ABF] |
| 100 |
else if ($lang=='ta') { |
| 101 |
// Shrii (Shree) |
| 102 |
$vstr = preg_replace('/0BB6 0BCD 0BB0 0BC0/','E04B', $vstr); |
| 103 |
|
| 104 |
// TAMIL double-part vowels [0BCA 0BC6 0BBE][0BCB 0BC7 0BBE][0BCC 0BC6 0BD7] |
| 105 |
$vstr = preg_replace('/0BCA/','0BC6 0BBE', $vstr); // convert to 2 parts |
| 106 |
$vstr = preg_replace('/0BCB/','0BC7 0BBE', $vstr); // pre-based is then shifted below |
| 107 |
$vstr = preg_replace('/0BCC/','0BC6 0BD7', $vstr); |
| 108 |
$prebasedvowels = "(0BC6|0BC7|0BC8)"; |
| 109 |
// No nukta |
| 110 |
$halant = "0BCD"; // Doesn't seem to move most in front of halanted consonants |
| 111 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left |
| 112 |
// ? Only for special case KSS (already moved to left of 0BB7) |
| 113 |
$vstr = preg_replace('/0B95 '.$halant.' '.$prebasedvowels.' 0BB7/','\\1 0B95 '.$halant.' 0BB7', $vstr); |
| 114 |
} |
| 115 |
|
| 116 |
// ORIYA |
| 117 |
else if ($lang=='or') { |
| 118 |
// ORIYA double-part vowels [] |
| 119 |
$vstr = str_replace('0B48','0B47 0B56', $vstr); // 2-part Vowel |
| 120 |
$vstr = str_replace('0B4B','0B47 0B3E', $vstr); // 2-part Vowel |
| 121 |
$vstr = str_replace('0B4C','0B47 0B57', $vstr); // 2-part Vowel |
| 122 |
$orprebasedvowels = "(0B47)"; |
| 123 |
// No nukta |
| 124 |
$halant = "0B4D"; |
| 125 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$orprebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left |
| 126 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$orprebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT |
| 127 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$orprebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT |
| 128 |
} |
| 129 |
|
| 130 |
// MALAYALAM |
| 131 |
else if ($lang=='ml') { |
| 132 |
// Chillus - old forms - remove ZWNJ after |
| 133 |
// This font Volt rules recognises e.g. "Na Halant(Virama)" as ChilluN |
| 134 |
$vstr = preg_replace('/(0D23 0D4D|0D28 0D4D|0D30 0D4D|0D32 0D4D|0D33 0D4D) 200D/','\\1', $vstr); |
| 135 |
// See Chillus in Unicode [http://en.wikipedia.org/wiki/Malayalam_script] |
| 136 |
$vstr = str_replace('0D7A','0D23 0D4D', $vstr); // [mlymChilluNn] |
| 137 |
$vstr = str_replace('0D7B','0D28 0D4D', $vstr); // [mlymChilluN] |
| 138 |
$vstr = str_replace('0D7C','0D30 0D4D', $vstr); // [mlymChilluR] |
| 139 |
$vstr = str_replace('0D7D','0D32 0D4D', $vstr); // [mlymChilluL] |
| 140 |
$vstr = str_replace('0D7E','0D33 0D4D', $vstr); // [mlymChilluLl] |
| 141 |
/* |
| 142 |
// Chillus - 0D7A-0D7E not in font directly, but as E005-E009 |
| 143 |
$vstr = preg_replace('/0D23 0D4D 200D/','0D7A', $vstr); |
| 144 |
$vstr = preg_replace('/0D28 0D4D 200D/','0D7B', $vstr); |
| 145 |
$vstr = preg_replace('/0D30 0D4D 200D/','0D7C', $vstr); |
| 146 |
$vstr = preg_replace('/0D32 0D4D 200D/','0D7D', $vstr); |
| 147 |
$vstr = preg_replace('/0D33 0D4D 200D/','0D7E', $vstr); |
| 148 |
|
| 149 |
$vstr = preg_replace('/0D7F/','E004', $vstr); // [mlymChilluK] |
| 150 |
$vstr = preg_replace('/0D7A/','E005', $vstr); // [mlymChilluNn] |
| 151 |
$vstr = preg_replace('/0D7B/','E006', $vstr); // [mlymChilluN] |
| 152 |
$vstr = preg_replace('/0D7C/','E007', $vstr); // [mlymChilluR] |
| 153 |
$vstr = preg_replace('/0D7D/','E008', $vstr); // [mlymChilluL] |
| 154 |
$vstr = preg_replace('/0D7E/','E009', $vstr); // [mlymChilluLl] |
| 155 |
*/ |
| 156 |
|
| 157 |
// MALAYALAM double-part vowels [] |
| 158 |
$vstr = str_replace('0D4A','0D46 0D3E', $vstr); // 2-part Vowel |
| 159 |
$vstr = str_replace('0D4B','0D47 0D3E', $vstr); // 2-part Vowel |
| 160 |
$vstr = str_replace('0D4C','0D46 0D57', $vstr); // 2-part Vowel |
| 161 |
$mlprebasedvowels = "(0D46|0D47|0D48)"; |
| 162 |
// No nukta |
| 163 |
$halant = "0D4D"; |
| 164 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$mlprebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left |
| 165 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$mlprebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT |
| 166 |
} |
| 167 |
|
| 168 |
// TELUGU |
| 169 |
else if ($lang=='te') { |
| 170 |
// TELUGU double-part vowels [0C48 -> 0C46 0C56] |
| 171 |
$vstr = str_replace('0C48','0C46 0C56', $vstr); // 2-part Vowel |
| 172 |
$prebasedvowels = "(0C46)"; |
| 173 |
$abvvowels = "(0C3E|0C3F|0C40|0C46|0C47|0C4A|0C4B|0C4C|0C55)"; |
| 174 |
// No nukta |
| 175 |
$halant = "0C4D"; |
| 176 |
$tefullforms = "0C15|0C17|0C18|0C1A|0C1B|0C1C|0C1D|0C20|0C21|0C22|0C24|0C25|0C26|0C27|0C28|0C2A|0C2B|0C2D|0C2E|0C2F|0C30|0C33|0C35|0C36|0C37|0C38|0C39|E028|E029|E02A|E02B|E078|E07A|E07B"; |
| 177 |
$vstr = preg_replace('/('.$tefullforms .') '.$halant.' ('.$tefullforms .') '.$abvvowels .'/','\\1 \\3 '.$halant.' \\2', $vstr); // before HALANT |
| 178 |
} |
| 179 |
|
| 180 |
|
| 181 |
// KANNADA |
| 182 |
else if ($lang=='kn') { |
| 183 |
// KANNADA double-part vowels [0CC8 -> 0CC6 0CD6] |
| 184 |
$vstr = str_replace('0CC0','0CBF 0CD5', $vstr); // 2-part Vowel |
| 185 |
$vstr = str_replace('0CC7','0CC6 0CD5', $vstr); // 2-part Vowel |
| 186 |
$vstr = str_replace('0CC8','0CC6 0CD6', $vstr); // 2-part Vowel AI - no glyph for single |
| 187 |
$vstr = str_replace('0CCA','0CC6 0CC2', $vstr); // 2-part Vowel |
| 188 |
$vstr = str_replace('0CCB','0CC6 0CC2 0CD5', $vstr); // 2-part Vowel |
| 189 |
$prebasedvowels = "(0CBF|0CC6)"; |
| 190 |
$halant = "0CCD"; |
| 191 |
} |
| 192 |
|
| 193 |
|
| 194 |
//============================ |
| 195 |
|
| 196 |
// SPECIALS |
| 197 |
|
| 198 |
// DEVANAGARI Ra Halant Ra |
| 199 |
if ($lang=='hi') { |
| 200 |
$vstr = str_replace('0930 094D 0930','E05D 0930', $vstr); // Ra Halant Ra => halfRa FullRa |
| 201 |
} |
| 202 |
|
| 203 |
// GUJARATI |
| 204 |
if ($lang=='gu') { |
| 205 |
$vstr = str_replace('0AB0 0AC2','E02E', $vstr); // Ra VowelUu => SpecialForm RaUu |
| 206 |
} |
| 207 |
|
| 208 |
// TELUGU Ra Halant <Consonant> Halant => halfRa Halant<Consonant> Halant |
| 209 |
if ($lang=='te') { |
| 210 |
$vstr = preg_replace('/0C30 0C4D ([A-F0-9]{4}) 0C4D/','E021 0C4D \\1 0C4D', $vstr); |
| 211 |
} |
| 212 |
|
| 213 |
// KANNADA |
| 214 |
// Reph at end of word becomes E0CC instead of E00B |
| 215 |
if ($lang=='kn') { |
| 216 |
$vstr = str_replace('0CB0 0CCD 0020','E0CC 0020', $vstr); // mPDF 5.3.87 |
| 217 |
} |
| 218 |
|
| 219 |
|
| 220 |
//============================ |
| 221 |
// MAIN BIT FROM VOLT RULES |
| 222 |
foreach($voltdata[$font] AS $rid=>$reps) { |
| 223 |
//echo $rid . ': ' . $vstr.'<br />'; |
| 224 |
$vstr = preg_replace('/'.$reps['match'].'/',$reps['replace'], $vstr); |
| 225 |
} |
| 226 |
//echo $vstr.'<br />'; exit; |
| 227 |
|
| 228 |
|
| 229 |
//============================ |
| 230 |
|
| 231 |
// SPECIALS |
| 232 |
|
| 233 |
// KANNADA |
| 234 |
// <Base> <BelowBase1> [<BelowBase2> ] MatraI -> <Base/MatraI ligature> <Belowbase1> etc |
| 235 |
if ($lang=='kn') { |
| 236 |
$matraI = "0CBF"; |
| 237 |
$knbase = preg_split('/\|/', "0C95|0C96|0C97|0C98|0C9A|0C9B|0C9C|0C9D|0CA0|0CA1|0CA2|0CA3|0CA4|0CA5|0CA6|0CA7|0CA8|0CAA|0CAB|0CAC|0CAD|0CAE|0CAF|0CB0|0CB2|0CB3|0CB5|0CB6|0CB7|0CB8|0CB9|E0A3|E07D|E07E"); |
| 238 |
$knmatraIligature = preg_split('/\|/', "E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A4|E0A1|E0A2"); |
| 239 |
$belowbase1 = "E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081"; |
| 240 |
$belowbase2 = "E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081"; |
| 241 |
for ($i=0; $i<count($knbase);$i++) { |
| 242 |
$vstr = preg_replace('/'.$knbase[$i].' ('.$belowbase1.') ('.$belowbase2.') '.$matraI.'/', $knmatraIligature[$i].' \\1 \\2', $vstr); |
| 243 |
$vstr = preg_replace('/'.$knbase[$i].' ('.$belowbase1.') '.$matraI.'/', $knmatraIligature[$i].' \\1', $vstr); |
| 244 |
} |
| 245 |
} |
| 246 |
|
| 247 |
// KANNADA |
| 248 |
// [KanTtaFull] [matraI] => [KanTtaPartial] [matraI] |
| 249 |
if ($lang=='kn') { |
| 250 |
$vstr = preg_replace('/0C9F '.$matraI.'/', 'E015 '.$matraI, $vstr); |
| 251 |
} |
| 252 |
|
| 253 |
// ORIYA |
| 254 |
if ($lang=='or') { |
| 255 |
// SpecialCase Ra[0B30] Halant still left before [oryaFullNnNna] => E00F |
| 256 |
$vstr = preg_replace('/0B30 '.$halant.' E00F/','E00F E069', $vstr); // convert to Reph |
| 257 |
} |
| 258 |
|
| 259 |
//============================ |
| 260 |
// SHIFT REPH |
| 261 |
|
| 262 |
// DEVANAGARI Shift Reph [E015] |
| 263 |
if ($lang=='hi') { |
| 264 |
// FIRSTLY - halfRa = E05D - Change this to Reph [E015] |
| 265 |
$himatchhalfforms = "E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E0D3|E0D4|E0D5|E0D6|E0D7|E0D8|E0D9|E0DA|E0DB|E0DC|E0DD|E0DE|E0DF|E0E0|E0E1|E0E2|E0E3|E0E4|E0E5|E0E6|E0E7|E0E8|E0E9|E0EA|E0EB|E0EC|E0ED|E0EE|E0EF|E0F0|E0F1|E0F2|E0F3|E0F4|E0F5|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FC|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145"; |
| 266 |
$himatchfullforms = "0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029|0958|0959|095A|E02A|E02B|E02C|E02D|095B|E02E|E02F|E030|E031|095C|095D|E032|E033|E034|E035|E036|0929|E037|095E|E038|E039|E03A|095F|0931|E03B|0934|E03C|E03D|E03E|E03F|E040|E041|E042|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E0A6|E0A7|E0A8|E0A9|E0AA|E0AB|E0AC|E0AD|E0AE|E0AF|E0B0|E0B1|E0B2|E0B3|E0B4|E0B5|E0B6|E0B7|E0B8|E0B9|E0BA|E0BB|E0BC|E0BD|E0BE|E0BF|E0C0|E0C1|E0C2|E0C3|E0C4|E0C5|E0C6|E0C7|E0C8|E0C9|E0CA|E0CB|E0CC|E0CD|E0CE|E0CF|E0D0|E0D1|E0D2|E11E|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E129|E12A|E12B|E12C|E12D|E12E|E12F|E130|E131|E132|E133"; |
| 267 |
$vstr = preg_replace('/E05D ('.$himatchhalfforms.'|'.$himatchfullforms.')/', 'E015 \\1', $vstr); |
| 268 |
|
| 269 |
// Reph = E015 - Shift Right to just after end of syllable |
| 270 |
// FullAllForms + HalfAllForms + 093E matraA |
| 271 |
while(preg_match('/E015 ('.$himatchhalfforms.')/', $vstr)) { |
| 272 |
$vstr = preg_replace('/E015 ('.$himatchhalfforms.')/', '\\1 E015', $vstr); |
| 273 |
} |
| 274 |
$vstr = preg_replace('/E015 ('.$himatchfullforms.')/', '\\1 E015', $vstr); |
| 275 |
|
| 276 |
// Now shift it beyond post-based vowels // ??? Need to add others e.g. 0949,094A,094B,094C + presentation forms like E198 |
| 277 |
$vstr = str_replace('E015 093E', '093E E015', $vstr); |
| 278 |
$vstr = preg_replace('/E015 (0940|E194|E195|E196|E197|E198)/', '\\1 E014', $vstr); // (Small) reph [E014] to Right of matraI |
| 279 |
$vstr = str_replace('E015 0947', '0947 E014', $vstr); // (Small) reph [E014] to Right of matraI |
| 280 |
} |
| 281 |
|
| 282 |
// BENGALI Shift Reph [E068] |
| 283 |
else if ($lang=='bn') { |
| 284 |
$bnfullconjuncts = "E002|E003|E004|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E0A6|E0A7|E0A8|E0A9|E0AA|E0AB|E0AC|E0AD|E0AE|E0AF|E0B0|E0B1|E0B2|E0B3|E0B4|E0B5|E0B6|E0B7|E0B8|E0B9|E0BA|E0BB|E0BC|E0BD|E0BE|E0BF|E0C0|E0C1|E0C2|E0C3|E0C4|E0C5|E0C6|E0C7|E0C8|E0C9|E0CA|E0CB|E0CC|E0CD|E0CE|E0CF|E0D0|E0D1|E0D2|E0D3|E0D4|E0D5|E0D6|E0D7|E0D8|E0D9|E0DA|E0DB|E0DC|E0DD|E0DE|E0DF|E0E0|E0E1|E0E2|E0E3|E0E4|E0E5|E0E6|E0E7|E0E8|E0E9|E0EA|E0EB|E0EC|E0ED|E0EE|E0EF|E0F0|E0F1|E0F2|E0F3|E0F4|E0F5|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FC|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E129|E12A|E12B|E12C|E12D|E12E|E12F|E130|E131|E132|E133|E134|E135|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E|E15F|E160|E161|E162|E163|E164|E165|E166|E167|E168|E169|E16A|E16B|E16C|E16D|E16E|E16F|E170|E171|E172|E173|E174|E175|E176|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E183|E184|E185|E186|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E18F|E190|E191|E192|E193|E194|E195|E196|E197|E198|E199|E19A"; |
| 285 |
// $bnfullcons - set above; |
| 286 |
$vstr = preg_replace('/E068 ('.$bnfullconjuncts.'|'.$bnfullcons.')/', '\\1 E068', $vstr); |
| 287 |
// ? Need to shift it beyond post-base vowels 09BE, 09C0, 09D7 haven't found so can't test?? |
| 288 |
$vstr = preg_replace('/E068 (09BE|09C0|09D7)/', '\\1 E068', $vstr); |
| 289 |
} |
| 290 |
|
| 291 |
// GUJARATI Shift Reph [E032] |
| 292 |
else if ($lang=='gu') { |
| 293 |
$gufullforms = "0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5"; |
| 294 |
$vstr = preg_replace('/E032 ('.$gufullforms.')/', '\\1 E032', $vstr); |
| 295 |
// Now shift it beyond post-based vowels // ??? Need to add others e.g. 0949,094A,094B,094C + presentation forms like E198 |
| 296 |
// ? Need to shift it beyond post-base vowels 0ABE, 0AC0 haven't found so can't test?? |
| 297 |
$vstr = preg_replace('/E032 (0ABE|0AC0)/', '\\1 E032', $vstr); |
| 298 |
} |
| 299 |
|
| 300 |
|
| 301 |
// TELUGU Shift Reph to LEFT [E046|E069|E077] [TelRaSmallOne] => E046 [TelRaSmallTwo] => E069 [TelRaSmallThree] => E077 |
| 302 |
else if ($lang=='te') { |
| 303 |
// tefullforms defined earlier |
| 304 |
$tepartialforms = "E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E07C|E07D|E07E"; |
| 305 |
$matraligs = "E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E0A6|E0A7|E0A8|E0A9|E0AA|E0AB|E0AC|E0AD|E0AE|E0AF"; |
| 306 |
$tevowels = "0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C" |
| 307 |
."|0C41|0C42|0C43|0C44"; // post matras |
| 308 |
$vstr = preg_replace('/('.$tevowels.') (E046|E069|E077)/', '\\2 \\1', $vstr); |
| 309 |
while(preg_match('/('.$tepartialforms.') (E046|E069|E077)/', $vstr)) { |
| 310 |
$vstr = preg_replace('/('.$tepartialforms.') (E046|E069|E077)/', '\\2 \\1', $vstr); |
| 311 |
} |
| 312 |
$vstr = preg_replace('/('.$tefullforms .'|'.$matraligs.') (E046|E069|E077)/', '\\2 \\1', $vstr); |
| 313 |
} |
| 314 |
|
| 315 |
|
| 316 |
// KANNADA Shift Reph to RIGHT [E00B] |
| 317 |
else if ($lang=='kn') { |
| 318 |
$knfullforms = "0C95|0C96|0C97|0C98|0C99|0C9A|0C9B|0C9C|0C9D|0C9E|0C9F|0CA0|0CA1|0CA2|0CA3|0CA4|0CA5|0CA6|0CA7|0CA8|0CAA|0CAB|0CAC|0CAD|0CAE|0CAF|0CB0|0CB1|0CB2|0CB3|0CB5|0CB6|0CB7|0CB8|0CB9|E07D|E07E|E0A3"; |
| 319 |
$knpartialforms = "E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|0C9E|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E07F"; |
| 320 |
while(preg_match('/E00B ('.$knpartialforms.')/', $vstr)) { |
| 321 |
$vstr = preg_replace('/E00B ('.$knpartialforms.')/', '\\1 E00B', $vstr); |
| 322 |
} |
| 323 |
// mPDF 5.3.47 Also move Reph to right of matraIligatures |
| 324 |
$knfullforms .= "|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A4|E0A1|E0A2"; |
| 325 |
$vstr = preg_replace('/E00B ('.$knfullforms.')/', '\\1 E00B', $vstr); |
| 326 |
|
| 327 |
// ? Need to shift it beyond base or below-base forms - haven't found so can't test?? |
| 328 |
// mPDF 5.3.87 |
| 329 |
// E004 added to list (which is a transformed version of 0CBE) |
| 330 |
$knvowels = "0CBE|0CC0|0CC1|0CC2|0CC3|0CC4|0CC7|0CC8|0CCA|0CCB|0CD5|0CD6|E004"; |
| 331 |
$vstr = preg_replace('/E00B ('.$knvowels.')/', '\\1 E00B', $vstr); |
| 332 |
} |
| 333 |
|
| 334 |
|
| 335 |
// ORIYA Shift Reph to RIGHT [E069|E06A|E06B|E06C] |
| 336 |
else if ($lang=='or') { |
| 337 |
$orrephs = "E069|E06A|E06B|E06C"; |
| 338 |
$orfullforms = "0B15|0B16|0B17|0B18|0B19|0B1A|0B1B|0B1C|0B1D|0B1E|0B1F|0B20|0B21|0B22|0B23|0B24|0B25|0B26|0B27|0B28|0B29|0B2A|0B2B|0B2C|0B2D|0B2E|0B2F|0B30|0B31|0B32|0B33|0B34|0B35|0B36|0B37|0B38|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037"; |
| 339 |
// E123 - E147 FullHalant forms ? add to FullForms |
| 340 |
$orpartialforms = "E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E0A6|E0A7|E0A8|E0A9|E0AA|E0AB|E0AC|E0AD|E0AE|E0AF|E0B0|E0B1|E0B2|E0B3|E0B4|E0B5|E0B6|E0B7|E0B8|E0B9|E0BA|E0BB|E0BC|E0BD|E0BE|E0BF|E0C0|E0C1|E0C2|E0C3|E0C4|E0C5|E0C6|E0C7|E0C8|E0C9|E0CA|E0CB|E0CC|E0CD|E0CE|E0CF|E0D0|E0D1|E0D2|E0D3|E0D4|E0D5|E0D6|E0D7|E0D8|E0D9|E0DA|E0DB|E0DC|E0DD|E0DE|E0DF|E0E0|E0E1|E0E2|E0E3|E0E4|E0E5|E0E6|E0E7|E0E8|E0E9|E0EA|E0EB|E0EC|E0ED|E0EE|E0EF|E0F0|E0F1|E0F2|E0F3|E0F4|E0F5"; |
| 341 |
|
| 342 |
// Combined MatraIReph[E06D] split [0B3F & E069] to allow reph to be shifted forwards |
| 343 |
$vstr = preg_replace('/('.$orfullforms.') E06D ('.$orfullforms.') 0B3E/', '\\1 0B3F E069 \\2 0B3E', $vstr); |
| 344 |
|
| 345 |
|
| 346 |
while(preg_match('/('.$orrephs.') ('.$orpartialforms.')/', $vstr)) { |
| 347 |
$vstr = preg_replace('/('.$orrephs.') ('.$orpartialforms.')/', '\\2 \\1', $vstr); |
| 348 |
} |
| 349 |
$vstr = preg_replace('/('.$orrephs.') ('.$orfullforms.')/', '\\2 \\1', $vstr); |
| 350 |
|
| 351 |
|
| 352 |
// Combine Reph and MatraI |
| 353 |
$vstr = str_replace('E069 0B3F', 'E06D', $vstr); // Reph and MatraI -> MatraIReph |
| 354 |
$vstr = str_replace('E06A 0B3F', 'E06E', $vstr); // Reph and MatraI -> MatraIReph |
| 355 |
$vstr = str_replace('E06B 0B3F', 'E06F', $vstr); // Reph and MatraI -> MatraIReph |
| 356 |
} |
| 357 |
|
| 358 |
|
| 359 |
// MALAYALAM Shift Reph to LEFT [E00E] (mlylmRaVattu) |
| 360 |
else if ($lang=='ml') { |
| 361 |
$halant = "0D4D"; |
| 362 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' 0D30/','E00E \\1', $vstr); // 0D30 = Ra |
| 363 |
$vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$mlprebasedvowels .' 0D30/','\\2 E00E \\1', $vstr); // 0D30 = Ra |
| 364 |
|
| 365 |
$mlfullforms = "0D15|0D16|0D17|0D18|0D19|0D1A|0D1B|0D1C|0D1D|0D1E|0D1F|0D20|0D21|0D22|0D23|0D24|0D25|0D26|0D27|0D28|0D2A|0D2B|0D2C|0D2D|0D2E|0D2F|0D30|0D31|0D32|0D33|0D34|0D35|0D36|0D37|0D38|0D39" |
| 366 |
."|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D"; |
| 367 |
// = FullConsonants + FullConjuncts |
| 368 |
|
| 369 |
// = Add Chillu characters // mPDF 5.0.024 |
| 370 |
$mlfullforms .= "|E004|E005|E006|E007|E008|E009"; |
| 371 |
while(preg_match('/('.$mlfullforms.') E00E/', $vstr)) |
| 372 |
$vstr = preg_replace('/('.$mlfullforms.') E00E/', 'E00E \\1', $vstr); |
| 373 |
} |
| 374 |
|
| 375 |
//============================ |
| 376 |
|
| 377 |
// SHIFT post-based vowels to Left of SmallForms (NOT to left of full forms) |
| 378 |
|
| 379 |
// TELUGU Shift |
| 380 |
if ($lang=='te') { |
| 381 |
// NB $tevowels defined above |
| 382 |
// NB $tefullforms defined above |
| 383 |
$tebelowbase1 = "E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E"; //'Small1KaToHa' |
| 384 |
$tebelowbase2 = "E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071"; // 'Small2KaToHa' |
| 385 |
$vstr = preg_replace('/('.$tebelowbase2.') ('.$tevowels.')/', '\\2 \\1', $vstr); |
| 386 |
$vstr = preg_replace('/('.$tebelowbase1.') ('.$tevowels.')/', '\\2 \\1', $vstr); |
| 387 |
} |
| 388 |
|
| 389 |
|
| 390 |
// KANNADA Shift |
| 391 |
else if ($lang=='kn') { |
| 392 |
$knvowels = "0CBE|0CC0|0CC1|0CC2|0CC3|0CC4|0CC7|0CC8|0CCA|0CCB|0CD5|0CD6" |
| 393 |
// mPDF 5.3.87 Shouldn't swop E082 and E047 (belowbase1) below |
| 394 |
// E082 is a matraIligature |
| 395 |
// ."|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E0A6|E0A7|E0A8|E0A9|E0AA|E0AB" |
| 396 |
."|E004|E007|E008|E009|E00A"; |
| 397 |
|
| 398 |
|
| 399 |
// NB $knvowels defined above |
| 400 |
// NB $fullforms defined above |
| 401 |
// $belowbase1/2 defined above |
| 402 |
$vstr = preg_replace('/('.$belowbase2.') ('.$knvowels.')/', '\\2 \\1', $vstr); |
| 403 |
// mPDF 5.3.87 |
| 404 |
$vstr = preg_replace('/('.$belowbase1.') ('.$knvowels.')/', '\\2 \\1', $vstr); |
| 405 |
|
| 406 |
//$vstr = preg_replace('/('.$fullforms.') ('.$knvowels.')/', '\\2 \\1', $vstr); |
| 407 |
} |
| 408 |
|
| 409 |
//============================ |
| 410 |
// Clear unwanted ZWJ, ZWNJ |
| 411 |
// MALAYALAM |
| 412 |
if ($lang=='ml') { |
| 413 |
$vstr = preg_replace('/(200C|200D) /','', $vstr); |
| 414 |
} |
| 415 |
|
| 416 |
//============================ |
| 417 |
// END & PUT IT BACK TOGETHER |
| 418 |
$vstr = preg_replace('/^0020 (.*) 0020$/', '\\1', $vstr); |
| 419 |
|
| 420 |
$varr = explode(" ",$vstr); |
| 421 |
$e = ''; |
| 422 |
foreach($varr AS $v) { |
| 423 |
$e.=code2utf(hexdec($v)); |
| 424 |
} |
| 425 |
//============================ |
| 426 |
|
| 427 |
return $e; |
| 428 |
} |
| 429 |
|
| 430 |
|
| 431 |
} |
| 432 |
|
| 433 |
?> |