Subversion Repositories Scribus

Rev

Rev 22125 | Rev 22501 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
22102 craig 1
/*
8175 avox 2
 For general Scribus (>=1.3.2) copyright and licensing information please refer
3
 to the COPYING file provided with the program. Following this notice may exist
4
 a copyright and/or license notice that predates the release of Scribus 1.3.2
5
 for which a new license (GPL+exception) is in place.
6
 */
7
/***************************************************************************
8
pageitem.cpp  -  description
9
-------------------
10
    begin                : Sat Apr 7 2001
11
    copyright            : (C) 2001 by Franz Schmid
12
    email                : Franz.Schmid@altmuehlnet.de
13
        ***************************************************************************/
14
 
15
/***************************************************************************
16
*                                                                         *
17
*   This program is free software; you can redistribute it and/or modify  *
18
*   it under the terms of the GNU General Public License as published by  *
19
*   the Free Software Foundation; either version 2 of the License, or     *
20
*   (at your option) any later version.                                   *
21
*                                                                         *
22
***************************************************************************/
23
 
24
#include "specialchars.h"
25
 
11713 fschmid 26
QChar SpecialChars::OBJECT       = QChar(25);
27
QChar SpecialChars::TAB          = QChar(9);
28
QChar SpecialChars::PARSEP       = QChar(13);
22125 jghali 29
QChar SpecialChars::LINEBREAK    = QChar(0x2028);
30
QChar SpecialChars::OLD_LINEBREAK = QChar(28);
11713 fschmid 31
QChar SpecialChars::COLBREAK     = QChar(26);
32
QChar SpecialChars::FRAMEBREAK   = QChar(27);
33
QChar SpecialChars::SHYPHEN      = QChar(0xAD);
34
QChar SpecialChars::NBHYPHEN     = QChar(0x2011);
35
QChar SpecialChars::NBSPACE      = QChar(0xA0);
36
QChar SpecialChars::OLD_NBHYPHEN = QChar(24);
37
QChar SpecialChars::OLD_NBSPACE  = QChar(29);
38
QChar SpecialChars::ZWNBSPACE    = QChar(0x2060);
39
QChar SpecialChars::ZWSPACE      = QChar(0x200B);
21563 jghali 40
QChar SpecialChars::ZWNJ         = QChar(0x200C);
41
QChar SpecialChars::ZWJ          = QChar(0x200D);
11713 fschmid 42
QChar SpecialChars::PAGENUMBER   = QChar(30);
43
QChar SpecialChars::PAGECOUNT    = QChar(23);
44
QChar SpecialChars::BLANK        = QChar(32);      // SPACE is some macro on my machine - av
8175 avox 45
 
46
 
47
bool SpecialChars::isBreakingSpace(QChar c)
48
{
49
        return c == BLANK || c == ZWSPACE;
50
}
51
 
52
bool SpecialChars::isExpandingSpace(QChar c)
53
{
54
        return c == BLANK || c == NBSPACE;
55
}
56
 
57
bool SpecialChars::isBreak(QChar c, bool includeColBreak)
58
{
59
        return (c == PARSEP
60
                        || c == LINEBREAK
61
                        || c == FRAMEBREAK
62
                        || (includeColBreak && c == COLBREAK));
63
}
64
 
17254 fschmid 65
int SpecialChars::getCJKAttr(QChar c)
66
{
67
        static uchar attr_3000[0x100] = {
68
                // 0x3000 - 0x3007
69
                CJK_SPACE,CJK_COMMA,CJK_PERIOD,CJK_NOTOP,CJK_KANJI,CJK_NOTOP,CJK_KANJI,CJK_KANJI,
70
                // 0x3008 - 0x300f
71
                CJK_FENCE_BEGIN,CJK_FENCE_END,CJK_FENCE_BEGIN,CJK_FENCE_END,CJK_FENCE_BEGIN,CJK_FENCE_END,CJK_FENCE_BEGIN,CJK_FENCE_END,
72
                // 0x3010 - 0x3017
73
                CJK_FENCE_BEGIN,CJK_FENCE_END,CJK_KANJI,CJK_KANJI,CJK_FENCE_BEGIN,CJK_FENCE_END,CJK_FENCE_BEGIN,CJK_FENCE_END,
74
                // 0x3018 - 0x301f
75
                CJK_FENCE_BEGIN,CJK_FENCE_END,CJK_FENCE_BEGIN,CJK_FENCE_END,CJK_HYPHEN,CJK_FENCE_BEGIN,CJK_FENCE_END,CJK_FENCE_END,
76
                // 0x3020 - 0x3027
77
                CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,
78
                // 0x3028 - 0x302f
79
                CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,
80
                // 0x3030 - 0x3037
81
                CJK_BETWEEN,CJK_BETWEEN,CJK_BETWEEN,CJK_BETWEEN,CJK_BETWEEN,CJK_BETWEEN,CJK_KANJI,CJK_KANJI,
82
                // 0x3038 - 0x303f
83
                CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,
84
                // 0x3040 - 0x3047
85
                CJK_KANJI,CJK_NOTOP,CJK_KANA,CJK_NOTOP,CJK_KANA,CJK_NOTOP,CJK_KANA,CJK_NOTOP,
86
                // 0x3048 - 0x304f
87
                CJK_KANA,CJK_NOTOP,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,
88
                // 0x3050 - 0x3057
89
                CJK_KANA,CJK_NOTOP,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,
90
                // 0x3058 - 0x305f
91
                CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,
92
                // 0x3060 - 0x3067
93
                CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,
94
                // 0x3068 - 0x306f
95
                CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,
96
                // 0x3070 - 0x3077
97
                CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,
98
                // 0x3078 - 0x307f
99
                CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,
100
                // 0x3080 - 0x3087
101
                CJK_KANA,CJK_KANA,CJK_KANA,CJK_NOTOP,CJK_KANA,CJK_NOTOP,CJK_KANA,CJK_NOTOP,
102
                // 0x3088 - 0x308f
103
                CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_NOTOP,CJK_KANA,
104
                // 0x3090 - 0x3097
105
                CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_NOTOP,CJK_NOTOP,CJK_KANJI,
106
                // 0x3098 - 0x309f
107
                CJK_KANJI,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_NOTOP,CJK_NOTOP,CJK_KANA,
108
 
109
                // 0x30a0 - 0x30a7
110
                CJK_KANJI,CJK_NOTOP,CJK_KANA,CJK_NOTOP,CJK_KANA,CJK_NOTOP,CJK_KANA,CJK_NOTOP,
111
                // 0x30a8 - 0x30af
112
                CJK_KANA,CJK_NOTOP,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,
113
                // 0x30b0 - 0x30b7
114
                CJK_KANA,CJK_NOTOP,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,
115
                // 0x30b8 - 0x30bf
116
                CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,
117
                // 0x30c0 - 0x30c7
118
                CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,
119
                // 0x30c8 - 0x30cf
120
                CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,
121
                // 0x30d0 - 0x30d7
122
                CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,
123
                // 0x30d8 - 0x30df
124
                CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,
125
                // 0x30e0 - 0x30e7
126
                CJK_KANA,CJK_KANA,CJK_KANA,CJK_NOTOP,CJK_KANA,CJK_NOTOP,CJK_KANA,CJK_NOTOP,
127
                // 0x30e8 - 0x30ef
128
                CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_NOTOP,CJK_KANA,
129
                // 0x30f0 - 0x30f7
130
                CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_KANA,CJK_NOTOP,CJK_NOTOP,CJK_KANA,
131
                // 0x30f8 - 0x30ff
132
                CJK_KANA,CJK_KANA,CJK_KANA,CJK_MIDPOINT,CJK_NOTOP,CJK_NOTOP,CJK_NOTOP,CJK_KANA
133
        };
134
 
135
        static uchar attr_ff00[0x61] = {
136
                // 0xff00 - 0xff07
137
                CJK_SPACE,CJK_DELMITER,CJK_KANJI,CJK_PREFIX,CJK_PREFIX,CJK_KANJI,CJK_KANJI,CJK_KANJI,
138
                // 0xff08 - 0xff0f
139
                CJK_FENCE_BEGIN,CJK_FENCE_END,CJK_KANJI,CJK_KANJI,CJK_COMMA,CJK_BETWEEN,CJK_PERIOD,CJK_KANJI,
140
                // 0xff10 - 0xff17
141
                CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,
142
                // 0xff18 - 0xff1f
17265 jghali 143
                CJK_KANJI,CJK_KANJI,CJK_MIDPOINT,CJK_MIDPOINT,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_DELMITER,
17254 fschmid 144
                // 0xff20 - 0xff27
145
                CJK_KANJI,CJK_KANJI,CJK_MIDPOINT,CJK_MIDPOINT,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,
146
                // 0xff28 - 0xff2f
147
                CJK_KANJI,CJK_KANJI,CJK_MIDPOINT,CJK_MIDPOINT,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,
148
                // 0xff30 - 0xff37
149
                CJK_KANJI,CJK_KANJI,CJK_MIDPOINT,CJK_MIDPOINT,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,
150
                // 0xff38 - 0xff3f
151
                CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_FENCE_BEGIN,CJK_KANJI,CJK_FENCE_END,CJK_KANJI,CJK_KANJI,
152
                // 0xff40 - 0xff47
153
                CJK_KANJI,CJK_KANJI,CJK_MIDPOINT,CJK_MIDPOINT,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,
154
                // 0xff48 - 0xff4f
155
                CJK_KANJI,CJK_KANJI,CJK_MIDPOINT,CJK_MIDPOINT,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,
156
                // 0xff50 - 0xff57
157
                CJK_KANJI,CJK_KANJI,CJK_MIDPOINT,CJK_MIDPOINT,CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_KANJI,
158
                // 0xff58 - 0xff5f
159
                CJK_KANJI,CJK_KANJI,CJK_KANJI,CJK_FENCE_BEGIN,CJK_KANJI,CJK_FENCE_END,CJK_BETWEEN,CJK_FENCE_BEGIN,
160
                // 0xff60
161
                CJK_FENCE_END
162
        };
163
        ushort code = c.unicode();
164
        if(code >= 0x3100 && code < 0xa000){
165
                return CJK_KANJI;
166
        }
167
 
168
        int attr = 0;
169
        if(code >= 0x3000 && code < 0x3100){
170
                attr = attr_3000[code - 0x3000];
171
        } else if( code >= 0xff00 && code <= 0xff60 ){
172
                attr = attr_ff00[code - 0xff00];
173
        }
174
        if( attr != 0 ){
175
                if(attr == CJK_COMMA || attr == CJK_PERIOD || attr == CJK_NOTOP || attr == CJK_FENCE_END )
176
                        attr |= CJK_NOBREAK_BEFORE;
177
                else if(attr == CJK_FENCE_BEGIN )
178
                        attr |= CJK_NOBREAK_AFTER;
179
                else if(attr == CJK_MIDPOINT || attr == CJK_HYPHEN || attr == CJK_DELMITER )
180
                        attr |= CJK_NOBREAK_BEFORE;
181
        }
182
        return attr;
183
}
21563 jghali 184
 
185
bool SpecialChars::isCJK(uint ch)
186
{
187
        if (    (0x2E80 < ch && ch < 0x2EFF)   ||  // CJK Radicals Supplement
188
                (0x3000 < ch && ch < 0x303F)   ||  // CJK Symbols and Punctuation
189
                (0x3040 < ch && ch <= 0x30FF)  ||  // Hiragana, Katakana
190
                (0x31C0 < ch && ch < 0x31EF)   ||  // CJK Strokes
191
                (0x3200 < ch && ch < 0x32FF)   ||  // Enclosed CJK Letters and Months
192
                (0x3300 < ch && ch < 0x33FF)   ||  // CJK Compatibility
193
                (0x3400 < ch && ch < 0x4DBF)   ||  // CJK Unified Ideographs Extension A
194
                (0x4E00 < ch && ch < 0x9FFF)   ||  // CJK Unified Ideographs
195
                (0xF900 < ch && ch < 0xFAFF)   ||  // CJK Compatibility Ideographs
196
                (0xFE30 < ch && ch < 0xFE4F)   ||  // CJK Compatibility Forms
197
                (0x20000 < ch && ch < 0x2A6DF) ||  // CJK Unified Ideographs Extension B
198
                (0x2A700 < ch && ch < 0x2B73F) ||  // CJK Unified Ideographs Extension C
199
                (0x2B740 < ch && ch < 0x2B81F) ||  // CJK Unified Ideographs Extension D
200
                (0x2F800 < ch && ch < 0x2FA1F) ||  // CJK Compatibility Ideographs Supplement
201
                (0xFF01 < ch && ch < 0xFF0F)   ||
202
                (0xFF1A < ch && ch < 0xFF20)   ||
203
                (0xFF58 < ch && ch < 0xFFDC)   ||
204
                (ch == 0x3000) ||
205
                (ch == 0x3002) ||
206
                (ch == 0x201C) ||
207
                (ch == 0x201D))
208
                return true;
209
        else
210
                return false;
211
}
212
 
22017 jghali 213
 
214
bool SpecialChars::isLetterRequiringSpaceAroundCJK(uint ch) {
215
        return (0x0030 <= ch && ch <= 0x0039) ||  // ASCII digits
216
                   (0x0041 <= ch && ch <= 0x005A) ||  // Latin uppercase alphabet
217
                   (0x0061 <= ch && ch <= 0x007A) ||  // Latin lowercase alphabet
218
                   (0x00C0 <= ch && ch <= 0x00D6) ||  // Letters in Latin-1 Supplement
219
                   (0x00D8 <= ch && ch <= 0x00F6) ||  // Letters in Latin-1 Supplement
220
                   (0x00F8 <= ch && ch <= 0x00FF) ||  // Letters in Latin-1 Supplement
221
                   (0x0100 <= ch && ch <= 0x017F) ||  // Letters in Latin Extended-A
222
                   (0x0180 <= ch && ch <= 0x024F) ||  // Letters in Latin Extended-B
223
                   (0x0250 <= ch && ch <= 0x02AF) ||  // Letters in IPA Extensions
224
                   (0x1D00 <= ch && ch <= 0x1D25) ||  // Letters in Phonetic Extentions
225
                   (0x1D6B <= ch && ch <= 0x1D70) ||  // Letters in Phonetic Extentions
226
                   (0x1D80 <= ch && ch <= 0x1D9A) ||  // Letters in Phonetic Extentions Supplement
227
                   (0x1E02 <= ch && ch <= 0x1EF3) ||  // Letters in Latin Extended Additional
228
                   (0x2C60 <= ch && ch <= 0x2C7F) ||  // Letters in Latin Extended-C
229
                   (0xA722 <= ch && ch <= 0xA787) ||  // Letters in Latin Extended-D
230
                   (0xA78B <= ch && ch <= 0xA7AE) ||  // Letters in Latin Extended-D
231
                   (0xA7B0 <= ch && ch <= 0xA7B7) ||  // Letters in Latin Extended-D
232
                   (0xA7F7 <= ch && ch <= 0xA7BF) ||  // Letters in Latin Extended-D
233
                   (0xAB30 <= ch && ch <= 0xAB5A) ||  // Letters in Latin Extended-D
234
                   (0xAB5C <= ch && ch <= 0xAB64) ||  // Letters in Latin Extended-D
235
                   (0xFB00 <= ch && ch <= 0xFB06) ;   // Alphabetic Presentation Forms
236
}
237
 
238
 
21563 jghali 239
bool SpecialChars::isIgnorableCodePoint(uint ch)
240
{
241
        // based on list of Default_Ignorable_Code_Point in Unicode 9
242
        if ( (ch == 0x00AD)                                       || //SOFT HYPHEN
243
                 (ch == 0x034F)                                   || //COMBINING GRAPHEME JOINER
244
                 (ch == 0x061C)                                   || //ARABIC LETTER MARK
245
                 (ch == 0x115F) || (ch == 0x1160) || //HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER
246
                 (ch == 0x17B4) || (ch == 0x17B5) || //KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
247
                 (ch >= 0x180B && ch <= 0x180D)   || //MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
248
                 (ch == 0x180E)                                   || // MONGOLIAN VOWEL SEPARATOR
249
                 (ch >= 0x200B && ch <= 0x200F)   || //ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK
250
                 (ch >= 0x202A && ch <= 0x202E)   || //LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
251
                 (ch >= 0x2060 && ch <= 0x2064)   || //WORD JOINER..INVISIBLE PLUS
252
                 (ch >= 0x2066 && ch <= 0x206F)   || //LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES
253
                 (ch == 0x3164)                                   || //HANGUL FILLER
254
                 (ch >= 0xFE00 && ch <= 0xFE0F)   || //VARIATION SELECTOR-1..VARIATION SELECTOR-16
255
                 (ch == 0xFEFF)                                   || //ZERO WIDTH NO-BREAK SPACE
256
                 (ch == 0xFFA0)                                   || //HALFWIDTH HANGUL FILLER
257
                 (ch >= 0x1BCA0 && ch <= 0x1BCA3) || //SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP
258
                 (ch >= 0x1D173 && ch <= 0x1D17A) || //MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
259
                 (ch == 0xE0001)                                         //LANGUAGE TAG
260
                        )
261
                return true;
262
        else
263
                return false;
264
}
22102 craig 265
 
22127 jghali 266
bool SpecialChars::isArabicModifierLetter(uint ch)
22102 craig 267
{
22127 jghali 268
        if (ch == 0x0640) //ARABIC TATWEEL
22102 craig 269
                return true;
22127 jghali 270
        else if (ch == 0x06E5) //ARABIC SMALL WAW
22102 craig 271
                return true;
22127 jghali 272
        else if (ch == 0x06E6) //ARABIC SMALL YEH
22102 craig 273
                return true;
274
        return false;
275
}