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