Merge "Move tts-player.h from devel-api to public-api" into 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_FL   = 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_NEL  = 0x0085; ///< Next line.
34 const unsigned int CHAR_LS   = 0x2028; ///< Line separator.
35 const unsigned int CHAR_PS   = 0x2029; ///< Paragraph separator
36
37 const unsigned int CHAR_ZWS  = 0x200B; ///< Zero width space.
38 const unsigned int CHAR_ZWNJ = 0x200C; ///< Zero width non joiner.
39 const unsigned int CHAR_ZWJ  = 0x200D; ///< Zero width joiner.
40 const unsigned int CHAR_LTRM = 0x200E; ///< Left to Right Mark.
41 const unsigned int CHAR_RTLM = 0x200F; ///< Right to Left Mark.
42 const unsigned int CHAR_TS   = 0x2009; ///< Thin Space.
43 } // namespace
44
45 bool IsRightToLeftScript( Script script )
46 {
47   return ( ( ARABIC == script ) ||
48            ( HEBREW == script ) );
49 }
50
51 Script GetCharacterScript( Character character )
52 {
53   // Latin script:
54   // 0x0000 - 0x007f C0 Controls and Basic Latin
55   // 0x0080 - 0x00ff C1 Controls and Latin-1 Supplement
56   // 0x0100 - 0x017f Latin Extended-A
57   // 0x0180 - 0x024f Latin Extended-B
58   // 0x0250 - 0x02af IPA Extensions
59   // 0x02b0 - 0x02ff Spacing Modifier Letters
60   // 0x1d00 - 0x1d7f Phonetic Extensions
61   // 0x1d80 - 0x1dbf Phonetic Extensions Supplement
62   // 0x1e00 - 0x1eff Latin Extended Additional
63   // 0x2070 - 0x209f Superscripts and Subscripts
64   // 0x2100 - 0x214f Letterlike symbols
65   // 0x2150 - 0x218f Number Forms
66   // 0x2c60 - 0x2c7f Latin Extended-C
67   // 0xa720 - 0xa7ff Latin Extended-D
68   // 0xab30 - 0xab6f Latin Extended-E
69   // 0xfb00 - 0xfb06 Latin Alphabetic Presentation Forms
70   // 0xff00 - 0xffef Halfwidth and Fullwidth Forms
71
72   // Brahmic scripts:
73   // 0x0900 - 0x097f Devanagari
74   // 0x0980 - 0x09ff Bengali
75   // 0x0a00 - 0x0a7f Gurmukhi
76   // 0x0a80 - 0x0aff Gujarati
77   // 0x0b00 - 0x0b7f Oriya
78   // 0x0b80 - 0x0bff Tamil
79   // 0x0c00 - 0x0c7f Telugu
80   // 0x0c80 - 0x0cff Kannada
81   // 0x0d00 - 0x0d7f Malayalam
82
83   // Sinhala script.
84   // 0x0d80 - 0x0dff Sinhala
85
86   // Arabic script.
87   // 0x0600 - 0x06ff Arabic
88   // 0x0750 - 0x077f Arabic Supplement
89   // 0x08A0 - 0x08ff Arabic Extended-A
90   // 0xfb50 - 0xfdff Arabic Presentation Forms-A
91   // 0xfe70 - 0xfeff Arabic Presentation Forms-B
92   // 0x1ee00 - 0x1eeff Arabic Mathematical Alphabetic Symbols
93
94   // CJK (Chinese, Japanese and Korean) and Vietnamese script.
95   // 0x2e80 - 0x2eff CJK Radicals Supplement
96   // 0x2f00 - 0x2fdf Kangxi Radicals
97   // 0x3000 - 0x303f CJK Symbols and Punctuation
98   // 0x3200 - 0x32ff Enclosed CJK Letters and Months
99   // 0x3400 - 0x4dbf CJK Unified Ideographs Extension A
100   // 0x4e00 - 0x62ff CJK Unified Ideographs
101   // 0x6300 - 0x77ff CJK Unified Ideographs
102   // 0x7800 - 0x8cff CJK Unified Ideographs
103   // 0x8d00 - 0x9fff CJK Unified Ideographs
104   // 0x20000 - 0x215ff CJK Unified Ideographs Extension B
105   // 0x21600 - 0x230ff CJK Unified Ideographs Extension B
106   // 0x23100 - 0x245ff CJK Unified Ideographs Extension B
107   // 0x24600 - 0x260ff CJK Unified Ideographs Extension B
108   // 0x26100 - 0x275ff CJK Unified Ideographs Extension B
109   // 0x27600 - 0x290ff CJK Unified Ideographs Extension B
110   // 0x29100 - 0x2a6df CJK Unified Ideographs Extension B
111   // 0x2a700 - 0x2b73f CJK Unified Ideographs Extension C
112   // 0x2b740 - 0x2b81f CJK Unified Ideographs Extension D
113
114   // Japanese scripts.
115   // 0x3040 - 0x309f Hiragana
116   // 0x30a0 - 0x30ff Katakana
117
118   // Hangul script
119   // 0x1100 - 0x11ff Hangul jamo
120   // 0x3130 - 0x318f Hangul Compatibility Jamo
121   // 0xa960 - 0xa97f Hangul Jamo Extended-A
122   // 0xac00 - 0xd7af Hangul Syllables
123   // 0xd7b0 - 0xd7ff Hangul Jamo Extended-B
124
125   // Khmer script
126   // 0x1780 - 0x17ff Khmer
127   // 0x19e0 - 0x19ff Khmer Symbols
128
129   // Lao script
130   // 0x0e80 - 0x0eff Lao
131
132   // Thai script
133   // 0x0e00 - 0x0e7f Thai
134
135   // Burmese script
136   // 0x1000 - 0x109f Myanmar
137
138   // Hebrew script
139   // 0x0591 - 0x05f4 Hebrew
140   // 0xfb1d - 0xfb4f Hebrew subset of Alphabetic Presentation Forms
141
142   // Cyrillic script
143   // 0x0400 - 0x04ff Cyrillic
144   // 0x0500 - 0x052f Cyrillic suplement
145   // 0x2de0 - 0x2dff Cyrillic Extended-A
146   // 0xa640 - 0xa69f Cyrillic Extended-B
147
148   // Georgian script
149   // 0x10a0 - 0x10ff Georgian
150   // 0x2d00 - 0x2d2f Georgian suplement
151
152   // Greek script
153   // 0x0370 - 0x03ff Greek & Coptic
154   // 0x1f00 - 0x1fff Greek Extended
155
156   // Armenian script
157   // 0x0530 - 0x058f Armenian
158   // 0xfb13 - 0xfb17 Armenian subset of Alphabetic prefentation forms
159
160   // The Emoji which map to standardized Unicode characters
161   // 1. Emoticons ( 1F601 - 1F64F )
162   // 2. Dingbats ( 2702 - 27B0 )
163   // 3. Transport and map symbols ( 1F680 - 1F6C0 )
164   // 4. Enclosed characters ( 24C2 - 1F251 )
165   // 5. Uncategorized :-S
166   // 6. Additional Emoticons ( 1F600 - 1F636 )
167   // 6b. Additional transport and map symbols ( 1F681 - 1F6C5 )
168   // 6c. Other additional symbols ( 1F30D - 1F567 )
169
170   if( IsCommonScript( character ) )
171   {
172     return COMMON;
173   }
174
175   if( character <= 0x0cff )
176   {
177     if( character <= 0x09ff )
178     {
179       if( character <= 0x077f )
180       {
181         if( character == 0x00A9 )
182         {
183           return EMOJI; // 5. Uncategorized: copyright sign
184         }
185         if( character == 0x00AE )
186         {
187           return EMOJI; // 5. Uncategorized: registered sign
188         }
189         if( character <= 0x02ff )
190         {
191           return LATIN;
192         }
193         if( ( 0x0370 <= character ) && ( character <= 0x03ff ) )
194         {
195           return GREEK;
196         }
197         if( ( 0x0400 <= character ) && ( character <= 0x04ff ) )
198         {
199           return CYRILLIC;
200         }
201         if( ( 0x0500 <= character ) && ( character <= 0x052f ) )
202         {
203           return CYRILLIC;
204         }
205         if( ( 0x0530 <= character ) && ( character <= 0x058f ) )
206         {
207           return ARMENIAN;
208         }
209         if( ( 0x0591 <= character ) && ( character <= 0x05f4 ) )
210         {
211           return HEBREW;
212         }
213         if( ( 0x0600 <= character ) && ( character <= 0x06ff ) )
214         {
215           return ARABIC;
216         }
217         if( ( 0x0750 <= character ) && ( character <= 0x077f ) )
218         {
219           return ARABIC;
220         }
221       }
222       else // > 0x077f
223       {
224         if( ( 0x08A0 <= character ) && ( character <= 0x08ff ) )
225         {
226           return ARABIC;
227         }
228         if( ( 0x0900 <= character ) && ( character <= 0x097f ) )
229         {
230           return DEVANAGARI;
231         }
232         if( ( 0x0980 <= character ) && ( character <= 0x09ff ) )
233         {
234           return BENGALI;
235         }
236       }
237     }
238     else // > 0x09ff
239     {
240       if( character <= 0x0b7f )
241       {
242         if( ( 0x0a00 <= character ) && ( character <= 0x0a7f ) )
243         {
244           return GURMUKHI;
245         }
246         if( ( 0x0a80 <= character ) && ( character <= 0x0aff ) )
247         {
248           return GUJARATI;
249         }
250         if( ( 0x0b00 <= character ) && ( character <= 0x0b7f ) )
251         {
252           return ORIYA;
253         }
254       }
255       else // > 0x0b7f
256       {
257         if( ( 0x0b80 <= character ) && ( character <= 0x0bff ) )
258         {
259           return TAMIL;
260         }
261         if( ( 0x0c00 <= character ) && ( character <= 0x0c7f ) )
262         {
263           return TELUGU;
264         }
265         if( ( 0x0c80 <= character ) && ( character <= 0x0cff ) )
266         {
267           return KANNADA;
268         }
269       }
270     }
271   }
272   else // > 0x0cff
273   {
274     if( character <= 0x2c7f )
275     {
276       if( character <= 0x1eff )
277       {
278         if( ( 0x0d00 <= character ) && ( character <= 0x0d7f ) )
279         {
280           return MALAYALAM;
281         }
282         if( ( 0x0d80 <= character ) && ( character <= 0x0dff ) )
283         {
284           return SINHALA;
285         }
286         if( ( 0x0e00 <= character ) && ( character <= 0x0e7f ) )
287         {
288           return THAI;
289         }
290         if( ( 0x0e80 <= character ) && ( character <= 0x0eff ) )
291         {
292           return LAO;
293         }
294         if( ( 0x1000 <= character ) && ( character <= 0x109f ) )
295         {
296           return BURMESE;
297         }
298         if( ( 0x10a0 <= character ) && ( character <= 0x10ff ) )
299         {
300           return GEORGIAN;
301         }
302         if( ( 0x1100 <= character ) && ( character <= 0x11ff ) )
303         {
304           return HANGUL;
305         }
306         if( ( 0x1780 <= character ) && ( character <= 0x17ff ) )
307         {
308           return KHMER;
309         }
310         if( ( 0x19e0 <= character ) && ( character <= 0x19ff ) )
311         {
312           return KHMER;
313         }
314         if( ( 0x1d00 <= character ) && ( character <= 0x1eff ) )
315         {
316           return LATIN;
317         }
318       }
319       else // > 0x1eff
320       {
321         if( ( 0x1f00 <= character ) && ( character <= 0x1fff ) )
322         {
323           return GREEK;
324         }
325         if( character == 0x203c )
326         {
327           return EMOJI; // 5. Uncategorized: double exclamation mark
328         }
329         if( character == 0x2049 )
330         {
331           return EMOJI; // 5. Uncategorized: exclamation question mark
332         }
333         if( ( 0x2070 <= character ) && ( character <= 0x209f ) )
334         {
335           return LATIN;
336         }
337         if( character == 0x20e3 )
338         {
339           return EMOJI; // 5. Uncategorized: combining enclosing keycap
340         }
341         if( character == 0x2122 )
342         {
343           return EMOJI; // 5. Uncategorized: trade mark sign
344         }
345         if( character == 0x2139 )
346         {
347           return EMOJI; // 5. Uncategorized: information source
348         }
349         if( ( 0x2100 <= character ) && ( character <= 0x218f ) )
350         {
351           return LATIN;
352         }
353         // U+2194 5. Uncategorized: left right arrow
354         // U+2B55 5. Uncategorized: heavy large circle
355         if( ( 0x2194 <= character ) && ( character <= 0x2B55 ) )
356         {
357           return EMOJI;
358         }
359         if( ( 0x2c60 <= character ) && ( character <= 0x2c7f ) )
360         {
361           return LATIN;
362         }
363       }
364     }
365     else // > 0x2c7f
366     {
367       if( character <= 0xfdff )
368       {
369         if( ( 0x2d00 <= character ) && ( character <= 0x2d2f ) )
370         {
371           return GEORGIAN;
372         }
373         if( ( 0x2de0 <= character ) && ( character <= 0x2dff ) )
374         {
375           return CYRILLIC;
376         }
377         if( ( 0x2e80 <= character ) && ( character <= 0x2eff ) )
378         {
379           return CJK;
380         }
381         if( ( 0x2f00 <= character ) && ( character <= 0x2fdf ) )
382         {
383           return CJK;
384         }
385         if( ( 0x3000 <= character ) && ( character <= 0x303f ) )
386         {
387           return CJK;
388         }
389         if( ( 0x3040 <= character ) && ( character <= 0x309f ) )
390         {
391           return HIRAGANA;
392         }
393         if( ( 0x30a0 <= character ) && ( character <= 0x30ff ) )
394         {
395           return KATAKANA;
396         }
397         if( ( 0x3130 <= character ) && ( character <= 0x318f ) )
398         {
399           return HANGUL;
400         }
401         if( ( 0x3200 <= character ) && ( character <= 0x32ff ) )
402         {
403           return CJK;
404         }
405         if( ( 0x3400 <= character ) && ( character <= 0x4dbf ) )
406         {
407           return CJK;
408         }
409         if( ( 0x4e00 <= character ) && ( character <= 0x62ff ) )
410         {
411           return CJK;
412         }
413         if( ( 0x6300 <= character ) && ( character <= 0x77ff ) )
414         {
415           return CJK;
416         }
417         if( ( 0x7800 <= character ) && ( character <= 0x8cff ) )
418         {
419           return CJK;
420         }
421         if( ( 0x8d00 <= character ) && ( character <= 0x9fff ) )
422         {
423           return CJK;
424         }
425         if( ( 0xa640 <= character ) && ( character <= 0xa69f ) )
426         {
427           return CYRILLIC;
428         }
429         if( ( 0xa720 <= character ) && ( character <= 0xa7ff ) )
430         {
431           return LATIN;
432         }
433         if( ( 0xa960 <= character ) && ( character <= 0xa97f ) )
434         {
435           return HANGUL;
436         }
437         if( ( 0xab30 <= character ) && ( character <= 0xab6f ) )
438         {
439           return LATIN;
440         }
441         if( ( 0xac00 <= character ) && ( character <= 0xd7af ) )
442         {
443           return HANGUL;
444         }
445         if( ( 0xd7b0 <= character ) && ( character <= 0xd7ff ) )
446         {
447           return HANGUL;
448         }
449         if( ( 0xfb00 <= character ) && ( character <= 0xfb06 ) )
450         {
451           return LATIN;
452         }
453         if( ( 0xfb13 <= character ) && ( character <= 0xfb17 ) )
454         {
455           return ARMENIAN;
456         }
457         if( ( 0xfb1d <= character ) && ( character <= 0xfb4f ) )
458         {
459           return HEBREW;
460         }
461         if( ( 0xfb50 <= character ) && ( character <= 0xfdff ) )
462         {
463           return ARABIC;
464         }
465       }
466       else // > 0xfdff
467       {
468         if( ( 0xfe70 <= character ) && ( character <= 0xfeff ) )
469         {
470           return ARABIC;
471         }
472         if( ( 0xff00 <= character ) && ( character <= 0xffef ) )
473         {
474           return LATIN;
475         }
476         if( ( 0x1ee00 <= character ) && ( character <= 0x1eeff ) )
477         {
478           return ARABIC;
479         }
480         // U+1f170 4. Enclosed characters: negative squared latin capital letter A
481         // U+1f6c5 6b. Additional transport and map symbols
482         if( ( 0x1f170 <= character ) && ( character <= 0x1f6c5 ) )
483         {
484           return EMOJI;
485         }
486         if( ( 0x20000 <= character ) && ( character <= 0x215ff ) )
487         {
488           return CJK;
489         }
490         if( ( 0x21600 <= character ) && ( character <= 0x230ff ) )
491         {
492           return CJK;
493         }
494         if( ( 0x23100 <= character ) && ( character <= 0x245ff ) )
495         {
496           return CJK;
497         }
498         if( ( 0x24600 <= character ) && ( character <= 0x260ff ) )
499         {
500           return CJK;
501         }
502         if( ( 0x26100 <= character ) && ( character <= 0x275ff ) )
503         {
504           return CJK;
505         }
506         if( ( 0x27600 <= character ) && ( character <= 0x290ff ) )
507         {
508           return CJK;
509         }
510         if( ( 0x29100 <= character ) && ( character <= 0x2a6df ) )
511         {
512           return CJK;
513         }
514         if( ( 0x2a700 <= character ) && ( character <= 0x2b73f ) )
515         {
516           return CJK;
517         }
518         if( ( 0x2b740 <= character ) && ( character <= 0x2b81f ) )
519         {
520           return CJK;
521         }
522       }
523     }
524   }
525
526   return UNKNOWN;
527 }
528
529 bool IsWhiteSpace( Character character )
530 {
531   return character < WHITE_SPACE_THRESHOLD;
532 }
533
534 bool IsNewParagraph( Character character )
535 {
536   return ( ( CHAR_FL == character )  ||
537            ( CHAR_VT == character )  ||
538            ( CHAR_FF == character )  ||
539            ( CHAR_NEL == character ) ||
540            ( CHAR_LS == character )  ||
541            ( CHAR_PS == character ) );
542 }
543
544 bool IsZeroWidthNonJoiner( Character character )
545 {
546   return CHAR_ZWNJ == character;
547 }
548
549 bool IsZeroWidthJoiner( Character character )
550 {
551   return CHAR_ZWJ == character;
552 }
553
554 bool IsZeroWidthSpace( Character character )
555 {
556   return CHAR_ZWS == character;
557 }
558
559 bool IsLeftToRightMark( Character character )
560 {
561   return CHAR_LTRM == character;
562 }
563
564 bool IsRightToLeftMark( Character character )
565 {
566   return CHAR_RTLM == character;
567 }
568
569 bool IsThinSpace( Character character )
570 {
571   return CHAR_TS == character;
572 }
573
574 bool IsCommonScript( Character character )
575 {
576   return ( IsWhiteSpace( character )         ||
577            IsZeroWidthNonJoiner( character ) ||
578            IsZeroWidthJoiner( character )    ||
579            IsZeroWidthSpace( character )     ||
580            IsLeftToRightMark( character )    ||
581            IsRightToLeftMark( character )    ||
582            IsThinSpace( character )          ||
583            IsNewParagraph( character ) );
584 }
585
586 } // namespace TextAbstraction
587
588 } // namespace Dali