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