Update unicode range of emoji script based on the latest unicode specification
[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 ( 2700 - 27BF )
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 ( 1F680 - 1F6FF ): http://unicode.org/charts/PDF/U1F680.pdf
259   // 6c. Other additional symbols ( 1F30D - 1F567 )
260   // 7. Supplemental Symbols and Pictographs ( 1F900–1F9FF ): http://unicode.org/charts/PDF/U1F900.pdf
261
262   // Symbols. Work around for these symbols.
263   // 0x25cb
264   // 0x25cf
265   // 0x25a1
266   // 0x25a0
267   // 0x2664
268   // 0x2661
269   // 0x2662
270   // 0x2667
271   // 0x2606
272   // 0x25aa
273   // 0x262a
274
275   if( IsCommonScript( character ) )
276   {
277     return COMMON;
278   }
279
280   if( character <= 0x0cff )
281   {
282     if( character <= 0x09ff )
283     {
284       if( character <= 0x077f )
285       {
286         if( ( 0x0030 <= character ) && ( character <= 0x0039 ) )
287         {
288           return ASCII_DIGITS;
289         }
290         if( character <= 0x007E )
291         {
292           if( ( 0x0020 <= character ) && ( character <= 0x002F ) )
293           {
294             return ASCII_PS;
295           }
296           if( ( 0x003A <= character ) && ( character <= 0x0040 ) )
297           {
298             return ASCII_PS;
299           }
300           if( ( 0x005B <= character ) && ( character <= 0x0060 ) )
301           {
302             return ASCII_PS;
303           }
304           if( ( 0x007B <= character ) && ( character <= 0x007E ) )
305           {
306             return ASCII_PS;
307           }
308         }
309         if( ( 0x007F <= character ) && ( character <= 0x009F ) )
310         {
311           // 0x007F is actually part of C0 Controls and Basic Latin. However, is the last and only control character of its block
312           // and the following characters of the next block are consecutive.
313           return C1_CONTROLS;
314         }
315         if( ( 0x00A0 <= character ) && ( character <= 0x00BF ) )
316         {
317           if( character == 0x00A9 )
318           {
319             return EMOJI; // 5. Uncategorized: copyright sign
320           }
321           if( character == 0x00AE )
322           {
323             return EMOJI; // 5. Uncategorized: registered sign
324           }
325
326           return C1_PS;
327         }
328         if( character == 0x00D7 )
329         {
330           return C1_MATH;
331         }
332         if( character == 0x00F7 )
333         {
334           return  C1_MATH;
335         }
336         if( character <= 0x02ff )
337         {
338           if( ( 0x02B9 <= character ) && ( character <= 0x02BF ) )
339           {
340             return SML_P;
341           }
342
343           return LATIN;
344         }
345         if( ( 0x0370 <= character ) && ( character <= 0x03ff ) )
346         {
347           return GREEK;
348         }
349         if( ( 0x0400 <= character ) && ( character <= 0x04ff ) )
350         {
351           return CYRILLIC;
352         }
353         if( ( 0x0500 <= character ) && ( character <= 0x052f ) )
354         {
355           return CYRILLIC;
356         }
357         if( ( 0x0530 <= character ) && ( character <= 0x058f ) )
358         {
359           return ARMENIAN;
360         }
361         if( ( 0x0591 <= character ) && ( character <= 0x05f4 ) )
362         {
363           return HEBREW;
364         }
365         if( ( 0x0600 <= character ) && ( character <= 0x06ff ) )
366         {
367           return ARABIC;
368         }
369         if( ( 0x0750 <= character ) && ( character <= 0x077f ) )
370         {
371           return ARABIC;
372         }
373       }
374       else // > 0x077f
375       {
376         if( ( 0x08A0 <= character ) && ( character <= 0x08ff ) )
377         {
378           return ARABIC;
379         }
380         if( ( 0x0900 <= character ) && ( character <= 0x097f ) )
381         {
382           return DEVANAGARI;
383         }
384         if( ( 0x0980 <= character ) && ( character <= 0x09ff ) )
385         {
386           return BENGALI;
387         }
388       }
389     }
390     else // > 0x09ff
391     {
392       if( character <= 0x0b7f )
393       {
394         if( ( 0x0a00 <= character ) && ( character <= 0x0a7f ) )
395         {
396           return GURMUKHI;
397         }
398         if( ( 0x0a80 <= character ) && ( character <= 0x0aff ) )
399         {
400           return GUJARATI;
401         }
402         if( ( 0x0b00 <= character ) && ( character <= 0x0b7f ) )
403         {
404           return ORIYA;
405         }
406       }
407       else // > 0x0b7f
408       {
409         if( ( 0x0b80 <= character ) && ( character <= 0x0bff ) )
410         {
411           return TAMIL;
412         }
413         if( ( 0x0c00 <= character ) && ( character <= 0x0c7f ) )
414         {
415           return TELUGU;
416         }
417         if( ( 0x0c80 <= character ) && ( character <= 0x0cff ) )
418         {
419           return KANNADA;
420         }
421       }
422     }
423   }
424   else // > 0x0cff
425   {
426     if( character <= 0x2c7f )
427     {
428       if( character <= 0x1eff )
429       {
430         if( ( 0x0d00 <= character ) && ( character <= 0x0d7f ) )
431         {
432           return MALAYALAM;
433         }
434         if( ( 0x0d80 <= character ) && ( character <= 0x0dff ) )
435         {
436           return SINHALA;
437         }
438         if( ( 0x0e00 <= character ) && ( character <= 0x0e7f ) )
439         {
440           return THAI;
441         }
442         if( ( 0x0e80 <= character ) && ( character <= 0x0eff ) )
443         {
444           return LAO;
445         }
446         if( ( 0x1000 <= character ) && ( character <= 0x109f ) )
447         {
448           return BURMESE;
449         }
450         if( ( 0x10a0 <= character ) && ( character <= 0x10ff ) )
451         {
452           return GEORGIAN;
453         }
454         if( ( 0x1100 <= character ) && ( character <= 0x11ff ) )
455         {
456           return HANGUL;
457         }
458         if( ( 0x1200 <= character ) && ( character <= 0x137f ) )
459         {
460           return GEEZ;
461         }
462         if( ( 0x1380 <= character ) && ( character <= 0x139f ) )
463         {
464           return GEEZ;
465         }
466         if( ( 0x1700 <= character ) && ( character <= 0x171f ) )
467         {
468           return BAYBAYIN;
469         }
470         if( ( 0x1780 <= character ) && ( character <= 0x17ff ) )
471         {
472           return KHMER;
473         }
474         if( ( 0x19e0 <= character ) && ( character <= 0x19ff ) )
475         {
476           return KHMER;
477         }
478         if( ( 0x1b80 <= character ) && ( character <= 0x1bbf ) )
479         {
480           return SUNDANESE;
481         }
482         if( ( 0x1c50 <= character ) && ( character <= 0x1c7f ) )
483         {
484           return OL_CHIKI;
485         }
486         if( ( 0x1cc0 <= character ) && ( character <= 0x1ccf ) )
487         {
488           return SUNDANESE;
489         }
490         if( ( 0x1d00 <= character ) && ( character <= 0x1eff ) )
491         {
492           if( ( 0x1D26 <= character ) && ( character <= 0x1D2B ) )
493           {
494             return PHONETIC_U;
495           }
496           if( ( 0x1D5D <= character ) && ( character <= 0x1D61 ) )
497           {
498             return PHONETIC_SS;
499           }
500           if( ( 0x1D66 <= character ) && ( character <= 0x1D6A ) )
501           {
502             return PHONETIC_SS;
503           }
504           if( character == 0x1D78 )
505           {
506             return PHONETIC_SS;
507           }
508           if( character == 0x1DBF)
509           {
510             return PHONETIC_SS;
511           }
512
513           return LATIN;
514         }
515       }
516       else // > 0x1eff
517       {
518         if( ( 0x1f00 <= character ) && ( character <= 0x1fff ) )
519         {
520           return GREEK;
521         }
522         if( character == 0x203c )
523         {
524           return EMOJI; // 5. Uncategorized: double exclamation mark
525         }
526         if( character == 0x2049 )
527         {
528           return EMOJI; // 5. Uncategorized: exclamation question mark
529         }
530         if( ( 0x2070 <= character ) && ( character <= 0x209f ) )
531         {
532           if( character == 0x2070 )
533           {
534             return NUMERIC_SS;
535           }
536           if( ( 0x2074 <= character ) && ( character <= 0x207E ) )
537           {
538             return NUMERIC_SS;
539           }
540
541           return LATIN;
542         }
543         if( character == 0x20e3 )
544         {
545           return EMOJI; // 5. Uncategorized: combining enclosing keycap
546         }
547         if( character == 0x2122 )
548         {
549           return EMOJI; // 5. Uncategorized: trade mark sign
550         }
551         if( character == 0x2139 )
552         {
553           return EMOJI; // 5. Uncategorized: information source
554         }
555         if( ( 0x2100 <= character ) && ( character <= 0x2189 ) )
556         {
557           if( ( 0x2100 <= character ) && ( character <= 0x214f ) )
558           {
559             if( ( 0x212A <= character ) && ( character <= 0x212B ) )
560             {
561               return LATIN;
562             }
563             if( character == 0x2132 )
564             {
565               return LATIN;
566             }
567             if( character == 0x214E )
568             {
569               return LATIN;
570             }
571
572             return LETTER_LIKE;
573           }
574           if( ( 0x2150 <= character ) && ( character <= 0x215F ) )
575           {
576             return FRACTIONS_NF;
577           }
578           if( character == 0x2189 )
579           {
580             return FRACTIONS_NF;
581           }
582
583           return LATIN;
584         }
585
586         // Symbols
587         if( ( 0x25cb == character ) ||
588             ( 0x25cf == character ) ||
589             ( 0x25a1 == character ) )
590         {
591           return SYMBOLS1;
592         }
593
594         if( 0x25a0 == character )
595         {
596           return SYMBOLS2;
597         }
598
599         if( ( 0x2664 == character ) ||
600             ( 0x2661 == character ) ||
601             ( 0x2662 == character ) ||
602             ( 0x2667 == character ) )
603         {
604           return SYMBOLS3;
605         }
606
607         if( ( 0x2606 == character ) ||
608             ( 0x25aa == character ) )
609         {
610           return SYMBOLS4;
611         }
612
613         if( 0x262a == character )
614         {
615           return SYMBOLS5;
616         }
617
618         // U+2194 5. Uncategorized: left right arrow
619         // U+2B55 5. Uncategorized: heavy large circle
620         if( ( 0x2194 <= character ) && ( character <= 0x2B55 ) )
621         {
622           return EMOJI;
623         }
624         if( ( 0x2c60 <= character ) && ( character <= 0x2c7f ) )
625         {
626           return LATIN;
627         }
628       }
629     }
630     else // > 0x2c7f
631     {
632       if( character <= 0xfdff )
633       {
634         if( ( 0x2d00 <= character ) && ( character <= 0x2d2f ) )
635         {
636           return GEORGIAN;
637         }
638         if( ( 0x2d80 <= character ) && ( character <= 0x2ddf ) )
639         {
640           return GEEZ;
641         }
642         if( ( 0x2de0 <= character ) && ( character <= 0x2dff ) )
643         {
644           return CYRILLIC;
645         }
646         if( ( 0x2e80 <= character ) && ( character <= 0x2eff ) )
647         {
648           return CJK;
649         }
650         if( ( 0x2f00 <= character ) && ( character <= 0x2fdf ) )
651         {
652           return CJK;
653         }
654         if( ( 0x3000 <= character ) && ( character <= 0x303f ) )
655         {
656           return CJK;
657         }
658         if( ( 0x3040 <= character ) && ( character <= 0x309f ) )
659         {
660           return HIRAGANA;
661         }
662         if( ( 0x30a0 <= character ) && ( character <= 0x30ff ) )
663         {
664           return KATAKANA;
665         }
666         if( ( 0x3100 <= character ) && ( character <= 0x312f ) )
667         {
668           return BOPOMOFO;
669         }
670         if( ( 0x3130 <= character ) && ( character <= 0x318f ) )
671         {
672           return HANGUL;
673         }
674         if( ( 0x31a0 <= character ) && ( character <= 0x31bf ) )
675         {
676           return BOPOMOFO;
677         }
678         if( ( 0x3200 <= character ) && ( character <= 0x32ff ) )
679         {
680           return CJK;
681         }
682         if( ( 0x3400 <= character ) && ( character <= 0x4dbf ) )
683         {
684           return CJK;
685         }
686         if( ( 0x4e00 <= character ) && ( character <= 0x62ff ) )
687         {
688           return CJK;
689         }
690         if( ( 0x6300 <= character ) && ( character <= 0x77ff ) )
691         {
692           return CJK;
693         }
694         if( ( 0x7800 <= character ) && ( character <= 0x8cff ) )
695         {
696           return CJK;
697         }
698         if( ( 0x8d00 <= character ) && ( character <= 0x9fff ) )
699         {
700           return CJK;
701         }
702         if( ( 0xa640 <= character ) && ( character <= 0xa69f ) )
703         {
704           return CYRILLIC;
705         }
706         if( ( 0xa720 <= character ) && ( character <= 0xa7ff ) )
707         {
708           if( character == 0xA720 )
709           {
710             return PHONETIC_U;
711           }
712           if( character == 0xA721 )
713           {
714             return PHONETIC_U;
715           }
716           if( character == 0xA788 )
717           {
718             return NON_LATIN_LED;
719           }
720           if( character == 0xA789 )
721           {
722             return NON_LATIN_LED;
723           }
724           if( character == 0xA78A )
725           {
726             return NON_LATIN_LED;
727           }
728
729           return LATIN;
730         }
731         if( ( 0xa960 <= character ) && ( character <= 0xa97f ) )
732         {
733           return HANGUL;
734         }
735         if( ( 0xa980 <= character ) && ( character <= 0xa9fd ) )
736         {
737           return JAVANESE;
738         }
739         if( ( 0xab00 <= character ) && ( character <= 0xab2f ) )
740         {
741           return GEEZ;
742         }
743         if( ( 0xab30 <= character ) && ( character <= 0xab6f ) )
744         {
745           return LATIN;
746         }
747         if( ( 0xaae0 <= character ) && ( character <= 0xaaff ) )
748         {
749           return MEITEI;
750         }
751         if( ( 0xabc0 <= character ) && ( character <= 0xabff ) )
752         {
753           return MEITEI;
754         }
755         if( ( 0xac00 <= character ) && ( character <= 0xd7af ) )
756         {
757           return HANGUL;
758         }
759         if( ( 0xd7b0 <= character ) && ( character <= 0xd7ff ) )
760         {
761           return HANGUL;
762         }
763         if( ( 0xfb00 <= character ) && ( character <= 0xfb06 ) )
764         {
765           return LATIN;
766         }
767         if( ( 0xfb13 <= character ) && ( character <= 0xfb17 ) )
768         {
769           return ARMENIAN;
770         }
771         if( ( 0xfb1d <= character ) && ( character <= 0xfb4f ) )
772         {
773           return HEBREW;
774         }
775         if( ( 0xfb50 <= character ) && ( character <= 0xfdff ) )
776         {
777           return ARABIC;
778         }
779       }
780       else // > 0xfdff
781       {
782         if( ( 0xfe70 <= character ) && ( character <= 0xfeff ) )
783         {
784           return ARABIC;
785         }
786         if( ( 0xff00 <= character ) && ( character <= 0xffef ) )
787         {
788           if( ( 0xFF00 <= character ) && ( character <= 0xFF20 ) )
789           {
790             return HWFW_S;
791           }
792           if( ( 0xFF3B <= character ) && ( character <= 0xFF40 ) )
793           {
794             return HWFW_S;
795           }
796           if( ( 0xFF5B <= character ) && ( character <= 0xFFEF ) )
797           {
798             return HWFW_S;
799           }
800
801           return LATIN;
802         }
803         if( ( 0x1ee00 <= character ) && ( character <= 0x1eeff ) )
804         {
805           return ARABIC;
806         }
807         // U+1f170 4. Enclosed characters: negative squared latin capital letter A
808         // U+1f6ff 6b. Additional transport and map symbols
809         if( ( 0x1f170 <= character ) && ( character <= 0x1f6ff ) )
810         {
811           return EMOJI;
812         }
813         // 7. Supplemental Symbols and Pictographs
814         if( ( 0x1f900 <= character ) && ( character <= 0x1f9ff ) )
815         {
816           return EMOJI;
817         }
818         if( ( 0x20000 <= character ) && ( character <= 0x215ff ) )
819         {
820           return CJK;
821         }
822         if( ( 0x21600 <= character ) && ( character <= 0x230ff ) )
823         {
824           return CJK;
825         }
826         if( ( 0x23100 <= character ) && ( character <= 0x245ff ) )
827         {
828           return CJK;
829         }
830         if( ( 0x24600 <= character ) && ( character <= 0x260ff ) )
831         {
832           return CJK;
833         }
834         if( ( 0x26100 <= character ) && ( character <= 0x275ff ) )
835         {
836           return CJK;
837         }
838         if( ( 0x27600 <= character ) && ( character <= 0x290ff ) )
839         {
840           return CJK;
841         }
842         if( ( 0x29100 <= character ) && ( character <= 0x2a6df ) )
843         {
844           return CJK;
845         }
846         if( ( 0x2a700 <= character ) && ( character <= 0x2b73f ) )
847         {
848           return CJK;
849         }
850         if( ( 0x2b740 <= character ) && ( character <= 0x2b81f ) )
851         {
852           return CJK;
853         }
854       }
855     }
856   }
857
858   return UNKNOWN;
859 }
860
861 bool IsWhiteSpace( Character character )
862 {
863   return character < WHITE_SPACE_THRESHOLD;
864 }
865
866 bool IsNewParagraph( Character character )
867 {
868   return ( ( CHAR_LF == character )  ||
869            ( CHAR_VT == character )  ||
870            ( CHAR_FF == character )  ||
871            ( CHAR_CR == character )  ||
872            ( CHAR_NEL == character ) ||
873            ( CHAR_LS == character )  ||
874            ( CHAR_PS == character ) );
875 }
876
877 bool IsZeroWidthNonJoiner( Character character )
878 {
879   return CHAR_ZWNJ == character;
880 }
881
882 bool IsZeroWidthJoiner( Character character )
883 {
884   return CHAR_ZWJ == character;
885 }
886
887 bool IsZeroWidthSpace( Character character )
888 {
889   return CHAR_ZWS == character;
890 }
891
892 bool IsLeftToRightMark( Character character )
893 {
894   return CHAR_LTRM == character;
895 }
896
897 bool IsRightToLeftMark( Character character )
898 {
899   return CHAR_RTLM == character;
900 }
901
902 bool IsThinSpace( Character character )
903 {
904   return CHAR_TS == character;
905 }
906
907 bool IsCommonScript( Character character )
908 {
909   return ( IsWhiteSpace( character )         ||
910            IsZeroWidthNonJoiner( character ) ||
911            IsZeroWidthJoiner( character )    ||
912            IsZeroWidthSpace( character )     ||
913            IsLeftToRightMark( character )    ||
914            IsRightToLeftMark( character )    ||
915            IsThinSpace( character )          ||
916            IsNewParagraph( character ) );
917 }
918
919 bool HasLigatureMustBreak( Script script )
920 {
921   return ( ( LATIN == script ) ||
922            ( ARABIC == script ) );
923 }
924
925 } // namespace TextAbstraction
926
927 } // namespace Dali