1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/graphics/graphicsdeviceinterface/gdi/sgdi/LineBreak.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,1990 @@
1.4 +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
1.5 +// All rights reserved.
1.6 +// This component and the accompanying materials are made available
1.7 +// under the terms of "Eclipse Public License v1.0"
1.8 +// which accompanies this distribution, and is available
1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.10 +//
1.11 +// Initial Contributors:
1.12 +// Nokia Corporation - initial contribution.
1.13 +//
1.14 +// Contributors:
1.15 +//
1.16 +// Description:
1.17 +// This file was last edited on 09/04/2007. Please read the 'Unicode Character Data and Line Break data Update History.doc' file
1.18 +// for the latest updates.
1.19 +//
1.20 +//
1.21 +
1.22 +#include "LineBreak.h"
1.23 +#include "LineBreakImp.h"
1.24 +#include <e32std.h>
1.25 +#include <e32svr.h>
1.26 +
1.27 +_LIT(KLinebreakPanicCategory,"LineBreak");
1.28 +
1.29 +GLDEF_C void Panic(TInt aError)
1.30 + {
1.31 + User::Panic(KLinebreakPanicCategory,aError);
1.32 + }
1.33 +
1.34 +const TUint KOpFlag = 1 << MLineBreaker::EOpLineBreakClass;
1.35 +const TUint KClFlag = 1 << MLineBreaker::EClLineBreakClass;
1.36 +const TUint KNsFlag = 1 << MLineBreaker::ENsLineBreakClass;
1.37 +const TUint KExFlag = 1 << MLineBreaker::EExLineBreakClass;
1.38 +const TUint KSyFlag = 1 << MLineBreaker::ESyLineBreakClass;
1.39 +const TUint KIsFlag = 1 << MLineBreaker::EIsLineBreakClass;
1.40 +const TUint KPrFlag = 1 << MLineBreaker::EPrLineBreakClass;
1.41 +const TUint KPoFlag = 1 << MLineBreaker::EPoLineBreakClass;
1.42 +const TUint KNuFlag = 1 << MLineBreaker::ENuLineBreakClass;
1.43 +const TUint KAlFlag = 1 << MLineBreaker::EAlLineBreakClass;
1.44 +const TUint KIdFlag = 1 << MLineBreaker::EIdLineBreakClass;
1.45 +const TUint KInFlag = 1 << MLineBreaker::EInLineBreakClass;
1.46 +const TUint KBbFlag = 1 << MLineBreaker::EBbLineBreakClass;
1.47 +const TUint KB2Flag = 1 << MLineBreaker::EB2LineBreakClass;
1.48 +const TUint KZwFlag = 1 << MLineBreaker::EZwLineBreakClass;
1.49 +const TUint KCmFlag = 1 << MLineBreaker::ECmLineBreakClass;
1.50 +const TUint KAiFlag = 1 << MLineBreaker::EAiLineBreakClass;
1.51 +
1.52 +const TUint KAiAlFlags = KAiFlag | KAlFlag;
1.53 +
1.54 +const TUint KAllBreaks = 0xFFFFFFFF;
1.55 +const TUint KUsualForbidden = KClFlag | KExFlag | KSyFlag | KIsFlag | KZwFlag;
1.56 +const TUint KUsualAllowed = KOpFlag | KPrFlag | KPoFlag | KNuFlag | KAiAlFlags | KIdFlag | KInFlag | KBbFlag | KB2Flag;
1.57 +
1.58 +const TUint KAlAllowed = KOpFlag | KPrFlag | KPoFlag | KIdFlag | KBbFlag | KB2Flag;
1.59 +
1.60 +// A table of break rules, indexed by the class of the character before the possible break.
1.61 +static const TLineBreakRule TheLineBreakRuleTable[MLineBreaker::ELineBreakClasses] =
1.62 + {
1.63 + { KAllBreaks - KCmFlag,0 }, // Op
1.64 + { KUsualForbidden | KNsFlag,KUsualAllowed - KPoFlag }, // Cl
1.65 + { KUsualForbidden | KOpFlag,0 }, // Qu
1.66 + { KUsualForbidden, 0 }, // Gl
1.67 + { KUsualForbidden, KUsualAllowed }, // Ns
1.68 + { KUsualForbidden, KUsualAllowed }, // Ex
1.69 + { KUsualForbidden, KUsualAllowed - KNuFlag }, // Sy
1.70 + { KUsualForbidden, KUsualAllowed - KNuFlag }, // Is
1.71 + { KUsualForbidden, KPrFlag | KPoFlag | KInFlag | KBbFlag | KB2Flag }, // Pr
1.72 + { KUsualForbidden, KUsualAllowed }, // Po
1.73 + { KUsualForbidden, KOpFlag | KPrFlag | KIdFlag | KBbFlag | KB2Flag }, // Nu
1.74 + { KUsualForbidden, KAlAllowed }, // Al
1.75 + { KUsualForbidden, KUsualAllowed - KPoFlag - KInFlag }, // Id
1.76 + { KUsualForbidden, KUsualAllowed - KInFlag }, // In
1.77 + { KUsualForbidden, KUsualAllowed }, // Hy
1.78 + { KUsualForbidden, KUsualAllowed }, // Ba
1.79 + { KUsualForbidden, 0 }, // Bb
1.80 + { KUsualForbidden | KB2Flag, KUsualAllowed }, // B2
1.81 + { KZwFlag, KAllBreaks - KZwFlag - KCmFlag}, // Zw
1.82 + { KUsualForbidden, KOpFlag | KPrFlag | KPoFlag | KIdFlag | KBbFlag | KB2Flag }, // Cm
1.83 + { 0, 0, }, // Bk
1.84 + { 0, 0, }, // Cr
1.85 + { 0, 0, }, // Lf
1.86 + { 0, 0, }, // Sg
1.87 + { 0, 0, }, // Cb
1.88 + { KAllBreaks, 0, }, // Sp
1.89 + { 0, 0, }, // Sa
1.90 + { KUsualForbidden, KAlAllowed, }, // Ai
1.91 + { 0, 0, } // Xx
1.92 + };
1.93 +
1.94 +/**
1.95 +A sorted table of ranges of characters, with their line breaking classes.
1.96 +A range includes all codes for iStart <= code < iEnd.
1.97 +All these items have fixed range, please don't split any item into more or
1.98 +combine consecutive items even if they have the same property,
1.99 +because these change will cause mismatch with customer definition.
1.100 +*/
1.101 +static const TLineBreakRange TheLineBreakRangeTable[] =
1.102 + {
1.103 + { 0x0000, 0x0009, MLineBreaker::ECmLineBreakClass }, //<control>
1.104 + { 0x0009, 0x000a, MLineBreaker::EBaLineBreakClass }, //<control>
1.105 + { 0x000a, 0x000b, MLineBreaker::ELfLineBreakClass }, //<control>
1.106 + { 0x000b, 0x000c, MLineBreaker::ECmLineBreakClass }, //<control>
1.107 + { 0x000c, 0x000d, MLineBreaker::EBkLineBreakClass }, //<control>
1.108 + { 0x000d, 0x000e, MLineBreaker::ECrLineBreakClass }, //<control>
1.109 + { 0x000e, 0x0020, MLineBreaker::ECmLineBreakClass }, //<control>
1.110 + { 0x0020, 0x0021, MLineBreaker::ESpLineBreakClass }, //space
1.111 + { 0x0021, 0x0022, MLineBreaker::EExLineBreakClass }, //exclamation mark
1.112 + { 0x0022, 0x0023, MLineBreaker::EQuLineBreakClass }, //quotation mark
1.113 + { 0x0023, 0x0024, MLineBreaker::EAlLineBreakClass }, //number sign
1.114 + { 0x0024, 0x0025, MLineBreaker::EPrLineBreakClass }, //dollar sign
1.115 + { 0x0025, 0x0026, MLineBreaker::EPoLineBreakClass }, //percent sign
1.116 + { 0x0026, 0x0027, MLineBreaker::EAlLineBreakClass }, //ampersand
1.117 + { 0x0027, 0x0028, MLineBreaker::EQuLineBreakClass }, //apostrophe
1.118 + { 0x0028, 0x0029, MLineBreaker::EOpLineBreakClass }, //left parenthesis
1.119 + { 0x0029, 0x002a, MLineBreaker::EClLineBreakClass }, //right parenthesis
1.120 + { 0x002a, 0x002b, MLineBreaker::EAlLineBreakClass }, //asterisk
1.121 + { 0x002b, 0x002c, MLineBreaker::EPrLineBreakClass }, //plus sign
1.122 + { 0x002c, 0x002d, MLineBreaker::EIsLineBreakClass }, //comma
1.123 + { 0x002d, 0x002e, MLineBreaker::EHyLineBreakClass }, //hyphen-minus
1.124 + { 0x002e, 0x002f, MLineBreaker::EIsLineBreakClass }, //full stop
1.125 + { 0x002f, 0x0030, MLineBreaker::ESyLineBreakClass }, //solidus
1.126 + { 0x0030, 0x003a, MLineBreaker::ENuLineBreakClass }, //digit zero
1.127 + { 0x003a, 0x003c, MLineBreaker::EIsLineBreakClass }, //colon
1.128 + { 0x003c, 0x003f, MLineBreaker::EAlLineBreakClass }, //less-than sign
1.129 + { 0x003f, 0x0040, MLineBreaker::EExLineBreakClass }, //question mark
1.130 + { 0x0040, 0x005b, MLineBreaker::EAlLineBreakClass }, //commercial at
1.131 + { 0x005b, 0x005c, MLineBreaker::EOpLineBreakClass }, //left square bracket
1.132 + { 0x005c, 0x005d, MLineBreaker::EPrLineBreakClass }, //reverse solidus
1.133 + { 0x005d, 0x005e, MLineBreaker::EClLineBreakClass }, //right square bracket
1.134 + { 0x005e, 0x005f, MLineBreaker::EAlLineBreakClass }, //circumflex accent
1.135 + { 0x005f, 0x0060, MLineBreaker::EAlLineBreakClass }, //low line (underscore)
1.136 + { 0x0060, 0x007b, MLineBreaker::EAlLineBreakClass }, //grave accent
1.137 + { 0x007b, 0x007c, MLineBreaker::EOpLineBreakClass }, //left curly bracket
1.138 + { 0x007c, 0x007d, MLineBreaker::EBaLineBreakClass }, //vertical line
1.139 + { 0x007d, 0x007e, MLineBreaker::EClLineBreakClass }, //right curly bracket
1.140 + { 0x007e, 0x007f, MLineBreaker::EAlLineBreakClass }, //tilde
1.141 + { 0x007f, 0x00a0, MLineBreaker::ECmLineBreakClass }, //<control>
1.142 + { 0x00a0, 0x00a1, MLineBreaker::EGlLineBreakClass }, //no-break space
1.143 + { 0x00a1, 0x00a2, MLineBreaker::EAiLineBreakClass }, //inverted exclamation mark
1.144 + { 0x00a2, 0x00a3, MLineBreaker::EPoLineBreakClass }, //cent sign
1.145 + { 0x00a3, 0x00a6, MLineBreaker::EPrLineBreakClass }, //pound sign
1.146 + { 0x00a6, 0x00a7, MLineBreaker::EAlLineBreakClass }, //broken bar
1.147 + { 0x00a7, 0x00a9, MLineBreaker::EAiLineBreakClass }, //section sign
1.148 + { 0x00a9, 0x00aa, MLineBreaker::EAlLineBreakClass }, //copyright sign
1.149 + { 0x00aa, 0x00ab, MLineBreaker::EAiLineBreakClass }, //feminine ordinal indicator
1.150 + { 0x00ab, 0x00ac, MLineBreaker::EQuLineBreakClass }, //left-pointing double angle quotation mark
1.151 + { 0x00ac, 0x00ad, MLineBreaker::EAlLineBreakClass }, //not sign
1.152 + { 0x00ad, 0x00ae, MLineBreaker::EBaLineBreakClass }, //soft hyphen
1.153 + { 0x00ae, 0x00b0, MLineBreaker::EAlLineBreakClass }, //registered sign
1.154 + { 0x00b0, 0x00b1, MLineBreaker::EPoLineBreakClass }, //degree sign
1.155 + { 0x00b1, 0x00b2, MLineBreaker::EPrLineBreakClass }, //plus-minus sign
1.156 + { 0x00b2, 0x00b4, MLineBreaker::EAiLineBreakClass }, //superscript two
1.157 + { 0x00b4, 0x00b5, MLineBreaker::EBaLineBreakClass }, //acute accent
1.158 + { 0x00b5, 0x00b6, MLineBreaker::EAlLineBreakClass }, //micro sign
1.159 + { 0x00b6, 0x00bb, MLineBreaker::EAiLineBreakClass }, //pilcrow sign
1.160 + { 0x00bb, 0x00bc, MLineBreaker::EQuLineBreakClass }, //right-pointing double angle quotation mark
1.161 + { 0x00bc, 0x00c0, MLineBreaker::EAiLineBreakClass }, //vulgar fraction one quarter
1.162 + { 0x00c0, 0x00c6, MLineBreaker::EAlLineBreakClass }, //latin capital letter a with grave
1.163 + { 0x00c6, 0x00c7, MLineBreaker::EAiLineBreakClass }, //latin capital letter ae
1.164 + { 0x00c7, 0x00d0, MLineBreaker::EAlLineBreakClass }, //latin capital letter c with cedilla
1.165 + { 0x00d0, 0x00d1, MLineBreaker::EAiLineBreakClass }, //latin capital letter eth
1.166 + { 0x00d1, 0x00d7, MLineBreaker::EAlLineBreakClass }, //latin capital letter n with tilde
1.167 + { 0x00d7, 0x00d9, MLineBreaker::EAiLineBreakClass }, //multiplication sign
1.168 + { 0x00d9, 0x00de, MLineBreaker::EAlLineBreakClass }, //latin capital letter u with grave
1.169 + { 0x00de, 0x00e2, MLineBreaker::EAiLineBreakClass }, //latin capital letter thorn
1.170 + { 0x00e2, 0x00e6, MLineBreaker::EAlLineBreakClass }, //latin small letter a with circumflex
1.171 + { 0x00e6, 0x00e7, MLineBreaker::EAiLineBreakClass }, //latin small letter ae
1.172 + { 0x00e7, 0x00e8, MLineBreaker::EAlLineBreakClass }, //latin small letter c with cedilla
1.173 + { 0x00e8, 0x00eb, MLineBreaker::EAiLineBreakClass }, //latin small letter e with grave
1.174 + { 0x00eb, 0x00ec, MLineBreaker::EAlLineBreakClass }, //latin small letter e with diaeresis
1.175 + { 0x00ec, 0x00ee, MLineBreaker::EAiLineBreakClass }, //latin small letter i with grave
1.176 + { 0x00ee, 0x00f0, MLineBreaker::EAlLineBreakClass }, //latin small letter i with circumflex
1.177 + { 0x00f0, 0x00f1, MLineBreaker::EAiLineBreakClass }, //latin small letter eth
1.178 + { 0x00f1, 0x00f2, MLineBreaker::EAlLineBreakClass }, //latin small letter n with tilde
1.179 + { 0x00f2, 0x00f4, MLineBreaker::EAiLineBreakClass }, //latin small letter o with grave
1.180 + { 0x00f4, 0x00f7, MLineBreaker::EAlLineBreakClass }, //latin small letter o with circumflex
1.181 + { 0x00f7, 0x00fb, MLineBreaker::EAiLineBreakClass }, //division sign
1.182 + { 0x00fb, 0x00fc, MLineBreaker::EAlLineBreakClass }, //latin small letter u with circumflex
1.183 + { 0x00fc, 0x00fd, MLineBreaker::EAiLineBreakClass }, //latin small letter u with diaeresis
1.184 + { 0x00fd, 0x00fe, MLineBreaker::EAlLineBreakClass }, //latin small letter y with acute
1.185 + { 0x00fe, 0x00ff, MLineBreaker::EAiLineBreakClass }, //latin small letter thorn
1.186 + { 0x00ff, 0x0101, MLineBreaker::EAlLineBreakClass }, //latin small letter y with diaeresis
1.187 + { 0x0101, 0x0102, MLineBreaker::EAiLineBreakClass }, //latin small letter a with macron
1.188 + { 0x0102, 0x0111, MLineBreaker::EAlLineBreakClass }, //latin capital letter a with breve
1.189 + { 0x0111, 0x0112, MLineBreaker::EAiLineBreakClass }, //latin small letter d with stroke
1.190 + { 0x0112, 0x0113, MLineBreaker::EAlLineBreakClass }, //latin capital letter e with macron
1.191 + { 0x0113, 0x0114, MLineBreaker::EAiLineBreakClass }, //latin small letter e with macron
1.192 + { 0x0114, 0x011b, MLineBreaker::EAlLineBreakClass }, //latin capital letter e with breve
1.193 + { 0x011b, 0x011c, MLineBreaker::EAiLineBreakClass }, //latin small letter e with caron
1.194 + { 0x011c, 0x0126, MLineBreaker::EAlLineBreakClass }, //latin capital letter g with circumflex
1.195 + { 0x0126, 0x0128, MLineBreaker::EAiLineBreakClass }, //latin capital letter h with stroke
1.196 + { 0x0128, 0x012b, MLineBreaker::EAlLineBreakClass }, //latin capital letter i with tilde
1.197 + { 0x012b, 0x012c, MLineBreaker::EAiLineBreakClass }, //latin small letter i with macron
1.198 + { 0x012c, 0x0131, MLineBreaker::EAlLineBreakClass }, //latin capital letter i with breve
1.199 + { 0x0131, 0x0134, MLineBreaker::EAiLineBreakClass }, //latin small letter dotless i
1.200 + { 0x0134, 0x0138, MLineBreaker::EAlLineBreakClass }, //latin capital letter j with circumflex
1.201 + { 0x0138, 0x0139, MLineBreaker::EAiLineBreakClass }, //latin small letter kra
1.202 + { 0x0139, 0x013f, MLineBreaker::EAlLineBreakClass }, //latin capital letter l with acute
1.203 + { 0x013f, 0x0143, MLineBreaker::EAiLineBreakClass }, //latin capital letter l with middle dot
1.204 + { 0x0143, 0x0144, MLineBreaker::EAlLineBreakClass }, //latin capital letter n with acute
1.205 + { 0x0144, 0x0145, MLineBreaker::EAiLineBreakClass }, //latin small letter n with acute
1.206 + { 0x0145, 0x0148, MLineBreaker::EAlLineBreakClass }, //latin capital letter n with cedilla
1.207 + { 0x0148, 0x014b, MLineBreaker::EAiLineBreakClass }, //latin small letter n with caron
1.208 + { 0x014b, 0x014d, MLineBreaker::EAlLineBreakClass }, //latin small letter eng
1.209 + { 0x014d, 0x014e, MLineBreaker::EAiLineBreakClass }, //latin small letter o with macron
1.210 + { 0x014e, 0x0152, MLineBreaker::EAlLineBreakClass }, //latin capital letter o with breve
1.211 + { 0x0152, 0x0154, MLineBreaker::EAiLineBreakClass }, //latin capital ligature oe
1.212 + { 0x0154, 0x0166, MLineBreaker::EAlLineBreakClass }, //latin capital letter r with acute
1.213 + { 0x0166, 0x0168, MLineBreaker::EAiLineBreakClass }, //latin capital letter t with stroke
1.214 + { 0x0168, 0x016b, MLineBreaker::EAlLineBreakClass }, //latin capital letter u with tilde
1.215 + { 0x016b, 0x016c, MLineBreaker::EAiLineBreakClass }, //latin small letter u with macron
1.216 + { 0x016c, 0x01ce, MLineBreaker::EAlLineBreakClass }, //latin capital letter u with breve
1.217 + { 0x01ce, 0x01cf, MLineBreaker::EAiLineBreakClass }, //latin small letter a with caron
1.218 + { 0x01cf, 0x01d0, MLineBreaker::EAlLineBreakClass }, //latin capital letter i with caron
1.219 + { 0x01d0, 0x01d1, MLineBreaker::EAiLineBreakClass }, //latin small letter i with caron
1.220 + { 0x01d1, 0x01d2, MLineBreaker::EAlLineBreakClass }, //latin capital letter o with caron
1.221 + { 0x01d2, 0x01d3, MLineBreaker::EAiLineBreakClass }, //latin small letter o with caron
1.222 + { 0x01d3, 0x01d4, MLineBreaker::EAlLineBreakClass }, //latin capital letter u with caron
1.223 + { 0x01d4, 0x01d5, MLineBreaker::EAiLineBreakClass }, //latin small letter u with caron
1.224 + { 0x01d5, 0x01d6, MLineBreaker::EAlLineBreakClass }, //latin capital letter u with diaeresis and macron
1.225 + { 0x01d6, 0x01d7, MLineBreaker::EAiLineBreakClass }, //latin small letter u with diaeresis and macron
1.226 + { 0x01d7, 0x01d8, MLineBreaker::EAlLineBreakClass }, //latin capital letter u with diaeresis and acute
1.227 + { 0x01d8, 0x01d9, MLineBreaker::EAiLineBreakClass }, //latin small letter u with diaeresis and acute
1.228 + { 0x01d9, 0x01da, MLineBreaker::EAlLineBreakClass }, //latin capital letter u with diaeresis and caron
1.229 + { 0x01da, 0x01db, MLineBreaker::EAiLineBreakClass }, //latin small letter u with diaeresis and caron
1.230 + { 0x01db, 0x01dc, MLineBreaker::EAlLineBreakClass }, //latin capital letter u with diaeresis and grave
1.231 + { 0x01dc, 0x01dd, MLineBreaker::EAiLineBreakClass }, //latin small letter u with diaeresis and grave
1.232 + { 0x01dd, 0x0250, MLineBreaker::EAlLineBreakClass }, //latin small letter turned e
1.233 + { 0x0250, 0x0251, MLineBreaker::EAlLineBreakClass }, //latin small letter turned a
1.234 + { 0x0251, 0x0252, MLineBreaker::EAiLineBreakClass }, //latin small letter alpha
1.235 + { 0x0252, 0x0261, MLineBreaker::EAlLineBreakClass }, //latin small letter turned alpha
1.236 + { 0x0261, 0x0262, MLineBreaker::EAiLineBreakClass }, //latin small letter script g
1.237 + { 0x0262, 0x02c7, MLineBreaker::EAlLineBreakClass }, //latin letter small capital g
1.238 + { 0x02c7, 0x02c8, MLineBreaker::EAiLineBreakClass }, //caron
1.239 + { 0x02c8, 0x02c9, MLineBreaker::EBbLineBreakClass }, //modifier letter vertical line
1.240 + { 0x02c9, 0x02cc, MLineBreaker::EAiLineBreakClass }, //modifier letter macron
1.241 + { 0x02cc, 0x02cd, MLineBreaker::EBbLineBreakClass }, //modifier letter low vertical line
1.242 + { 0x02cd, 0x02ce, MLineBreaker::EAiLineBreakClass }, //modifier letter low macron
1.243 + { 0x02ce, 0x02d0, MLineBreaker::EAlLineBreakClass }, //modifier letter low grave accent
1.244 + { 0x02d0, 0x02d1, MLineBreaker::EAiLineBreakClass }, //modifier letter triangular colon
1.245 + { 0x02d1, 0x02d8, MLineBreaker::EAlLineBreakClass }, //modifier letter half triangular colon
1.246 + { 0x02d8, 0x02dc, MLineBreaker::EAiLineBreakClass }, //breve
1.247 + { 0x02dc, 0x02dd, MLineBreaker::EAlLineBreakClass }, //small tilde
1.248 + { 0x02dd, 0x02de, MLineBreaker::EAiLineBreakClass }, //double acute accent
1.249 + { 0x02de, 0x0300, MLineBreaker::EAlLineBreakClass }, //modifier letter rhotic hook
1.250 + { 0x0300, 0x034f, MLineBreaker::ECmLineBreakClass }, //combining grave accent
1.251 + { 0x034f, 0x0350, MLineBreaker::EGlLineBreakClass }, //COMBINING GRAPHEME JOINER
1.252 + { 0x0350, 0x035c, MLineBreaker::ECmLineBreakClass }, //COMBINING RIGHT ARROWHEAD ABOVE
1.253 + { 0x035c, 0x0360, MLineBreaker::EGlLineBreakClass }, //COMBINING DOUBLE BREVE BELOW
1.254 + { 0x0360, 0x0370, MLineBreaker::ECmLineBreakClass }, //combining double tilde
1.255 + { 0x0374, 0x0376, MLineBreaker::EAlLineBreakClass }, //greek numeral sign
1.256 + { 0x037a, 0x037b, MLineBreaker::EAlLineBreakClass }, //greek ypogegrammeni
1.257 + { 0x037b, 0x037e, MLineBreaker::EAlLineBreakClass }, //GREEK SMALL REVERSED LUNATE SIGMA SYMBOL
1.258 + { 0x037e, 0x037f, MLineBreaker::EAlLineBreakClass }, //greek question mark
1.259 + { 0x0384, 0x038b, MLineBreaker::EAlLineBreakClass }, //greek tonos
1.260 + { 0x038c, 0x038d, MLineBreaker::EAlLineBreakClass }, //greek capital letter omicron with tonos
1.261 + { 0x038e, 0x0391, MLineBreaker::EAlLineBreakClass }, //greek capital letter upsilon with tonos
1.262 + { 0x0391, 0x03a2, MLineBreaker::EAiLineBreakClass }, //greek capital letter alpha
1.263 + { 0x03a3, 0x03aa, MLineBreaker::EAiLineBreakClass }, //greek capital letter sigma
1.264 + { 0x03aa, 0x03b1, MLineBreaker::EAlLineBreakClass }, //greek capital letter iota with dialytika
1.265 + { 0x03b1, 0x03c2, MLineBreaker::EAiLineBreakClass }, //greek small letter alpha
1.266 + { 0x03c2, 0x03c3, MLineBreaker::EAlLineBreakClass }, //greek small letter final sigma
1.267 + { 0x03c3, 0x03ca, MLineBreaker::EAiLineBreakClass }, //greek small letter sigma
1.268 + { 0x03ca, 0x03cf, MLineBreaker::EAlLineBreakClass }, //greek small letter iota with dialytika
1.269 + { 0x03d0, 0x0400, MLineBreaker::EAlLineBreakClass }, //greek beta symbol
1.270 + { 0x0400, 0x0401, MLineBreaker::EAlLineBreakClass }, //cyrillic capital letter ie with grave
1.271 + { 0x0401, 0x0402, MLineBreaker::EAiLineBreakClass }, //cyrillic capital letter io
1.272 + { 0x0402, 0x0410, MLineBreaker::EAlLineBreakClass }, //cyrillic capital letter dje
1.273 + { 0x0410, 0x0450, MLineBreaker::EAiLineBreakClass }, //cyrillic capital letter a
1.274 + { 0x0450, 0x0451, MLineBreaker::EAlLineBreakClass }, //cyrillic small letter ie with grave
1.275 + { 0x0451, 0x0452, MLineBreaker::EAiLineBreakClass }, //cyrillic small letter io
1.276 + { 0x0452, 0x0483, MLineBreaker::EAlLineBreakClass }, //cyrillic small letter dje
1.277 + { 0x0483, 0x0487, MLineBreaker::ECmLineBreakClass }, //combining cyrillic titlo
1.278 + { 0x0488, 0x048a, MLineBreaker::ECmLineBreakClass }, //combining cyrillic hundred thousands sign
1.279 + { 0x048a, 0x0514, MLineBreaker::EAlLineBreakClass }, //CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
1.280 + { 0x0531, 0x0557, MLineBreaker::EAlLineBreakClass }, //armenian capital letter ayb
1.281 + { 0x0559, 0x0560, MLineBreaker::EAlLineBreakClass }, //armenian modifier letter left half ring
1.282 + { 0x0561, 0x0588, MLineBreaker::EAlLineBreakClass }, //armenian small letter ayb
1.283 + { 0x0589, 0x058a, MLineBreaker::EIsLineBreakClass }, //armenian full stop
1.284 + { 0x058a, 0x058b, MLineBreaker::EBaLineBreakClass }, //armenian hyphen
1.285 + { 0x0591, 0x05be, MLineBreaker::ECmLineBreakClass }, //hebrew accent etnahta
1.286 + { 0x05be, 0x05bf, MLineBreaker::EAlLineBreakClass }, //hebrew punctuation maqaf
1.287 + { 0x05bf, 0x05c0, MLineBreaker::ECmLineBreakClass }, //hebrew point rafe
1.288 + { 0x05c0, 0x05c1, MLineBreaker::EAlLineBreakClass }, //hebrew punctuation paseq
1.289 + { 0x05c1, 0x05c3, MLineBreaker::ECmLineBreakClass }, //hebrew point shin dot
1.290 + { 0x05c3, 0x05c4, MLineBreaker::EAlLineBreakClass }, //hebrew punctuation sof pasuq
1.291 + { 0x05c4, 0x05c5, MLineBreaker::ECmLineBreakClass }, //hebrew mark upper dot
1.292 + { 0x05c5, 0x05c6, MLineBreaker::ECmLineBreakClass }, //HEBREW MARK LOWER DOT
1.293 + { 0x05c6, 0x05c7, MLineBreaker::EExLineBreakClass }, //HEBREW PUNCTUATION NUN HAFUKHA
1.294 + { 0x05c7, 0x05c8, MLineBreaker::ECmLineBreakClass }, //HEBREW POINT QAMATS QATAN
1.295 + { 0x05d0, 0x05eb, MLineBreaker::EAlLineBreakClass }, //hebrew letter alef
1.296 + { 0x05f0, 0x05f5, MLineBreaker::EAlLineBreakClass }, //hebrew ligature yiddish double vav
1.297 + { 0x0600, 0x0604, MLineBreaker::EAlLineBreakClass }, //ARABIC NUMBER SIGN
1.298 + { 0x060b, 0x060c, MLineBreaker::EPoLineBreakClass }, //AFGHANI SIGN
1.299 + { 0x060c, 0x060d, MLineBreaker::EExLineBreakClass }, //arabic comma
1.300 + { 0x060d, 0x060e, MLineBreaker::EIsLineBreakClass }, //ARABIC DATE SEPARATOR
1.301 + { 0x060e, 0x0610, MLineBreaker::EAlLineBreakClass }, //ARABIC POETIC VERSE SIGN
1.302 + { 0x0610, 0x0616, MLineBreaker::ECmLineBreakClass }, //ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM
1.303 + { 0x061b, 0x061c, MLineBreaker::EExLineBreakClass }, //arabic semicolon
1.304 + { 0x061e, 0x061f, MLineBreaker::EExLineBreakClass }, //ARABIC TRIPLE DOT PUNCTUATION MARK
1.305 + { 0x061f, 0x0620, MLineBreaker::EExLineBreakClass }, //arabic question mark
1.306 + { 0x0621, 0x063b, MLineBreaker::EAlLineBreakClass }, //arabic letter hamza
1.307 + { 0x0640, 0x064b, MLineBreaker::EAlLineBreakClass }, //arabic tatweel
1.308 + { 0x064b, 0x065f, MLineBreaker::ECmLineBreakClass }, //arabic fathatan
1.309 + { 0x0660, 0x066a, MLineBreaker::ENuLineBreakClass }, //arabic-indic digit zero
1.310 + { 0x066a, 0x066b, MLineBreaker::EExLineBreakClass }, //arabic percent sign
1.311 + { 0x066b, 0x066d, MLineBreaker::ENuLineBreakClass }, //arabic decimal & thousands separator
1.312 + { 0x066d, 0x066e, MLineBreaker::EAlLineBreakClass }, //arabic five pointed star
1.313 + { 0x066e, 0x0670, MLineBreaker::EAlLineBreakClass }, //arabic five pointed star
1.314 + { 0x0670, 0x0671, MLineBreaker::ECmLineBreakClass }, //arabic letter superscript alef
1.315 + { 0x0671, 0x06d4, MLineBreaker::EAlLineBreakClass }, //arabic letter alef wasla
1.316 + { 0x06d4, 0x06d5, MLineBreaker::EExLineBreakClass }, //arabic full stop
1.317 + { 0x06d5, 0x06d6, MLineBreaker::EAlLineBreakClass }, //arabic letter ae
1.318 + { 0x06d6, 0x06e5, MLineBreaker::ECmLineBreakClass }, //arabic small high ligature sad with lam with alef maksura
1.319 + { 0x06e5, 0x06e7, MLineBreaker::EAlLineBreakClass }, //arabic small waw
1.320 + { 0x06e7, 0x06e9, MLineBreaker::ECmLineBreakClass }, //arabic small high yeh
1.321 + { 0x06e9, 0x06ea, MLineBreaker::EAlLineBreakClass }, //arabic place of sajdah
1.322 + { 0x06ea, 0x06ee, MLineBreaker::ECmLineBreakClass }, //arabic empty centre low stop
1.323 + { 0x06ee, 0x06f0, MLineBreaker::EAlLineBreakClass }, //ARABIC LETTER DAL WITH INVERTED V
1.324 + { 0x06f0, 0x06fa, MLineBreaker::ENuLineBreakClass }, //extended arabic-indic digit zero
1.325 + { 0x06fa, 0x070e, MLineBreaker::EAlLineBreakClass }, //arabic letter sheen with dot below
1.326 + { 0x070f, 0x0710, MLineBreaker::ECmLineBreakClass }, //syriac abbreviation mark
1.327 + { 0x0710, 0x0711, MLineBreaker::EAlLineBreakClass }, //syriac letter alaph
1.328 + { 0x0711, 0x0712, MLineBreaker::ECmLineBreakClass }, //syriac letter superscript alaph
1.329 + { 0x0712, 0x0730, MLineBreaker::EAlLineBreakClass }, //syriac letter beth
1.330 + { 0x0730, 0x074b, MLineBreaker::ECmLineBreakClass }, //syriac pthaha above
1.331 + { 0x074d, 0x076e, MLineBreaker::EAlLineBreakClass }, //SYRIAC LETTER SOGDIAN ZHAIN
1.332 + { 0x0780, 0x07a6, MLineBreaker::EAlLineBreakClass }, //thaana letter haa
1.333 + { 0x07a6, 0x07b1, MLineBreaker::ECmLineBreakClass }, //thaana abafili
1.334 + { 0x07b1, 0x07b2, MLineBreaker::EAlLineBreakClass }, //THAANA LETTER NAA
1.335 + { 0x07c0, 0x07ca, MLineBreaker::ENuLineBreakClass }, //NKO DIGIT ZERO
1.336 + { 0x07ca, 0x07eb, MLineBreaker::EAlLineBreakClass }, //NKO LETTER A
1.337 + { 0x07eb, 0x07f4, MLineBreaker::ECmLineBreakClass }, //NKO COMBINING SHORT HIGH TONE
1.338 + { 0x07f4, 0x07f8, MLineBreaker::EAlLineBreakClass }, //NKO HIGH TONE APOSTROPHE
1.339 + { 0x07f8, 0x07f9, MLineBreaker::EIsLineBreakClass }, //NKO COMMA
1.340 + { 0x07f9, 0x07fa, MLineBreaker::EExLineBreakClass }, //NKO EXCLAMATION MARK
1.341 + { 0x07fa, 0x07fb, MLineBreaker::EAlLineBreakClass }, //NKO LAJANYALAN
1.342 + { 0x0901, 0x0904, MLineBreaker::ECmLineBreakClass }, //devanagari sign candrabindu
1.343 + { 0x0904, 0x093a, MLineBreaker::EAlLineBreakClass }, //devanagari letter short a: CR1080
1.344 + { 0x093c, 0x093d, MLineBreaker::ECmLineBreakClass }, //devanagari sign nukta
1.345 + { 0x093d, 0x093e, MLineBreaker::EAlLineBreakClass }, //devanagari sign avagraha
1.346 + { 0x093e, 0x094e, MLineBreaker::ECmLineBreakClass }, //devanagari vowel sign aa
1.347 + { 0x0950, 0x0951, MLineBreaker::EAlLineBreakClass }, //devanagari om
1.348 + { 0x0951, 0x0955, MLineBreaker::ECmLineBreakClass }, //devanagari stress sign udatta
1.349 + { 0x0958, 0x0962, MLineBreaker::EAlLineBreakClass }, //devanagari letter qa
1.350 + { 0x0962, 0x0964, MLineBreaker::ECmLineBreakClass }, //devanagari vowel sign vocalic l
1.351 + { 0x0964, 0x0966, MLineBreaker::EAlLineBreakClass }, //devanagari danda
1.352 + { 0x0966, 0x0970, MLineBreaker::ENuLineBreakClass }, //devanagari digit zero
1.353 + { 0x0970, 0x0971, MLineBreaker::EAlLineBreakClass }, //devanagari abbreviation sign
1.354 + { 0x097b, 0x0980, MLineBreaker::EAlLineBreakClass }, //devanagari letter gga: CR1080
1.355 + { 0x0981, 0x0984, MLineBreaker::ECmLineBreakClass }, //bengali sign candrabindu
1.356 + { 0x0985, 0x098d, MLineBreaker::EAlLineBreakClass }, //bengali letter a
1.357 + { 0x098f, 0x0991, MLineBreaker::EAlLineBreakClass }, //bengali letter e
1.358 + { 0x0993, 0x09a9, MLineBreaker::EAlLineBreakClass }, //bengali letter o
1.359 + { 0x09aa, 0x09b1, MLineBreaker::EAlLineBreakClass }, //bengali letter pa
1.360 + { 0x09b2, 0x09b3, MLineBreaker::EAlLineBreakClass }, //bengali letter la
1.361 + { 0x09b6, 0x09ba, MLineBreaker::EAlLineBreakClass }, //bengali letter sha
1.362 + { 0x09bc, 0x09bd, MLineBreaker::ECmLineBreakClass }, //bengali sign nukta
1.363 + { 0x09bd, 0x09be, MLineBreaker::EAlLineBreakClass }, //bengali sign avagraha: CR1080
1.364 + { 0x09be, 0x09c5, MLineBreaker::ECmLineBreakClass }, //bengali vowel sign aa
1.365 + { 0x09c7, 0x09c9, MLineBreaker::ECmLineBreakClass }, //bengali vowel sign e
1.366 + { 0x09cb, 0x09ce, MLineBreaker::ECmLineBreakClass }, //bengali vowel sign o
1.367 + { 0x09ce, 0x09cf, MLineBreaker::EAlLineBreakClass }, //bengali letter khanda ta: CR1080
1.368 + { 0x09d7, 0x09d8, MLineBreaker::ECmLineBreakClass }, //bengali au length mark
1.369 + { 0x09dc, 0x09de, MLineBreaker::EAlLineBreakClass }, //bengali letter rra
1.370 + { 0x09df, 0x09e2, MLineBreaker::EAlLineBreakClass }, //bengali letter yya
1.371 + { 0x09e2, 0x09e4, MLineBreaker::ECmLineBreakClass }, //bengali vowel sign vocalic l
1.372 + { 0x09e6, 0x09f0, MLineBreaker::ENuLineBreakClass }, //bengali digit zero
1.373 + { 0x09f0, 0x09f2, MLineBreaker::EAlLineBreakClass }, //bengali letter ra with middle diagonal
1.374 + { 0x09f2, 0x09f4, MLineBreaker::EPrLineBreakClass }, //bengali rupee mark
1.375 + { 0x09f4, 0x09fb, MLineBreaker::EAlLineBreakClass }, //bengali currency numerator one
1.376 + { 0x0a01, 0x0a04, MLineBreaker::ECmLineBreakClass }, //gurmukhi sign adak bindi: CR1080
1.377 + { 0x0a05, 0x0a0b, MLineBreaker::EAlLineBreakClass }, //gurmukhi letter a
1.378 + { 0x0a0f, 0x0a11, MLineBreaker::EAlLineBreakClass }, //gurmukhi letter ee
1.379 + { 0x0a13, 0x0a29, MLineBreaker::EAlLineBreakClass }, //gurmukhi letter oo
1.380 + { 0x0a2a, 0x0a31, MLineBreaker::EAlLineBreakClass }, //gurmukhi letter pa
1.381 + { 0x0a32, 0x0a34, MLineBreaker::EAlLineBreakClass }, //gurmukhi letter la
1.382 + { 0x0a35, 0x0a37, MLineBreaker::EAlLineBreakClass }, //gurmukhi letter va
1.383 + { 0x0a38, 0x0a3a, MLineBreaker::EAlLineBreakClass }, //gurmukhi letter sa
1.384 + { 0x0a3c, 0x0a3d, MLineBreaker::ECmLineBreakClass }, //gurmukhi sign nukta
1.385 + { 0x0a3e, 0x0a43, MLineBreaker::ECmLineBreakClass }, //gurmukhi vowel sign aa
1.386 + { 0x0a47, 0x0a49, MLineBreaker::ECmLineBreakClass }, //gurmukhi vowel sign ee
1.387 + { 0x0a4b, 0x0a4e, MLineBreaker::ECmLineBreakClass }, //gurmukhi vowel sign oo
1.388 + { 0x0a59, 0x0a5d, MLineBreaker::EAlLineBreakClass }, //gurmukhi letter khha
1.389 + { 0x0a5e, 0x0a5f, MLineBreaker::EAlLineBreakClass }, //gurmukhi letter fa
1.390 + { 0x0a66, 0x0a70, MLineBreaker::ENuLineBreakClass }, //gurmukhi digit zero
1.391 + { 0x0a70, 0x0a72, MLineBreaker::ECmLineBreakClass }, //gurmukhi tippi
1.392 + { 0x0a72, 0x0a75, MLineBreaker::EAlLineBreakClass }, //gurmukhi iri
1.393 + { 0x0a81, 0x0a84, MLineBreaker::ECmLineBreakClass }, //gujarati sign candrabindu
1.394 + { 0x0a85, 0x0a8d, MLineBreaker::EAlLineBreakClass }, //gujarati letter a: CR1080
1.395 + { 0x0a8d, 0x0a8e, MLineBreaker::EAlLineBreakClass }, //gujarati vowel candra e
1.396 + { 0x0a8f, 0x0a92, MLineBreaker::EAlLineBreakClass }, //gujarati letter e
1.397 + { 0x0a93, 0x0aa9, MLineBreaker::EAlLineBreakClass }, //gujarati letter o
1.398 + { 0x0aaa, 0x0ab1, MLineBreaker::EAlLineBreakClass }, //gujarati letter pa
1.399 + { 0x0ab2, 0x0ab4, MLineBreaker::EAlLineBreakClass }, //gujarati letter la
1.400 + { 0x0ab5, 0x0aba, MLineBreaker::EAlLineBreakClass }, //gujarati letter va
1.401 + { 0x0abc, 0x0abd, MLineBreaker::ECmLineBreakClass }, //gujarati sign nukta
1.402 + { 0x0abd, 0x0abe, MLineBreaker::EAlLineBreakClass }, //gujarati sign avagraha
1.403 + { 0x0abe, 0x0ac6, MLineBreaker::ECmLineBreakClass }, //gujarati vowel sign aa
1.404 + { 0x0ac7, 0x0aca, MLineBreaker::ECmLineBreakClass }, //gujarati vowel sign e
1.405 + { 0x0acb, 0x0ace, MLineBreaker::ECmLineBreakClass }, //gujarati vowel sign o
1.406 + { 0x0ad0, 0x0ad1, MLineBreaker::EAlLineBreakClass }, //gujarati om
1.407 + { 0x0ae0, 0x0ae2, MLineBreaker::EAlLineBreakClass }, //gujarati letter vocalic rr: CR1080
1.408 + { 0x0ae2, 0x0ae4, MLineBreaker::ECmLineBreakClass }, //gujarati vowel sign vocalic l: CR1080
1.409 + { 0x0ae6, 0x0af0, MLineBreaker::ENuLineBreakClass }, //gujarati digit zero
1.410 + { 0x0af1, 0x0af2, MLineBreaker::EPrLineBreakClass }, //gujarati rupee sign: CR1080
1.411 + { 0x0b01, 0x0b04, MLineBreaker::ECmLineBreakClass }, //oriya sign candrabindu
1.412 + { 0x0b05, 0x0b0d, MLineBreaker::EAlLineBreakClass }, //oriya letter a
1.413 + { 0x0b0f, 0x0b11, MLineBreaker::EAlLineBreakClass }, //oriya letter e
1.414 + { 0x0b13, 0x0b29, MLineBreaker::EAlLineBreakClass }, //oriya letter o
1.415 + { 0x0b2a, 0x0b31, MLineBreaker::EAlLineBreakClass }, //oriya letter pa
1.416 + { 0x0b32, 0x0b34, MLineBreaker::EAlLineBreakClass }, //oriya letter la
1.417 + { 0x0b35, 0x0b36, MLineBreaker::EAlLineBreakClass }, //oriya letter va: CR1080
1.418 + { 0x0b36, 0x0b3a, MLineBreaker::EAlLineBreakClass }, //oriya letter sha
1.419 + { 0x0b3c, 0x0b3d, MLineBreaker::ECmLineBreakClass }, //oriya sign nukta
1.420 + { 0x0b3d, 0x0b3e, MLineBreaker::EAlLineBreakClass }, //oriya sign avagraha
1.421 + { 0x0b3e, 0x0b44, MLineBreaker::ECmLineBreakClass }, //oriya vowel sign aa
1.422 + { 0x0b47, 0x0b49, MLineBreaker::ECmLineBreakClass }, //oriya vowel sign e
1.423 + { 0x0b4b, 0x0b4e, MLineBreaker::ECmLineBreakClass }, //oriya vowel sign o
1.424 + { 0x0b56, 0x0b58, MLineBreaker::ECmLineBreakClass }, //oriya ai length mark
1.425 + { 0x0b5c, 0x0b5e, MLineBreaker::EAlLineBreakClass }, //oriya letter rra
1.426 + { 0x0b5f, 0x0b62, MLineBreaker::EAlLineBreakClass }, //oriya letter yya
1.427 + { 0x0b66, 0x0b70, MLineBreaker::ENuLineBreakClass }, //oriya digit zero
1.428 + { 0x0b70, 0x0b71, MLineBreaker::EAlLineBreakClass }, //oriya isshar
1.429 + { 0x0b71, 0x0b72, MLineBreaker::EAlLineBreakClass }, //oriya letter wa: CR1080
1.430 + { 0x0b82, 0x0b84, MLineBreaker::ECmLineBreakClass }, //tamil sign anusvara
1.431 + { 0x0b85, 0x0b8b, MLineBreaker::EAlLineBreakClass }, //tamil letter a
1.432 + { 0x0b8e, 0x0b91, MLineBreaker::EAlLineBreakClass }, //tamil letter e
1.433 + { 0x0b92, 0x0b96, MLineBreaker::EAlLineBreakClass }, //tamil letter o
1.434 + { 0x0b99, 0x0b9b, MLineBreaker::EAlLineBreakClass }, //tamil letter nga
1.435 + { 0x0b9c, 0x0b9d, MLineBreaker::EAlLineBreakClass }, //tamil letter ja
1.436 + { 0x0b9e, 0x0ba0, MLineBreaker::EAlLineBreakClass }, //tamil letter nya
1.437 + { 0x0ba3, 0x0ba5, MLineBreaker::EAlLineBreakClass }, //tamil letter nna
1.438 + { 0x0ba8, 0x0bab, MLineBreaker::EAlLineBreakClass }, //tamil letter na
1.439 + { 0x0bae, 0x0bba, MLineBreaker::EAlLineBreakClass }, //tamil letter ma: CR1080
1.440 + { 0x0bbe, 0x0bc3, MLineBreaker::ECmLineBreakClass }, //tamil vowel sign aa
1.441 + { 0x0bc6, 0x0bc9, MLineBreaker::ECmLineBreakClass }, //tamil vowel sign e
1.442 + { 0x0bca, 0x0bce, MLineBreaker::ECmLineBreakClass }, //tamil vowel sign o
1.443 + { 0x0bd7, 0x0bd8, MLineBreaker::ECmLineBreakClass }, //tamil au length mark
1.444 + { 0x0be6, 0x0bf0, MLineBreaker::ENuLineBreakClass }, //tamil digit one: CR1080
1.445 + { 0x0bf0, 0x0bf9, MLineBreaker::EAlLineBreakClass }, //tamil number ten: CR1080
1.446 + { 0x0bf9, 0x0bfa, MLineBreaker::EPrLineBreakClass }, //tamil rupee sign: CR1080
1.447 + { 0x0bfa, 0x0bfb, MLineBreaker::EAlLineBreakClass }, //tamil number sign: CR1080
1.448 + { 0x0c01, 0x0c04, MLineBreaker::ECmLineBreakClass }, //telugu sign candrabindu
1.449 + { 0x0c05, 0x0c0d, MLineBreaker::EAlLineBreakClass }, //telugu letter a
1.450 + { 0x0c0e, 0x0c11, MLineBreaker::EAlLineBreakClass }, //telugu letter e
1.451 + { 0x0c12, 0x0c29, MLineBreaker::EAlLineBreakClass }, //telugu letter o
1.452 + { 0x0c2a, 0x0c34, MLineBreaker::EAlLineBreakClass }, //telugu letter pa
1.453 + { 0x0c35, 0x0c3a, MLineBreaker::EAlLineBreakClass }, //telugu letter va
1.454 + { 0x0c3e, 0x0c45, MLineBreaker::ECmLineBreakClass }, //telugu vowel sign aa
1.455 + { 0x0c46, 0x0c49, MLineBreaker::ECmLineBreakClass }, //telugu vowel sign e
1.456 + { 0x0c4a, 0x0c4e, MLineBreaker::ECmLineBreakClass }, //telugu vowel sign o
1.457 + { 0x0c55, 0x0c57, MLineBreaker::ECmLineBreakClass }, //telugu length mark
1.458 + { 0x0c60, 0x0c62, MLineBreaker::EAlLineBreakClass }, //telugu letter vocalic rr
1.459 + { 0x0c66, 0x0c70, MLineBreaker::ENuLineBreakClass }, //telugu digit zero
1.460 + { 0x0c82, 0x0c84, MLineBreaker::ECmLineBreakClass }, //kannada sign anusvara
1.461 + { 0x0c85, 0x0c8d, MLineBreaker::EAlLineBreakClass }, //kannada letter a
1.462 + { 0x0c8e, 0x0c91, MLineBreaker::EAlLineBreakClass }, //kannada letter e
1.463 + { 0x0c92, 0x0ca9, MLineBreaker::EAlLineBreakClass }, //kannada letter o
1.464 + { 0x0caa, 0x0cb4, MLineBreaker::EAlLineBreakClass }, //kannada letter pa
1.465 + { 0x0cb5, 0x0cba, MLineBreaker::EAlLineBreakClass }, //kannada letter va
1.466 + { 0x0cbc, 0x0cbd, MLineBreaker::ECmLineBreakClass }, //kannada sign nukta: CR1080
1.467 + { 0x0cbd, 0x0cbe, MLineBreaker::EAlLineBreakClass }, //kannada sign avagraha: CR1080
1.468 + { 0x0cbe, 0x0cc5, MLineBreaker::ECmLineBreakClass }, //kannada vowel sign aa
1.469 + { 0x0cc6, 0x0cc9, MLineBreaker::ECmLineBreakClass }, //kannada vowel sign e
1.470 + { 0x0cca, 0x0cce, MLineBreaker::ECmLineBreakClass }, //kannada vowel sign o
1.471 + { 0x0cd5, 0x0cd7, MLineBreaker::ECmLineBreakClass }, //kannada length mark
1.472 + { 0x0cde, 0x0cdf, MLineBreaker::EAlLineBreakClass }, //kannada letter fa
1.473 + { 0x0ce0, 0x0ce2, MLineBreaker::EAlLineBreakClass }, //kannada letter vocalic rr
1.474 + { 0x0ce2, 0x0ce4, MLineBreaker::ECmLineBreakClass }, //kannada vowel sign vocalic l: CR1080
1.475 + { 0x0ce6, 0x0cf0, MLineBreaker::ENuLineBreakClass }, //kannada digit zero
1.476 + { 0x0cf1, 0x0cf3, MLineBreaker::EAlLineBreakClass }, //kannada sign jihvamuliya: CR1080
1.477 + { 0x0d02, 0x0d04, MLineBreaker::ECmLineBreakClass }, //malayalam sign anusvara
1.478 + { 0x0d05, 0x0d0d, MLineBreaker::EAlLineBreakClass }, //malayalam letter a
1.479 + { 0x0d0e, 0x0d11, MLineBreaker::EAlLineBreakClass }, //malayalam letter e
1.480 + { 0x0d12, 0x0d29, MLineBreaker::EAlLineBreakClass }, //malayalam letter o
1.481 + { 0x0d2a, 0x0d3a, MLineBreaker::EAlLineBreakClass }, //malayalam letter pa
1.482 + { 0x0d3e, 0x0d44, MLineBreaker::ECmLineBreakClass }, //malayalam vowel sign aa
1.483 + { 0x0d46, 0x0d49, MLineBreaker::ECmLineBreakClass }, //malayalam vowel sign e
1.484 + { 0x0d4a, 0x0d4e, MLineBreaker::ECmLineBreakClass }, //malayalam vowel sign o
1.485 + { 0x0d57, 0x0d58, MLineBreaker::ECmLineBreakClass }, //malayalam au length mark
1.486 + { 0x0d60, 0x0d62, MLineBreaker::EAlLineBreakClass }, //malayalam letter vocalic rr
1.487 + { 0x0d66, 0x0d70, MLineBreaker::ENuLineBreakClass }, //malayalam digit zero
1.488 + { 0x0d82, 0x0d84, MLineBreaker::ECmLineBreakClass }, //sinhala sign anusvaraya
1.489 + { 0x0d85, 0x0d97, MLineBreaker::EAlLineBreakClass }, //sinhala letter ayanna
1.490 + { 0x0d9a, 0x0db2, MLineBreaker::EAlLineBreakClass }, //sinhala letter alpapraana kayanna
1.491 + { 0x0db3, 0x0dbc, MLineBreaker::EAlLineBreakClass }, //sinhala letter sanyaka dayanna
1.492 + { 0x0dbd, 0x0dbe, MLineBreaker::EAlLineBreakClass }, //sinhala letter dantaja layanna
1.493 + { 0x0dc0, 0x0dc7, MLineBreaker::EAlLineBreakClass }, //sinhala letter vayanna
1.494 + { 0x0dca, 0x0dcb, MLineBreaker::ECmLineBreakClass }, //sinhala sign al-lakuna
1.495 + { 0x0dcf, 0x0dd5, MLineBreaker::ECmLineBreakClass }, //sinhala vowel sign aela-pilla
1.496 + { 0x0dd6, 0x0dd7, MLineBreaker::ECmLineBreakClass }, //sinhala vowel sign diga paa-pilla
1.497 + { 0x0dd8, 0x0de0, MLineBreaker::ECmLineBreakClass }, //sinhala vowel sign gaetta-pilla
1.498 + { 0x0df2, 0x0df4, MLineBreaker::ECmLineBreakClass }, //sinhala vowel sign diga gaetta-pilla
1.499 + { 0x0df4, 0x0df5, MLineBreaker::EAlLineBreakClass }, //sinhala punctuation kunddaliya
1.500 + { 0x0e01, 0x0e31, MLineBreaker::ESaLineBreakClass }, //thai character ko kai
1.501 + { 0x0e31, 0x0e32, MLineBreaker::ECmLineBreakClass }, //thai character mai han-akat
1.502 + { 0x0e32, 0x0e34, MLineBreaker::ESaLineBreakClass }, //thai character sara aa
1.503 + { 0x0e34, 0x0e3b, MLineBreaker::ECmLineBreakClass }, //thai character sara i
1.504 + { 0x0e3f, 0x0e40, MLineBreaker::EPrLineBreakClass }, //thai currency symbol baht
1.505 + { 0x0e40, 0x0e47, MLineBreaker::ESaLineBreakClass }, //thai character sara e
1.506 + { 0x0e47, 0x0e4f, MLineBreaker::ECmLineBreakClass }, //thai character maitaikhu
1.507 + { 0x0e4f, 0x0e50, MLineBreaker::EAlLineBreakClass }, //thai character fongman
1.508 + { 0x0e50, 0x0e5a, MLineBreaker::ENuLineBreakClass }, //thai digit zero
1.509 + { 0x0e5a, 0x0e5c, MLineBreaker::ENsLineBreakClass }, //thai character angkhankhu
1.510 + { 0x0e81, 0x0e83, MLineBreaker::ESaLineBreakClass }, //lao letter ko
1.511 + { 0x0e84, 0x0e85, MLineBreaker::ESaLineBreakClass }, //lao letter kho tam
1.512 + { 0x0e87, 0x0e89, MLineBreaker::ESaLineBreakClass }, //lao letter ngo
1.513 + { 0x0e8a, 0x0e8b, MLineBreaker::ESaLineBreakClass }, //lao letter so tam
1.514 + { 0x0e8d, 0x0e8e, MLineBreaker::ESaLineBreakClass }, //lao letter nyo
1.515 + { 0x0e94, 0x0e98, MLineBreaker::ESaLineBreakClass }, //lao letter do
1.516 + { 0x0e99, 0x0ea0, MLineBreaker::ESaLineBreakClass }, //lao letter no
1.517 + { 0x0ea1, 0x0ea4, MLineBreaker::ESaLineBreakClass }, //lao letter mo
1.518 + { 0x0ea5, 0x0ea6, MLineBreaker::ESaLineBreakClass }, //lao letter lo loot
1.519 + { 0x0ea7, 0x0ea8, MLineBreaker::ESaLineBreakClass }, //lao letter wo
1.520 + { 0x0eaa, 0x0eac, MLineBreaker::ESaLineBreakClass }, //lao letter so sung
1.521 + { 0x0ead, 0x0eb1, MLineBreaker::ESaLineBreakClass }, //lao letter o
1.522 + { 0x0eb1, 0x0eb2, MLineBreaker::ECmLineBreakClass }, //lao vowel sign mai kan
1.523 + { 0x0eb2, 0x0eb4, MLineBreaker::ESaLineBreakClass }, //lao vowel sign aa
1.524 + { 0x0eb4, 0x0eba, MLineBreaker::ECmLineBreakClass }, //lao vowel sign i
1.525 + { 0x0ebb, 0x0ebd, MLineBreaker::ECmLineBreakClass }, //lao vowel sign mai kon
1.526 + { 0x0ebd, 0x0ebe, MLineBreaker::ESaLineBreakClass }, //lao semivowel sign nyo
1.527 + { 0x0ec0, 0x0ec5, MLineBreaker::ESaLineBreakClass }, //lao vowel sign e
1.528 + { 0x0ec6, 0x0ec7, MLineBreaker::ESaLineBreakClass }, //lao ko la
1.529 + { 0x0ec8, 0x0ece, MLineBreaker::ECmLineBreakClass }, //lao tone mai ek
1.530 + { 0x0ed0, 0x0eda, MLineBreaker::ENuLineBreakClass }, //lao digit zero
1.531 + { 0x0edc, 0x0ede, MLineBreaker::ESaLineBreakClass }, //lao ho no
1.532 + { 0x0f00, 0x0f0b, MLineBreaker::EAlLineBreakClass }, //tibetan syllable om
1.533 + { 0x0f0b, 0x0f0c, MLineBreaker::EBaLineBreakClass }, //tibetan mark intersyllabic tsheg
1.534 + { 0x0f0c, 0x0f0d, MLineBreaker::EGlLineBreakClass }, //tibetan mark delimiter tsheg bstar
1.535 + { 0x0f0d, 0x0f18, MLineBreaker::EAlLineBreakClass }, //tibetan mark shad
1.536 + { 0x0f18, 0x0f1a, MLineBreaker::ECmLineBreakClass }, //tibetan astrological sign -khyud pa
1.537 + { 0x0f1a, 0x0f20, MLineBreaker::EAlLineBreakClass }, //tibetan sign rdel dkar gcig
1.538 + { 0x0f20, 0x0f2a, MLineBreaker::ENuLineBreakClass }, //tibetan digit zero
1.539 + { 0x0f2a, 0x0f35, MLineBreaker::EAlLineBreakClass }, //tibetan digit half one
1.540 + { 0x0f35, 0x0f36, MLineBreaker::ECmLineBreakClass }, //tibetan mark ngas bzung nyi zla
1.541 + { 0x0f36, 0x0f37, MLineBreaker::EAlLineBreakClass }, //tibetan mark caret -dzud rtags bzhi mig can
1.542 + { 0x0f37, 0x0f38, MLineBreaker::ECmLineBreakClass }, //tibetan mark ngas bzung sgor rtags
1.543 + { 0x0f38, 0x0f39, MLineBreaker::EAlLineBreakClass }, //tibetan mark che mgo
1.544 + { 0x0f39, 0x0f3a, MLineBreaker::ECmLineBreakClass }, //tibetan mark tsa -phru
1.545 + { 0x0f3a, 0x0f3b, MLineBreaker::EOpLineBreakClass }, //tibetan mark gug rtags gyon
1.546 + { 0x0f3b, 0x0f3c, MLineBreaker::EClLineBreakClass }, //tibetan mark gug rtags gyas
1.547 + { 0x0f3c, 0x0f3d, MLineBreaker::EOpLineBreakClass }, //tibetan mark ang khang gyon
1.548 + { 0x0f3d, 0x0f3e, MLineBreaker::EClLineBreakClass }, //tibetan mark ang khang gyas
1.549 + { 0x0f3e, 0x0f40, MLineBreaker::ECmLineBreakClass }, //tibetan sign yar tshes
1.550 + { 0x0f40, 0x0f48, MLineBreaker::EAlLineBreakClass }, //tibetan letter ka
1.551 + { 0x0f49, 0x0f6b, MLineBreaker::EAlLineBreakClass }, //tibetan letter nya
1.552 + { 0x0f71, 0x0f85, MLineBreaker::ECmLineBreakClass }, //tibetan vowel sign aa
1.553 + { 0x0f85, 0x0f86, MLineBreaker::EAlLineBreakClass }, //tibetan mark paluta
1.554 + { 0x0f86, 0x0f88, MLineBreaker::ECmLineBreakClass }, //tibetan sign lci rtags
1.555 + { 0x0f88, 0x0f8c, MLineBreaker::EAlLineBreakClass }, //tibetan sign lce tsa can
1.556 + { 0x0f90, 0x0f98, MLineBreaker::ECmLineBreakClass }, //tibetan subjoined letter ka
1.557 + { 0x0f99, 0x0fbd, MLineBreaker::ECmLineBreakClass }, //tibetan subjoined letter nya
1.558 + { 0x0fbe, 0x0fc6, MLineBreaker::EAlLineBreakClass }, //tibetan ku ru kha
1.559 + { 0x0fc6, 0x0fc7, MLineBreaker::ECmLineBreakClass }, //tibetan symbol padma gdan
1.560 + { 0x0fc7, 0x0fcd, MLineBreaker::EAlLineBreakClass }, //tibetan symbol rdo rje rgya gram
1.561 + { 0x0fcf, 0x0fd0, MLineBreaker::EAlLineBreakClass }, //tibetan sign rdel nag gsum
1.562 + { 0x0fd0, 0x0fd2, MLineBreaker::EBbLineBreakClass }, //TIBETAN MARK BSKA- SHOG GI MGO RGYAN
1.563 + { 0x1000, 0x1022, MLineBreaker::ESaLineBreakClass }, //myanmar letter ka
1.564 + { 0x1023, 0x1028, MLineBreaker::ESaLineBreakClass }, //myanmar letter i
1.565 + { 0x1029, 0x102b, MLineBreaker::ESaLineBreakClass }, //myanmar letter o
1.566 + { 0x102c, 0x1033, MLineBreaker::ECmLineBreakClass }, //myanmar vowel sign aa
1.567 + { 0x1036, 0x103a, MLineBreaker::ECmLineBreakClass }, //myanmar sign anusvara
1.568 + { 0x1040, 0x104a, MLineBreaker::ENuLineBreakClass }, //myanmar digit zero
1.569 + { 0x104a, 0x1050, MLineBreaker::EAlLineBreakClass }, //myanmar sign little section
1.570 + { 0x1050, 0x1056, MLineBreaker::ESaLineBreakClass }, //myanmar letter sha
1.571 + { 0x1056, 0x105a, MLineBreaker::ECmLineBreakClass }, //myanmar vowel sign vocalic r
1.572 + { 0x10a0, 0x10c6, MLineBreaker::EAlLineBreakClass }, //georgian capital letter an
1.573 + { 0x10d0, 0x10fb, MLineBreaker::EAlLineBreakClass }, //georgian letter an
1.574 + { 0x10fb, 0x10fc, MLineBreaker::EAlLineBreakClass }, //georgian paragraph separator
1.575 + { 0x10fc, 0x10fd, MLineBreaker::EAlLineBreakClass }, //MODIFIER LETTER GEORGIAN NAR
1.576 + { 0x1100, 0x115a, MLineBreaker::EIdLineBreakClass }, //hangul choseong kiyeok
1.577 + { 0x115f, 0x1160, MLineBreaker::EIdLineBreakClass }, //hangul choseong filler
1.578 + { 0x1160, 0x11a3, MLineBreaker::ECmLineBreakClass }, //hangul jungseong filler
1.579 + { 0x11a8, 0x11fa, MLineBreaker::ECmLineBreakClass }, //hangul jongseong kiyeok
1.580 + { 0x1200, 0x1248, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable ha
1.581 + { 0x1248, 0x1249, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable qwa
1.582 + { 0x124a, 0x124e, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable qwi
1.583 + { 0x1250, 0x1257, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable qha
1.584 + { 0x1258, 0x1259, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable qhwa
1.585 + { 0x125a, 0x125e, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable qhwi
1.586 + { 0x1260, 0x1288, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable ba
1.587 + { 0x1288, 0x1289, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable xwa
1.588 + { 0x128a, 0x128e, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable xwi
1.589 + { 0x1290, 0x12b0, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable na
1.590 + { 0x12b0, 0x12b1, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable kwa
1.591 + { 0x12b2, 0x12b6, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable kwi
1.592 + { 0x12b8, 0x12bf, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable kxa
1.593 + { 0x12c0, 0x12c1, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable kxwa
1.594 + { 0x12c2, 0x12c6, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable kxwi
1.595 + { 0x12c8, 0x12d7, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable wa
1.596 + { 0x12d8, 0x1310, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable za
1.597 + { 0x1310, 0x1311, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable gwa
1.598 + { 0x1312, 0x1316, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable gwi
1.599 + { 0x1318, 0x135b, MLineBreaker::EAlLineBreakClass }, //ethiopic syllable gga
1.600 + { 0x135f, 0x1360, MLineBreaker::ECmLineBreakClass }, //ETHIOPIC COMBINING GEMINATION MARK
1.601 + { 0x1360, 0x1361, MLineBreaker::EAlLineBreakClass }, //ETHIOPIC SECTION MARK
1.602 + { 0x1361, 0x1362, MLineBreaker::EBaLineBreakClass }, //ethiopic wordspace
1.603 + { 0x1362, 0x1369, MLineBreaker::EAlLineBreakClass }, //ethiopic full stop
1.604 + { 0x1369, 0x1372, MLineBreaker::ENuLineBreakClass }, //ethiopic digit one
1.605 + { 0x1372, 0x137d, MLineBreaker::EAlLineBreakClass }, //ethiopic number ten
1.606 + { 0x1380, 0x139a, MLineBreaker::EAlLineBreakClass }, //ETHIOPIC SYLLABLE SEBATBEIT MWA
1.607 + { 0x13a0, 0x13f5, MLineBreaker::EAlLineBreakClass }, //cherokee letter a
1.608 + { 0x1401, 0x1677, MLineBreaker::EAlLineBreakClass }, //canadian syllabics e
1.609 + { 0x1680, 0x1681, MLineBreaker::EBaLineBreakClass }, //ogham space mark
1.610 + { 0x1681, 0x169b, MLineBreaker::EAlLineBreakClass }, //ogham letter beith
1.611 + { 0x169b, 0x169c, MLineBreaker::EOpLineBreakClass }, //ogham feather mark
1.612 + { 0x169c, 0x169d, MLineBreaker::EClLineBreakClass }, //ogham reversed feather mark
1.613 + { 0x16a0, 0x16f1, MLineBreaker::EAlLineBreakClass }, //runic letter fehu feoh fe f
1.614 + { 0x1700, 0x170d, MLineBreaker::EAlLineBreakClass }, //TAGALOG LETTER A
1.615 + { 0x170e, 0x1712, MLineBreaker::EAlLineBreakClass }, //TAGALOG LETTER LA
1.616 + { 0x1712, 0x1715, MLineBreaker::ECmLineBreakClass }, //TAGALOG VOWEL SIGN I
1.617 + { 0x1720, 0x1732, MLineBreaker::EAlLineBreakClass }, //HANUNOO LETTER A
1.618 + { 0x1732, 0x1735, MLineBreaker::ECmLineBreakClass }, //HANUNOO VOWEL SIGN I
1.619 + { 0x1735, 0x1737, MLineBreaker::EBaLineBreakClass }, //PHILIPPINE SINGLE PUNCTUATION
1.620 + { 0x1740, 0x1752, MLineBreaker::EAlLineBreakClass }, //BUHID LETTER A
1.621 + { 0x1752, 0x1754, MLineBreaker::ECmLineBreakClass }, //BUHID VOWEL SIGN I
1.622 + { 0x1760, 0x176d, MLineBreaker::EAlLineBreakClass }, //TAGBANWA LETTER A
1.623 + { 0x176e, 0x1771, MLineBreaker::EAlLineBreakClass }, //TAGBANWA LETTER LA
1.624 + { 0x1772, 0x1774, MLineBreaker::ECmLineBreakClass }, //TAGBANWA VOWEL SIGN I
1.625 + { 0x1780, 0x17b4, MLineBreaker::ESaLineBreakClass }, //khmer letter ka
1.626 + { 0x17b4, 0x17d4, MLineBreaker::ECmLineBreakClass }, //khmer vowel inherent aq
1.627 + { 0x17d4, 0x17d5, MLineBreaker::ENsLineBreakClass }, //khmer sign khan
1.628 + { 0x17d5, 0x17d6, MLineBreaker::EBaLineBreakClass }, //khmer sign bariyoosan
1.629 + { 0x17d6, 0x17db, MLineBreaker::ENsLineBreakClass }, //khmer sign camnuc pii kuuh
1.630 + { 0x17db, 0x17dc, MLineBreaker::EPrLineBreakClass }, //khmer currency symbol riel
1.631 + { 0x17dc, 0x17dd, MLineBreaker::EAlLineBreakClass }, //khmer sign avakrahasanya
1.632 + { 0x17dd, 0x17de, MLineBreaker::ESaLineBreakClass }, //KHMER SIGN ATTHACAN
1.633 + { 0x17e0, 0x17ea, MLineBreaker::ENuLineBreakClass }, //khmer digit zero
1.634 + { 0x17f0, 0x17fa, MLineBreaker::EAlLineBreakClass }, //KHMER SYMBOL LEK ATTAK SON
1.635 + { 0x1800, 0x1806, MLineBreaker::EAlLineBreakClass }, //mongolian birga
1.636 + { 0x1806, 0x1807, MLineBreaker::EBbLineBreakClass }, //mongolian todo soft hyphen
1.637 + { 0x1807, 0x180b, MLineBreaker::EAlLineBreakClass }, //mongolian sibe syllable boundary marker
1.638 + { 0x180b, 0x180f, MLineBreaker::ECmLineBreakClass }, //mongolian free variation selector one
1.639 + { 0x1810, 0x181a, MLineBreaker::ENuLineBreakClass }, //mongolian digit zero
1.640 + { 0x1820, 0x1878, MLineBreaker::EAlLineBreakClass }, //mongolian letter a
1.641 + { 0x1880, 0x18a9, MLineBreaker::EAlLineBreakClass }, //mongolian letter ali gali anusvara one
1.642 + { 0x18a9, 0x18aa, MLineBreaker::ECmLineBreakClass }, //mongolian letter ali gali dagalga
1.643 + { 0x1900, 0x191d, MLineBreaker::EAlLineBreakClass }, //LIMBU VOWEL-CARRIER LETTER
1.644 + { 0x1920, 0x192c, MLineBreaker::ECmLineBreakClass }, //LIMBU VOWEL SIGN A
1.645 + { 0x1930, 0x193c, MLineBreaker::ECmLineBreakClass }, //LIMBU SMALL LETTER KA
1.646 + { 0x1940, 0x1941, MLineBreaker::EAlLineBreakClass }, //LIMBU SIGN LOO
1.647 + { 0x1944, 0x1946, MLineBreaker::EExLineBreakClass }, //LIMBU EXCLAMATION MARK
1.648 + { 0x1946, 0x1950, MLineBreaker::ENuLineBreakClass }, //LIMBU DIGIT ZERO
1.649 + { 0x1950, 0x196e, MLineBreaker::ESaLineBreakClass }, //TAI LE LETTER KA
1.650 + { 0x1970, 0x1975, MLineBreaker::ESaLineBreakClass }, //TAI LE LETTER TONE-2
1.651 + { 0x1980, 0x19aa, MLineBreaker::ESaLineBreakClass }, //NEW TAI LUE LETTER HIGH QA
1.652 + { 0x19b0, 0x19ca, MLineBreaker::ESaLineBreakClass }, //NEW TAI LUE VOWEL SIGN VOWEL SHORTENER
1.653 + { 0x19d0, 0x19da, MLineBreaker::ENuLineBreakClass }, //NEW TAI LUE DIGIT ZERO
1.654 + { 0x19de, 0x19e0, MLineBreaker::ESaLineBreakClass }, //NEW TAI LUE SIGN LAE
1.655 + { 0x19e0, 0x1a17, MLineBreaker::EAlLineBreakClass }, //KHMER SYMBOL PATHAMASAT
1.656 + { 0x1a17, 0x1a1c, MLineBreaker::ECmLineBreakClass }, //BUGINESE VOWEL SIGN I
1.657 + { 0x1a1e, 0x1a1f, MLineBreaker::EBaLineBreakClass }, //BUGINESE PALLAWA
1.658 + { 0x1a1f, 0x1a20, MLineBreaker::EAlLineBreakClass }, //BUGINESE END OF SECTION
1.659 + { 0x1b00, 0x1b05, MLineBreaker::ECmLineBreakClass }, //BALINESE SIGN ULU RICEM
1.660 + { 0x1b05, 0x1b34, MLineBreaker::EAlLineBreakClass }, //BALINESE LETTER AKARA
1.661 + { 0x1b34, 0x1b45, MLineBreaker::ECmLineBreakClass }, //BALINESE SIGN REREKAN
1.662 + { 0x1b45, 0x1b4c, MLineBreaker::EAlLineBreakClass }, //BALINESE LETTER KAF SASAK
1.663 + { 0x1b50, 0x1b5a, MLineBreaker::ENuLineBreakClass }, //BALINESE DIGIT ZERO
1.664 + { 0x1b5a, 0x1b61, MLineBreaker::EBaLineBreakClass }, //BALINESE PANTI
1.665 + { 0x1b61, 0x1b6b, MLineBreaker::EAlLineBreakClass }, //BALINESE MUSICAL SYMBOL DONG
1.666 + { 0x1b6b, 0x1b74, MLineBreaker::ECmLineBreakClass }, //BALINESE MUSICAL SYMBOL COMBINING TEGEH
1.667 + { 0x1b74, 0x1b7d, MLineBreaker::EAlLineBreakClass }, //BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG
1.668 + { 0x1d00, 0x1dc0, MLineBreaker::EAlLineBreakClass }, //LATIN LETTER SMALL CAPITAL A
1.669 + { 0x1dc0, 0x1dcb, MLineBreaker::ECmLineBreakClass }, //COMBINING DOTTED GRAVE ACCENT
1.670 + { 0x1dfe, 0x1e00, MLineBreaker::ECmLineBreakClass }, //COMBINING LEFT ARROWHEAD ABOVE
1.671 + { 0x1e00, 0x1e9c, MLineBreaker::EAlLineBreakClass }, //latin capital letter a with ring below
1.672 + { 0x1ea0, 0x1efa, MLineBreaker::EAlLineBreakClass }, //latin capital letter a with dot below
1.673 + { 0x1f00, 0x1f16, MLineBreaker::EAlLineBreakClass }, //greek small letter alpha with psili
1.674 + { 0x1f18, 0x1f1e, MLineBreaker::EAlLineBreakClass }, //greek capital letter epsilon with psili
1.675 + { 0x1f20, 0x1f46, MLineBreaker::EAlLineBreakClass }, //greek small letter eta with psili
1.676 + { 0x1f48, 0x1f4e, MLineBreaker::EAlLineBreakClass }, //greek capital letter omicron with psili
1.677 + { 0x1f50, 0x1f58, MLineBreaker::EAlLineBreakClass }, //greek small letter upsilon with psili
1.678 + { 0x1f59, 0x1f5a, MLineBreaker::EAlLineBreakClass }, //greek capital letter upsilon with dasia
1.679 + { 0x1f5b, 0x1f5c, MLineBreaker::EAlLineBreakClass }, //greek capital letter upsilon with dasia and varia
1.680 + { 0x1f5d, 0x1f5e, MLineBreaker::EAlLineBreakClass }, //greek capital letter upsilon with dasia and oxia
1.681 + { 0x1f5f, 0x1f7e, MLineBreaker::EAlLineBreakClass }, //greek capital letter upsilon with dasia and perispomeni
1.682 + { 0x1f80, 0x1fb5, MLineBreaker::EAlLineBreakClass }, //greek small letter alpha with psili and ypogegrammeni
1.683 + { 0x1fb6, 0x1fc5, MLineBreaker::EAlLineBreakClass }, //greek small letter alpha with perispomeni
1.684 + { 0x1fc6, 0x1fd4, MLineBreaker::EAlLineBreakClass }, //greek small letter eta with perispomeni
1.685 + { 0x1fd6, 0x1fdc, MLineBreaker::EAlLineBreakClass }, //greek small letter iota with perispomeni
1.686 + { 0x1fdd, 0x1ff0, MLineBreaker::EAlLineBreakClass }, //greek dasia and varia
1.687 + { 0x1ff2, 0x1ff5, MLineBreaker::EAlLineBreakClass }, //greek small letter omega with varia and ypogegrammeni
1.688 + { 0x1ff6, 0x1fff, MLineBreaker::EAlLineBreakClass }, //greek small letter omega with perispomeni
1.689 + { 0x2000, 0x2007, MLineBreaker::EBaLineBreakClass }, //en quad
1.690 + { 0x2007, 0x2008, MLineBreaker::EGlLineBreakClass }, //figure space
1.691 + { 0x2008, 0x200b, MLineBreaker::EBaLineBreakClass }, //punctuation space
1.692 + { 0x200b, 0x200c, MLineBreaker::EZwLineBreakClass }, //zero width space
1.693 + { 0x200c, 0x2010, MLineBreaker::ECmLineBreakClass }, //zero width non-joiner
1.694 + { 0x2010, 0x2011, MLineBreaker::EBaLineBreakClass }, //hyphen
1.695 + { 0x2011, 0x2012, MLineBreaker::EGlLineBreakClass }, //non-breaking hyphen
1.696 + { 0x2012, 0x2014, MLineBreaker::EBaLineBreakClass }, //figure dash
1.697 + { 0x2014, 0x2015, MLineBreaker::EB2LineBreakClass }, //em dash
1.698 + { 0x2015, 0x2016, MLineBreaker::EAlLineBreakClass }, //horizontal bar
1.699 + { 0x2016, 0x2017, MLineBreaker::EAiLineBreakClass }, //double vertical line
1.700 + { 0x2017, 0x2018, MLineBreaker::EAlLineBreakClass }, //double low line
1.701 + { 0x2018, 0x201a, MLineBreaker::EQuLineBreakClass }, //left single quotation mark
1.702 + { 0x201a, 0x201b, MLineBreaker::EOpLineBreakClass }, //single low-9 quotation mark
1.703 + { 0x201b, 0x201e, MLineBreaker::EQuLineBreakClass }, //single high-reversed-9 quotation mark
1.704 + { 0x201e, 0x201f, MLineBreaker::EOpLineBreakClass }, //double low-9 quotation mark
1.705 + { 0x201f, 0x2020, MLineBreaker::EQuLineBreakClass }, //double high-reversed-9 quotation mark
1.706 + { 0x2020, 0x2022, MLineBreaker::EAiLineBreakClass }, //dagger
1.707 + { 0x2022, 0x2024, MLineBreaker::EAlLineBreakClass }, //bullet
1.708 + { 0x2024, 0x2027, MLineBreaker::EInLineBreakClass }, //one dot leader
1.709 + { 0x2027, 0x2028, MLineBreaker::EBaLineBreakClass }, //hyphenation point
1.710 + { 0x2028, 0x202a, MLineBreaker::EBkLineBreakClass }, //line separator
1.711 + { 0x202a, 0x202f, MLineBreaker::ECmLineBreakClass }, //left-to-right embedding
1.712 + { 0x202f, 0x2030, MLineBreaker::EGlLineBreakClass }, //narrow no-break space
1.713 + { 0x2030, 0x2038, MLineBreaker::EPoLineBreakClass }, //per mille sign
1.714 + { 0x2038, 0x2039, MLineBreaker::EAlLineBreakClass }, //caret
1.715 + { 0x2039, 0x203b, MLineBreaker::EQuLineBreakClass }, //single left-pointing angle quotation mark
1.716 + { 0x203b, 0x203c, MLineBreaker::EAiLineBreakClass }, //reference mark
1.717 + { 0x203c, 0x203d, MLineBreaker::ENsLineBreakClass }, //double exclamation mark
1.718 + { 0x203d, 0x2044, MLineBreaker::EAlLineBreakClass }, //interrobang
1.719 + { 0x2044, 0x2045, MLineBreaker::ENsLineBreakClass }, //fraction slash
1.720 + { 0x2045, 0x2046, MLineBreaker::EOpLineBreakClass }, //left square bracket with quill
1.721 + { 0x2046, 0x2047, MLineBreaker::EClLineBreakClass }, //right square bracket with quill
1.722 + { 0x2047, 0x2048, MLineBreaker::ENsLineBreakClass }, //DOUBLE QUESTION MARK
1.723 + { 0x2048, 0x2056, MLineBreaker::EAlLineBreakClass }, //question exclamation mark
1.724 + { 0x2056, 0x2057, MLineBreaker::EBaLineBreakClass }, //THREE DOT PUNCTUATION
1.725 + { 0x2057, 0x2058, MLineBreaker::EAlLineBreakClass }, //QUADRUPLE PRIME
1.726 + { 0x2058, 0x205c, MLineBreaker::EBaLineBreakClass }, //FOUR DOT PUNCTUATION
1.727 + { 0x205c, 0x205d, MLineBreaker::EAlLineBreakClass }, //DOTTED CROSS
1.728 + { 0x205d, 0x2060, MLineBreaker::EBaLineBreakClass }, //TRICOLON
1.729 + { 0x2060, 0x2061, MLineBreaker::EGlLineBreakClass }, //WORD JOINER
1.730 + { 0x2061, 0x2064, MLineBreaker::EAlLineBreakClass }, //FUNCTION APPLICATION
1.731 + { 0x206a, 0x2070, MLineBreaker::ECmLineBreakClass }, //inhibit symmetric swapping
1.732 + { 0x2070, 0x2071, MLineBreaker::EAlLineBreakClass }, //superscript zero
1.733 + { 0x2071, 0x2072, MLineBreaker::EAlLineBreakClass }, //SUPERSCRIPT LATIN SMALL LETTER I
1.734 + { 0x2074, 0x2075, MLineBreaker::EAiLineBreakClass }, //superscript four
1.735 + { 0x2075, 0x207d, MLineBreaker::EAlLineBreakClass }, //superscript five
1.736 + { 0x207d, 0x207e, MLineBreaker::EOpLineBreakClass }, //superscript left parenthesis
1.737 + { 0x207e, 0x207f, MLineBreaker::EClLineBreakClass }, //superscript right parenthesis
1.738 + { 0x207f, 0x2080, MLineBreaker::EAiLineBreakClass }, //superscript latin small letter n
1.739 + { 0x2080, 0x2081, MLineBreaker::EAlLineBreakClass }, //subscript zero
1.740 + { 0x2081, 0x2085, MLineBreaker::EAiLineBreakClass }, //subscript one
1.741 + { 0x2085, 0x208d, MLineBreaker::EAlLineBreakClass }, //subscript five
1.742 + { 0x208d, 0x208e, MLineBreaker::EOpLineBreakClass }, //subscript left parenthesis
1.743 + { 0x208e, 0x208f, MLineBreaker::EClLineBreakClass }, //subscript right parenthesis
1.744 + { 0x2090, 0x2095, MLineBreaker::EAlLineBreakClass }, //LATIN SUBSCRIPT SMALL LETTER A
1.745 + { 0x20a0, 0x20a7, MLineBreaker::EPrLineBreakClass }, //euro-currency sign
1.746 + { 0x20a7, 0x20a8, MLineBreaker::EPoLineBreakClass }, //peseta sign
1.747 + { 0x20a8, 0x20b6, MLineBreaker::EPrLineBreakClass }, //rupee sign
1.748 + { 0x20d0, 0x20f0, MLineBreaker::ECmLineBreakClass }, //combining left harpoon above
1.749 + { 0x2100, 0x2103, MLineBreaker::EAlLineBreakClass }, //account of
1.750 + { 0x2103, 0x2104, MLineBreaker::EPoLineBreakClass }, //degree celsius
1.751 + { 0x2104, 0x2105, MLineBreaker::EAlLineBreakClass }, //centre line symbol
1.752 + { 0x2105, 0x2106, MLineBreaker::EAiLineBreakClass }, //care of
1.753 + { 0x2106, 0x2109, MLineBreaker::EAlLineBreakClass }, //cada una
1.754 + { 0x2109, 0x210a, MLineBreaker::EPoLineBreakClass }, //degree fahrenheit
1.755 + { 0x210a, 0x2113, MLineBreaker::EAlLineBreakClass }, //script small g
1.756 + { 0x2113, 0x2114, MLineBreaker::EAiLineBreakClass }, //script small l
1.757 + { 0x2114, 0x2116, MLineBreaker::EAlLineBreakClass }, //l b bar symbol
1.758 + { 0x2116, 0x2117, MLineBreaker::EPrLineBreakClass }, //numero sign
1.759 + { 0x2117, 0x2121, MLineBreaker::EAlLineBreakClass }, //sound recording copyright
1.760 + { 0x2121, 0x2123, MLineBreaker::EAiLineBreakClass }, //telephone sign
1.761 + { 0x2123, 0x2126, MLineBreaker::EAlLineBreakClass }, //versicle
1.762 + { 0x2126, 0x2127, MLineBreaker::EPoLineBreakClass }, //ohm sign
1.763 + { 0x2127, 0x212b, MLineBreaker::EAlLineBreakClass }, //inverted ohm sign
1.764 + { 0x212b, 0x212c, MLineBreaker::EAiLineBreakClass }, //angstrom sign
1.765 + { 0x212c, 0x214f, MLineBreaker::EAlLineBreakClass }, //script capital b
1.766 + { 0x2153, 0x2154, MLineBreaker::EAlLineBreakClass }, //vulgar fraction one third
1.767 + { 0x2154, 0x2156, MLineBreaker::EAiLineBreakClass }, //vulgar fraction two thirds
1.768 + { 0x2156, 0x215b, MLineBreaker::EAlLineBreakClass }, //vulgar fraction two fifths
1.769 + { 0x215b, 0x215c, MLineBreaker::EAiLineBreakClass }, //vulgar fraction one eighth
1.770 + { 0x215c, 0x215e, MLineBreaker::EAlLineBreakClass }, //vulgar fraction three eighths
1.771 + { 0x215e, 0x215f, MLineBreaker::EAiLineBreakClass }, //vulgar fraction seven eighths
1.772 + { 0x215f, 0x2160, MLineBreaker::EAlLineBreakClass }, //fraction numerator one
1.773 + { 0x2160, 0x216c, MLineBreaker::EAiLineBreakClass }, //roman numeral one
1.774 + { 0x216c, 0x2170, MLineBreaker::EAlLineBreakClass }, //roman numeral fifty
1.775 + { 0x2170, 0x217a, MLineBreaker::EAiLineBreakClass }, //small roman numeral one
1.776 + { 0x217a, 0x2185, MLineBreaker::EAlLineBreakClass }, //small roman numeral eleven
1.777 + { 0x2190, 0x219a, MLineBreaker::EAiLineBreakClass }, //leftwards arrow
1.778 + { 0x219a, 0x21d2, MLineBreaker::EAlLineBreakClass }, //leftwards arrow with stroke
1.779 + { 0x21d2, 0x21d3, MLineBreaker::EAiLineBreakClass }, //rightwards double arrow
1.780 + { 0x21d3, 0x21d4, MLineBreaker::EAlLineBreakClass }, //downwards double arrow
1.781 + { 0x21d4, 0x21d5, MLineBreaker::EAiLineBreakClass }, //left right double arrow
1.782 + { 0x21d5, 0x2200, MLineBreaker::EAlLineBreakClass }, //up down double arrow
1.783 + { 0x2200, 0x2201, MLineBreaker::EAiLineBreakClass }, //for all
1.784 + { 0x2201, 0x2202, MLineBreaker::EAlLineBreakClass }, //complement
1.785 + { 0x2202, 0x2204, MLineBreaker::EAiLineBreakClass }, //partial differential
1.786 + { 0x2204, 0x2207, MLineBreaker::EAlLineBreakClass }, //there does not exist
1.787 + { 0x2207, 0x2209, MLineBreaker::EAiLineBreakClass }, //nabla
1.788 + { 0x2209, 0x220b, MLineBreaker::EAlLineBreakClass }, //not an element of
1.789 + { 0x220b, 0x220c, MLineBreaker::EAiLineBreakClass }, //contains as member
1.790 + { 0x220c, 0x220f, MLineBreaker::EAlLineBreakClass }, //does not contain as member
1.791 + { 0x220f, 0x2210, MLineBreaker::EAiLineBreakClass }, //n-ary product
1.792 + { 0x2210, 0x2211, MLineBreaker::EAlLineBreakClass }, //n-ary coproduct
1.793 + { 0x2211, 0x2212, MLineBreaker::EAiLineBreakClass }, //n-ary summation
1.794 + { 0x2212, 0x2214, MLineBreaker::EPrLineBreakClass }, //minus sign
1.795 + { 0x2214, 0x2215, MLineBreaker::EAlLineBreakClass }, //dot plus
1.796 + { 0x2215, 0x2216, MLineBreaker::EAiLineBreakClass }, //division slash
1.797 + { 0x2216, 0x221a, MLineBreaker::EAlLineBreakClass }, //set minus
1.798 + { 0x221a, 0x221b, MLineBreaker::EAiLineBreakClass }, //square root
1.799 + { 0x221b, 0x221d, MLineBreaker::EAlLineBreakClass }, //cube root
1.800 + { 0x221d, 0x2221, MLineBreaker::EAiLineBreakClass }, //proportional to
1.801 + { 0x2221, 0x2223, MLineBreaker::EAlLineBreakClass }, //measured angle
1.802 + { 0x2223, 0x2224, MLineBreaker::EAiLineBreakClass }, //divides
1.803 + { 0x2224, 0x2225, MLineBreaker::EAlLineBreakClass }, //does not divide
1.804 + { 0x2225, 0x2226, MLineBreaker::EAiLineBreakClass }, //parallel to
1.805 + { 0x2226, 0x2227, MLineBreaker::EAlLineBreakClass }, //not parallel to
1.806 + { 0x2227, 0x222d, MLineBreaker::EAiLineBreakClass }, //logical and
1.807 + { 0x222d, 0x222e, MLineBreaker::EAlLineBreakClass }, //triple integral
1.808 + { 0x222e, 0x222f, MLineBreaker::EAiLineBreakClass }, //contour integral
1.809 + { 0x222f, 0x2234, MLineBreaker::EAlLineBreakClass }, //surface integral
1.810 + { 0x2234, 0x2238, MLineBreaker::EAiLineBreakClass }, //therefore
1.811 + { 0x2238, 0x223c, MLineBreaker::EAlLineBreakClass }, //dot minus
1.812 + { 0x223c, 0x223e, MLineBreaker::EAiLineBreakClass }, //tilde operator
1.813 + { 0x223e, 0x2248, MLineBreaker::EAlLineBreakClass }, //inverted lazy s
1.814 + { 0x2248, 0x2249, MLineBreaker::EAiLineBreakClass }, //almost equal to
1.815 + { 0x2249, 0x224c, MLineBreaker::EAlLineBreakClass }, //not almost equal to
1.816 + { 0x224c, 0x224d, MLineBreaker::EAiLineBreakClass }, //all equal to
1.817 + { 0x224d, 0x2252, MLineBreaker::EAlLineBreakClass }, //equivalent to
1.818 + { 0x2252, 0x2253, MLineBreaker::EAiLineBreakClass }, //approximately equal to or the image of
1.819 + { 0x2253, 0x2260, MLineBreaker::EAlLineBreakClass }, //image of or approximately equal to
1.820 + { 0x2260, 0x2262, MLineBreaker::EAiLineBreakClass }, //not equal to
1.821 + { 0x2262, 0x2264, MLineBreaker::EAlLineBreakClass }, //not identical to
1.822 + { 0x2264, 0x2268, MLineBreaker::EAiLineBreakClass }, //less-than or equal to
1.823 + { 0x2268, 0x226a, MLineBreaker::EAlLineBreakClass }, //less-than but not equal to
1.824 + { 0x226a, 0x226c, MLineBreaker::EAiLineBreakClass }, //much less-than
1.825 + { 0x226c, 0x226e, MLineBreaker::EAlLineBreakClass }, //between
1.826 + { 0x226e, 0x2270, MLineBreaker::EAiLineBreakClass }, //not less-than
1.827 + { 0x2270, 0x2282, MLineBreaker::EAlLineBreakClass }, //neither less-than nor equal to
1.828 + { 0x2282, 0x2284, MLineBreaker::EAiLineBreakClass }, //subset of
1.829 + { 0x2284, 0x2286, MLineBreaker::EAlLineBreakClass }, //not a subset of
1.830 + { 0x2286, 0x2288, MLineBreaker::EAiLineBreakClass }, //subset of or equal to
1.831 + { 0x2288, 0x2295, MLineBreaker::EAlLineBreakClass }, //neither a subset of nor equal to
1.832 + { 0x2295, 0x2296, MLineBreaker::EAiLineBreakClass }, //circled plus
1.833 + { 0x2296, 0x2299, MLineBreaker::EAlLineBreakClass }, //circled minus
1.834 + { 0x2299, 0x229a, MLineBreaker::EAiLineBreakClass }, //circled dot operator
1.835 + { 0x229a, 0x22a5, MLineBreaker::EAlLineBreakClass }, //circled ring operator
1.836 + { 0x22a5, 0x22a6, MLineBreaker::EAiLineBreakClass }, //up tack
1.837 + { 0x22a6, 0x22bf, MLineBreaker::EAlLineBreakClass }, //assertion
1.838 + { 0x22bf, 0x22c0, MLineBreaker::EAiLineBreakClass }, //right triangle
1.839 + { 0x22c0, 0x2312, MLineBreaker::EAlLineBreakClass }, //n-ary logical and
1.840 + { 0x2312, 0x2313, MLineBreaker::EAiLineBreakClass }, //arc
1.841 + { 0x2313, 0x2329, MLineBreaker::EAlLineBreakClass }, //segment
1.842 + { 0x2329, 0x232a, MLineBreaker::EOpLineBreakClass }, //left-pointing angle bracket
1.843 + { 0x232a, 0x232b, MLineBreaker::EClLineBreakClass }, //right-pointing angle bracket
1.844 + { 0x232b, 0x23e8, MLineBreaker::EAlLineBreakClass }, //erase to the left
1.845 + { 0x2400, 0x2427, MLineBreaker::EAlLineBreakClass }, //symbol for null
1.846 + { 0x2440, 0x244b, MLineBreaker::EAlLineBreakClass }, //ocr hook
1.847 + { 0x2460, 0x24c0, MLineBreaker::EAiLineBreakClass }, //circled digit one
1.848 + { 0x24c0, 0x24d0, MLineBreaker::EAlLineBreakClass }, //circled latin capital letter k
1.849 + { 0x24d0, 0x24ea, MLineBreaker::EAiLineBreakClass }, //circled latin small letter a
1.850 + { 0x24ea, 0x24eb, MLineBreaker::EAlLineBreakClass }, //circled digit zero
1.851 + { 0x24eb, 0x24ff, MLineBreaker::EAiLineBreakClass }, //NEGATIVE CIRCLED NUMBER ELEVEN
1.852 + { 0x24ff, 0x2500, MLineBreaker::EAlLineBreakClass }, //NEGATIVE CIRCLED DIGIT ZERO
1.853 + { 0x2500, 0x254c, MLineBreaker::EAiLineBreakClass }, //box drawings light horizontal
1.854 + { 0x254c, 0x2550, MLineBreaker::EAlLineBreakClass }, //box drawings light double dash horizontal
1.855 + { 0x2550, 0x2575, MLineBreaker::EAiLineBreakClass }, //box drawings double horizontal
1.856 + { 0x2575, 0x2580, MLineBreaker::EAlLineBreakClass }, //box drawings light up
1.857 + { 0x2580, 0x2590, MLineBreaker::EAiLineBreakClass }, //upper half block
1.858 + { 0x2590, 0x2592, MLineBreaker::EAlLineBreakClass }, //right half block
1.859 + { 0x2592, 0x2596, MLineBreaker::EAiLineBreakClass }, //medium shade
1.860 + { 0x2596, 0x25a0, MLineBreaker::EAlLineBreakClass }, //QUADRANT LOWER LEFT
1.861 + { 0x25a0, 0x25a2, MLineBreaker::EAiLineBreakClass }, //black square
1.862 + { 0x25a2, 0x25a3, MLineBreaker::EAlLineBreakClass }, //white square with rounded corners
1.863 + { 0x25a3, 0x25aa, MLineBreaker::EAiLineBreakClass }, //white square containing black small square
1.864 + { 0x25aa, 0x25b2, MLineBreaker::EAlLineBreakClass }, //black small square
1.865 + { 0x25b2, 0x25b4, MLineBreaker::EAiLineBreakClass }, //black up-pointing triangle
1.866 + { 0x25b4, 0x25b6, MLineBreaker::EAlLineBreakClass }, //black up-pointing small triangle
1.867 + { 0x25b6, 0x25b8, MLineBreaker::EAiLineBreakClass }, //black right-pointing triangle
1.868 + { 0x25b8, 0x25bc, MLineBreaker::EAlLineBreakClass }, //black right-pointing small triangle
1.869 + { 0x25bc, 0x25be, MLineBreaker::EAiLineBreakClass }, //black down-pointing triangle
1.870 + { 0x25be, 0x25c0, MLineBreaker::EAlLineBreakClass }, //black down-pointing small triangle
1.871 + { 0x25c0, 0x25c2, MLineBreaker::EAiLineBreakClass }, //black left-pointing triangle
1.872 + { 0x25c2, 0x25c6, MLineBreaker::EAlLineBreakClass }, //black left-pointing small triangle
1.873 + { 0x25c6, 0x25c8, MLineBreaker::EAiLineBreakClass }, //black diamond
1.874 + { 0x25c8, 0x25cb, MLineBreaker::EAlLineBreakClass }, //white diamond containing black small diamond
1.875 + { 0x25cb, 0x25cc, MLineBreaker::EAiLineBreakClass }, //white circle
1.876 + { 0x25cc, 0x25ce, MLineBreaker::EAlLineBreakClass }, //dotted circle
1.877 + { 0x25ce, 0x25d2, MLineBreaker::EAiLineBreakClass }, //bullseye
1.878 + { 0x25d2, 0x25e2, MLineBreaker::EAlLineBreakClass }, //circle with lower half black
1.879 + { 0x25e2, 0x25e6, MLineBreaker::EAiLineBreakClass }, //black lower right triangle
1.880 + { 0x25e6, 0x25ef, MLineBreaker::EAlLineBreakClass }, //white bullet
1.881 + { 0x25ef, 0x25f0, MLineBreaker::EAiLineBreakClass }, //large circle
1.882 + { 0x25f0, 0x2605, MLineBreaker::EAlLineBreakClass }, //white square with upper left quadrant
1.883 + { 0x2605, 0x2607, MLineBreaker::EAiLineBreakClass }, //black star
1.884 + { 0x2607, 0x2609, MLineBreaker::EAlLineBreakClass }, //lightning
1.885 + { 0x2609, 0x260a, MLineBreaker::EAiLineBreakClass }, //sun
1.886 + { 0x260a, 0x260e, MLineBreaker::EAlLineBreakClass }, //ascending node
1.887 + { 0x260e, 0x2610, MLineBreaker::EAiLineBreakClass }, //black telephone
1.888 + { 0x2610, 0x2614, MLineBreaker::EAlLineBreakClass }, //ballot box
1.889 + { 0x2614, 0x2618, MLineBreaker::EAiLineBreakClass }, //UMBRELLA WITH RAIN DROPS
1.890 + { 0x2618, 0x261c, MLineBreaker::EAlLineBreakClass }, //SHAMROCK
1.891 + { 0x261c, 0x261d, MLineBreaker::EAiLineBreakClass }, //white left pointing index
1.892 + { 0x261d, 0x261e, MLineBreaker::EAlLineBreakClass }, //white up pointing index
1.893 + { 0x261e, 0x261f, MLineBreaker::EAiLineBreakClass }, //white right pointing index
1.894 + { 0x261f, 0x2640, MLineBreaker::EAlLineBreakClass }, //white down pointing index
1.895 + { 0x2640, 0x2641, MLineBreaker::EAiLineBreakClass }, //female sign
1.896 + { 0x2641, 0x2642, MLineBreaker::EAlLineBreakClass }, //earth
1.897 + { 0x2642, 0x2643, MLineBreaker::EAiLineBreakClass }, //male sign
1.898 + { 0x2643, 0x2660, MLineBreaker::EAlLineBreakClass }, //jupiter
1.899 + { 0x2660, 0x2662, MLineBreaker::EAiLineBreakClass }, //black spade suit
1.900 + { 0x2662, 0x2663, MLineBreaker::EAlLineBreakClass }, //white diamond suit
1.901 + { 0x2663, 0x2666, MLineBreaker::EAiLineBreakClass }, //black club suit
1.902 + { 0x2666, 0x2667, MLineBreaker::EAlLineBreakClass }, //black diamond suit
1.903 + { 0x2667, 0x266b, MLineBreaker::EAiLineBreakClass }, //white club suit
1.904 + { 0x266b, 0x266c, MLineBreaker::EAlLineBreakClass }, //beamed eighth notes
1.905 + { 0x266c, 0x266e, MLineBreaker::EAiLineBreakClass }, //beamed sixteenth notes
1.906 + { 0x266e, 0x266f, MLineBreaker::EAlLineBreakClass }, //music natural sign
1.907 + { 0x266f, 0x2670, MLineBreaker::EAiLineBreakClass }, //music sharp sign
1.908 + { 0x2670, 0x269d, MLineBreaker::EAlLineBreakClass }, //west syriac cross
1.909 + { 0x26a0, 0x26b3, MLineBreaker::EAlLineBreakClass }, //WARNING SIGN
1.910 + { 0x2701, 0x2705, MLineBreaker::EAlLineBreakClass }, //upper blade scissors
1.911 + { 0x2706, 0x270a, MLineBreaker::EAlLineBreakClass }, //telephone location sign
1.912 + { 0x270c, 0x2728, MLineBreaker::EAlLineBreakClass }, //victory hand
1.913 + { 0x2729, 0x274c, MLineBreaker::EAlLineBreakClass }, //stress outlined white star
1.914 + { 0x274d, 0x274e, MLineBreaker::EAlLineBreakClass }, //shadowed white circle
1.915 + { 0x274f, 0x2753, MLineBreaker::EAlLineBreakClass }, //lower right drop-shadowed white square
1.916 + { 0x2756, 0x2757, MLineBreaker::EAlLineBreakClass }, //black diamond minus white x
1.917 + { 0x2758, 0x275f, MLineBreaker::EAlLineBreakClass }, //light vertical bar
1.918 + { 0x2761, 0x2768, MLineBreaker::EAlLineBreakClass }, //curved stem paragraph sign ornament
1.919 + { 0x2768, 0x2769, MLineBreaker::EOpLineBreakClass }, //MEDIUM LEFT PARENTHESIS ORNAMENT
1.920 + { 0x2769, 0x276a, MLineBreaker::EClLineBreakClass }, //MEDIUM RIGHT PARENTHESIS ORNAMENT
1.921 + { 0x276a, 0x276b, MLineBreaker::EOpLineBreakClass }, //MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
1.922 + { 0x276b, 0x276c, MLineBreaker::EClLineBreakClass }, //MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
1.923 + { 0x276c, 0x276d, MLineBreaker::EOpLineBreakClass }, //MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
1.924 + { 0x276d, 0x276e, MLineBreaker::EClLineBreakClass }, //MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
1.925 + { 0x276e, 0x276f, MLineBreaker::EOpLineBreakClass }, //HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
1.926 + { 0x276f, 0x2770, MLineBreaker::EClLineBreakClass }, //HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
1.927 + { 0x2770, 0x2771, MLineBreaker::EOpLineBreakClass }, //HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
1.928 + { 0x2771, 0x2772, MLineBreaker::EClLineBreakClass }, //HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
1.929 + { 0x2772, 0x2773, MLineBreaker::EOpLineBreakClass }, //LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
1.930 + { 0x2773, 0x2774, MLineBreaker::EClLineBreakClass }, //LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
1.931 + { 0x2774, 0x2775, MLineBreaker::EOpLineBreakClass }, //MEDIUM LEFT CURLY BRACKET ORNAMENT
1.932 + { 0x2775, 0x2776, MLineBreaker::EClLineBreakClass }, //MEDIUM RIGHT CURLY BRACKET ORNAMENT
1.933 + { 0x2776, 0x2795, MLineBreaker::EAlLineBreakClass }, //dingbat negative circled digit one
1.934 + { 0x2798, 0x27b0, MLineBreaker::EAlLineBreakClass }, //heavy south east arrow
1.935 + { 0x27b1, 0x27bf, MLineBreaker::EAlLineBreakClass }, //notched upper right-shadowed white rightwards arrow
1.936 + { 0x27c0, 0x27c5, MLineBreaker::EAlLineBreakClass }, //THREE DIMENSIONAL ANGLE
1.937 + { 0x27c5, 0x27c6, MLineBreaker::EOpLineBreakClass }, //LEFT S-SHAPED BAG DELIMITER
1.938 + { 0x27c6, 0x27c7, MLineBreaker::EClLineBreakClass }, //RIGHT S-SHAPED BAG DELIMITER
1.939 + { 0x27c7, 0x27cb, MLineBreaker::EAlLineBreakClass }, //OR WITH DOT INSIDE
1.940 + { 0x27d0, 0x27e6, MLineBreaker::EAlLineBreakClass }, //WHITE DIAMOND WITH CENTRED DOT
1.941 + { 0x27e6, 0x27e7, MLineBreaker::EOpLineBreakClass }, //MATHEMATICAL LEFT WHITE SQUARE BRACKET
1.942 + { 0x27e7, 0x27e8, MLineBreaker::EClLineBreakClass }, //MATHEMATICAL RIGHT WHITE SQUARE BRACKET
1.943 + { 0x27e8, 0x27e9, MLineBreaker::EOpLineBreakClass }, //MATHEMATICAL LEFT ANGLE BRACKET
1.944 + { 0x27e9, 0x27ea, MLineBreaker::EClLineBreakClass }, //MATHEMATICAL RIGHT ANGLE BRACKET
1.945 + { 0x27ea, 0x27eb, MLineBreaker::EOpLineBreakClass }, //MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
1.946 + { 0x27eb, 0x27ec, MLineBreaker::EClLineBreakClass }, //MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
1.947 + { 0x27f0, 0x2983, MLineBreaker::EAlLineBreakClass }, //UPWARDS QUADRUPLE ARROW
1.948 + { 0x2983, 0x2984, MLineBreaker::EOpLineBreakClass }, //LEFT WHITE CURLY BRACKET
1.949 + { 0x2984, 0x2985, MLineBreaker::EClLineBreakClass }, //RIGHT WHITE CURLY BRACKET
1.950 + { 0x2985, 0x2986, MLineBreaker::EOpLineBreakClass }, //LEFT WHITE PARENTHESIS
1.951 + { 0x2986, 0x2987, MLineBreaker::EClLineBreakClass }, //RIGHT WHITE PARENTHESIS
1.952 + { 0x2987, 0x2988, MLineBreaker::EOpLineBreakClass }, //Z NOTATION LEFT IMAGE BRACKET
1.953 + { 0x2988, 0x2989, MLineBreaker::EClLineBreakClass }, //Z NOTATION RIGHT IMAGE BRACKET
1.954 + { 0x2989, 0x298a, MLineBreaker::EOpLineBreakClass }, //Z NOTATION LEFT BINDING BRACKET
1.955 + { 0x298a, 0x298b, MLineBreaker::EClLineBreakClass }, //Z NOTATION RIGHT BINDING BRACKET
1.956 + { 0x298b, 0x298c, MLineBreaker::EOpLineBreakClass }, //LEFT SQUARE BRACKET WITH UNDERBAR
1.957 + { 0x298c, 0x298d, MLineBreaker::EClLineBreakClass }, //RIGHT SQUARE BRACKET WITH UNDERBAR
1.958 + { 0x298d, 0x298e, MLineBreaker::EOpLineBreakClass }, //LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
1.959 + { 0x298e, 0x298f, MLineBreaker::EClLineBreakClass }, //RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
1.960 + { 0x298f, 0x2990, MLineBreaker::EOpLineBreakClass }, //LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
1.961 + { 0x2990, 0x2991, MLineBreaker::EClLineBreakClass }, //RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
1.962 + { 0x2991, 0x2992, MLineBreaker::EOpLineBreakClass }, //LEFT ANGLE BRACKET WITH DOT
1.963 + { 0x2992, 0x2993, MLineBreaker::EClLineBreakClass }, //RIGHT ANGLE BRACKET WITH DOT
1.964 + { 0x2993, 0x2994, MLineBreaker::EOpLineBreakClass }, //LEFT ARC LESS-THAN BRACKET
1.965 + { 0x2994, 0x2995, MLineBreaker::EClLineBreakClass }, //RIGHT ARC GREATER-THAN BRACKET
1.966 + { 0x2995, 0x2996, MLineBreaker::EOpLineBreakClass }, //DOUBLE LEFT ARC GREATER-THAN BRACKET
1.967 + { 0x2996, 0x2997, MLineBreaker::EClLineBreakClass }, //DOUBLE RIGHT ARC LESS-THAN BRACKET
1.968 + { 0x2997, 0x2998, MLineBreaker::EOpLineBreakClass }, //LEFT BLACK TORTOISE SHELL BRACKET
1.969 + { 0x2998, 0x2999, MLineBreaker::EClLineBreakClass }, //RIGHT BLACK TORTOISE SHELL BRACKET
1.970 + { 0x2999, 0x29d8, MLineBreaker::EAlLineBreakClass }, //DOTTED FENCE
1.971 + { 0x29d8, 0x29d9, MLineBreaker::EOpLineBreakClass }, //LEFT WIGGLY FENCE
1.972 + { 0x29d9, 0x29da, MLineBreaker::EClLineBreakClass }, //RIGHT WIGGLY FENCE
1.973 + { 0x29da, 0x29db, MLineBreaker::EOpLineBreakClass }, //LEFT DOUBLE WIGGLY FENCE
1.974 + { 0x29db, 0x29dc, MLineBreaker::EClLineBreakClass }, //RIGHT DOUBLE WIGGLY FENCE
1.975 + { 0x29dc, 0x29fc, MLineBreaker::EAlLineBreakClass }, //INCOMPLETE INFINITY
1.976 + { 0x29fc, 0x29fd, MLineBreaker::EOpLineBreakClass }, //LEFT-POINTING CURVED ANGLE BRACKET
1.977 + { 0x29fd, 0x29fe, MLineBreaker::EClLineBreakClass }, //RIGHT-POINTING CURVED ANGLE BRACKET
1.978 + { 0x29fe, 0x2b1b, MLineBreaker::EAlLineBreakClass }, //TINY
1.979 + { 0x2b20, 0x2b24, MLineBreaker::EAlLineBreakClass }, //WHITE PENTAGON
1.980 + { 0x2c00, 0x2c2f, MLineBreaker::EAlLineBreakClass }, //GLAGOLITIC CAPITAL LETTER AZU
1.981 + { 0x2c30, 0x2c5f, MLineBreaker::EAlLineBreakClass }, //GLAGOLITIC SMALL LETTER AZU
1.982 + { 0x2c60, 0x2c6d, MLineBreaker::EAlLineBreakClass }, //LATIN CAPITAL LETTER L WITH DOUBLE BAR
1.983 + { 0x2c74, 0x2c78, MLineBreaker::EAlLineBreakClass }, //LATIN SMALL LETTER V WITH CURL
1.984 + { 0x2c80, 0x2ceb, MLineBreaker::EAlLineBreakClass }, //COPTIC CAPITAL LETTER ALFA
1.985 + { 0x2cf9, 0x2cfd, MLineBreaker::EBaLineBreakClass }, //COPTIC OLD NUBIAN FULL STOP
1.986 + { 0x2cfd, 0x2cfe, MLineBreaker::EAlLineBreakClass }, //COPTIC FRACTION ONE HALF
1.987 + { 0x2cfe, 0x2d00, MLineBreaker::EBaLineBreakClass }, //COPTIC FULL STOP
1.988 + { 0x2d00, 0x2d26, MLineBreaker::EAlLineBreakClass }, //GEORGIAN SMALL LETTER AN
1.989 + { 0x2d30, 0x2d66, MLineBreaker::EAlLineBreakClass }, //TIFINAGH LETTER YA
1.990 + { 0x2d6f, 0x2d70, MLineBreaker::EAlLineBreakClass }, //TIFINAGH MODIFIER LETTER LABIALIZATION MARK
1.991 + { 0x2d80, 0x2d97, MLineBreaker::EAlLineBreakClass }, //ETHIOPIC SYLLABLE LOA
1.992 + { 0x2da0, 0x2da7, MLineBreaker::EAlLineBreakClass }, //ETHIOPIC SYLLABLE SSA
1.993 + { 0x2da8, 0x2daf, MLineBreaker::EAlLineBreakClass }, //ETHIOPIC SYLLABLE CCA
1.994 + { 0x2db0, 0x2db7, MLineBreaker::EAlLineBreakClass }, //ETHIOPIC SYLLABLE ZZA
1.995 + { 0x2db8, 0x2dbf, MLineBreaker::EAlLineBreakClass }, //ETHIOPIC SYLLABLE CCHA
1.996 + { 0x2dc0, 0x2dc7, MLineBreaker::EAlLineBreakClass }, //ETHIOPIC SYLLABLE QYA
1.997 + { 0x2dc8, 0x2dcf, MLineBreaker::EAlLineBreakClass }, //ETHIOPIC SYLLABLE KYA
1.998 + { 0x2dd0, 0x2dd7, MLineBreaker::EAlLineBreakClass }, //ETHIOPIC SYLLABLE XYA
1.999 + { 0x2dd8, 0x2ddf, MLineBreaker::EAlLineBreakClass }, //ETHIOPIC SYLLABLE GYA
1.1000 + { 0x2e00, 0x2e0e, MLineBreaker::EQuLineBreakClass }, //RIGHT ANGLE SUBSTITUTION MARKER
1.1001 + { 0x2e0e, 0x2e16, MLineBreaker::EBaLineBreakClass }, //EDITORIAL CORONIS
1.1002 + { 0x2e16, 0x2e17, MLineBreaker::EAlLineBreakClass }, //DOTTED RIGHT-POINTING ANGLE
1.1003 + { 0x2e17, 0x2e18, MLineBreaker::EBaLineBreakClass }, //DOUBLE OBLIQUE HYPHEN
1.1004 + { 0x2e1c, 0x2e1e, MLineBreaker::EQuLineBreakClass }, //LEFT LOW PARAPHRASE BRACKET
1.1005 + { 0x2e80, 0x2e9a, MLineBreaker::EIdLineBreakClass }, //cjk radical repeat
1.1006 + { 0x2e9b, 0x2ef4, MLineBreaker::EIdLineBreakClass }, //cjk radical choke
1.1007 + { 0x2f00, 0x2fd6, MLineBreaker::EIdLineBreakClass }, //kangxi radical one
1.1008 + { 0x2ff0, 0x2ffc, MLineBreaker::EIdLineBreakClass }, //ideographic description character left to right
1.1009 + { 0x3000, 0x3001, MLineBreaker::EIdLineBreakClass }, //ideographic space
1.1010 + { 0x3001, 0x3003, MLineBreaker::EClLineBreakClass }, //ideographic comma
1.1011 + { 0x3003, 0x3005, MLineBreaker::EIdLineBreakClass }, //ditto mark
1.1012 + { 0x3005, 0x3006, MLineBreaker::ENsLineBreakClass }, //ideographic iteration mark
1.1013 + { 0x3006, 0x3008, MLineBreaker::EIdLineBreakClass }, //ideographic closing mark
1.1014 + { 0x3008, 0x3009, MLineBreaker::EOpLineBreakClass }, //left angle bracket
1.1015 + { 0x3009, 0x300a, MLineBreaker::EClLineBreakClass }, //right angle bracket
1.1016 + { 0x300a, 0x300b, MLineBreaker::EOpLineBreakClass }, //left double angle bracket
1.1017 + { 0x300b, 0x300c, MLineBreaker::EClLineBreakClass }, //right double angle bracket
1.1018 + { 0x300c, 0x300d, MLineBreaker::EOpLineBreakClass }, //left corner bracket
1.1019 + { 0x300d, 0x300e, MLineBreaker::EClLineBreakClass }, //right corner bracket
1.1020 + { 0x300e, 0x300f, MLineBreaker::EOpLineBreakClass }, //left white corner bracket
1.1021 + { 0x300f, 0x3010, MLineBreaker::EClLineBreakClass }, //right white corner bracket
1.1022 + { 0x3010, 0x3011, MLineBreaker::EOpLineBreakClass }, //left black lenticular bracket
1.1023 + { 0x3011, 0x3012, MLineBreaker::EClLineBreakClass }, //right black lenticular bracket
1.1024 + { 0x3012, 0x3014, MLineBreaker::EIdLineBreakClass }, //postal mark
1.1025 + { 0x3014, 0x3015, MLineBreaker::EOpLineBreakClass }, //left tortoise shell bracket
1.1026 + { 0x3015, 0x3016, MLineBreaker::EClLineBreakClass }, //right tortoise shell bracket
1.1027 + { 0x3016, 0x3017, MLineBreaker::EOpLineBreakClass }, //left white lenticular bracket
1.1028 + { 0x3017, 0x3018, MLineBreaker::EClLineBreakClass }, //right white lenticular bracket
1.1029 + { 0x3018, 0x3019, MLineBreaker::EOpLineBreakClass }, //left white tortoise shell bracket
1.1030 + { 0x3019, 0x301a, MLineBreaker::EClLineBreakClass }, //right white tortoise shell bracket
1.1031 + { 0x301a, 0x301b, MLineBreaker::EOpLineBreakClass }, //left white square bracket
1.1032 + { 0x301b, 0x301c, MLineBreaker::EClLineBreakClass }, //right white square bracket
1.1033 + { 0x301c, 0x301d, MLineBreaker::ENsLineBreakClass }, //wave dash
1.1034 + { 0x301d, 0x301e, MLineBreaker::EOpLineBreakClass }, //reversed double prime quotation mark
1.1035 + { 0x301e, 0x3020, MLineBreaker::EClLineBreakClass }, //double prime quotation mark
1.1036 + { 0x3020, 0x302a, MLineBreaker::EIdLineBreakClass }, //postal mark face
1.1037 + { 0x302a, 0x3030, MLineBreaker::ECmLineBreakClass }, //ideographic level tone mark
1.1038 + { 0x3030, 0x303b, MLineBreaker::EIdLineBreakClass }, //wavy dash
1.1039 + { 0x303b, 0x303d, MLineBreaker::ENsLineBreakClass }, //VERTICAL IDEOGRAPHIC ITERATION MARK
1.1040 + { 0x303d, 0x3040, MLineBreaker::EIdLineBreakClass }, //PART ALTERNATION MARK
1.1041 + { 0x3041, 0x3042, MLineBreaker::ENsLineBreakClass }, //hiragana letter small a
1.1042 + { 0x3042, 0x3043, MLineBreaker::EIdLineBreakClass }, //hiragana letter a
1.1043 + { 0x3043, 0x3044, MLineBreaker::ENsLineBreakClass }, //hiragana letter small i
1.1044 + { 0x3044, 0x3045, MLineBreaker::EIdLineBreakClass }, //hiragana letter i
1.1045 + { 0x3045, 0x3046, MLineBreaker::ENsLineBreakClass }, //hiragana letter small u
1.1046 + { 0x3046, 0x3047, MLineBreaker::EIdLineBreakClass }, //hiragana letter u
1.1047 + { 0x3047, 0x3048, MLineBreaker::ENsLineBreakClass }, //hiragana letter small e
1.1048 + { 0x3048, 0x3049, MLineBreaker::EIdLineBreakClass }, //hiragana letter e
1.1049 + { 0x3049, 0x304a, MLineBreaker::ENsLineBreakClass }, //hiragana letter small o
1.1050 + { 0x304a, 0x3063, MLineBreaker::EIdLineBreakClass }, //hiragana letter o
1.1051 + { 0x3063, 0x3064, MLineBreaker::ENsLineBreakClass }, //hiragana letter small tu
1.1052 + { 0x3064, 0x3083, MLineBreaker::EIdLineBreakClass }, //hiragana letter tu
1.1053 + { 0x3083, 0x3084, MLineBreaker::ENsLineBreakClass }, //hiragana letter small ya
1.1054 + { 0x3084, 0x3085, MLineBreaker::EIdLineBreakClass }, //hiragana letter ya
1.1055 + { 0x3085, 0x3086, MLineBreaker::ENsLineBreakClass }, //hiragana letter small yu
1.1056 + { 0x3086, 0x3087, MLineBreaker::EIdLineBreakClass }, //hiragana letter yu
1.1057 + { 0x3087, 0x3088, MLineBreaker::ENsLineBreakClass }, //hiragana letter small yo
1.1058 + { 0x3088, 0x308e, MLineBreaker::EIdLineBreakClass }, //hiragana letter yo
1.1059 + { 0x308e, 0x308f, MLineBreaker::ENsLineBreakClass }, //hiragana letter small wa
1.1060 + { 0x308f, 0x3095, MLineBreaker::EIdLineBreakClass }, //hiragana letter wa
1.1061 + { 0x3095, 0x3097, MLineBreaker::ENsLineBreakClass }, //HIRAGANA LETTER SMALL KA
1.1062 + { 0x3099, 0x309b, MLineBreaker::ECmLineBreakClass }, //combining katakana-hiragana voiced sound mark
1.1063 + { 0x309b, 0x309f, MLineBreaker::ENsLineBreakClass }, //katakana-hiragana voiced sound mark
1.1064 + { 0x309f, 0x30a0, MLineBreaker::EIdLineBreakClass }, //HIRAGANA DIGRAPH YORI
1.1065 + { 0x30a0, 0x30a1, MLineBreaker::ENsLineBreakClass }, //KATAKANA-HIRAGANA DOUBLE HYPHEN
1.1066 + { 0x30a1, 0x30a2, MLineBreaker::ENsLineBreakClass }, //katakana letter small a
1.1067 + { 0x30a2, 0x30a3, MLineBreaker::EIdLineBreakClass }, //katakana letter a
1.1068 + { 0x30a3, 0x30a4, MLineBreaker::ENsLineBreakClass }, //katakana letter small i
1.1069 + { 0x30a4, 0x30a5, MLineBreaker::EIdLineBreakClass }, //katakana letter i
1.1070 + { 0x30a5, 0x30a6, MLineBreaker::ENsLineBreakClass }, //katakana letter small u
1.1071 + { 0x30a6, 0x30a7, MLineBreaker::EIdLineBreakClass }, //katakana letter u
1.1072 + { 0x30a7, 0x30a8, MLineBreaker::ENsLineBreakClass }, //katakana letter small e
1.1073 + { 0x30a8, 0x30a9, MLineBreaker::EIdLineBreakClass }, //katakana letter e
1.1074 + { 0x30a9, 0x30aa, MLineBreaker::ENsLineBreakClass }, //katakana letter small o
1.1075 + { 0x30aa, 0x30c3, MLineBreaker::EIdLineBreakClass }, //katakana letter o
1.1076 + { 0x30c3, 0x30c4, MLineBreaker::ENsLineBreakClass }, //katakana letter small tu
1.1077 + { 0x30c4, 0x30e3, MLineBreaker::EIdLineBreakClass }, //katakana letter tu
1.1078 + { 0x30e3, 0x30e4, MLineBreaker::ENsLineBreakClass }, //katakana letter small ya
1.1079 + { 0x30e4, 0x30e5, MLineBreaker::EIdLineBreakClass }, //katakana letter ya
1.1080 + { 0x30e5, 0x30e6, MLineBreaker::ENsLineBreakClass }, //katakana letter small yu
1.1081 + { 0x30e6, 0x30e7, MLineBreaker::EIdLineBreakClass }, //katakana letter yu
1.1082 + { 0x30e7, 0x30e8, MLineBreaker::ENsLineBreakClass }, //katakana letter small yo
1.1083 + { 0x30e8, 0x30ee, MLineBreaker::EIdLineBreakClass }, //katakana letter yo
1.1084 + { 0x30ee, 0x30ef, MLineBreaker::ENsLineBreakClass }, //katakana letter small wa
1.1085 + { 0x30ef, 0x30f5, MLineBreaker::EIdLineBreakClass }, //katakana letter wa
1.1086 + { 0x30f5, 0x30f7, MLineBreaker::ENsLineBreakClass }, //katakana letter small ka
1.1087 + { 0x30f7, 0x30fb, MLineBreaker::EIdLineBreakClass }, //katakana letter va
1.1088 + { 0x30fb, 0x30fc, MLineBreaker::ENsLineBreakClass }, //katakana middle dot
1.1089 + { 0x30fc, 0x30fd, MLineBreaker::EIdLineBreakClass }, //katakana-hiragana prolonged sound mark
1.1090 + { 0x30fd, 0x30fe, MLineBreaker::ENsLineBreakClass }, //katakana iteration mark
1.1091 + { 0x30fe, 0x30ff, MLineBreaker::EIdLineBreakClass }, //katakana voiced iteration mark
1.1092 + { 0x30ff, 0x3100, MLineBreaker::EIdLineBreakClass }, //KATAKANA DIGRAPH KOTO
1.1093 + { 0x3105, 0x312d, MLineBreaker::EIdLineBreakClass }, //bopomofo letter b
1.1094 + { 0x3131, 0x318f, MLineBreaker::EIdLineBreakClass }, //hangul letter kiyeok
1.1095 + { 0x3190, 0x31b8, MLineBreaker::EIdLineBreakClass }, //ideographic annotation linking mark
1.1096 + { 0x31c0, 0x31d0, MLineBreaker::EIdLineBreakClass }, //CJK STROKE T
1.1097 + { 0x31f0, 0x3200, MLineBreaker::ENsLineBreakClass }, //KATAKANA LETTER SMALL KU
1.1098 + { 0x3200, 0x321f, MLineBreaker::EIdLineBreakClass }, //parenthesized hangul kiyeok
1.1099 + { 0x3220, 0x3244, MLineBreaker::EIdLineBreakClass }, //parenthesized ideograph one
1.1100 + { 0x3250, 0x32ff, MLineBreaker::EIdLineBreakClass }, //PARTNERSHIP SIGN
1.1101 + { 0x3300, 0x4db6, MLineBreaker::EIdLineBreakClass }, //square apaato
1.1102 + { 0x4dc0, 0x4e00, MLineBreaker::EAlLineBreakClass }, //HEXAGRAM FOR THE CREATIVE HEAVEN
1.1103 + { 0x4e00, 0x9fbb, MLineBreaker::EIdLineBreakClass }, //<cjk ideograph,
1.1104 + { 0xa000, 0xa48d, MLineBreaker::EIdLineBreakClass }, //yi syllable it
1.1105 + { 0xa490, 0xa4c6, MLineBreaker::EIdLineBreakClass }, //yi radical qot
1.1106 + { 0xa4c6, 0xa4c7, MLineBreaker::EIdLineBreakClass }, //yi radical ke
1.1107 + { 0xa700, 0xa71b, MLineBreaker::EAlLineBreakClass }, //MODIFIER LETTER CHINESE TONE YIN PING
1.1108 + { 0xa720, 0xa722, MLineBreaker::EAlLineBreakClass }, //MODIFIER LETTER STRESS AND HIGH TONE
1.1109 + { 0xa800, 0xa802, MLineBreaker::EAlLineBreakClass }, //SYLOTI NAGRI LETTER A
1.1110 + { 0xa802, 0xa803, MLineBreaker::ECmLineBreakClass }, //SYLOTI NAGRI SIGN DVISVARA
1.1111 + { 0xa803, 0xa806, MLineBreaker::EAlLineBreakClass }, //SYLOTI NAGRI LETTER U
1.1112 + { 0xa806, 0xa807, MLineBreaker::ECmLineBreakClass }, //SYLOTI NAGRI SIGN HASANTA
1.1113 + { 0xa807, 0xa80b, MLineBreaker::EAlLineBreakClass }, //SYLOTI NAGRI LETTER KO
1.1114 + { 0xa80b, 0xa80c, MLineBreaker::ECmLineBreakClass }, //SYLOTI NAGRI SIGN ANUSVARA
1.1115 + { 0xa80c, 0xa823, MLineBreaker::EAlLineBreakClass }, //SYLOTI NAGRI LETTER CO
1.1116 + { 0xa823, 0xa828, MLineBreaker::ECmLineBreakClass }, //SYLOTI NAGRI VOWEL SIGN A
1.1117 + { 0xa828, 0xa82c, MLineBreaker::EAlLineBreakClass }, //SYLOTI NAGRI POETRY MARK-1
1.1118 + { 0xa840, 0xa874, MLineBreaker::EAlLineBreakClass }, //PHAGS-PA LETTER KA
1.1119 + { 0xa874, 0xa876, MLineBreaker::EBbLineBreakClass }, //PHAGS-PA SINGLE HEAD MARK
1.1120 + { 0xa876, 0xa878, MLineBreaker::EExLineBreakClass }, //PHAGS-PA MARK SHAD
1.1121 + { 0xac00, 0xd7a4, MLineBreaker::EIdLineBreakClass }, //<hangul syllable,
1.1122 + { 0xd800, 0xe000, MLineBreaker::ESgLineBreakClass }, //<non private use high surrogate,
1.1123 + { 0xe000, 0xf900, MLineBreaker::EAiLineBreakClass }, //<private use,
1.1124 + { 0xf900, 0xfa2e, MLineBreaker::EIdLineBreakClass }, //cjk compatibility ideograph-f900
1.1125 + { 0xfa30, 0xfa6b, MLineBreaker::EIdLineBreakClass }, //CJK COMPATIBILITY IDEOGRAPH-FA30
1.1126 + { 0xfa70, 0xfada, MLineBreaker::EIdLineBreakClass }, //CJK COMPATIBILITY IDEOGRAPH-FA70
1.1127 + { 0xfb00, 0xfb07, MLineBreaker::EAlLineBreakClass }, //latin small ligature ff
1.1128 + { 0xfb13, 0xfb18, MLineBreaker::EAlLineBreakClass }, //armenian small ligature men now
1.1129 + { 0xfb1d, 0xfb1e, MLineBreaker::EAlLineBreakClass }, //hebrew letter yod with hiriq
1.1130 + { 0xfb1e, 0xfb1f, MLineBreaker::ECmLineBreakClass }, //hebrew point judeo-spanish varika
1.1131 + { 0xfb1f, 0xfb37, MLineBreaker::EAlLineBreakClass }, //hebrew ligature yiddish yod yod patah
1.1132 + { 0xfb38, 0xfb3d, MLineBreaker::EAlLineBreakClass }, //hebrew letter tet with dagesh
1.1133 + { 0xfb3e, 0xfb3f, MLineBreaker::EAlLineBreakClass }, //hebrew letter mem with dagesh
1.1134 + { 0xfb40, 0xfb42, MLineBreaker::EAlLineBreakClass }, //hebrew letter nun with dagesh
1.1135 + { 0xfb43, 0xfb45, MLineBreaker::EAlLineBreakClass }, //hebrew letter final pe with dagesh
1.1136 + { 0xfb46, 0xfbb2, MLineBreaker::EAlLineBreakClass }, //hebrew letter tsadi with dagesh
1.1137 + { 0xfbd3, 0xfd3e, MLineBreaker::EAlLineBreakClass }, //arabic letter ng isolated form
1.1138 + { 0xfd3e, 0xfd3f, MLineBreaker::EOpLineBreakClass }, //ornate left parenthesis
1.1139 + { 0xfd3f, 0xfd40, MLineBreaker::EClLineBreakClass }, //ornate right parenthesis
1.1140 + { 0xfd50, 0xfd90, MLineBreaker::EAlLineBreakClass }, //arabic ligature teh with jeem with meem initial form
1.1141 + { 0xfd92, 0xfdc8, MLineBreaker::EAlLineBreakClass }, //arabic ligature meem with jeem with khah initial form
1.1142 + { 0xfdf0, 0xfdfc, MLineBreaker::EAlLineBreakClass }, //arabic ligature salla used as koranic stop sign isolated form
1.1143 + { 0xfdfc, 0xfdfd, MLineBreaker::EPoLineBreakClass }, //RIAL SIGN
1.1144 + { 0xfdfd, 0xfdfe, MLineBreaker::EAlLineBreakClass }, //ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
1.1145 + { 0xfe00, 0xfe10, MLineBreaker::ECmLineBreakClass }, //VARIATION SELECTOR-1
1.1146 + { 0xfe10, 0xfe11, MLineBreaker::EIsLineBreakClass }, //PRESENTATION FORM FOR VERTICAL COMMA
1.1147 + { 0xfe11, 0xfe13, MLineBreaker::EClLineBreakClass }, //PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA
1.1148 + { 0xfe13, 0xfe15, MLineBreaker::EIsLineBreakClass }, //PRESENTATION FORM FOR VERTICAL COLON
1.1149 + { 0xfe15, 0xfe17, MLineBreaker::EExLineBreakClass }, //PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK
1.1150 + { 0xfe17, 0xfe18, MLineBreaker::EOpLineBreakClass }, //PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
1.1151 + { 0xfe18, 0xfe19, MLineBreaker::EClLineBreakClass }, //PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
1.1152 + { 0xfe19, 0xfe1a, MLineBreaker::EInLineBreakClass }, //PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
1.1153 + { 0xfe20, 0xfe24, MLineBreaker::ECmLineBreakClass }, //combining ligature left half
1.1154 + { 0xfe30, 0xfe35, MLineBreaker::EIdLineBreakClass }, //presentation form for vertical two dot leader
1.1155 + { 0xfe35, 0xfe36, MLineBreaker::EOpLineBreakClass }, //presentation form for vertical left parenthesis
1.1156 + { 0xfe36, 0xfe37, MLineBreaker::EClLineBreakClass }, //presentation form for vertical right parenthesis
1.1157 + { 0xfe37, 0xfe38, MLineBreaker::EOpLineBreakClass }, //presentation form for vertical left curly bracket
1.1158 + { 0xfe38, 0xfe39, MLineBreaker::EClLineBreakClass }, //presentation form for vertical right curly bracket
1.1159 + { 0xfe39, 0xfe3a, MLineBreaker::EOpLineBreakClass }, //presentation form for vertical left tortoise shell bracket
1.1160 + { 0xfe3a, 0xfe3b, MLineBreaker::EClLineBreakClass }, //presentation form for vertical right tortoise shell bracket
1.1161 + { 0xfe3b, 0xfe3c, MLineBreaker::EOpLineBreakClass }, //presentation form for vertical left black lenticular bracket
1.1162 + { 0xfe3c, 0xfe3d, MLineBreaker::EClLineBreakClass }, //presentation form for vertical right black lenticular bracket
1.1163 + { 0xfe3d, 0xfe3e, MLineBreaker::EOpLineBreakClass }, //presentation form for vertical left double angle bracket
1.1164 + { 0xfe3e, 0xfe3f, MLineBreaker::EClLineBreakClass }, //presentation form for vertical right double angle bracket
1.1165 + { 0xfe3f, 0xfe40, MLineBreaker::EOpLineBreakClass }, //presentation form for vertical left angle bracket
1.1166 + { 0xfe40, 0xfe41, MLineBreaker::EClLineBreakClass }, //presentation form for vertical right angle bracket
1.1167 + { 0xfe41, 0xfe42, MLineBreaker::EOpLineBreakClass }, //presentation form for vertical left corner bracket
1.1168 + { 0xfe42, 0xfe43, MLineBreaker::EClLineBreakClass }, //presentation form for vertical right corner bracket
1.1169 + { 0xfe43, 0xfe44, MLineBreaker::EOpLineBreakClass }, //presentation form for vertical left white corner bracket
1.1170 + { 0xfe44, 0xfe45, MLineBreaker::EClLineBreakClass }, //presentation form for vertical right white corner bracket
1.1171 + { 0xfe45, 0xfe47, MLineBreaker::EIdLineBreakClass }, //SESAME DOT
1.1172 + { 0xfe47, 0xfe48, MLineBreaker::EOpLineBreakClass }, //PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
1.1173 + { 0xfe48, 0xfe49, MLineBreaker::EClLineBreakClass }, //PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
1.1174 + { 0xfe49, 0xfe50, MLineBreaker::EIdLineBreakClass }, //dashed overline
1.1175 + { 0xfe50, 0xfe51, MLineBreaker::EClLineBreakClass }, //small comma
1.1176 + { 0xfe51, 0xfe52, MLineBreaker::EIdLineBreakClass }, //small ideographic comma
1.1177 + { 0xfe52, 0xfe53, MLineBreaker::EClLineBreakClass }, //small full stop
1.1178 + { 0xfe54, 0xfe56, MLineBreaker::ENsLineBreakClass }, //small semicolon
1.1179 + { 0xfe56, 0xfe58, MLineBreaker::EExLineBreakClass }, //small question mark
1.1180 + { 0xfe58, 0xfe59, MLineBreaker::EIdLineBreakClass }, //small em dash
1.1181 + { 0xfe59, 0xfe5a, MLineBreaker::EOpLineBreakClass }, //small left parenthesis
1.1182 + { 0xfe5a, 0xfe5b, MLineBreaker::EClLineBreakClass }, //small right parenthesis
1.1183 + { 0xfe5b, 0xfe5c, MLineBreaker::EOpLineBreakClass }, //small left curly bracket
1.1184 + { 0xfe5c, 0xfe5d, MLineBreaker::EClLineBreakClass }, //small right curly bracket
1.1185 + { 0xfe5d, 0xfe5e, MLineBreaker::EOpLineBreakClass }, //small left tortoise shell bracket
1.1186 + { 0xfe5e, 0xfe5f, MLineBreaker::EClLineBreakClass }, //small right tortoise shell bracket
1.1187 + { 0xfe5f, 0xfe67, MLineBreaker::EIdLineBreakClass }, //small number sign
1.1188 + { 0xfe68, 0xfe69, MLineBreaker::EIdLineBreakClass }, //small reverse solidus
1.1189 + { 0xfe69, 0xfe6a, MLineBreaker::EPrLineBreakClass }, //small dollar sign
1.1190 + { 0xfe6a, 0xfe6b, MLineBreaker::EPoLineBreakClass }, //small percent sign
1.1191 + { 0xfe6b, 0xfe6c, MLineBreaker::EAlLineBreakClass }, //small commercial at
1.1192 + { 0xfe70, 0xfe74, MLineBreaker::EAlLineBreakClass }, //arabic fathatan isolated form
1.1193 + { 0xfe74, 0xfe75, MLineBreaker::EAlLineBreakClass }, //arabic kasratan isolated form
1.1194 + { 0xfe76, 0xfefd, MLineBreaker::EAlLineBreakClass }, //arabic fatha isolated form
1.1195 + { 0xfeff, 0xff00, MLineBreaker::EGlLineBreakClass }, //zero width no-break space
1.1196 + { 0xff01, 0xff02, MLineBreaker::EExLineBreakClass }, //fullwidth exclamation mark
1.1197 + { 0xff02, 0xff04, MLineBreaker::EIdLineBreakClass }, //fullwidth quotation mark
1.1198 + { 0xff04, 0xff05, MLineBreaker::EPrLineBreakClass }, //fullwidth dollar sign
1.1199 + { 0xff05, 0xff06, MLineBreaker::EPoLineBreakClass }, //fullwidth percent sign
1.1200 + { 0xff06, 0xff08, MLineBreaker::EIdLineBreakClass }, //fullwidth ampersand
1.1201 + { 0xff08, 0xff09, MLineBreaker::EOpLineBreakClass }, //fullwidth left parenthesis
1.1202 + { 0xff09, 0xff0a, MLineBreaker::EClLineBreakClass }, //fullwidth right parenthesis
1.1203 + { 0xff0a, 0xff0c, MLineBreaker::EIdLineBreakClass }, //fullwidth asterisk
1.1204 + { 0xff0c, 0xff0d, MLineBreaker::EClLineBreakClass }, //fullwidth comma
1.1205 + { 0xff0d, 0xff0e, MLineBreaker::EIdLineBreakClass }, //fullwidth hyphen-minus
1.1206 + { 0xff0e, 0xff0f, MLineBreaker::EClLineBreakClass }, //fullwidth full stop
1.1207 + { 0xff0f, 0xff1a, MLineBreaker::EIdLineBreakClass }, //fullwidth solidus
1.1208 + { 0xff1a, 0xff1c, MLineBreaker::ENsLineBreakClass }, //fullwidth colon
1.1209 + { 0xff1c, 0xff1f, MLineBreaker::EIdLineBreakClass }, //fullwidth less-than sign
1.1210 + { 0xff1f, 0xff20, MLineBreaker::EExLineBreakClass }, //fullwidth question mark
1.1211 + { 0xff20, 0xff3b, MLineBreaker::EIdLineBreakClass }, //fullwidth commercial at
1.1212 + { 0xff3b, 0xff3c, MLineBreaker::EOpLineBreakClass }, //fullwidth left square bracket
1.1213 + { 0xff3c, 0xff3d, MLineBreaker::EIdLineBreakClass }, //fullwidth reverse solidus
1.1214 + { 0xff3d, 0xff3e, MLineBreaker::EClLineBreakClass }, //fullwidth right square bracket
1.1215 + { 0xff3e, 0xff5b, MLineBreaker::EIdLineBreakClass }, //fullwidth circumflex accent
1.1216 + { 0xff5b, 0xff5c, MLineBreaker::EOpLineBreakClass }, //fullwidth left curly bracket
1.1217 + { 0xff5c, 0xff5d, MLineBreaker::EIdLineBreakClass }, //fullwidth vertical line
1.1218 + { 0xff5d, 0xff5e, MLineBreaker::EClLineBreakClass }, //fullwidth right curly bracket
1.1219 + { 0xff5e, 0xff5f, MLineBreaker::EIdLineBreakClass }, //fullwidth tilde
1.1220 + { 0xff5f, 0xff60, MLineBreaker::EOpLineBreakClass }, //FULLWIDTH LEFT WHITE PARENTHESIS
1.1221 + { 0xff60, 0xff61, MLineBreaker::EClLineBreakClass }, //FULLWIDTH RIGHT WHITE PARENTHESIS
1.1222 + { 0xff61, 0xff62, MLineBreaker::EClLineBreakClass }, //halfwidth ideographic full stop
1.1223 + { 0xff62, 0xff63, MLineBreaker::EOpLineBreakClass }, //halfwidth left corner bracket
1.1224 + { 0xff63, 0xff65, MLineBreaker::EClLineBreakClass }, //halfwidth right corner bracket
1.1225 + { 0xff65, 0xff66, MLineBreaker::ENsLineBreakClass }, //halfwidth katakana middle dot
1.1226 + { 0xff66, 0xff67, MLineBreaker::EAlLineBreakClass }, //halfwidth katakana letter wo
1.1227 + { 0xff67, 0xff71, MLineBreaker::ENsLineBreakClass }, //halfwidth katakana letter small a
1.1228 + { 0xff71, 0xff9e, MLineBreaker::EAlLineBreakClass }, //halfwidth katakana letter a
1.1229 + { 0xff9e, 0xffa0, MLineBreaker::ENsLineBreakClass }, //halfwidth katakana voiced sound mark
1.1230 + { 0xffa0, 0xffbf, MLineBreaker::EAlLineBreakClass }, //halfwidth hangul filler
1.1231 + { 0xffc2, 0xffc8, MLineBreaker::EAlLineBreakClass }, //halfwidth hangul letter a
1.1232 + { 0xffca, 0xffd0, MLineBreaker::EAlLineBreakClass }, //halfwidth hangul letter yeo
1.1233 + { 0xffd2, 0xffd8, MLineBreaker::EAlLineBreakClass }, //halfwidth hangul letter yo
1.1234 + { 0xffda, 0xffdd, MLineBreaker::EAlLineBreakClass }, //halfwidth hangul letter eu
1.1235 + { 0xffe0, 0xffe1, MLineBreaker::EPoLineBreakClass }, //fullwidth cent sign
1.1236 + { 0xffe1, 0xffe2, MLineBreaker::EPrLineBreakClass }, //fullwidth pound sign
1.1237 + { 0xffe2, 0xffe5, MLineBreaker::EIdLineBreakClass }, //fullwidth not sign
1.1238 + { 0xffe5, 0xffe7, MLineBreaker::EPrLineBreakClass }, //fullwidth yen sign
1.1239 + { 0xffe8, 0xffef, MLineBreaker::EAlLineBreakClass }, //halfwidth forms light vertical
1.1240 + { 0xfff9, 0xfffc, MLineBreaker::ECmLineBreakClass }, //interlinear annotation anchor
1.1241 + { 0xfffc, 0xfffd, MLineBreaker::ECbLineBreakClass }, //object replacement character
1.1242 + { 0xfffd, 0xfffe, MLineBreaker::EAiLineBreakClass }, //replacement character
1.1243 + { 0x10000, 0x1000c, MLineBreaker::EAlLineBreakClass }, //LINEAR B SYLLABLE B008 A
1.1244 + { 0x1000d, 0x10027, MLineBreaker::EAlLineBreakClass }, //LINEAR B SYLLABLE B036 JO
1.1245 + { 0x10028, 0x1003b, MLineBreaker::EAlLineBreakClass }, //LINEAR B SYLLABLE B060 RA
1.1246 + { 0x1003c, 0x1003e, MLineBreaker::EAlLineBreakClass }, //LINEAR B SYLLABLE B017 ZA
1.1247 + { 0x1003f, 0x1004e, MLineBreaker::EAlLineBreakClass }, //LINEAR B SYLLABLE B020 ZO
1.1248 + { 0x10050, 0x1005e, MLineBreaker::EAlLineBreakClass }, //LINEAR B SYMBOL B018
1.1249 + { 0x10080, 0x100fb, MLineBreaker::EAlLineBreakClass }, //LINEAR B IDEOGRAM B100 MAN
1.1250 + { 0x10100, 0x10103, MLineBreaker::EBaLineBreakClass }, //AEGEAN WORD SEPARATOR LINE
1.1251 + { 0x10107, 0x10134, MLineBreaker::EAlLineBreakClass }, //AEGEAN NUMBER ONE
1.1252 + { 0x10137, 0x1018b, MLineBreaker::EAlLineBreakClass }, //AEGEAN WEIGHT BASE UNIT
1.1253 + { 0x10300, 0x1031f, MLineBreaker::EAlLineBreakClass }, //OLD ITALIC LETTER A
1.1254 + { 0x10320, 0x10324, MLineBreaker::EAlLineBreakClass }, //OLD ITALIC NUMERAL ONE
1.1255 + { 0x10330, 0x1034b, MLineBreaker::EAlLineBreakClass }, //GOTHIC LETTER AHSA
1.1256 + { 0x10380, 0x1039e, MLineBreaker::EAlLineBreakClass }, //UGARITIC LETTER ALPA
1.1257 + { 0x1039f, 0x103a0, MLineBreaker::EBaLineBreakClass }, //UGARITIC WORD DIVIDER
1.1258 + { 0x103a0, 0x103c4, MLineBreaker::EAlLineBreakClass }, //OLD PERSIAN SIGN A
1.1259 + { 0x103c8, 0x103d0, MLineBreaker::EAlLineBreakClass }, //OLD PERSIAN SIGN AURAMAZDAA
1.1260 + { 0x103d0, 0x103d1, MLineBreaker::EBaLineBreakClass }, //OLD PERSIAN WORD DIVIDER
1.1261 + { 0x103d1, 0x103d6, MLineBreaker::EAlLineBreakClass }, //OLD PERSIAN NUMBER ONE
1.1262 + { 0x10400, 0x1049e, MLineBreaker::EAlLineBreakClass }, //DESERET CAPITAL LETTER LONG I
1.1263 + { 0x104a0, 0x104aa, MLineBreaker::ENuLineBreakClass }, //OSMANYA DIGIT ZERO
1.1264 + { 0x10800, 0x10806, MLineBreaker::EAlLineBreakClass }, //CYPRIOT SYLLABLE A
1.1265 + { 0x10808, 0x10809, MLineBreaker::EAlLineBreakClass }, //CYPRIOT SYLLABLE JO
1.1266 + { 0x1080a, 0x10836, MLineBreaker::EAlLineBreakClass }, //CYPRIOT SYLLABLE KA
1.1267 + { 0x10837, 0x10839, MLineBreaker::EAlLineBreakClass }, //CYPRIOT SYLLABLE XA
1.1268 + { 0x1083c, 0x1083d, MLineBreaker::EAlLineBreakClass }, //CYPRIOT SYLLABLE ZA
1.1269 + { 0x1083f, 0x10840, MLineBreaker::EAlLineBreakClass }, //CYPRIOT SYLLABLE ZO
1.1270 + { 0x10900, 0x1091a, MLineBreaker::EAlLineBreakClass }, //PHOENICIAN LETTER ALF
1.1271 + { 0x1091f, 0x10920, MLineBreaker::EBaLineBreakClass }, //PHOENICIAN WORD SEPARATOR
1.1272 + { 0x10a00, 0x10a01, MLineBreaker::EAlLineBreakClass }, //KHAROSHTHI LETTER A
1.1273 + { 0x10a01, 0x10a04, MLineBreaker::ECmLineBreakClass }, //KHAROSHTHI VOWEL SIGN I
1.1274 + { 0x10a05, 0x10a07, MLineBreaker::ECmLineBreakClass }, //KHAROSHTHI VOWEL SIGN E
1.1275 + { 0x10a0c, 0x10a10, MLineBreaker::ECmLineBreakClass }, //KHAROSHTHI VOWEL LENGTH MARK
1.1276 + { 0x10a10, 0x10a14, MLineBreaker::EAlLineBreakClass }, //KHAROSHTHI LETTER KA
1.1277 + { 0x10a15, 0x10a18, MLineBreaker::EAlLineBreakClass }, //KHAROSHTHI LETTER CA
1.1278 + { 0x10a19, 0x10a34, MLineBreaker::EAlLineBreakClass }, //KHAROSHTHI LETTER NYA
1.1279 + { 0x10a38, 0x10a3b, MLineBreaker::ECmLineBreakClass }, //KHAROSHTHI SIGN BAR ABOVE
1.1280 + { 0x10a3f, 0x10a40, MLineBreaker::ECmLineBreakClass }, //KHAROSHTHI VIRAMA
1.1281 + { 0x10a40, 0x10a48, MLineBreaker::EAlLineBreakClass }, //KHAROSHTHI DIGIT ONE
1.1282 + { 0x10a50, 0x10a58, MLineBreaker::EBaLineBreakClass }, //KHAROSHTHI PUNCTUATION DOT
1.1283 + { 0x10a58, 0x10a59, MLineBreaker::EAlLineBreakClass }, //KHAROSHTHI PUNCTUATION LINES
1.1284 + { 0x12000, 0x1236f, MLineBreaker::EAlLineBreakClass }, //CUNEIFORM SIGN A
1.1285 + { 0x12400, 0x12463, MLineBreaker::EAlLineBreakClass }, //CUNEIFORM NUMERIC SIGN TWO ASH
1.1286 + { 0x12470, 0x12474, MLineBreaker::EBaLineBreakClass }, //CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER
1.1287 + { 0x1d000, 0x1d0f6, MLineBreaker::EAlLineBreakClass }, //BYZANTINE MUSICAL SYMBOL PSILI
1.1288 + { 0x1d100, 0x1d127, MLineBreaker::EAlLineBreakClass }, //MUSICAL SYMBOL SINGLE BARLINE
1.1289 + { 0x1d12a, 0x1d165, MLineBreaker::EAlLineBreakClass }, //MUSICAL SYMBOL DOUBLE SHARP
1.1290 + { 0x1d165, 0x1d16a, MLineBreaker::ECmLineBreakClass }, //MUSICAL SYMBOL COMBINING STEM
1.1291 + { 0x1d16a, 0x1d16d, MLineBreaker::EAlLineBreakClass }, //MUSICAL SYMBOL FINGERED TREMOLO-1
1.1292 + { 0x1d16d, 0x1d183, MLineBreaker::ECmLineBreakClass }, //MUSICAL SYMBOL COMBINING AUGMENTATION DOT
1.1293 + { 0x1d183, 0x1d185, MLineBreaker::EAlLineBreakClass }, //MUSICAL SYMBOL ARPEGGIATO UP
1.1294 + { 0x1d185, 0x1d18c, MLineBreaker::ECmLineBreakClass }, //MUSICAL SYMBOL COMBINING DOIT
1.1295 + { 0x1d18c, 0x1d1aa, MLineBreaker::EAlLineBreakClass }, //MUSICAL SYMBOL RINFORZANDO
1.1296 + { 0x1d1aa, 0x1d1ae, MLineBreaker::ECmLineBreakClass }, //MUSICAL SYMBOL COMBINING DOWN BOW
1.1297 + { 0x1d1ae, 0x1d1de, MLineBreaker::EAlLineBreakClass }, //MUSICAL SYMBOL PEDAL MARK
1.1298 + { 0x1d200, 0x1d242, MLineBreaker::EAlLineBreakClass }, //GREEK VOCAL NOTATION SYMBOL-1
1.1299 + { 0x1d242, 0x1d245, MLineBreaker::ECmLineBreakClass }, //COMBINING GREEK MUSICAL TRISEME
1.1300 + { 0x1d245, 0x1d246, MLineBreaker::EAlLineBreakClass }, //GREEK MUSICAL LEIMMA
1.1301 + { 0x1d300, 0x1d357, MLineBreaker::EAlLineBreakClass }, //MONOGRAM FOR EARTH
1.1302 + { 0x1d360, 0x1d372, MLineBreaker::EAlLineBreakClass }, //COUNTING ROD UNIT DIGIT ONE
1.1303 + { 0x1d400, 0x1d455, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL BOLD CAPITAL A
1.1304 + { 0x1d456, 0x1d49d, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL ITALIC SMALL I
1.1305 + { 0x1d49e, 0x1d4a0, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL SCRIPT CAPITAL C
1.1306 + { 0x1d4a2, 0x1d4a3, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL SCRIPT CAPITAL G
1.1307 + { 0x1d4a5, 0x1d4a7, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL SCRIPT CAPITAL J
1.1308 + { 0x1d4a9, 0x1d4ad, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL SCRIPT CAPITAL N
1.1309 + { 0x1d4ae, 0x1d4ba, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL SCRIPT CAPITAL S
1.1310 + { 0x1d4bb, 0x1d4bc, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL SCRIPT SMALL F
1.1311 + { 0x1d4bd, 0x1d4c4, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL SCRIPT SMALL H
1.1312 + { 0x1d4c5, 0x1d506, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL SCRIPT SMALL P
1.1313 + { 0x1d507, 0x1d50b, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL FRAKTUR CAPITAL D
1.1314 + { 0x1d50d, 0x1d515, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL FRAKTUR CAPITAL J
1.1315 + { 0x1d516, 0x1d51d, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL FRAKTUR CAPITAL S
1.1316 + { 0x1d51e, 0x1d53a, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL FRAKTUR SMALL A
1.1317 + { 0x1d53b, 0x1d53f, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL DOUBLE-STRUCK CAPITAL D
1.1318 + { 0x1d540, 0x1d545, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL DOUBLE-STRUCK CAPITAL I
1.1319 + { 0x1d546, 0x1d547, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL DOUBLE-STRUCK CAPITAL O
1.1320 + { 0x1d54a, 0x1d551, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL DOUBLE-STRUCK CAPITAL S
1.1321 + { 0x1d552, 0x1d6a6, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL DOUBLE-STRUCK SMALL A
1.1322 + { 0x1d6a8, 0x1d7cc, MLineBreaker::EAlLineBreakClass }, //MATHEMATICAL BOLD CAPITAL ALPHA
1.1323 + { 0x1d7ce, 0x1d800, MLineBreaker::ENuLineBreakClass }, //MATHEMATICAL BOLD DIGIT ZERO
1.1324 + { 0x20000, 0x2a6d6, MLineBreaker::EIdLineBreakClass }, //<CJK Ideograph Extension B, First>..<CJK Ideograph Extension B, Last>
1.1325 + { 0x2f800, 0x2fa1e, MLineBreaker::EIdLineBreakClass }, //CJK COMPATIBILITY IDEOGRAPH-2F800
1.1326 + { 0xe0001, 0xe0002, MLineBreaker::ECmLineBreakClass }, //LANGUAGE TAG
1.1327 + { 0xe0020, 0xe0080, MLineBreaker::ECmLineBreakClass }, //TAG SPACE
1.1328 + { 0xe0100, 0xe01f0, MLineBreaker::ECmLineBreakClass }, //VARIATION SELECTOR-17
1.1329 + { 0xf0000, 0xffffd, MLineBreaker::EXxLineBreakClass }, //<Plane 15 Private Use, First>..<Plane 15 Private Use, Last>
1.1330 + { 0x100000, 0x10fffd, MLineBreaker::EXxLineBreakClass }, //<Plane 16 Private Use, First>..<Plane 16 Private Use, Last>
1.1331 + };
1.1332 +
1.1333 +static const TInt TheLineBreakRanges = sizeof(TheLineBreakRangeTable) / sizeof(TheLineBreakRangeTable[0]);
1.1334 +
1.1335 +void TestLineBreakTables(void)
1.1336 + {
1.1337 +#ifdef _DEBUG
1.1338 + TUint prev_end = 0;
1.1339 + for (int i = 0; i < TheLineBreakRanges; i++)
1.1340 + {
1.1341 + const TLineBreakRange& r = TheLineBreakRangeTable[i];
1.1342 + if (r.iStart >= r.iEnd || r.iClass >= MLineBreaker::ELineBreakClasses || r.iStart < prev_end)
1.1343 + Panic(ELineBreakPanic_BadTable);
1.1344 + prev_end = r.iEnd;
1.1345 + }
1.1346 +#endif
1.1347 + }
1.1348 +
1.1349 +TUint TLineBreakClassCache::LineBreakClass(TUint aChar)
1.1350 + {
1.1351 + if (aChar >= iStart && aChar < iEnd)
1.1352 + return iClass;
1.1353 + TUint new_start, new_end;
1.1354 + TUint new_class = iBreaker.LineBreakClass(aChar,new_start,new_end);
1.1355 + if (new_start < new_end - 1)
1.1356 + {
1.1357 + iStart = new_start;
1.1358 + iEnd = new_end;
1.1359 + iClass = new_class;
1.1360 + }
1.1361 + return new_class;
1.1362 + }
1.1363 +
1.1364 +EXPORT_C TBool MLineBreaker::LineBreakPossible(
1.1365 + TUint aPrevClass, TUint aNextClass, TBool aHaveSpaces) const
1.1366 +/** Returns whether line breaks are legal between a character of line breaking
1.1367 +class aPrevClass and aNextClass, with intervening spaces or not as determined
1.1368 +by aHaveSpaces.
1.1369 +
1.1370 +@param aPrevClass The class before the potential line break.
1.1371 +@param aNextClass The class after the potential line break.
1.1372 +@param aHaveSpaces Whether spaces separate the characters.
1.1373 +@return ETrue if and only if a line break is legal in the situation described. */
1.1374 + {
1.1375 + if (aPrevClass >= ELineBreakClasses || aNextClass >= ELineBreakClasses)
1.1376 + return FALSE;
1.1377 + const TLineBreakRule& rule = TheLineBreakRuleTable[aPrevClass];
1.1378 + TUint flag = 1 << aNextClass;
1.1379 + if (rule.iForbid & flag)
1.1380 + return FALSE;
1.1381 + return aHaveSpaces || (rule.iAllow & flag);
1.1382 + }
1.1383 +
1.1384 +EXPORT_C TUint MLineBreaker::LineBreakClass(TUint aCode,TUint& aRangeStart,TUint& aRangeEnd) const
1.1385 +/** Converts Unicode character into line breaking class.
1.1386 +
1.1387 +@param aCode Input Unicode value.
1.1388 +@param aRangeStart Returns the start of the contiguous range of characters
1.1389 +including aCode that have the returned line breaking class.
1.1390 +@param aRangeEnd Returns the end of the contiguous range of characters including
1.1391 +aCode that have the returned line breaking class.
1.1392 +@return The line breaking class for aCode. */
1.1393 + {
1.1394 + aRangeStart = aCode;
1.1395 + aRangeEnd = aCode + 1;
1.1396 +
1.1397 + // First check for a space; this needs to be fast.
1.1398 + if (aCode == 0x0020)
1.1399 + return ESpLineBreakClass;
1.1400 +
1.1401 + // Now search the table.
1.1402 + const TLineBreakRange* base = TheLineBreakRangeTable;
1.1403 + const TLineBreakRange* end = base + TheLineBreakRanges;
1.1404 + while (base < end)
1.1405 + {
1.1406 + int n = end - base;
1.1407 + const TLineBreakRange* r = &base[n / 2];
1.1408 + if (r->iStart > aCode)
1.1409 + end = r;
1.1410 + else if (r->iEnd <= aCode)
1.1411 + base = r + 1;
1.1412 + else
1.1413 + {
1.1414 + aRangeStart = r->iStart;
1.1415 + aRangeEnd = r->iEnd;
1.1416 + return r->iClass;
1.1417 + }
1.1418 + }
1.1419 +
1.1420 + // If the character was not in the table determine the line break class using the Unicode character category.
1.1421 + TChar::TCategory cat = TChar(aCode).GetCategory();
1.1422 + switch (cat)
1.1423 + {
1.1424 + case TChar::ELuCategory:
1.1425 + case TChar::ELlCategory:
1.1426 + case TChar::ELtCategory:
1.1427 + case TChar::ELoCategory:
1.1428 + case TChar::ESmCategory:
1.1429 + case TChar::ESoCategory:
1.1430 + return EAlLineBreakClass;
1.1431 +
1.1432 + case TChar::ESkCategory:
1.1433 + if (TChar(aCode).GetCjkWidth() == TChar::EWide)
1.1434 + return ENsLineBreakClass;
1.1435 + else
1.1436 + return EAlLineBreakClass;
1.1437 +
1.1438 + case TChar::ELmCategory:
1.1439 + {
1.1440 + TChar::TCjkWidth cjk_width = TChar(aCode).GetCjkWidth();
1.1441 + if (cjk_width == TChar::EWide || cjk_width == TChar::EHalfWidth)
1.1442 + return ENsLineBreakClass;
1.1443 + }
1.1444 + break;
1.1445 +
1.1446 + case TChar::EMnCategory:
1.1447 + case TChar::EMcCategory:
1.1448 + case TChar::EMeCategory:
1.1449 + case TChar::ECcCategory:
1.1450 + case TChar::ECfCategory:
1.1451 + return ECmLineBreakClass;
1.1452 +
1.1453 + case TChar::ENdCategory:
1.1454 + return ENuLineBreakClass;
1.1455 +
1.1456 + case TChar::EPsCategory:
1.1457 + return EOpLineBreakClass;
1.1458 +
1.1459 + case TChar::EPeCategory:
1.1460 + return EClLineBreakClass;
1.1461 +
1.1462 + case TChar::EScCategory:
1.1463 + return EPrLineBreakClass;
1.1464 +
1.1465 + case TChar::EPfCategory:
1.1466 + case TChar::EPiCategory:
1.1467 + return EQuLineBreakClass;
1.1468 +
1.1469 + case TChar::ECsCategory:
1.1470 + return ESgLineBreakClass;
1.1471 +
1.1472 + default:
1.1473 + break;
1.1474 + }
1.1475 +
1.1476 + // If it has still not been found it may be an ideographic character not covered above.
1.1477 + if (aCode >= 0x3000 && aCode <= 0x3FFF)
1.1478 + return EIdLineBreakClass;
1.1479 +
1.1480 + // Or it may be a surrogate; assume plane 1 is alphabetic, plane 2 is ideographic.
1.1481 + if (aCode >= 0x10000 && aCode <= 0x1FFFF)
1.1482 + return EAlLineBreakClass;
1.1483 + if (aCode >= 0x20000 && aCode <= 0x2FFFF)
1.1484 + return EIdLineBreakClass;
1.1485 +
1.1486 + // Return the catch-all class.
1.1487 + return EXxLineBreakClass;
1.1488 + }
1.1489 +
1.1490 +
1.1491 +EXPORT_C TBool MLineBreaker::IsHangingCharacter(TUint) const
1.1492 +/** Returns ETrue if the character value may be positioned outside the margins.
1.1493 +
1.1494 +@param aChar Chatacter to test
1.1495 +@return ETrue if the character value may be positioned outside the margins. */
1.1496 + {
1.1497 + return EFalse;
1.1498 + }
1.1499 +
1.1500 +TInt MakeSurrogate(TInt aHigh, TInt aLow)
1.1501 + {
1.1502 + return (aHigh << 10) + (aLow & 0x3FF)
1.1503 + + (0x10000 - 0xD800*0x400);
1.1504 + }
1.1505 +
1.1506 +inline TBool IsSurrogate(TInt aChar)
1.1507 + {
1.1508 + return (aChar & 0xF800) == 0xD800;
1.1509 + }
1.1510 +
1.1511 +inline TBool IsHighSurrogate(TInt aChar)
1.1512 + {
1.1513 + return (aChar & 0xFC00) == 0xD800;
1.1514 + }
1.1515 +
1.1516 +inline TBool IsLowSurrogate(TInt aChar)
1.1517 + {
1.1518 + return (aChar & 0xFC00) == 0xDC00;
1.1519 + }
1.1520 +
1.1521 +/**
1.1522 +Move past the current character and return the next.
1.1523 +@param aPtr
1.1524 + Pointer to the current character. On return, contains a pointer to the next
1.1525 + character.
1.1526 +@param aLimit
1.1527 + Limit of the iteration. For positive aOffset (moving forwards) this should
1.1528 + be one less than the end of the text. For negative aOffset (moving
1.1529 + backwards) this should be the start of the text.
1.1530 +@param aOffset
1.1531 + 1 for moving forward, -1 for moving backward.
1.1532 +@return
1.1533 + Unicode character value or -1 on error.
1.1534 +@internalComponent
1.1535 +*/
1.1536 +TInt MoveTextPtr(const TText*& aPtr, const TText* aLimit, TInt aOffset)
1.1537 + {
1.1538 + // if (aPtr - aLimit) has the same sign as aOffset then we are
1.1539 + // already too far.
1.1540 + if (0 <= ((aPtr - aLimit) ^ aOffset)
1.1541 + && aLimit)
1.1542 + return -1;
1.1543 + TInt c = 0;
1.1544 + for (;;)
1.1545 + {
1.1546 + if (aPtr == aLimit)
1.1547 + return -1;
1.1548 + aPtr += aOffset;
1.1549 + TInt lastc = c;
1.1550 + c = *aPtr;
1.1551 + if (!IsSurrogate(c))
1.1552 + return c;
1.1553 + if (aOffset < 0)
1.1554 + {
1.1555 + if (IsHighSurrogate(c) && IsLowSurrogate(lastc))
1.1556 + return MakeSurrogate(c, lastc);
1.1557 + }
1.1558 + else
1.1559 + {
1.1560 + if (IsHighSurrogate(lastc) && IsLowSurrogate(c))
1.1561 + {
1.1562 + // found a surrogate pair
1.1563 + // Set the pointer to the first of the pair
1.1564 + --aPtr;
1.1565 + return MakeSurrogate(lastc, c);
1.1566 + }
1.1567 + }
1.1568 + }
1.1569 + }
1.1570 +
1.1571 +/** Find the line break class of the latest character within [aFirst, aP+1]
1.1572 +to have non-CM line break class.
1.1573 +@pre aP points to a character of CM class.
1.1574 +*/
1.1575 +inline TUint GetGlyphClusterLineBreakClass(const TText* aP,
1.1576 + const TText* aFirst, TLineBreakClassCache& aBreaker)
1.1577 + {
1.1578 + TInt ch = MoveTextPtr(aP, aFirst, -1);
1.1579 + while (0 <= ch)
1.1580 + {
1.1581 + TUint cl = aBreaker.LineBreakClass(ch);
1.1582 + if (cl != MLineBreaker::ECmLineBreakClass)
1.1583 + return cl;
1.1584 + ch = MoveTextPtr(aP, aFirst, -1);
1.1585 + }
1.1586 + return MLineBreaker::ECmLineBreakClass;
1.1587 + }
1.1588 +
1.1589 +void TLineBreakClassIterator::Set(const TText* aFirst, const TText* aText, TLineBreakClassCache& aBreaker)
1.1590 + {
1.1591 + iFirst = aFirst;
1.1592 + iCurrent = aText;
1.1593 + TInt c = *aText;
1.1594 + if (IsHighSurrogate(c))
1.1595 + {
1.1596 + if (IsLowSurrogate(aText[1]))
1.1597 + c = MakeSurrogate(c, aText[1]);
1.1598 + }
1.1599 + iClass = aBreaker.LineBreakClass(c);
1.1600 + if (iClass == MLineBreaker::ECmLineBreakClass)
1.1601 + {
1.1602 + TUint baseLbCls = GetGlyphClusterLineBreakClass(iCurrent, iFirst, aBreaker);
1.1603 + if (baseLbCls == MLineBreaker::ESaLineBreakClass)
1.1604 + iClass = MLineBreaker::ESaLineBreakClass;
1.1605 + }
1.1606 + }
1.1607 +
1.1608 +void TLineBreakClassIterator::SetNull()
1.1609 + {
1.1610 + iFirst = iCurrent = 0;
1.1611 + }
1.1612 +
1.1613 +TBool TLineBreakClassIterator::Move(const TText* aLimit,
1.1614 + const TText* aLimitAfterSpaces, TInt aOffset,
1.1615 + TBool& aHasSpaces, TLineBreakClassCache& aBreaker)
1.1616 + {
1.1617 + TInt c = MoveTextPtr(iCurrent, aLimit, aOffset);
1.1618 + if (c < 0)
1.1619 + return EFalse;
1.1620 + TUint lbClass = aBreaker.LineBreakClass(c);
1.1621 + if (lbClass == MLineBreaker::ESpLineBreakClass)
1.1622 + {
1.1623 + aHasSpaces = ETrue;
1.1624 + while (lbClass == MLineBreaker::ESpLineBreakClass)
1.1625 + {
1.1626 + c = MoveTextPtr(iCurrent, aLimitAfterSpaces, aOffset);
1.1627 + // We have hit the limit, but there might be more text to search
1.1628 + // after the spaces.
1.1629 + if (c < 0)
1.1630 + {
1.1631 + iClass = MLineBreaker::ESpLineBreakClass;
1.1632 + return ETrue;
1.1633 + }
1.1634 + lbClass = aBreaker.LineBreakClass(c);
1.1635 + }
1.1636 + iClass = lbClass;
1.1637 + return ETrue;
1.1638 + }
1.1639 +
1.1640 + // Cm class characters taken on their base character's
1.1641 + // line break property in the combining character sequence
1.1642 + // See D14 in Conformance chapter of Unicode 3.0 book.
1.1643 + // We do this just for Complex content to maintain backwards
1.1644 + // compatibility otherwise original test cases fail.
1.1645 + if (lbClass == MLineBreaker::ECmLineBreakClass)
1.1646 + {
1.1647 + TUint baseLbCls = GetGlyphClusterLineBreakClass(iCurrent, iFirst, aBreaker);
1.1648 + if (baseLbCls == MLineBreaker::ESaLineBreakClass)
1.1649 + lbClass = MLineBreaker::ESaLineBreakClass;
1.1650 + }
1.1651 +
1.1652 + aHasSpaces = EFalse;
1.1653 + if (lbClass == MLineBreaker::ESaLineBreakClass
1.1654 + && iClass == MLineBreaker::ESaLineBreakClass)
1.1655 + {
1.1656 + // We have at least two SA characters, so we need to find the
1.1657 + // total extent of the SA block. GetLineBreakInContext will be asked
1.1658 + // to find the break.
1.1659 + const TText* p = iCurrent;
1.1660 + while (0 <= c && lbClass == MLineBreaker::ESaLineBreakClass)
1.1661 + {
1.1662 + iCurrent = p;
1.1663 + c = MoveTextPtr(p, aOffset < 0? iFirst : aLimitAfterSpaces, aOffset);
1.1664 + lbClass = aBreaker.LineBreakClass(c);
1.1665 +
1.1666 + // Cm class characters taken on their base character's
1.1667 + // line break property. See above.
1.1668 + if (lbClass == MLineBreaker::ECmLineBreakClass)
1.1669 + {
1.1670 + TUint baseLbCls = GetGlyphClusterLineBreakClass(p, iFirst, aBreaker);
1.1671 + if (baseLbCls == MLineBreaker::ESaLineBreakClass)
1.1672 + lbClass = MLineBreaker::ESaLineBreakClass;
1.1673 + }
1.1674 + if (lbClass == MLineBreaker::EZwLineBreakClass)
1.1675 + {
1.1676 + iCurrent = p;
1.1677 + }
1.1678 + }
1.1679 + return ETrue;
1.1680 + }
1.1681 + iClass = lbClass;
1.1682 + return ETrue;
1.1683 + }
1.1684 +
1.1685 +TLineBreakIterator::TLineBreakIterator(TLineBreakClassCache& aBreaker,
1.1686 + const TText* aText, TInt aLength, TBool aForwards,
1.1687 + TInt aMinBreakPos, TInt aMaxBreakPos)
1.1688 + : iBreaker(aBreaker), iText(aText), iTextLength(aLength), iHasSpaces(EFalse)
1.1689 + {
1.1690 + if (aMinBreakPos < 1)
1.1691 + aMinBreakPos = 1;
1.1692 + // Find the next valid character and see if it can hang
1.1693 + // over the margin.
1.1694 + const TText* endText = aText + aLength;
1.1695 + const TText* max = aText + aMaxBreakPos;
1.1696 + if (endText <= max && aText < endText)
1.1697 + {
1.1698 + // let 'max' point to last character
1.1699 + max = endText - 1;
1.1700 + if (IsLowSurrogate(*max))
1.1701 + {
1.1702 + ASSERT(aLength > 1);
1.1703 + --max;
1.1704 + ASSERT(IsHighSurrogate(*max));
1.1705 + }
1.1706 + }
1.1707 + TInt c = 0xFFFF;
1.1708 + while (max < endText)
1.1709 + {
1.1710 + TInt lastc = c;
1.1711 + c = *max;
1.1712 + if ((c & 0xF800) != 0xD800)
1.1713 + break;
1.1714 + if ((lastc & 0xFC00) == 0xD800
1.1715 + && (c & 0xFC00) == 0xDC00)
1.1716 + {
1.1717 + c = MakeSurrogate(lastc, c);
1.1718 + break;
1.1719 + }
1.1720 + ++max;
1.1721 + }
1.1722 + if (c != 0xFFFF && max + 1 < endText
1.1723 + && aBreaker.Breaker().IsHangingCharacter(c))
1.1724 + // Set max to just beyond hanging character
1.1725 + ++max;
1.1726 + // till here, 'max' points to the "end" of a character
1.1727 +
1.1728 + // set up the iteration.
1.1729 + iMinBreakPos = aText + aMinBreakPos;
1.1730 + iMaxBreakPos = aText + aMaxBreakPos;
1.1731 + // Increment or Decrement must be called to complete set up.
1.1732 + if (max < aText + aMinBreakPos)
1.1733 + {
1.1734 + // no possible line breaks
1.1735 + iLimit = 0;
1.1736 + iAfterBreak.SetNull();
1.1737 + iBeforeBreak.SetNull();
1.1738 + }
1.1739 + else if (aForwards)
1.1740 + {
1.1741 + iLimit = max; // point to the 'end' of the last character (low surrogate if supplementary)
1.1742 + iLimitAfterSpaces = endText - 1;
1.1743 + iAfterBreak.Set(iText, aText + aMinBreakPos - 1, aBreaker);
1.1744 + }
1.1745 + else
1.1746 + {
1.1747 + iLimit = aText + aMinBreakPos - 1;
1.1748 + iLimitAfterSpaces = iLimit;
1.1749 + iBeforeBreak.Set(iText, max - 1, aBreaker);
1.1750 + iBeforeBreak.Move(endText - 1, endText - 1, 1, iHasSpaces, aBreaker);
1.1751 + }
1.1752 + }
1.1753 +
1.1754 +TBool TLineBreakIterator::IsBreak(TBool aForwards)
1.1755 + {
1.1756 + TInt beforeClass = iBeforeBreak.Class();
1.1757 + TInt afterClass = iAfterBreak.Class();
1.1758 + const MLineBreaker& breaker = iBreaker.Breaker();
1.1759 +
1.1760 + // Line break characters overhang the margin
1.1761 + // along with the spaces that precede them.
1.1762 + if (afterClass == MLineBreaker::EBkLineBreakClass)
1.1763 + {
1.1764 + const TText* p = iAfterBreak.Ptr();
1.1765 + MoveTextPtr(p, iText + iTextLength, 1);
1.1766 + iAfterBreak.Set(iText, p, iBreaker);
1.1767 + return ETrue;
1.1768 + }
1.1769 +
1.1770 + // Find break within this run of SA text
1.1771 + const TText* startOfSaText = iBeforeBreak.Ptr();
1.1772 + const TText* endOfSaText = iAfterBreak.Ptr();
1.1773 +
1.1774 + if ((beforeClass != MLineBreaker::ESaLineBreakClass && *startOfSaText != KWhiteSpace) ||
1.1775 + (afterClass != MLineBreaker::ESaLineBreakClass))
1.1776 + // Complex (South-East Asian) line breaking rules not required.
1.1777 + return breaker.LineBreakPossible(beforeClass, afterClass, iHasSpaces);
1.1778 +
1.1779 + MoveTextPtr(endOfSaText, iText + iTextLength, 1);
1.1780 + const TText* minBreak = startOfSaText < iMinBreakPos ?
1.1781 + iMinBreakPos : startOfSaText + 1;
1.1782 + const TText* maxBreak = iMaxBreakPos < endOfSaText ?
1.1783 + iMaxBreakPos : endOfSaText - 1;
1.1784 + TInt breakPos;
1.1785 + TPtrC saText(startOfSaText, endOfSaText - startOfSaText);
1.1786 + if (!breaker.GetLineBreakInContext(saText,
1.1787 + minBreak - startOfSaText, maxBreak - startOfSaText,
1.1788 + aForwards, breakPos))
1.1789 + return EFalse;
1.1790 +
1.1791 + // Convert the break position within SA text into iterator positions.
1.1792 + const TText* p = startOfSaText + breakPos;
1.1793 + iAfterBreak.Set(iText, p, iBreaker);
1.1794 + if (*p != KZeroWidthSpace) MoveTextPtr(p, 0, -1);
1.1795 + iBeforeBreak.Set(iText, p, iBreaker);
1.1796 +
1.1797 + return ETrue;
1.1798 + }
1.1799 +
1.1800 +TBool TLineBreakIterator::HasContingentBreak() const
1.1801 + {
1.1802 + return iBeforeBreak.Class() == MLineBreaker::ECbLineBreakClass
1.1803 + || iAfterBreak.Class() == MLineBreaker::ECbLineBreakClass;
1.1804 + }
1.1805 +
1.1806 +TInt TLineBreakIterator::PreviousClass() const
1.1807 + {
1.1808 + return iBeforeBreak.Class();
1.1809 + }
1.1810 +
1.1811 +TInt TLineBreakIterator::NextClass() const
1.1812 + {
1.1813 + return iAfterBreak.Class();
1.1814 + }
1.1815 +
1.1816 +TBool TLineBreakIterator::HasSpaces() const
1.1817 + {
1.1818 + return iHasSpaces;
1.1819 + }
1.1820 +
1.1821 +TBool TLineBreakIterator::Decrement()
1.1822 + {
1.1823 + iAfterBreak = iBeforeBreak;
1.1824 + return iBeforeBreak.Move(iLimit, iLimitAfterSpaces, -1, iHasSpaces, iBreaker);
1.1825 + }
1.1826 +
1.1827 +TBool TLineBreakIterator::Increment()
1.1828 + {
1.1829 + iBeforeBreak = iAfterBreak;
1.1830 + return iAfterBreak.Move(iLimit, iLimitAfterSpaces, 1, iHasSpaces, iBreaker);
1.1831 + }
1.1832 +
1.1833 +TInt TLineBreakIterator::BreakPos() const
1.1834 + {
1.1835 + const TText* t = iBeforeBreak.Ptr();
1.1836 + MoveTextPtr(t, 0, 1);
1.1837 + return t - iText;
1.1838 + }
1.1839 +
1.1840 +TInt TLineBreakIterator::BeforeBreakPos() const
1.1841 + {
1.1842 + return iBeforeBreak.Ptr() - iText;
1.1843 + }
1.1844 +
1.1845 +TInt TLineBreakIterator::AfterBreakPos() const
1.1846 + {
1.1847 + return iAfterBreak.Ptr() - iText;
1.1848 + }
1.1849 +
1.1850 +TBool HasContingentBreak(TLineBreakIterator& aIterator,
1.1851 + MContingentLineBreaker& aCbDelegate)
1.1852 + {
1.1853 + if (aIterator.PreviousClass() == MLineBreaker::ECbLineBreakClass
1.1854 + && aCbDelegate.IsLegalBreakAfter(
1.1855 + aIterator.BeforeBreakPos(), aIterator.NextClass(),
1.1856 + aIterator.HasSpaces()))
1.1857 + return ETrue;
1.1858 + if (aIterator.NextClass() == MLineBreaker::ECbLineBreakClass
1.1859 + && aCbDelegate.IsLegalBreakBefore(
1.1860 + aIterator.AfterBreakPos(), aIterator.PreviousClass(),
1.1861 + aIterator.HasSpaces()))
1.1862 + return ETrue;
1.1863 + return EFalse;
1.1864 + }
1.1865 +
1.1866 +TBool FindBreak(TLineBreakIterator& aIterator, TBool aForwards,
1.1867 + MContingentLineBreaker* aCbDelegate)
1.1868 + {
1.1869 + while (aForwards? aIterator.Increment() : aIterator.Decrement())
1.1870 + {
1.1871 + if (aCbDelegate && aIterator.HasContingentBreak())
1.1872 + {
1.1873 + if (HasContingentBreak(aIterator, *aCbDelegate))
1.1874 + {
1.1875 + return ETrue;
1.1876 + }
1.1877 + }
1.1878 + else if (aIterator.IsBreak(aForwards))
1.1879 + {
1.1880 + return ETrue;
1.1881 + }
1.1882 + }
1.1883 + return EFalse;
1.1884 + }
1.1885 +
1.1886 +TBool HasContingentBreakL(TLineBreakIterator& aIterator,
1.1887 + MContingentLineBreakerL& aCbDelegate)
1.1888 + {
1.1889 + if (aIterator.PreviousClass() == MLineBreaker::ECbLineBreakClass
1.1890 + && aCbDelegate.IsLegalBreakAfterL(
1.1891 + aIterator.BeforeBreakPos(), aIterator.NextClass(),
1.1892 + aIterator.HasSpaces()))
1.1893 + return ETrue;
1.1894 + if (aIterator.NextClass() == MLineBreaker::ECbLineBreakClass
1.1895 + && aCbDelegate.IsLegalBreakBeforeL(
1.1896 + aIterator.AfterBreakPos(), aIterator.PreviousClass(),
1.1897 + aIterator.HasSpaces()))
1.1898 + return ETrue;
1.1899 + return EFalse;
1.1900 + }
1.1901 +
1.1902 +TBool FindBreakL(TLineBreakIterator& aIterator, TBool aForwards,
1.1903 + MContingentLineBreakerL* aCbDelegate)
1.1904 + {
1.1905 + while (aForwards? aIterator.Increment() : aIterator.Decrement())
1.1906 + {
1.1907 + if (aCbDelegate && aIterator.HasContingentBreak())
1.1908 + {
1.1909 + if (HasContingentBreakL(aIterator, *aCbDelegate))
1.1910 + return ETrue;
1.1911 + }
1.1912 + else if (aIterator.IsBreak(aForwards))
1.1913 + return ETrue;
1.1914 + }
1.1915 + return EFalse;
1.1916 + }
1.1917 +
1.1918 +EXPORT_C TBool MLineBreaker::GetLineBreak(const TDesC& aText,
1.1919 + TInt aMinBreakPos, TInt aMaxBreakPos, TBool aForwards,
1.1920 + MContingentLineBreaker* aCbDelegate,
1.1921 + TInt& aBreakPos, TInt& aBreakPosAfterSpaces) const
1.1922 +/** Finds the line break according to the rules in the virtual functions.
1.1923 +
1.1924 +@param aText The text to be broken.
1.1925 +@param aMinBreakPos The smallest allowed result.
1.1926 +@param aMaxBreakPos The position of the first character that fails to fit the
1.1927 +measure.
1.1928 +@param aForwards ETrue to find the earliest legal break opportunity, EFalse
1.1929 +to find the last.
1.1930 +@param aCbDelegate Object to resolve breaks around characters with the CB (cointingent
1.1931 +break) line breaking class. Typically this class is only used for character
1.1932 +0xFFFD, which usually marks the position of embedded pictures. May be NULL,
1.1933 +in which case LineBreakPossible() determines whether these breaks are legal.
1.1934 +@param aBreakPos Returns the position of the break.
1.1935 +@param aBreakPosAfterSpaces Returns the position of the start of the next line.
1.1936 +@return ETrue if successful, EFalse if no legal line breaks were found. */
1.1937 + {
1.1938 + TLineBreakClassCache cache(*this);
1.1939 + const TText* text = aText.Ptr();
1.1940 + TLineBreakIterator it(cache, text, aText.Length(),
1.1941 + aForwards, aMinBreakPos, aMaxBreakPos);
1.1942 + if (!FindBreak(it, aForwards, aCbDelegate))
1.1943 + return EFalse;
1.1944 + aBreakPos = it.BreakPos();
1.1945 + aBreakPosAfterSpaces = it.AfterBreakPos();
1.1946 + return ETrue;
1.1947 + }
1.1948 +
1.1949 +EXPORT_C TBool MLineBreaker::GetLineBreakL(const TDesC& aText,
1.1950 + TInt aMinBreakPos, TInt aMaxBreakPos, TBool aForwards,
1.1951 + MContingentLineBreakerL* aCbDelegate,
1.1952 + TInt& aBreakPos, TInt& aBreakPosAfterSpaces) const
1.1953 +/** Exactly the same as GetLineBreak, but aCbDelegate's functions may leave so
1.1954 +the whole function may leave.
1.1955 +
1.1956 +@param aText The text to be broken.
1.1957 +@param aMinBreakPos The smallest allowed result.
1.1958 +@param aMaxBreakPos he position of the first character that fails to fit the
1.1959 +measure.
1.1960 +@param aForwards ETrue to find the earliest legal break opportunity, EFalse
1.1961 +to find the last.
1.1962 +@param aCbDelegate Object to resolve breaks around characters with the CB (cointingent
1.1963 +break) line breaking class. Typically this class is only used for character
1.1964 +0xFFFD, which usually marks the position of embedded pictures. May be NULL,
1.1965 +in which case LineBreakPossible() determines whether these breaks are legal.
1.1966 +@param aBreakPos Returns the position of the break.
1.1967 +@param aBreakPosAfterSpaces Returns the position of the start of the next line.
1.1968 +@return ETrue if successful, EFalse if no legal line breaks were found. */
1.1969 + {
1.1970 + if (aMaxBreakPos < aMinBreakPos)
1.1971 + return EFalse;
1.1972 + TLineBreakClassCache cache(*this);
1.1973 + const TText* text = aText.Ptr();
1.1974 + TLineBreakIterator it(cache, text, aText.Length(),
1.1975 + aForwards, aMinBreakPos, aMaxBreakPos);
1.1976 + if (!FindBreakL(it, aForwards, aCbDelegate))
1.1977 + return EFalse;
1.1978 + aBreakPos = it.BreakPos();
1.1979 + aBreakPosAfterSpaces = it.AfterBreakPos();
1.1980 + return ETrue;
1.1981 + }
1.1982 +EXPORT_C void* MLineBreaker::ExtendedInterface(TUid&) const
1.1983 +/** Returns an interface to more functions, or 0 if these are unsupported.
1.1984 +Currently there are no other functions, so 0 is always returned. If this
1.1985 +function is overridden, it must base call if aUid is not recognised,
1.1986 +rather than just returning 0.
1.1987 +@param aUid Identifies the interface to be returned.
1.1988 +@return A pointer to the extended interface, or 0 if not supported. */
1.1989 + {
1.1990 + return 0;
1.1991 + }
1.1992 +
1.1993 +