2314f2d38e0c6ea59a7d38e81114073f522c25c0
[platform/core/uifw/dali-adaptor.git] / dali / devel-api / text-abstraction / script.cpp
1 /*
2  * Copyright (c) 2015 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // FILE HEADER
19 #include <dali/devel-api/text-abstraction/script.h>
20
21 namespace Dali
22 {
23
24 namespace TextAbstraction
25 {
26
27 namespace
28 {
29 const unsigned int WHITE_SPACE_THRESHOLD  = 0x21; ///< All characters below 0x21 are considered white spaces.
30 const unsigned int CHAR_LF   = 0x000A; ///< NL Line feed, new line.
31 const unsigned int CHAR_VT   = 0x000B; ///< Vertical tab.
32 const unsigned int CHAR_FF   = 0x000C; ///< NP Form feed, new page.
33 const unsigned int CHAR_CR   = 0x000D; ///< Carriage return, new line.
34 const unsigned int CHAR_NEL  = 0x0085; ///< Next line.
35 const unsigned int CHAR_LS   = 0x2028; ///< Line separator.
36 const unsigned int CHAR_PS   = 0x2029; ///< Paragraph separator
37
38 const unsigned int CHAR_ZWS  = 0x200B; ///< Zero width space.
39 const unsigned int CHAR_ZWNJ = 0x200C; ///< Zero width non joiner.
40 const unsigned int CHAR_ZWJ  = 0x200D; ///< Zero width joiner.
41 const unsigned int CHAR_LTRM = 0x200E; ///< Left to Right Mark.
42 const unsigned int CHAR_RTLM = 0x200F; ///< Right to Left Mark.
43 const unsigned int CHAR_TS   = 0x2009; ///< Thin Space.
44 } // namespace
45
46 bool IsRightToLeftScript( Script script )
47 {
48   return ( ( ARABIC == script ) ||
49            ( HEBREW == script ) );
50 }
51
52 Script GetCharacterScript( Character character )
53 {
54   // Latin script:   It contains punctuation characters and symbols which are not part of the latin script. https://en.wikipedia.org/wiki/Latin_script_in_Unicode
55   // 0x0000 - 0x007f C0 Controls and Basic Latin
56   //
57   //                 ASCII digits (not part of LATIN script):
58   //                 0x0030 - 0x0039
59   //
60   //                 ASCII punctuation and symbols (not part of LATIN script):
61   //                 0x0020 - 0x002F
62   //                 0x003A - 0x0040
63   //                 0x005B - 0x0060
64   //                 0x007B - 0x007E
65   //
66   //                 Controls (not part of LATIN script):
67   //                 0x007F
68   //
69   // 0x0080 - 0x00ff C1 Controls and Latin-1 Supplement
70   //
71   //                 Controls (not part of LATIN script):
72   //                 0x0080 - 0x009F
73   //
74   //                 Punctuations and symbols (not part of LATIN script):
75   //                 0x00A0 - 0x00BF
76   //
77   //                 Mathematical operators (not part of LATIN script):
78   //                 0x00D7
79   //                 0x00F7
80   //
81   // 0x0100 - 0x017f Latin Extended-A
82   // 0x0180 - 0x024f Latin Extended-B
83   // 0x0250 - 0x02af IPA Extensions
84   // 0x02b0 - 0x02ff Spacing Modifier Letters
85   //
86   //                 Punctuation (not part of LATIN script):
87   //                 0x02B9 - 0x02BF
88   //
89   // 0x1d00 - 0x1d7f Phonetic Extensions
90   //
91   //                 Uralic Phonetic (not part of LATIN script):
92   //                 0x1D26 - 0x1D2B
93   //
94   //                 Subscripts and superscripts
95   //                 0x1D5D - 0x1D61
96   //                 0x1D66 - 0x1D6A
97   //                 0x1D78
98   //
99   // 0x1d80 - 0x1dbf Phonetic Extensions Supplement
100   //
101   //                 0x1DBF (subscript or superscript. Not part of LATIN script )
102   //
103   // 0x1e00 - 0x1eff Latin Extended Additional
104   // 0x2070 - 0x209f Superscripts and Subscripts
105   //
106   //                 0x2070          (not part of LATIN script)
107   //                 0x2074 - 0x207E (not part of LATIN script)
108   //
109   // 0x2100 - 0x214f Letterlike symbols (not part of LATIN script)
110   //
111   //                 0x212A - 0x212B (are part of LATIN script)
112   //                 0x2132          (are part of LATIN script)
113   //                 0x214E          (are part of LATIN script)
114   //
115   // 0x2150 - 0x2189 Number Forms
116   //
117   //                 0x2150 - 0x215F Fractions (not part of LATIN script)
118   //                 0x2189          Fractions (not part of LATIN script)
119   //
120   // 0x2c60 - 0x2c7f Latin Extended-C
121   // 0xa720 - 0xa7ff Latin Extended-D
122   //
123   //                 0xA720 - 0xA721 Uralic Phonetic (not part of LATIN script)
124   //                 0xA788          (not part of LATIN script)
125   //                 0xA789 - 0xA78A Budu (not part of LATIN script)
126   //
127   // 0xab30 - 0xab6f Latin Extended-E
128   //
129   // 0xfb00 - 0xfb06 Latin Alphabetic Presentation Forms
130   // 0xff00 - 0xffef Halfwidth and Fullwidth Forms
131   //
132   //                 0xFF00 - 0xFF20 HWFW Symbols (not part of LATIN script)
133   //                 0xFF3B - 0xFF40 HWFW Symbols (not part of LATIN script)
134   //                 0xFF5B - 0xFFEF HWFW Symbols (not part of LATIN script)
135
136   // Brahmic scripts:
137   // 0x0900 - 0x097f Devanagari
138   // 0x0980 - 0x09ff Bengali
139   // 0x0a00 - 0x0a7f Gurmukhi
140   // 0x0a80 - 0x0aff Gujarati
141   // 0x0b00 - 0x0b7f Oriya
142   // 0x0b80 - 0x0bff Tamil
143   // 0x0c00 - 0x0c7f Telugu
144   // 0x0c80 - 0x0cff Kannada
145   // 0x0d00 - 0x0d7f Malayalam
146
147   // Sinhala script.
148   // 0x0d80 - 0x0dff Sinhala
149
150   // Arabic script.
151   // 0x0600 - 0x06ff Arabic
152   // 0x0750 - 0x077f Arabic Supplement
153   // 0x08A0 - 0x08ff Arabic Extended-A
154   // 0xfb50 - 0xfdff Arabic Presentation Forms-A
155   // 0xfe70 - 0xfeff Arabic Presentation Forms-B
156   // 0x1ee00 - 0x1eeff Arabic Mathematical Alphabetic Symbols
157
158   // CJK (Chinese, Japanese and Korean) and Vietnamese script.
159   // 0x2e80 - 0x2eff CJK Radicals Supplement
160   // 0x2f00 - 0x2fdf Kangxi Radicals
161   // 0x3000 - 0x303f CJK Symbols and Punctuation
162   // 0x3200 - 0x32ff Enclosed CJK Letters and Months
163   // 0x3400 - 0x4dbf CJK Unified Ideographs Extension A
164   // 0x4e00 - 0x62ff CJK Unified Ideographs
165   // 0x6300 - 0x77ff CJK Unified Ideographs
166   // 0x7800 - 0x8cff CJK Unified Ideographs
167   // 0x8d00 - 0x9fff CJK Unified Ideographs
168   // 0x20000 - 0x215ff CJK Unified Ideographs Extension B
169   // 0x21600 - 0x230ff CJK Unified Ideographs Extension B
170   // 0x23100 - 0x245ff CJK Unified Ideographs Extension B
171   // 0x24600 - 0x260ff CJK Unified Ideographs Extension B
172   // 0x26100 - 0x275ff CJK Unified Ideographs Extension B
173   // 0x27600 - 0x290ff CJK Unified Ideographs Extension B
174   // 0x29100 - 0x2a6df CJK Unified Ideographs Extension B
175   // 0x2a700 - 0x2b73f CJK Unified Ideographs Extension C
176   // 0x2b740 - 0x2b81f CJK Unified Ideographs Extension D
177
178   // Japanese scripts.
179   // 0x3040 - 0x309f Hiragana
180   // 0x30a0 - 0x30ff Katakana
181
182   // Hangul script
183   // 0x1100 - 0x11ff Hangul jamo
184   // 0x3130 - 0x318f Hangul Compatibility Jamo
185   // 0xa960 - 0xa97f Hangul Jamo Extended-A
186   // 0xac00 - 0xd7af Hangul Syllables
187   // 0xd7b0 - 0xd7ff Hangul Jamo Extended-B
188
189   // Bopomofo script
190   // 0x3100 - 0x312f Bopomofo
191   // 0x31a0 - 0x31bf Bopomofo Extended
192
193   // Khmer script
194   // 0x1780 - 0x17ff Khmer
195   // 0x19e0 - 0x19ff Khmer Symbols
196
197   // Lao script
198   // 0x0e80 - 0x0eff Lao
199
200   // Thai script
201   // 0x0e00 - 0x0e7f Thai
202
203   // Burmese script
204   // 0x1000 - 0x109f Myanmar
205
206   // Hebrew script
207   // 0x0591 - 0x05f4 Hebrew
208   // 0xfb1d - 0xfb4f Hebrew subset of Alphabetic Presentation Forms
209
210   // Cyrillic script
211   // 0x0400 - 0x04ff Cyrillic
212   // 0x0500 - 0x052f Cyrillic suplement
213   // 0x2de0 - 0x2dff Cyrillic Extended-A
214   // 0xa640 - 0xa69f Cyrillic Extended-B
215
216   // Georgian script
217   // 0x10a0 - 0x10ff Georgian
218   // 0x2d00 - 0x2d2f Georgian suplement
219
220   // Greek script
221   // 0x0370 - 0x03ff Greek & Coptic
222   // 0x1f00 - 0x1fff Greek Extended
223
224   // Armenian script
225   // 0x0530 - 0x058f Armenian
226   // 0xfb13 - 0xfb17 Armenian subset of Alphabetic prefentation forms
227
228   // Javanese script
229   // 0xa980 - 0xa9fd Javanese
230
231   // Sundanese script
232   // 0x1b80 - 0x1bbf Sundanese
233   // 0x1cc0 - 0x1ccf Sundanese supplement
234
235   // Ge'ez script (Ethiopic)
236   // 0x1200 - 0x137f Ethiopic
237   // 0x1380 - 0x139f Ethiopic supplement
238   // 0x2d80 - 0x2ddf Ethiopic Extended
239   // 0xab00 - 0xab2f Ethiopic Extended-A
240
241   // Baybayin Script
242   // 0x1700 - 0x171f Baybayin
243
244   // Ol Chiki Script
245   // 0x1c50 - 0x1c7f Ol Chiki
246
247   // Meitei Script
248   // 0xabc0 - 0xabff Meetei Mayek
249   // 0xaae0 - 0xaaff Meetei Mayek Extensions
250
251   // The Emoji which map to standardized Unicode characters
252   // 1. Emoticons ( 1F601 - 1F64F )
253   // 2. Dingbats ( 2702 - 27B0 )
254   // 3. Transport and map symbols ( 1F680 - 1F6C0 )
255   // 4. Enclosed characters ( 24C2 - 1F251 )
256   // 5. Uncategorized :-S
257   // 6. Additional Emoticons ( 1F600 - 1F636 )
258   // 6b. Additional transport and map symbols ( 1F681 - 1F6C5 )
259   // 6c. Other additional symbols ( 1F30D - 1F567 )
260
261   // Symbols. Work around for these symbols.
262   // 0x25cb
263   // 0x25cf
264   // 0x25a1
265   // 0x25a0
266   // 0x2664
267   // 0x2661
268   // 0x2662
269   // 0x2667
270   // 0x2606
271   // 0x25aa
272   // 0x262a
273
274   if( IsCommonScript( character ) )
275   {
276     return COMMON;
277   }
278
279   if( character <= 0x0cff )
280   {
281     if( character <= 0x09ff )
282     {
283       if( character <= 0x077f )
284       {
285         if( ( 0x0030 <= character ) && ( character <= 0x0039 ) )
286         {
287           return ASCII_DIGITS;
288         }
289         if( character <= 0x007E )
290         {
291           if( ( 0x0020 <= character ) && ( character <= 0x002F ) )
292           {
293             return ASCII_PS;
294           }
295           if( ( 0x003A <= character ) && ( character <= 0x0040 ) )
296           {
297             return ASCII_PS;
298           }
299           if( ( 0x005B <= character ) && ( character <= 0x0060 ) )
300           {
301             return ASCII_PS;
302           }
303           if( ( 0x007B <= character ) && ( character <= 0x007E ) )
304           {
305             return ASCII_PS;
306           }
307         }
308         if( ( 0x007F <= character ) && ( character <= 0x009F ) )
309         {
310           // 0x007F is actually part of C0 Controls and Basic Latin. However, is the last and only control character of its block
311           // and the following characters of the next block are consecutive.
312           return C1_CONTROLS;
313         }
314         if( ( 0x00A0 <= character ) && ( character <= 0x00BF ) )
315         {
316           if( character == 0x00A9 )
317           {
318             return EMOJI; // 5. Uncategorized: copyright sign
319           }
320           if( character == 0x00AE )
321           {
322             return EMOJI; // 5. Uncategorized: registered sign
323           }
324
325           return C1_PS;
326         }
327         if( character == 0x00D7 )
328         {
329           return C1_MATH;
330         }
331         if( character == 0x00F7 )
332         {
333           return  C1_MATH;
334         }
335         if( character <= 0x02ff )
336         {
337           if( ( 0x02B9 <= character ) && ( character <= 0x02BF ) )
338           {
339             return SML_P;
340           }
341
342           return LATIN;
343         }
344         if( ( 0x0370 <= character ) && ( character <= 0x03ff ) )
345         {
346           return GREEK;
347         }
348         if( ( 0x0400 <= character ) && ( character <= 0x04ff ) )
349         {
350           return CYRILLIC;
351         }
352         if( ( 0x0500 <= character ) && ( character <= 0x052f ) )
353         {
354           return CYRILLIC;
355         }
356         if( ( 0x0530 <= character ) && ( character <= 0x058f ) )
357         {
358           return ARMENIAN;
359         }
360         if( ( 0x0591 <= character ) && ( character <= 0x05f4 ) )
361         {
362           return HEBREW;
363         }
364         if( ( 0x0600 <= character ) && ( character <= 0x06ff ) )
365         {
366           return ARABIC;
367         }
368         if( ( 0x0750 <= character ) && ( character <= 0x077f ) )
369         {
370           return ARABIC;
371         }
372       }
373       else // > 0x077f
374       {
375         if( ( 0x08A0 <= character ) && ( character <= 0x08ff ) )
376         {
377           return ARABIC;
378         }
379         if( ( 0x0900 <= character ) && ( character <= 0x097f ) )
380         {
381           return DEVANAGARI;
382         }
383         if( ( 0x0980 <= character ) && ( character <= 0x09ff ) )
384         {
385           return BENGALI;
386         }
387       }
388     }
389     else // > 0x09ff
390     {
391       if( character <= 0x0b7f )
392       {
393         if( ( 0x0a00 <= character ) && ( character <= 0x0a7f ) )
394         {
395           return GURMUKHI;
396         }
397         if( ( 0x0a80 <= character ) && ( character <= 0x0aff ) )
398         {
399           return GUJARATI;
400         }
401         if( ( 0x0b00 <= character ) && ( character <= 0x0b7f ) )
402         {
403           return ORIYA;
404         }
405       }
406       else // > 0x0b7f
407       {
408         if( ( 0x0b80 <= character ) && ( character <= 0x0bff ) )
409         {
410           return TAMIL;
411         }
412         if( ( 0x0c00 <= character ) && ( character <= 0x0c7f ) )
413         {
414           return TELUGU;
415         }
416         if( ( 0x0c80 <= character ) && ( character <= 0x0cff ) )
417         {
418           return KANNADA;
419         }
420       }
421     }
422   }
423   else // > 0x0cff
424   {
425     if( character <= 0x2c7f )
426     {
427       if( character <= 0x1eff )
428       {
429         if( ( 0x0d00 <= character ) && ( character <= 0x0d7f ) )
430         {
431           return MALAYALAM;
432         }
433         if( ( 0x0d80 <= character ) && ( character <= 0x0dff ) )
434         {
435           return SINHALA;
436         }
437         if( ( 0x0e00 <= character ) && ( character <= 0x0e7f ) )
438         {
439           return THAI;
440         }
441         if( ( 0x0e80 <= character ) && ( character <= 0x0eff ) )
442         {
443           return LAO;
444         }
445         if( ( 0x1000 <= character ) && ( character <= 0x109f ) )
446         {
447           return BURMESE;
448         }
449         if( ( 0x10a0 <= character ) && ( character <= 0x10ff ) )
450         {
451           return GEORGIAN;
452         }
453         if( ( 0x1100 <= character ) && ( character <= 0x11ff ) )
454         {
455           return HANGUL;
456         }
457         if( ( 0x1200 <= character ) && ( character <= 0x137f ) )
458         {
459           return GEEZ;
460         }
461         if( ( 0x1380 <= character ) && ( character <= 0x139f ) )
462         {
463           return GEEZ;
464         }
465         if( ( 0x1700 <= character ) && ( character <= 0x171f ) )
466         {
467           return BAYBAYIN;
468         }
469         if( ( 0x1780 <= character ) && ( character <= 0x17ff ) )
470         {
471           return KHMER;
472         }
473         if( ( 0x19e0 <= character ) && ( character <= 0x19ff ) )
474         {
475           return KHMER;
476         }
477         if( ( 0x1b80 <= character ) && ( character <= 0x1bbf ) )
478         {
479           return SUNDANESE;
480         }
481         if( ( 0x1c50 <= character ) && ( character <= 0x1c7f ) )
482         {
483           return OL_CHIKI;
484         }
485         if( ( 0x1cc0 <= character ) && ( character <= 0x1ccf ) )
486         {
487           return SUNDANESE;
488         }
489         if( ( 0x1d00 <= character ) && ( character <= 0x1eff ) )
490         {
491           if( ( 0x1D26 <= character ) && ( character <= 0x1D2B ) )
492           {
493             return PHONETIC_U;
494           }
495           if( ( 0x1D5D <= character ) && ( character <= 0x1D61 ) )
496           {
497             return PHONETIC_SS;
498           }
499           if( ( 0x1D66 <= character ) && ( character <= 0x1D6A ) )
500           {
501             return PHONETIC_SS;
502           }
503           if( character == 0x1D78 )
504           {
505             return PHONETIC_SS;
506           }
507           if( character == 0x1DBF)
508           {
509             return PHONETIC_SS;
510           }
511
512           return LATIN;
513         }
514       }
515       else // > 0x1eff
516       {
517         if( ( 0x1f00 <= character ) && ( character <= 0x1fff ) )
518         {
519           return GREEK;
520         }
521         if( character == 0x203c )
522         {
523           return EMOJI; // 5. Uncategorized: double exclamation mark
524         }
525         if( character == 0x2049 )
526         {
527           return EMOJI; // 5. Uncategorized: exclamation question mark
528         }
529         if( ( 0x2070 <= character ) && ( character <= 0x209f ) )
530         {
531           if( character == 0x2070 )
532           {
533             return NUMERIC_SS;
534           }
535           if( ( 0x2074 <= character ) && ( character <= 0x207E ) )
536           {
537             return NUMERIC_SS;
538           }
539
540           return LATIN;
541         }
542         if( character == 0x20e3 )
543         {
544           return EMOJI; // 5. Uncategorized: combining enclosing keycap
545         }
546         if( character == 0x2122 )
547         {
548           return EMOJI; // 5. Uncategorized: trade mark sign
549         }
550         if( character == 0x2139 )
551         {
552           return EMOJI; // 5. Uncategorized: information source
553         }
554         if( ( 0x2100 <= character ) && ( character <= 0x2189 ) )
555         {
556           if( ( 0x2100 <= character ) && ( character <= 0x214f ) )
557           {
558             if( ( 0x212A <= character ) && ( character <= 0x212B ) )
559             {
560               return LATIN;
561             }
562             if( character == 0x2132 )
563             {
564               return LATIN;
565             }
566             if( character == 0x214E )
567             {
568               return LATIN;
569             }
570
571             return LETTER_LIKE;
572           }
573           if( ( 0x2150 <= character ) && ( character <= 0x215F ) )
574           {
575             return FRACTIONS_NF;
576           }
577           if( character == 0x2189 )
578           {
579             return FRACTIONS_NF;
580           }
581
582           return LATIN;
583         }
584
585         // Symbols
586         if( ( 0x25cb == character ) ||
587             ( 0x25cf == character ) ||
588             ( 0x25a1 == character ) )
589         {
590           return SYMBOLS1;
591         }
592
593         if( 0x25a0 == character )
594         {
595           return SYMBOLS2;
596         }
597
598         if( ( 0x2664 == character ) ||
599             ( 0x2661 == character ) ||
600             ( 0x2662 == character ) ||
601             ( 0x2667 == character ) )
602         {
603           return SYMBOLS3;
604         }
605
606         if( ( 0x2606 == character ) ||
607             ( 0x25aa == character ) )
608         {
609           return SYMBOLS4;
610         }
611
612         if( 0x262a == character )
613         {
614           return SYMBOLS5;
615         }
616
617         // U+2194 5. Uncategorized: left right arrow
618         // U+2B55 5. Uncategorized: heavy large circle
619         if( ( 0x2194 <= character ) && ( character <= 0x2B55 ) )
620         {
621           return EMOJI;
622         }
623         if( ( 0x2c60 <= character ) && ( character <= 0x2c7f ) )
624         {
625           return LATIN;
626         }
627       }
628     }
629     else // > 0x2c7f
630     {
631       if( character <= 0xfdff )
632       {
633         if( ( 0x2d00 <= character ) && ( character <= 0x2d2f ) )
634         {
635           return GEORGIAN;
636         }
637         if( ( 0x2d80 <= character ) && ( character <= 0x2ddf ) )
638         {
639           return GEEZ;
640         }
641         if( ( 0x2de0 <= character ) && ( character <= 0x2dff ) )
642         {
643           return CYRILLIC;
644         }
645         if( ( 0x2e80 <= character ) && ( character <= 0x2eff ) )
646         {
647           return CJK;
648         }
649         if( ( 0x2f00 <= character ) && ( character <= 0x2fdf ) )
650         {
651           return CJK;
652         }
653         if( ( 0x3000 <= character ) && ( character <= 0x303f ) )
654         {
655           return CJK;
656         }
657         if( ( 0x3040 <= character ) && ( character <= 0x309f ) )
658         {
659           return HIRAGANA;
660         }
661         if( ( 0x30a0 <= character ) && ( character <= 0x30ff ) )
662         {
663           return KATAKANA;
664         }
665         if( ( 0x3100 <= character ) && ( character <= 0x312f ) )
666         {
667           return BOPOMOFO;
668         }
669         if( ( 0x3130 <= character ) && ( character <= 0x318f ) )
670         {
671           return HANGUL;
672         }
673         if( ( 0x31a0 <= character ) && ( character <= 0x31bf ) )
674         {
675           return BOPOMOFO;
676         }
677         if( ( 0x3200 <= character ) && ( character <= 0x32ff ) )
678         {
679           return CJK;
680         }
681         if( ( 0x3400 <= character ) && ( character <= 0x4dbf ) )
682         {
683           return CJK;
684         }
685         if( ( 0x4e00 <= character ) && ( character <= 0x62ff ) )
686         {
687           return CJK;
688         }
689         if( ( 0x6300 <= character ) && ( character <= 0x77ff ) )
690         {
691           return CJK;
692         }
693         if( ( 0x7800 <= character ) && ( character <= 0x8cff ) )
694         {
695           return CJK;
696         }
697         if( ( 0x8d00 <= character ) && ( character <= 0x9fff ) )
698         {
699           return CJK;
700         }
701         if( ( 0xa640 <= character ) && ( character <= 0xa69f ) )
702         {
703           return CYRILLIC;
704         }
705         if( ( 0xa720 <= character ) && ( character <= 0xa7ff ) )
706         {
707           if( character == 0xA720 )
708           {
709             return PHONETIC_U;
710           }
711           if( character == 0xA721 )
712           {
713             return PHONETIC_U;
714           }
715           if( character == 0xA788 )
716           {
717             return NON_LATIN_LED;
718           }
719           if( character == 0xA789 )
720           {
721             return NON_LATIN_LED;
722           }
723           if( character == 0xA78A )
724           {
725             return NON_LATIN_LED;
726           }
727
728           return LATIN;
729         }
730         if( ( 0xa960 <= character ) && ( character <= 0xa97f ) )
731         {
732           return HANGUL;
733         }
734         if( ( 0xa980 <= character ) && ( character <= 0xa9fd ) )
735         {
736           return JAVANESE;
737         }
738         if( ( 0xab00 <= character ) && ( character <= 0xab2f ) )
739         {
740           return GEEZ;
741         }
742         if( ( 0xab30 <= character ) && ( character <= 0xab6f ) )
743         {
744           return LATIN;
745         }
746         if( ( 0xaae0 <= character ) && ( character <= 0xaaff ) )
747         {
748           return MEITEI;
749         }
750         if( ( 0xabc0 <= character ) && ( character <= 0xabff ) )
751         {
752           return MEITEI;
753         }
754         if( ( 0xac00 <= character ) && ( character <= 0xd7af ) )
755         {
756           return HANGUL;
757         }
758         if( ( 0xd7b0 <= character ) && ( character <= 0xd7ff ) )
759         {
760           return HANGUL;
761         }
762         if( ( 0xfb00 <= character ) && ( character <= 0xfb06 ) )
763         {
764           return LATIN;
765         }
766         if( ( 0xfb13 <= character ) && ( character <= 0xfb17 ) )
767         {
768           return ARMENIAN;
769         }
770         if( ( 0xfb1d <= character ) && ( character <= 0xfb4f ) )
771         {
772           return HEBREW;
773         }
774         if( ( 0xfb50 <= character ) && ( character <= 0xfdff ) )
775         {
776           return ARABIC;
777         }
778       }
779       else // > 0xfdff
780       {
781         if( ( 0xfe70 <= character ) && ( character <= 0xfeff ) )
782         {
783           return ARABIC;
784         }
785         if( ( 0xff00 <= character ) && ( character <= 0xffef ) )
786         {
787           if( ( 0xFF00 <= character ) && ( character <= 0xFF20 ) )
788           {
789             return HWFW_S;
790           }
791           if( ( 0xFF3B <= character ) && ( character <= 0xFF40 ) )
792           {
793             return HWFW_S;
794           }
795           if( ( 0xFF5B <= character ) && ( character <= 0xFFEF ) )
796           {
797             return HWFW_S;
798           }
799
800           return LATIN;
801         }
802         if( ( 0x1ee00 <= character ) && ( character <= 0x1eeff ) )
803         {
804           return ARABIC;
805         }
806         // U+1f170 4. Enclosed characters: negative squared latin capital letter A
807         // U+1f6c5 6b. Additional transport and map symbols
808         if( ( 0x1f170 <= character ) && ( character <= 0x1f6c5 ) )
809         {
810           return EMOJI;
811         }
812         if( ( 0x20000 <= character ) && ( character <= 0x215ff ) )
813         {
814           return CJK;
815         }
816         if( ( 0x21600 <= character ) && ( character <= 0x230ff ) )
817         {
818           return CJK;
819         }
820         if( ( 0x23100 <= character ) && ( character <= 0x245ff ) )
821         {
822           return CJK;
823         }
824         if( ( 0x24600 <= character ) && ( character <= 0x260ff ) )
825         {
826           return CJK;
827         }
828         if( ( 0x26100 <= character ) && ( character <= 0x275ff ) )
829         {
830           return CJK;
831         }
832         if( ( 0x27600 <= character ) && ( character <= 0x290ff ) )
833         {
834           return CJK;
835         }
836         if( ( 0x29100 <= character ) && ( character <= 0x2a6df ) )
837         {
838           return CJK;
839         }
840         if( ( 0x2a700 <= character ) && ( character <= 0x2b73f ) )
841         {
842           return CJK;
843         }
844         if( ( 0x2b740 <= character ) && ( character <= 0x2b81f ) )
845         {
846           return CJK;
847         }
848       }
849     }
850   }
851
852   return UNKNOWN;
853 }
854
855 bool IsWhiteSpace( Character character )
856 {
857   return character < WHITE_SPACE_THRESHOLD;
858 }
859
860 bool IsNewParagraph( Character character )
861 {
862   return ( ( CHAR_LF == character )  ||
863            ( CHAR_VT == character )  ||
864            ( CHAR_FF == character )  ||
865            ( CHAR_CR == character )  ||
866            ( CHAR_NEL == character ) ||
867            ( CHAR_LS == character )  ||
868            ( CHAR_PS == character ) );
869 }
870
871 bool IsZeroWidthNonJoiner( Character character )
872 {
873   return CHAR_ZWNJ == character;
874 }
875
876 bool IsZeroWidthJoiner( Character character )
877 {
878   return CHAR_ZWJ == character;
879 }
880
881 bool IsZeroWidthSpace( Character character )
882 {
883   return CHAR_ZWS == character;
884 }
885
886 bool IsLeftToRightMark( Character character )
887 {
888   return CHAR_LTRM == character;
889 }
890
891 bool IsRightToLeftMark( Character character )
892 {
893   return CHAR_RTLM == character;
894 }
895
896 bool IsThinSpace( Character character )
897 {
898   return CHAR_TS == character;
899 }
900
901 bool IsCommonScript( Character character )
902 {
903   return ( IsWhiteSpace( character )         ||
904            IsZeroWidthNonJoiner( character ) ||
905            IsZeroWidthJoiner( character )    ||
906            IsZeroWidthSpace( character )     ||
907            IsLeftToRightMark( character )    ||
908            IsRightToLeftMark( character )    ||
909            IsThinSpace( character )          ||
910            IsNewParagraph( character ) );
911 }
912
913 bool HasLigatureMustBreak( Script script )
914 {
915   return ( ( LATIN == script ) ||
916            ( ARABIC == script ) );
917 }
918
919 } // namespace TextAbstraction
920
921 } // namespace Dali