KeyEvent passing mechanism
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / text / text-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-toolkit/internal/text/script.h>
20
21 namespace Dali
22 {
23
24 namespace Toolkit
25 {
26
27 namespace Text
28 {
29
30 namespace
31 {
32 const unsigned int WHITE_SPACE_THRESHOLD  = 0x21; ///< All characters below 0x21 are considered white spaces.
33 const unsigned int CHAR_FL   = 0x000A; ///< NL Line feed, new line.
34 const unsigned int CHAR_VT   = 0x000B; ///< Vertical tab.
35 const unsigned int CHAR_FF   = 0x000C; ///< NP Form feed, new page.
36 const unsigned int CHAR_NEL  = 0x0085; ///< Next line.
37 const unsigned int CHAR_LS   = 0x2028; ///< Line separator.
38 const unsigned int CHAR_PS   = 0x2029; ///< Paragraph separator
39
40 const unsigned int CHAR_ZWS  = 0x200B; ///< Zero width space.
41 const unsigned int CHAR_ZWNJ = 0x200C; ///< Zero width non joiner.
42 const unsigned int CHAR_ZWJ  = 0x200D; ///< Zero width joiner.
43 const unsigned int CHAR_LTRM = 0x200E; ///< Left to Right Mark.
44 const unsigned int CHAR_RTLM = 0x200F; ///< Right to Left Mark.
45 const unsigned int CHAR_TS   = 0x2009; ///< Thin Space.
46 } // namespace
47
48 Script GetCharacterScript( Character character )
49 {
50   // Latin script:
51   // 0x0000 - 0x007f C0 Controls and Basic Latin
52   // 0x0080 - 0x00ff C1 Controls and Latin-1 Supplement
53   // 0x0100 - 0x017f Latin Extended-A
54   // 0x0180 - 0x024f Latin Extended-B
55   // 0x0250 - 0x02af IPA Extensions
56   // 0x02b0 - 0x02ff Spacing Modifier Letters
57   // 0x1d00 - 0x1d7f Phonetic Extensions
58   // 0x1d80 - 0x1dbf Phonetic Extensions Supplement
59   // 0x1e00 - 0x1eff Latin Extended Additional
60   // 0x2070 - 0x209f Superscripts and Subscripts
61   // 0x2100 - 0x214f Letterlike symbols
62   // 0x2150 - 0x218f Number Forms
63   // 0x2c60 - 0x2c7f Latin Extended-C
64   // 0xa720 - 0xa7ff Latin Extended-D
65   // 0xab30 - 0xab6f Latin Extended-E
66   // 0xfb00 - 0xfb4f Alphabetic Presentation Forms
67   // 0xff00 - 0xffef Halfwidth and Fullwidth Forms
68
69   // Brahmic scripts:
70   // 0x0900 - 0x097f Devanagari
71   // 0x0980 - 0x09ff Bengali
72   // 0x0a00 - 0x0a7f Gurmukhi
73   // 0x0a80 - 0x0aff Gujarati
74   // 0x0b00 - 0x0b7f Oriya
75   // 0x0b80 - 0x0bff Tamil
76   // 0x0c00 - 0x0c7f Telugu
77   // 0x0c80 - 0x0cff Kannada
78   // 0x0d00 - 0x0d7f Malayalam
79
80   // Sinhala script.
81   // 0x0d80 - 0x0dff Sinhala
82
83   // Arabic script.
84   // 0x0600 - 0x06ff Arabic
85   // 0x0750 - 0x077f Arabic Supplement
86   // 0x08A0 - 0x08ff Arabic Extended-A
87   // 0xfb50 - 0xfdff Arabic Presentation Forms-A
88   // 0xfe70 - 0xfeff Arabic Presentation Forms-B
89   // 0x1ee00 - 0x1eeff Arabic Mathematical Alphabetic Symbols
90
91   // CJK and Vietnamese script.
92   // 0x2E80 - 0x2eff CJK Radicals Supplement
93   // 0x3000 - 0x303f CJK Symbols and Punctuation
94   // 0x3200 - 0x32ff Enclosed CJK Letters and Months
95   // 0x3400 - 0x4dbf CJK Unified Ideographs Extension A
96   // 0x4e00 - 0x62ff CJK Unified Ideographs
97   // 0x6300 - 0x77ff CJK Unified Ideographs
98   // 0x7800 - 0x8cff CJK Unified Ideographs
99   // 0x8d00 - 0x9fff CJK Unified Ideographs
100   // 0x20000 - 0x215ff CJK Unified Ideographs Extension B
101   // 0x21600 - 0x230ff CJK Unified Ideographs Extension B
102   // 0x23100 - 0x245ff CJK Unified Ideographs Extension B
103   // 0x24600 - 0x260ff CJK Unified Ideographs Extension B
104   // 0x26100 - 0x275ff CJK Unified Ideographs Extension B
105   // 0x27600 - 0x290ff CJK Unified Ideographs Extension B
106   // 0x29100 - 0x2a6df CJK Unified Ideographs Extension B
107   // 2a700-2b73f. CJK Unified Ideographs Extension C
108   // 2b740-2b81f. CJK Unified Ideographs Extension D
109
110   // Hangul script
111   // 0x1100 - 0x11ff Hangul jamo
112   // 0x3130 - 0x318f Hangul Compatibility Jamo
113   // 0xa960 - 0xa97f Hangul Jamo Extended-A
114   // 0xac00 - 0xd7af Hangul Syllables
115   // 0xd7b0 - 0xd7ff Hangul Jamo Extended-B
116
117   // Khmer script
118   // 0x1780 - 0x17ff Khmer
119   // 0x19e0 - 0x19ff Khmer Symbols
120
121   // Lao script
122   // 0x0e80 - 0x0eff Lao
123
124   // Thai script
125   // 0x0e00 - 0x0e7f Thai
126
127   // Burmese script
128   // 0x1000 - 0x109f Myanmar
129
130   if( character <= 0x0cff )
131   {
132     if( character <= 0x09ff )
133     {
134       if( character <= 0x077f )
135       {
136         if( character <= 0x02ff )
137         {
138           return TextAbstraction::LATIN;
139         }
140         if( ( 0x0600 <= character ) && ( character <= 0x06ff ) )
141         {
142           return TextAbstraction::ARABIC;
143         }
144         if( ( 0x0750 <= character ) && ( character <= 0x077f ) )
145         {
146           return TextAbstraction::ARABIC;
147         }
148       }
149       else // > 0x077f
150       {
151         if( ( 0x08A0 <= character ) && ( character <= 0x08ff ) )
152         {
153           return TextAbstraction::ARABIC;
154         }
155         if( ( 0x0900 <= character ) && ( character <= 0x097f ) )
156         {
157           return TextAbstraction::DEVANAGARI;
158         }
159         if( ( 0x0980 <= character ) && ( character <= 0x09ff ) )
160         {
161           return TextAbstraction::BENGALI;
162         }
163       }
164     }
165     else // > 0x09ff
166     {
167       if( character <= 0x0b7f )
168       {
169         if( ( 0x0a00 <= character ) && ( character <= 0x0a7f ) )
170         {
171           return TextAbstraction::GURMUKHI;
172         }
173         if( ( 0x0a80 <= character ) && ( character <= 0x0aff ) )
174         {
175           return TextAbstraction::GUJARATI;
176         }
177         if( ( 0x0b00 <= character ) && ( character <= 0x0b7f ) )
178         {
179           return TextAbstraction::ORIYA;
180         }
181       }
182       else // > 0x0b7f
183       {
184         if( ( 0x0b80 <= character ) && ( character <= 0x0bff ) )
185         {
186           return TextAbstraction::TAMIL;
187         }
188         if( ( 0x0c00 <= character ) && ( character <= 0x0c7f ) )
189         {
190           return TextAbstraction::TELUGU;
191         }
192         if( ( 0x0c80 <= character ) && ( character <= 0x0cff ) )
193         {
194           return TextAbstraction::KANNADA;
195         }
196       }
197     }
198   }
199   else // > 0x0cff
200   {
201     if( character <= 0x2c7f )
202     {
203       if( character <= 0x1eff )
204       {
205         if( ( 0x0d00 <= character ) && ( character <= 0x0d7f ) )
206         {
207           return TextAbstraction::MALAYALAM;
208         }
209         if( ( 0x0d80 <= character ) && ( character <= 0x0dff ) )
210         {
211           return TextAbstraction::SINHALA;
212         }
213         if( ( 0x0e00 <= character ) && ( character <= 0x0e7f ) )
214         {
215           return TextAbstraction::THAI;
216         }
217         if( ( 0x0e80 <= character ) && ( character <= 0x0eff ) )
218         {
219           return TextAbstraction::LAO;
220         }
221         if( ( 0x1000 <= character ) && ( character <= 0x109f ) )
222         {
223           return TextAbstraction::BURMESE;
224         }
225         if( ( 0x1100 <= character ) && ( character <= 0x11ff ) )
226         {
227           return TextAbstraction::HANGUL;
228         }
229         if( ( 0x1780 <= character ) && ( character <= 0x17ff ) )
230         {
231           return TextAbstraction::KHMER;
232         }
233         if( ( 0x19e0 <= character ) && ( character <= 0x19ff ) )
234         {
235           return TextAbstraction::KHMER;
236         }
237         if( ( 0x1d00 <= character ) && ( character <= 0x1eff ) )
238         {
239           return TextAbstraction::LATIN;
240         }
241       }
242       else // > 0x1eff
243       {
244         if( ( 0x2070 <= character ) && ( character <= 0x209f ) )
245         {
246           return TextAbstraction::LATIN;
247         }
248         if( ( 0x2100 <= character ) && ( character <= 0x218f ) )
249         {
250           return TextAbstraction::LATIN;
251         }
252         if( ( 0x2c60 <= character ) && ( character <= 0x2c7f ) )
253         {
254           return TextAbstraction::LATIN;
255         }
256       }
257     }
258     else // > 0x2c7f
259     {
260       if( character <= 0xfdff )
261       {
262         if( ( 0x2e80 <= character ) && ( character <= 0x2eff ) )
263         {
264           return TextAbstraction::CJK;
265         }
266         if( ( 0x3000 <= character ) && ( character <= 0x303f ) )
267         {
268           return TextAbstraction::CJK;
269         }
270         if( ( 0x3130 <= character ) && ( character <= 0x318f ) )
271         {
272           return TextAbstraction::HANGUL;
273         }
274         if( ( 0x3200 <= character ) && ( character <= 0x32ff ) )
275         {
276           return TextAbstraction::CJK;
277         }
278         if( ( 0x3400 <= character ) && ( character <= 0x4dbf ) )
279         {
280           return TextAbstraction::CJK;
281         }
282         if( ( 0x4e00 <= character ) && ( character <= 0x62ff ) )
283         {
284           return TextAbstraction::CJK;
285         }
286         if( ( 0x6300 <= character ) && ( character <= 0x77ff ) )
287         {
288           return TextAbstraction::CJK;
289         }
290         if( ( 0x7800 <= character ) && ( character <= 0x8cff ) )
291         {
292           return TextAbstraction::CJK;
293         }
294         if( ( 0x8d00 <= character ) && ( character <= 0x9fff ) )
295         {
296           return TextAbstraction::CJK;
297         }
298         if( ( 0xa720 <= character ) && ( character <= 0xa7ff ) )
299         {
300           return TextAbstraction::LATIN;
301         }
302         if( ( 0xa960 <= character ) && ( character <= 0xa97f ) )
303         {
304           return TextAbstraction::HANGUL;
305         }
306         if( ( 0xab30 <= character ) && ( character <= 0xab6f ) )
307         {
308           return TextAbstraction::LATIN;
309         }
310         if( ( 0xac00 <= character ) && ( character <= 0xd7af ) )
311         {
312           return TextAbstraction::HANGUL;
313         }
314         if( ( 0xd7b0 <= character ) && ( character <= 0xd7ff ) )
315         {
316           return TextAbstraction::HANGUL;
317         }
318         if( ( 0xfb00 <= character ) && ( character <= 0xfb4f ) )
319         {
320           return TextAbstraction::LATIN;
321         }
322         if( ( 0xfb50 <= character ) && ( character <= 0xfdff ) )
323         {
324           return TextAbstraction::ARABIC;
325         }
326       }
327       else // > 0xfdff
328       {
329         if( ( 0xfe70 <= character ) && ( character <= 0xfeff ) )
330         {
331           return TextAbstraction::ARABIC;
332         }
333         if( ( 0xff00 <= character ) && ( character <= 0xffef ) )
334         {
335           return TextAbstraction::LATIN;
336         }
337         if( ( 0x1ee00 <= character ) && ( character <= 0x1eeff ) )
338         {
339           return TextAbstraction::ARABIC;
340         }
341         if( ( 0x20000 <= character ) && ( character <= 0x215ff ) )
342         {
343           return TextAbstraction::CJK;
344         }
345         if( ( 0x21600 <= character ) && ( character <= 0x230ff ) )
346         {
347           return TextAbstraction::CJK;
348         }
349         if( ( 0x23100 <= character ) && ( character <= 0x245ff ) )
350         {
351           return TextAbstraction::CJK;
352         }
353         if( ( 0x24600 <= character ) && ( character <= 0x260ff ) )
354         {
355           return TextAbstraction::CJK;
356         }
357         if( ( 0x26100 <= character ) && ( character <= 0x275ff ) )
358         {
359           return TextAbstraction::CJK;
360         }
361         if( ( 0x27600 <= character ) && ( character <= 0x290ff ) )
362         {
363           return TextAbstraction::CJK;
364         }
365         if( ( 0x29100 <= character ) && ( character <= 0x2a6df ) )
366         {
367           return TextAbstraction::CJK;
368         }
369         if( ( 0x2a700 <= character ) && ( character <= 0x2b73f ) )
370         {
371           return TextAbstraction::CJK;
372         }
373         if( ( 0x2b740 <= character ) && ( character <= 0x2b81f ) )
374         {
375           return TextAbstraction::CJK;
376         }
377       }
378     }
379   }
380
381   return TextAbstraction::UNKNOWN;
382 }
383
384 bool IsWhiteSpace( Character character )
385 {
386   return character < WHITE_SPACE_THRESHOLD;
387 }
388
389 bool IsNewParagraph( Character character )
390 {
391   return ( ( CHAR_FL == character )  ||
392            ( CHAR_VT == character )  ||
393            ( CHAR_FF == character )  ||
394            ( CHAR_NEL == character ) ||
395            ( CHAR_LS == character )  ||
396            ( CHAR_PS == character ) );
397 }
398
399 bool IsZeroWidthNonJoiner( Character character )
400 {
401   return CHAR_ZWNJ == character;
402 }
403
404 bool IsZeroWidthJoiner( Character character )
405 {
406   return CHAR_ZWJ == character;
407 }
408
409 bool IsZeroWidthSpace( Character character )
410 {
411   return CHAR_ZWS == character;
412 }
413
414 bool IsLeftToRightMark( Character character )
415 {
416   return CHAR_LTRM == character;
417 }
418
419 bool IsRightToLeftMark( Character character )
420 {
421   return CHAR_RTLM == character;
422 }
423
424 bool IsThinSpace( Character character )
425 {
426   return CHAR_TS == character;
427 }
428
429 } // namespace Text
430
431 } // namespace Toolkit
432
433 } // namespace Dali