diff --git a/engine/src/flutter/ci/licenses_golden/licenses_flutter b/engine/src/flutter/ci/licenses_golden/licenses_flutter index 6b618b6f073..75ea1d7ced0 100644 --- a/engine/src/flutter/ci/licenses_golden/licenses_flutter +++ b/engine/src/flutter/ci/licenses_golden/licenses_flutter @@ -490,6 +490,7 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/surface/surface_stats.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/surface/transform.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/test_embedding.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/text/font_collection.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/text/line_break_properties.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/text/line_breaker.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/text/measurement.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/text/paragraph.dart diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine.dart b/engine/src/flutter/lib/web_ui/lib/src/engine.dart index e36550ba606..dd76738945b 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine.dart @@ -108,6 +108,7 @@ part 'engine/surface/surface_stats.dart'; part 'engine/surface/transform.dart'; part 'engine/test_embedding.dart'; part 'engine/text/font_collection.dart'; +part 'engine/text/line_break_properties.dart'; part 'engine/text/line_breaker.dart'; part 'engine/text/measurement.dart'; part 'engine/text/paragraph.dart'; diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/text/line_break_properties.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/text/line_break_properties.dart new file mode 100644 index 00000000000..291736d2438 --- /dev/null +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/text/line_break_properties.dart @@ -0,0 +1,76 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// AUTO-GENERATED FILE. +// Generated by: tool/unicode_sync_script.dart +// +// Source: +// # LineBreak-13.0.0.txt +// # Date: 2020-02-17, 07:43:02 GMT [KW, LI] +// # © 2020 Unicode®, Inc. +// # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +// # For terms of use, see http://www.unicode.org/terms_of_use.html + +// @dart = 2.6 +part of engine; + +/// For an explanation of these enum values, see: +/// +/// * https://unicode.org/reports/tr14/#DescriptionOfProperties +enum LineCharProperty { + CM, // serialized as "A" + BA, // serialized as "B" + LF, // serialized as "C" + BK, // serialized as "D" + CR, // serialized as "E" + SP, // serialized as "F" + EX, // serialized as "G" + QU, // serialized as "H" + AL, // serialized as "I" + PR, // serialized as "J" + PO, // serialized as "K" + OP, // serialized as "L" + CP, // serialized as "M" + IS, // serialized as "N" + HY, // serialized as "O" + SY, // serialized as "P" + NU, // serialized as "Q" + CL, // serialized as "R" + NL, // serialized as "S" + GL, // serialized as "T" + AI, // serialized as "U" + BB, // serialized as "V" + HL, // serialized as "W" + SA, // serialized as "X" + JL, // serialized as "Y" + JV, // serialized as "Z" + JT, // serialized as "a" + NS, // serialized as "b" + ZW, // serialized as "c" + ZWJ, // serialized as "d" + B2, // serialized as "e" + IN, // serialized as "f" + WJ, // serialized as "g" + ID, // serialized as "h" + EB, // serialized as "i" + CJ, // serialized as "j" + H2, // serialized as "k" + H3, // serialized as "l" + SG, // serialized as "m" + XX, // serialized as "n" + CB, // serialized as "o" + RI, // serialized as "p" + EM, // serialized as "q" +} + +const String _packedLineBreakProperties = + '00000008A0009!B000a!C000b000cD000d!E000e000vA000w!F000x!G000y!H000z!I0010!J0011!K0012!I0013!H0014!L0015!M0016!I0017!J0018!N0019!O001a!N001b!P001c001lQ001m001nN001o001qI001r!G001s002iI002j!L002k!J002l!M002m003eI003f!L003g!B003h!R003i!I003j003oA003p!S003q004fA004g!T004h!L004i!K004j004lJ004m!I004n004oU004p!I004q!U004r!H004s!I004t!B004u004vI004w!K004x!J004y004zU0050!V0051!I00520056U0057!H0058005aU005b!L005c005yI005z!U0060006uI006v!U006w00jqI00jr!U00js!V00jt00jvU00jw!V00jx!U00jy00jzI00k0!U00k100k7I00k800kbU00kc!I00kd!U00ke!I00kf!V00kg00lbI00lc00niA00nj!T00nk00nvA00nw00o2T00o300ofA00og00onI00oq00otI00ou!N00ov!I00p000p6I00p8!I00pa00ptI00pv00w2I00w300w9A00wa010vI010x011yI0121013cI013d!N013e!B013h013iI013j!J013l014tA014u!B014v!A014w!I014x014yA014z!I01500151A0152!G0153!A015c0162W0167016aW016b016cI016o016wI016x016zK01700171N01720173I0174017eA017f!G017g!A017i017jG017k018qI018r019bA019c019lQ019m!K019n019oQ019p019rI019s!A019t01cjI01ck!G01cl!I01cm01csA01ct01cuI01cv01d0A01d101d2I01d301d4A01d5!I01d601d9A01da01dbI01dc01dlQ01dm01e5I01e701e8I01e9!A01ea01f3I01f401fuA01fx01idI01ie01ioA01ip!I01j401jdQ01je01kaI01kb01kjA01kk01knI01ko!N01kp!G01kq!I01kt!A01ku01kvJ01kw01lhI01li01llA01lm!I01ln01lvA01lw!I01lx01lzA01m0!I01m101m5A01m801mmI01mo01ncI01nd01nfA01ni!I01nk01nuI01pc01pwI01py01qfI01qr01r5A01r6!I01r701s3A01s401tlI01tm01toA01tp!I01tq01u7A01u8!I01u901ufA01ug01upI01uq01urA01us01utB01uu01v3Q01v401vkI01vl01vnA01vp01vwI01vz01w0I01w301woI01wq01wwI01wy!I01x201x5I01x8!A01x9!I01xa01xgA01xj01xkA01xn01xpA01xq!I01xz!A01y401y5I01y701y9I01ya01ybA01ye01ynQ01yo01ypI01yq01yrK01ys01ywI01yx!K01yy!I01yz!J01z001z1I01z2!A01z501z7A01z901zeI01zj01zkI01zn0208I020a020gI020i020jI020l020mI020o020pI020s!A020u020yA02130214A02170219A021d!A021l021oI021q!I021y0227Q02280229A022a022cI022d!A022e!I022p022rA022t0231I02330235I0237023sI023u0240I02420243I02450249I024c!A024d!I024e024lA024n024pA024r024tA024w!I025c025dI025e025fA025i025rQ025s!I025t!J0261!I02620267A0269026bA026d026kI026n026oI026r027cI027e027kI027m027nI027p027tI027w!A027x!I027y0284A02870288A028b028dA028l028nA028s028tI028v028xI028y028zA0292029bQ029c029jI029u!A029v!I029x02a2I02a602a8I02aa02adI02ah02aiI02ak!I02am02anI02ar02asI02aw02ayI02b202bdI02bi02bmA02bq02bsA02bu02bxA02c0!I02c7!A02cm02cvQ02cw02d4I02d5!J02d6!I02dc02dgA02dh02doI02dq02dsI02du02egI02ei02exI02f1!I02f202f8A02fa02fcA02fe02fhA02fp02fqA02fs02fuI02g002g1I02g202g3A02g602gfQ02gn!V02go02gwI02gx02gzA02h0!V02h102h8I02ha02hcI02he02i0I02i202ibI02id02ihI02ik!A02il!I02im02isA02iu02iwA02iy02j1A02j902jaA02ji!I02jk02jlI02jm02jnA02jq02jzQ02k102k2I02kg02kjA02kk02ksI02ku02kwI02ky02m2I02m302m4A02m5!I02m602mcA02me02mgA02mi02mlA02mm02mnI02ms02muI02mv!A02mw02n5I02n602n7A02na02njQ02nk02nsI02nt!K02nu02nzI02o102o3A02o502omI02oq02pdI02pf02pnI02pp!I02ps02pyI02q2!A02q702qcA02qe!A02qg02qnA02qu02r3Q02r602r7A02r8!I02rl02t6X02tb!J02tc02tqX02tr!I02ts02u1Q02u202u3B02v502v6X02v8!X02va02veX02vg02w3X02w5!X02w702wtX02ww02x0X02x2!X02x402x9X02xc02xlQ02xo02xrX02yo!I02yp02ysV02yt!I02yu02yvV02yw!T02yx02yyV02yz!B02z0!T02z102z5G02z6!T02z7!I02z8!G02z902zbI02zc02zdA02ze02zjI02zk02ztQ02zu0303I0304!B0305!A0306!I0307!A0308!I0309!A030a!L030b!R030c!L030d!R030e030fA030g030nI030p031oI031t0326A0327!B0328032cA032d!B032e032fA032g032kI032l032vA032x033wA033y033zB03400345I0346!A0347034cI034e034fI034g034hV034i!B034j!V034k034oI034p034qT035s037jX037k037tQ037u037vB037w037zI0380039rX039s03a1Q03a203a7X03a803b9I03bb!I03bh!I03bk03cvI03cw03fjY03fk03hjZ03hk03jza03k003m0I03m203m5I03m803meI03mg!I03mi03mlI03mo03nsI03nu03nxI03o003owI03oy03p1I03p403paI03pc!I03pe03phI03pk03pyI03q003rkI03rm03rpI03rs03tmI03tp03trA03ts!I03tt!B03tu03ukI03uo03vdI03vk03xxI03y003y5I03y8!B03y904fzI04g0!B04g104gqI04gr!L04gs!R04gw04iyI04iz04j1B04j204jcI04jk04jwI04jy04k1I04k204k4A04kg04kxI04ky04l0A04l104l2B04lc04ltI04lu04lvA04m804mkI04mm04moI04mq04mrA04n404pfX04pg04phB04pi!b04pj!X04pk!B04pl!I04pm!B04pn!J04po04ppX04ps04q1Q04q804qhI04qo04qpI04qq04qrG04qs04qtB04qu!V04qv!I04qw04qxG04qy!I04qz04r1A04r2!T04r404rdQ04rk04u0I04u804ucI04ud04ueA04uf04vcI04vd!A04ve!I04vk04xhI04xs04ymI04yo04yzA04z404zfA04zk!I04zo04zpG04zq04zzQ0500050tX050w0510X051c052jX052o053dX053k053tQ053u!X053y053zX0540055iI055j055nA055q055rI055s057iX057k058cX058f!A058g058pQ058w0595Q059c059pX059s05a8A05c005c4A05c505dfI05dg05dwA05dx05e3I05e805ehQ05ei05ejB05ek!I05el05eoB05ep05eyI05ez05f7A05f805fgI05fk05fmA05fn05ggI05gh05gtA05gu05gvI05gw05h5Q05h605idI05ie05irA05j005k3I05k405knA05kr05kvB05kw05l5Q05l905lbI05lc05llQ05lm05mlI05mm05mnB05mo05mwI05n405oaI05od05onI05ow05oyA05oz!I05p005pkA05pl05poI05pp!A05pq05pvI05pw!A05px05pyI05pz05q1A05q2!I05q805vjI05vk05x5A05x705xbA05xc0651I06540659I065c066dI066g066lI066o066vI066x!I066z!I0671!I0673067xI0680069gI069i069wI069y06abI06ae06ajI06al06b3I06b606b8I06ba06bgI06bh!V06bi!I06bk06bqB06br!T06bs06buB06bv!c06bw!A06bx!d06by06bzA06c0!B06c1!T06c206c3B06c4!e06c506c6U06c7!I06c806c9H06ca!L06cb06cdH06ce!L06cf!H06cg06chU06ci06cjI06ck06cmf06cn!B06co06cpD06cq06cuA06cv!T06cw06d3K06d4!I06d506d6H06d7!U06d806d9b06da06dfI06dg!N06dh!L06di!R06dj06dlb06dm06dxI06dy!B06dz!I06e006e3B06e4!I06e506e7B06e8!g06e906ecI06ee06enA06eo06epI06es!U06et06f0I06f1!L06f2!R06f3!U06f4!I06f506f8U06f906fgI06fh!L06fi!R06fk06fwI06g006g6J06g7!K06g806glJ06gm!K06gn06gqJ06gr!K06gs06gtJ06gu!K06gv06hbJ06hc06i8A06io06iqI06ir!K06is!I06it!U06iu06iwI06ix!K06iy06j6I06j7!U06j806j9I06ja!J06jb06jkI06jl06jmU06jn06juI06jv!U06jw06kzI06l006l1U06l206l6I06l7!U06l806l9I06la!U06lb!I06lc06lnU06lo06lrI06ls06m1U06m206mgI06mh!U06mi06mjI06mo06mxU06my06ohI06oi!U06oj!I06ok!U06ol06prI06ps!U06pt!I06pu06pvU06pw06pyI06pz06q0U06q106q2I06q3!U06q406q6I06q7!U06q8!I06q9!U06qa06qbJ06qc!I06qd!U06qe06qhI06qi!U06qj06qkI06ql06qoU06qp06qqI06qr!U06qs!I06qt!U06qu!I06qv06r0U06r1!I06r2!U06r306r7I06r806rbU06rc06rfI06rg06rhU06ri06rrI06rs!U06rt06rvI06rw!U06rx06s1I06s2!U06s306sfI06sg06shU06si06sjI06sk06snU06so06spI06sq06srU06ss06stI06su06svU06sw06tdI06te06tfU06tg06thI06ti06tjU06tk06twI06tx!U06ty06u0I06u1!U06u206ucI06ud!U06ue06v2I06v3!U06v406weI06wf!f06wg06x3I06x4!L06x5!R06x6!L06x7!R06x806xdI06xe!U06xf06xlI06xm06xnh06xo06y0I06y1!L06y2!R06y3073jI073k073nh073o0752I075s0762I076o07b2U07b3!I07b407d7U07d807dbI07dc07ecU07ed07enI07eo07f3U07f407f5I07f607f9U07fa07fjI07fk07flU07fm!I07fn07ftU07fu07g1I07g207g3U07g407g5I07g607g7U07g807gbI07gc07gdU07ge07gfI07gg07ghU07gi07glI07gm07goU07gp07gqI07gr!U07gs07gtI07gu07gxU07gy07hdI07he07hhU07hi07hqI07hr!U07hs07i7I07i807ibh07ic!I07id07ieU07if07igI07ih!U07ii07ilI07im07inU07io07irI07is07ith07iu07ivU07iw!h07ix!I07iy07j0h07j1!i07j207j3h07j407jsI07jt07jvh07jw07jzI07k0!U07k1!I07k2!U07k307kvI07kw07kxU07ky!I07kz07l1U07l2!I07l3!U07l4!h07l507l6U07l7!I07l807l9U07la!I07lb!U07lc07lqI07lr!h07ls07mlI07mm07mnU07mo07ngI07nh07nsh07nt07nwU07nx!h07ny!I07nz07o1h07o2!U07o307o4h07o507o7U07o807o9h07oa07obU07oc!h07od07oeU07of07ohh07oi!I07oj!U07ok07onI07oo07opU07oq!h07or07owU07ox07p1h07p2!U07p307p4h07p5!i07p6!h07p707p8U07p907pgh07ph07pjI07pk07plh07pm07ppi07pq07rqI07rr!U07rs07ruI07rv07s0H07s1!I07s207s3G07s4!h07s507s7I07s8!L07s9!R07sa!L07sb!R07sc!L07sd!R07se!L07sf!R07sg!L07sh!R07si!L07sj!R07sk!L07sl!R07sm07tfU07tg07usI07ut!L07uu!R07uv07vpI07vq!L07vr!R07vs!L07vt!R07vu!L07vv!R07vw!L07vx!R07vy!L07vz!R07w00876I0877!L0878!R0879!L087a!R087b!L087c!R087d!L087e!R087f!L087g!R087h!L087i!R087j!L087k!R087l!L087m!R087n!L087o!R087p!L087q!R087r!L087s!R087t089jI089k!L089l!R089m!L089n!R089o08ajI08ak!L08al!R08am08k4I08k508k9U08ka08kzI08l208lxI08lz08q6I08q808riI08rk08viI08vj08vlA08vm08vnI08vt!G08vu08vwB08vx!I08vy!G08vz!B08w008x1I08x3!I08x9!I08xc08yvI08z3!I08z4!B08zj!A08zk0906I090g090mI090o090uI090w0912I0914091aI091c091iI091k091qI091s091yI09200926I09280933A0934093hH093i093pB093q!I093r!B093s!L093t!B093u093vI093w093xH093y093zI09400941H0942!L0943!R0944!L0945!R0946!L0947!R0948!L0949!R094a094dB094e!G094f!I094g094hB094i!I094j094kB094l094pI094q094re094s094uB094v!I094w094xB094y!L094z0956B0957!I0958!B0959!I095a095bB095c095eI096o097dh097f099vh09a809g5h09gw09h7h09hc!B09hd09heR09hf09hgh09hh!b09hi09hjh09hk!L09hl!R09hm!L09hn!R09ho!L09hp!R09hq!L09hr!R09hs!L09ht!R09hu09hvh09hw!L09hx!R09hy!L09hz!R09i0!L09i1!R09i2!L09i3!R09i4!b09i5!L09i609i7R09i809ihh09ii09inA09io09ish09it!A09iu09iyh09iz09j0b09j109j3h09j5!j09j6!h09j7!j09j8!h09j9!j09ja!h09jb!j09jc!h09jd!j09je09k2h09k3!j09k409kyh09kz!j09l0!h09l1!j09l2!h09l3!j09l409l9h09la!j09lb09lgh09lh09lij09ll09lmA09ln09lqb09lr!h09ls!b09lt!j09lu!h09lv!j09lw!h09lx!j09ly!h09lz!j09m0!h09m1!j09m209mqh09mr!j09ms09nmh09nn!j09no!h09np!j09nq!h09nr!j09ns09nxh09ny!j09nz09o4h09o509o6j09o709oah09ob!b09oc!j09od09oeb09of!h09ol09prh09pt09seh09sg09urh09v409vjj09vk09weh09wg09xjh09xk09xrU09xs0fcvh0fcw0fenI0feo0vmch0vmd!b0vme0wi4h0wi80wjqh0wk00wl9I0wla0wlbB0wlc0wssI0wst!B0wsu!G0wsv!B0wsw0wtbI0wtc0wtlQ0wtm0wtnI0wu80wviI0wvj0wvmA0wvn!I0wvo0wvxA0wvy0wwtI0wwu0wwvA0www0wz3I0wz40wz5A0wz6!I0wz70wzbB0wzk0x4vI0x4y0x56I0x6d0x6pI0x6q!A0x6r0x6tI0x6u!A0x6v0x6yI0x6z!A0x700x7mI0x7n0x7rA0x7s0x7vI0x7w!A0x800x87I0x88!K0x89!I0x8g0x9vI0x9w0x9xV0x9y0x9zG0xa80xa9A0xaa0xbnI0xbo0xc5A0xce0xcfB0xcg0xcpQ0xcw0xddA0xde0xdnI0xdo!V0xdp0xdqI0xdr!A0xds0xe1Q0xe20xetI0xeu0xf1A0xf20xf3B0xf40xfqI0xfr0xg3A0xgf!I0xgg0xh8Y0xhc0xhfA0xhg0xiqI0xir0xj4A0xj50xjaI0xjb0xjdB0xje0xjhI0xjj!I0xjk0xjtQ0xjy0xjzI0xk00xkfX0xkg0xkpQ0xkq0xkuX0xkw0xm0I0xm10xmeA0xmo0xmqI0xmr!A0xms0xmzI0xn00xn1A0xn40xndQ0xng!I0xnh0xnjB0xnk0xqaX0xqz0xr3X0xr40xreI0xrf0xrjA0xrk0xrlB0xrm0xroI0xrp0xrqA0xs10xs6I0xs90xseI0xsh0xsmI0xsw0xt2I0xt40xtaI0xtc0xuzI0xv40xyaI0xyb0xyiA0xyj!B0xyk0xylA0xyo0xyxQ0xz4!k0xz50xzvl0xzw!k0xzx0y0nl0y0o!k0y0p0y1fl0y1g!k0y1h0y27l0y28!k0y290y2zl0y30!k0y310y3rl0y3s!k0y3t0y4jl0y4k!k0y4l0y5bl0y5c!k0y5d0y63l0y64!k0y650y6vl0y6w!k0y6x0y7nl0y7o!k0y7p0y8fl0y8g!k0y8h0y97l0y98!k0y990y9zl0ya0!k0ya10yarl0yas!k0yat0ybjl0ybk!k0ybl0ycbl0ycc!k0ycd0yd3l0yd4!k0yd50ydvl0ydw!k0ydx0yenl0yeo!k0yep0yffl0yfg!k0yfh0yg7l0yg8!k0yg90ygzl0yh0!k0yh10yhrl0yhs!k0yht0yijl0yik!k0yil0yjbl0yjc!k0yjd0yk3l0yk4!k0yk50ykvl0ykw!k0ykx0ylnl0ylo!k0ylp0ymfl0ymg!k0ymh0yn7l0yn8!k0yn90ynzl0yo0!k0yo10yorl0yos!k0yot0ypjl0ypk!k0ypl0yqbl0yqc!k0yqd0yr3l0yr4!k0yr50yrvl0yrw!k0yrx0ysnl0yso!k0ysp0ytfl0ytg!k0yth0yu7l0yu8!k0yu90yuzl0yv0!k0yv10yvrl0yvs!k0yvt0ywjl0ywk!k0ywl0yxbl0yxc!k0yxd0yy3l0yy4!k0yy50yyvl0yyw!k0yyx0yznl0yzo!k0yzp0z0fl0z0g!k0z0h0z17l0z18!k0z190z1zl0z20!k0z210z2rl0z2s!k0z2t0z3jl0z3k!k0z3l0z4bl0z4c!k0z4d0z53l0z54!k0z550z5vl0z5w!k0z5x0z6nl0z6o!k0z6p0z7fl0z7g!k0z7h0z87l0z88!k0z890z8zl0z90!k0z910z9rl0z9s!k0z9t0zajl0zak!k0zal0zbbl0zbc!k0zbd0zc3l0zc4!k0zc50zcvl0zcw!k0zcx0zdnl0zdo!k0zdp0zefl0zeg!k0zeh0zf7l0zf8!k0zf90zfzl0zg0!k0zg10zgrl0zgs!k0zgt0zhjl0zhk!k0zhl0zibl0zic!k0zid0zj3l0zj4!k0zj50zjvl0zjw!k0zjx0zknl0zko!k0zkp0zlfl0zlg!k0zlh0zm7l0zm8!k0zm90zmzl0zn0!k0zn10znrl0zns!k0znt0zojl0zok!k0zol0zpbl0zpc!k0zpd0zq3l0zq4!k0zq50zqvl0zqw!k0zqx0zrnl0zro!k0zrp0zsfl0zsg!k0zsh0zt7l0zt8!k0zt90ztzl0zu0!k0zu10zurl0zus!k0zut0zvjl0zvk!k0zvl0zwbl0zwc!k0zwd0zx3l0zx4!k0zx50zxvl0zxw!k0zxx0zynl0zyo!k0zyp0zzfl0zzg!k0zzh1007l1008!k1009100zl1010!k1011101rl101s!k101t102jl102k!k102l103bl103c!k103d1043l1044!k1045104vl104w!k104x105nl105o!k105p106fl106g!k106h1077l1078!k1079107zl1080!k1081108rl108s!k108t109jl109k!k109l10abl10ac!k10ad10b3l10b4!k10b510bvl10bw!k10bx10cnl10co!k10cp10dfl10dg!k10dh10e7l10e8!k10e910ezl10f0!k10f110frl10fs!k10ft10gjl10gk!k10gl10hbl10hc!k10hd10i3l10i4!k10i510ivl10iw!k10ix10jnl10jo!k10jp10kfl10kg!k10kh10l7l10l8!k10l910lzl10m0!k10m110mrl10ms!k10mt10njl10nk!k10nl10obl10oc!k10od10p3l10p4!k10p510pvl10pw!k10px10qnl10qo!k10qp10rfl10rg!k10rh10s7l10s8!k10s910szl10t0!k10t110trl10ts!k10tt10ujl10uk!k10ul10vbl10vc!k10vd10w3l10w4!k10w510wvl10ww!k10wx10xnl10xo!k10xp10yfl10yg!k10yh10z7l10z8!k10z910zzl1100!k1101110rl110s!k110t111jl111k!k111l112bl112c!k112d1133l1134!k1135113vl113w!k113x114nl114o!k114p115fl115g!k115h1167l1168!k1169116zl1170!k1171117rl117s!k117t118jl118k!k118l119bl119c!k119d11a3l11a4!k11a511avl11aw!k11ax11bnl11bo!k11bp11cfl11cg!k11ch11d7l11d8!k11d911dzl11e0!k11e111erl11es!k11et11fjl11fk!k11fl11gbl11gc!k11gd11h3l11h4!k11h511hvl11hw!k11hx11inl11io!k11ip11jfl11jg!k11jh11k7l11k8!k11k911kzl11l0!k11l111lrl11ls!k11lt11mjl11mk!k11ml11nbl11nc!k11nd11o3l11o4!k11o511ovl11ow!k11ox11pnl11po!k11pp11qfl11qg!k11qh11r7l11r8!k11r911rzl11s0!k11s111srl11ss!k11st11tjl11tk!k11tl11ubl11uc!k11ud11v3l11v4!k11v511vvl11vw!k11vx11wnl11wo!k11wp11xfl11xg!k11xh11y7l11y8!k11y911yzl11z0!k11z111zrl11zs!k11zt120jl120k!k120l121bl121c!k121d1223l1224!k1225122vl122w!k122x123nl123o!k123p124fl124g!k124h1257l1258!k1259125zl1260!k1261126rl126s!k126t127jl127k!k127l128bl128c!k128d1293l1294!k1295129vl129w!k129x12anl12ao!k12ap12bfl12bg!k12bh12c7l12c8!k12c912czl12d0!k12d112drl12ds!k12dt12ejl12ek!k12el12fbl12fc!k12fd12g3l12g4!k12g512gvl12gw!k12gx12hnl12ho!k12hp12ifl12ig!k12ih12j7l12j8!k12j912jzl12k0!k12k112krl12ks!k12kt12ljl12lk!k12ll12mbl12mc!k12md12n3l12n4!k12n512nvl12nw!k12nx12onl12oo!k12op12pfl12pg!k12ph12q7l12q8!k12q912qzl12r0!k12r112rrl12rs!k12rt12sjl12sk!k12sl12tbl12tc!k12td12u3l12u4!k12u512uvl12uw!k12ux12vnl12vo!k12vp12wfl12wg!k12wh12x7l12x8!k12x912xzl12y0!k12y112yrl12ys!k12yt12zjl12zk!k12zl130bl130c!k130d1313l1314!k1315131vl131w!k131x132nl132o!k132p133fl133g!k133h1347l1348!k1349134zl1350!k1351135rl135s!k135t136jl136k!k136l137bl137c!k137d1383l1384!k1385138vl138w!k138x139nl139o!k139p13afl13ag!k13ah13b7l13b8!k13b913bzl13c0!k13c113crl13cs!k13ct13djl13dk!k13dl13ebl13ec!k13ed13f3l13f4!k13f513fvl13fw!k13fx13gnl13go!k13gp13hfl13hg!k13hh13i7l13i8!k13i913izl13j0!k13j113jrl13js!k13jt13kjl13kk!k13kl13lbl13lc!k13ld13m3l13m4!k13m513mvl13mw!k13mx13nnl13no!k13np13ofl13og!k13oh13p7l13p8!k13p913pzl13q0!k13q113qrl13qs!k13qt13rjl13rk!k13rl13sbl13sc!k13sd13t3l13t4!k13t513tvl13tw!k13tx13unl13uo!k13up13vfl13vg!k13vh13w7l13w8!k13w913wzl13x0!k13x113xrl13xs!k13xt13yjl13yk!k13yl13zbl13zc!k13zd1403l1404!k1405140vl140w!k140x141nl141o!k141p142fl142g!k142h1437l1438!k1439143zl1440!k1441144rl144s!k144t145jl145k!k145l146bl146c!k146d1473l1474!k1475147vl147w!k147x148nl148o!k148p149fl149g!k149h14a7l14a8!k14a914azl14b0!k14b114brl14bs!k14bt14cjl14ck!k14cl14dbl14dc!k14dd14e3l14e4!k14e514evl14ew!k14ex14fnl14fo!k14fp14gfl14gg!k14gh14h7l14h8!k14h914hzl14i0!k14i114irl14is!k14it14jjl14jk!k14jl14kbl14kc!k14kd14l3l14l4!k14l514lvl14lw!k14lx14mnl14mo!k14mp14nfl14ng!k14nh14o7l14o8!k14o914ozl14p0!k14p114prl14ps!k14pt14qjl14qk!k14ql14rbl14rc!k14rd14s3l14s4!k14s514svl14sw!k14sx14tnl14to!k14tp14ufl14ug!k14uh14v7l14v8!k14v914vzl14w0!k14w114wrl14ws!k14wt14xjl14xk!k14xl14ybl14yc!k14yd14z3l14z4!k14z514zvl14zw!k14zx150nl150o!k150p151fl151g!k151h1527l1528!k1529152zl1530!k1531153rl153s!k153t154jl154k!k154l155bl155c!k155d1563l1564!k1565156vl156w!k156x157nl157o!k157p158fl158g!k158h1597l1598!k1599159zl15a0!k15a115arl15as!k15at15bjl15bk!k15bl15cbl15cc!k15cd15d3l15d4!k15d515dvl15dw!k15dx15enl15eo!k15ep15ffl15fg!k15fh15g7l15g8!k15g915gzl15h0!k15h115hrl15hs!k15ht15ijl15ik!k15il15jbl15jc!k15jd15k3l15k4!k15k515kvl15kw!k15kx15lnl15lo!k15lp15mfl15mg!k15mh15n7l15n8!k15n915nzl15o0!k15o115orl15os!k15ot15pjl15pk!k15pl15qbl15qc!k15qd15r3l15r4!k15r515rvl15rw!k15rx15snl15so!k15sp15tfl15tg!k15th15u7l15u8!k15u915uzl15v0!k15v115vrl15vs!k15vt15wjl15wk!k15wl15xbl15xc!k15xd15y3l15y4!k15y515yvl15yw!k15yx15znl15zo!k15zp160fl160g!k160h1617l1618!k1619161zl1620!k1621162rl162s!k162t163jl163k!k163l164bl164c!k164d1653l1654!k1655165vl165w!k165x166nl166o!k166p167fl167g!k167h1687l1688!k1689168zl1690!k1691169rl169s!k169t16ajl16ak!k16al16bbl16bc!k16bd16c3l16c4!k16c516cvl16cw!k16cx16dnl16do!k16dp16efl16eg!k16eh16f7l16f8!k16f916fzl16g0!k16g116grl16gs!k16gt16hjl16hk!k16hl16ibl16ic!k16id16j3l16j4!k16j516jvl16jw!k16jx16knl16ko!k16kp16lfl16ls16meZ16mj16nva16o0188vm188w1d6nn1d6o1dkvh1dkw1dl2I1dlf1dljI1dlp!W1dlq!A1dlr1dm0W1dm1!I1dm21dmeW1dmg1dmkW1dmm!W1dmo1dmpW1dmr1dmsW1dmu1dn3W1dn41dq9I1dqr1e0tI1e0u!R1e0v!L1e1c1e33I1e361e4nI1e5s1e63I1e64!K1e65!I1e681e6nA1e6o!N1e6p1e6qR1e6r1e6sN1e6t1e6uG1e6v!L1e6w!R1e6x!f1e741e7jA1e7k1e7oh1e7p!L1e7q!R1e7r!L1e7s!R1e7t!L1e7u!R1e7v!L1e7w!R1e7x!L1e7y!R1e7z!L1e80!R1e81!L1e82!R1e83!L1e84!R1e851e86h1e87!L1e88!R1e891e8fh1e8g!R1e8h!h1e8i!R1e8k1e8lb1e8m1e8nG1e8o!h1e8p!L1e8q!R1e8r!L1e8s!R1e8t!L1e8u!R1e8v1e92h1e94!h1e95!J1e96!K1e97!h1e9c1e9gI1e9i1ed8I1edb!g1edd!G1ede1edfh1edg!J1edh!K1edi1edjh1edk!L1edl!R1edm1ednh1edo!R1edp!h1edq!R1edr1ee1h1ee21ee3b1ee41ee6h1ee7!G1ee81eeyh1eez!L1ef0!h1ef1!R1ef21efuh1efv!L1efw!h1efx!R1efy!h1efz!L1eg01eg1R1eg2!L1eg31eg4R1eg5!b1eg6!h1eg71eggj1egh1ehph1ehq1ehrb1ehs1eimh1eiq1eivh1eiy1ej3h1ej61ejbh1eje1ejgh1ejk!K1ejl!J1ejm1ejoh1ejp1ejqJ1ejs1ejyI1ek91ekbA1ekc!o1ekd!U1ekg1ekrI1ekt1eliI1elk1em2I1em41em5I1em71emlI1emo1en1I1eo01ereI1erk1ermB1err1eszI1et31eviI1evk1evwI1ew0!I1exc1eykI1eyl!A1f281f30I1f341f4gI1f4w!A1f4x1f5nI1f5s1f6rI1f711f7uI1f801f91I1f921f96A1f9c1fa5I1fa7!B1fa81fb7I1fbc1fbjI1fbk!B1fbl1fbpI1fcw1fh9I1fhc1fhlQ1fhs1firI1fiw1fjvI1fk01fl3I1flc1fmrI1fn3!I1fr41fzqI1g001g0lI1g0w1g13I1g5c1g5hI1g5k!I1g5m1g6tI1g6v1g6wI1g70!I1g731g7pI1g7r!B1g7s1g9qI1g9z1ga7I1gbk1gc2I1gc41gc5I1gcb1gd7I1gdb!B1gdc1ge1I1ge7!I1gg01ghjI1gho1gi7I1gia1gjkI1gjl1gjnA1gjp1gjqA1gjw1gjzA1gk01gk3I1gk51gk7I1gk91gl1I1gl41gl6A1glb!A1glc1glkI1gls1glzB1gm0!I1gm81gnzI1gow1gpwI1gpx1gpyA1gq31gq7I1gq81gqdB1gqe!f1gqo1gs5I1gs91gsfB1gsg1gt1I1gt41gtuI1gu01gupI1gux1gv0I1gvd1gvjI1gxs1gzsI1h1c1h2qI1h341h4iI1h4q1h5vI1h5w1h5zA1h681h6hQ1heo1hfiI1hfk1hgpI1hgr1hgsA1hgt!B1hgw1hgxI1hj41hk7I1hkg1hl1I1hl21hlcA1hld1hllI1ho01horI1hpc1hpyI1hq81hqaA1hqb1hrrI1hrs1hs6A1hs71hs8B1hs91hsdI1hsi1ht1I1ht21htbQ1htr1htuA1htv1hv3I1hv41hveA1hvf1hvhI1hvi1hvlB1hvx!I1hw01hwoI1hww1hx5Q1hxc1hxeA1hxf1hyeI1hyf1hysA1hyu1hz3Q1hz41hz7B1hz8!I1hz91hzaA1hzb!I1hzk1i0iI1i0j!A1i0k!I1i0l!V1i0m!I1i0w1i0yA1i0z1i2aI1i2b1i2oA1i2p1i2sI1i2t1i2uB1i2v!I1i2w!B1i2x1i30A1i31!I1i321i33A1i341i3dQ1i3e!I1i3f!V1i3g!I1i3h1i3jB1i3l1i44I1i4g1i4xI1i4z1i5nI1i5o1i5zA1i601i61B1i62!I1i631i64B1i65!I1i66!A1i801i86I1i88!I1i8a1i8dI1i8f1i8tI1i8v1i94I1i95!B1i9c1iamI1ian1iayA1ib41ibdQ1ibk1ibnA1ibp1ibwI1ibz1ic0I1ic31icoI1icq1icwI1icy1iczI1id11id5I1id71id8A1id9!I1ida1idgA1idj1idkA1idn1idpA1ids!I1idz!A1ie51ie9I1iea1iebA1iee1iekA1ieo1iesA1iio1ik4I1ik51ikmA1ikn1ikqI1ikr1ikuB1ikv!I1ikw1il5Q1il61il7B1il9!I1ila!A1ilb1ildI1im81injI1ink1io3A1io41io7I1iog1iopQ1itc1iumI1iun1iutA1iuw1iv4A1iv5!V1iv61iv7B1iv81iv9G1iva1ivcI1ivd1ivrB1ivs1ivvI1ivw1ivxA1iww1iy7I1iy81iyoA1iyp1iyqB1iyr1iysI1iz41izdQ1izk1izwV1j0g1j1mI1j1n1j1zA1j20!I1j281j2hQ1j401j4qX1j4t1j57X1j5c1j5lQ1j5m1j5nX1j5o1j5qB1j5r!X1jb41jcbI1jcc1jcqA1jcr!I1jfk1jhbI1jhc1jhlQ1jhm1jhuI1ji71jieI1jih!I1jik1jirI1jit1jiuI1jiw1jjjI1jjk1jjpA1jjr1jjsA1jjv1jjyA1jjz!I1jk0!A1jk1!I1jk21jk3A1jk41jk6B1jkg1jkpQ1jmo1jmvI1jmy1jo0I1jo11jo7A1joa1jogA1joh!I1joi!V1joj!I1jok!A1jpc!I1jpd1jpmA1jpn1jqqI1jqr1jqxA1jqy!I1jqz1jr2A1jr3!V1jr4!I1jr51jr8B1jr9!V1jra!I1jrb!A1jrk!I1jrl1jrvA1jrw1jt5I1jt61jtlA1jtm1jtoB1jtp!I1jtq1jtsV1jtt1jtuB1juo1jw8I1k3k1k3sI1k3u1k4uI1k4v1k52A1k541k5bA1k5c!I1k5d1k5hB1k5s1k61Q1k621k6kI1k6o!V1k6p!G1k6q1k7jI1k7m1k87A1k891k8mA1kao1kauI1kaw1kaxI1kaz1kc0I1kc11kc6A1kca!A1kcc1kcdA1kcf1kclA1kcm!I1kcn!A1kcw1kd5Q1kdc1kdhI1kdj1kdkI1kdm1kehI1kei1kemA1keo1kepA1ker1kevA1kew!I1kf41kfdQ1ko01koiI1koj1komA1kon1kooI1kts!I1ku81kv0I1kv11kv4K1kv51kvlI1kvz!B1kw01lllI1log1lriI1lrk1lroB1ls01lxfI1o1s1oifI1oig1oiiL1oij1oilR1oim1ojlI1ojm!R1ojn1ojpI1ojq!L1ojr!R1ojs!L1ojt!R1oju1oqgI1oqh!L1oqi1oqjR1oqk1oviI1ovk1ovqT1ovr!L1ovs!R1s001sctI1scu!L1scv!R1scw1sg6I1z401zjsI1zk01zkuI1zkw1zl5Q1zla1zlbB1zo01zotI1zow1zp0A1zp1!B1zpc1zqnI1zqo1zquA1zqv1zqxB1zqy1zr7I1zr8!B1zr9!I1zrk1zrtQ1zrv1zs1I1zs31zsnI1zst1ztbI20cg20euI20ev20ewB20ex20eyI20hs20juI20jz!A20k0!I20k120ljA20lr20luA20lv20m7I20o020o3b20o4!T20og20ohA20ow25fbh25fk260vh260w26dxI26f426fch2dc02djyh2dlc2dlej2dlw2dlzj2dm82dx7h2fpc2fsaI2fsg2fssI2fsw2ft4I2ftc2ftlI2fto!I2ftp2ftqA2ftr!B2fts2ftvA2jnk2judI2juo2jvqI2jvt2jxgI2jxh2jxlA2jxm2jxoI2jxp2jyaA2jyb2jycI2jyd2jyjA2jyk2jzdI2jze2jzhA2jzi2k14I2k1s2k3lI2k3m2k3oA2k3p!I2k802k8jI2k8w2kbaI2kbk2kc8I2kg02kicI2kie2kkcI2kke2kkfI2kki!I2kkl2kkmI2kkp2kksI2kku2kl5I2kl7!I2kl92klfI2klh2kn9I2knb2kneI2knh2knoI2knq2knwI2kny2kopI2kor2kouI2kow2kp0I2kp2!I2kp62kpcI2kpe2kytI2kyw2l6zI2l722l8fQ2l8g2lmnI2lmo2lo6A2lo72loaI2lob2lpoA2lpp2lpwI2lpx!A2lpy2lqbI2lqc!A2lqd2lqeI2lqf2lqiB2lqj!I2lqz2lr3A2lr52lrjA2mtc2mtiA2mtk2mu0A2mu32mu9A2mub2mucA2mue2muiA2n0g2n1oI2n1s2n1yA2n1z2n25I2n282n2hQ2n2m2n2nI2ncw2ne3I2ne42ne7A2ne82nehQ2nen!J2oe82ojoI2ojr2ojzI2ok02ok6A2olc2on7I2on82oneA2onf!I2onk2ontQ2ony2onzL2p9t2pbfI2pbg!K2pbh2pbjI2pbk!K2pbl2pboI2pdt2pfhI2pkw2pkzI2pl12plrI2plt2pluI2plw!I2plz!I2pm12pmaI2pmc2pmfI2pmh!I2pmj!I2pmq!I2pmv!I2pmx!I2pmz!I2pn12pn3I2pn52pn6I2pn8!I2pnb!I2pnd!I2pnf!I2pnh!I2pnj!I2pnl2pnmI2pno!I2pnr2pnuI2pnw2po2I2po42po7I2po92pocI2poe!I2pog2popI2por2pp7I2ppd2ppfI2pph2pplI2ppn2pq3I2prk2prlI2pz42q67h2q682q6kU2q6l2q6nh2q6o2q7hU2q7i2q7jI2q7k2q95U2q962q98I2q992q9bh2q9c2qb0U2qb12qclh2qcm2qdbp2qdc2qo4h2qo5!i2qo62qorh2qos2qotI2qou2qpgh2qph2qpiI2qpj2qpnh2qpo!I2qpp2qpth2qpu2qpwi2qpx2qpyh2qpz!i2qq02qq1h2qq22qq4i2qq52qreh2qrf2qrjq2qrk2qtdh2qte2qtfi2qtg2qthh2qti2qtsi2qtt2qudh2que2quwi2qux2quzh2qv0!i2qv12qv4h2qv52qv7i2qv8!h2qv92qvbi2qvc2qvih2qvj!i2qvk!h2qvl!i2qvm2qvzh2qw0!I2qw1!h2qw2!I2qw3!h2qw4!I2qw52qw9h2qwa!i2qwb2qweh2qwf!I2qwg!h2qwh2qwiI2qwj2qynh2qyo2qyuI2qyv2qzah2qzb2qzoI2qzp2r01h2r022r0pI2r0q2r1vh2r1w2r1xi2r1y2r21h2r22!i2r232r2nh2r2o!i2r2p2r2sh2r2t2r2ui2r2v2r4jh2r4k2r4rI2r4s2r5fh2r5g2r5lI2r5m2r7oh2r7p2r7ri2r7s2r7uh2r7v2r7zi2r802r91I2r922r94H2r952r97b2r982r9bI2r9c2raah2rab!i2rac2rarh2ras2raui2rav2rb3h2rb4!i2rb52rbfh2rbg!i2rbh2rcvh2rcw2rg3I2rg42rgfh2rgg2risI2rit2rjzh2rk02rkbI2rkc2rkfh2rkg2rlzI2rm02rm7h2rm82rmhI2rmi2rmnh2rmo2rnrI2rns2rnzh2ro02rotI2rou2rr3h2rr42rrfI2rrg!i2rrh2rrih2rrj!i2rrk2rrrh2rrs2rrzi2rs02rs5h2rs6!i2rs72rsfh2rsg2rspi2rsq2rsrh2rss2rsui2rsv2rueh2ruf!i2rug2rw4h2rw52rw6i2rw7!h2rw82rw9i2rwa!h2rwb!i2rwc2rwsh2rwt2rwvi2rww!h2rwx2rx9i2rxa2ry7h2ry82s0jI2s0k2s5bh2s5c2s9eI2s9g2sayI2sc02sc9Q2scg2t4th2t4w47p9h47pc5m9phjny9!Ajnz4jo1rAjo5cjobzAl2iomh31nmh34nvnhn'; + + +UnicodePropertyLookup lineLookup = + UnicodePropertyLookup.fromPackedData( + _packedLineBreakProperties, + 1076, + LineCharProperty.values, +); diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/text/unicode_range.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/text/unicode_range.dart index 85b04211eee..e893a978ab1 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/text/unicode_range.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/text/unicode_range.dart @@ -5,6 +5,14 @@ // @dart = 2.6 part of engine; +const int _kChar_0 = 48; +const int _kChar_9 = 57; +const int _kChar_A = 65; +const int _kChar_Z = 90; +const int _kChar_a = 97; +const int _kChar_z = 122; +const int _kCharBang = 33; + enum _ComparisonResult { inside, higher, @@ -63,11 +71,29 @@ class UnicodeRange

{ class UnicodePropertyLookup

{ const UnicodePropertyLookup(this.ranges); + /// Creates a [UnicodePropertyLookup] from packed line break data. + factory UnicodePropertyLookup.fromPackedData( + String packedData, + int singleRangesCount, + List

propertyEnumValues, + ) { + return UnicodePropertyLookup

( + _unpackProperties

(packedData, singleRangesCount, propertyEnumValues), + ); + } + final List> ranges; - P find(int value) { - final int index = _binarySearch(value); - return index == -1 ? null : ranges[index].property; + /// Take a [text] and an [index], and returns the property of the character + /// located at that [index]. + /// + /// If the [index] is out of range, null will be returned. + P find(String text, int index) { + if (index < 0 || index >= text.length) { + return null; + } + final int rangeIndex = _binarySearch(text.codeUnitAt(index)); + return rangeIndex == -1 ? null : ranges[rangeIndex].property; } int _binarySearch(int value) { @@ -90,3 +116,94 @@ class UnicodePropertyLookup

{ return -1; } } + +List> _unpackProperties

( + String packedData, + int singleRangesCount, + List

propertyEnumValues, +) { + // Packed data is mostly structured in chunks of 9 characters each: + // + // * [0..3]: Range start, encoded as a base36 integer. + // * [4..7]: Range end, encoded as a base36 integer. + // * [8]: Index of the property enum value, encoded as a single letter. + // + // When the range is a single number (i.e. range start == range end), it gets + // packed more efficiently in a chunk of 6 characters: + // + // * [0..3]: Range start (and range end), encoded as a base 36 integer. + // * [4]: "!" to indicate that there's no range end. + // * [5]: Index of the property enum value, encoded as a single letter. + + // `packedData.length + singleRangesCount * 3` would have been the size of the + // packed data if the efficient packing of single-range items wasn't applied. + assert((packedData.length + singleRangesCount * 3) % 9 == 0); + + final List> ranges = >[]; + final int dataLength = packedData.length; + int i = 0; + while (i < dataLength) { + final int rangeStart = _consumeInt(packedData, i); + i += 4; + + int rangeEnd; + if (packedData.codeUnitAt(i) == _kCharBang) { + rangeEnd = rangeStart; + i++; + } else { + rangeEnd = _consumeInt(packedData, i); + i += 4; + } + final int charCode = packedData.codeUnitAt(i); + final P property = + propertyEnumValues[_getEnumIndexFromPackedValue(charCode)]; + i++; + + ranges.add(UnicodeRange

(rangeStart, rangeEnd, property)); + } + return ranges; +} + +int _getEnumIndexFromPackedValue(int charCode) { + // This has to stay in sync with [EnumValue.serialized] in + // `tool/unicode_sync_script.dart`. + + assert((charCode >= _kChar_A && charCode <= _kChar_Z) || + (charCode >= _kChar_a && charCode <= _kChar_z)); + + // Uppercase letters were assigned to the first 26 enum values. + if (charCode <= _kChar_Z) { + return charCode - _kChar_A; + } + // Lowercase letters were assigned to enum values above 26. + return 26 + charCode - _kChar_a; +} + +int _consumeInt(String packedData, int index) { + // The implementation is equivalent to: + // + // ```dart + // return int.tryParse(packedData.substring(index, index + 4), radix: 36); + // ``` + // + // But using substring is slow when called too many times. This custom + // implementation makes the unpacking 25%-45% faster than using substring. + final int digit0 = _getIntFromCharCode(packedData.codeUnitAt(index + 3)); + final int digit1 = _getIntFromCharCode(packedData.codeUnitAt(index + 2)); + final int digit2 = _getIntFromCharCode(packedData.codeUnitAt(index + 1)); + final int digit3 = _getIntFromCharCode(packedData.codeUnitAt(index)); + return digit0 + (digit1 * 36) + (digit2 * 36 * 36) + (digit3 * 36 * 36 * 36); +} + +/// Does the same thing as [int.parse(str, 36)] but takes only a single +/// character as a [charCode] integer. +int _getIntFromCharCode(int charCode) { + assert((charCode >= _kChar_0 && charCode <= _kChar_9) || + (charCode >= _kChar_a && charCode <= _kChar_z)); + + if (charCode <= _kChar_9) { + return charCode - _kChar_0; + } + // "a" starts from 10 and remaining letters go up from there. + return charCode - _kChar_a + 10; +} diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/text/word_break_properties.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/text/word_break_properties.dart index 4ca58a18f4a..ab8b9746fc6 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/text/word_break_properties.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/text/word_break_properties.dart @@ -6,1016 +6,46 @@ // Generated by: tool/unicode_sync_script.dart // // Source: -// # WordBreakProperty-12.1.0.txt -// # Date: 2019-03-10, 10:53:28 GMT -// # © 2019 Unicode®, Inc. +// # WordBreakProperty-13.0.0.txt +// # Date: 2020-01-22, 00:07:44 GMT +// # © 2020 Unicode®, Inc. // # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. // # For terms of use, see http://www.unicode.org/terms_of_use.html -// # -// # Unicode Character Database -// # For documentation, see http://www.unicode.org/reports/tr44/ // @dart = 2.6 part of engine; -CharProperty getCharProperty(String text, int index) { - if (index < 0 || index >= text.length) { - return null; - } - return lookup.find(text.codeUnitAt(index)); +/// For an explanation of these enum values, see: +/// +/// * http://unicode.org/reports/tr29/#Table_Word_Break_Property_Values +enum WordCharProperty { + DoubleQuote, // serialized as "A" + SingleQuote, // serialized as "B" + HebrewLetter, // serialized as "C" + CR, // serialized as "D" + LF, // serialized as "E" + Newline, // serialized as "F" + Extend, // serialized as "G" + RegionalIndicator, // serialized as "H" + Format, // serialized as "I" + Katakana, // serialized as "J" + ALetter, // serialized as "K" + MidLetter, // serialized as "L" + MidNum, // serialized as "M" + MidNumLet, // serialized as "N" + Numeric, // serialized as "O" + ExtendNumLet, // serialized as "P" + ZWJ, // serialized as "Q" + WSegSpace, // serialized as "R" } -enum CharProperty { - DoubleQuote, - SingleQuote, - HebrewLetter, - CR, - LF, - Newline, - Extend, - RegionalIndicator, - Format, - Katakana, - ALetter, - MidLetter, - MidNum, - MidNumLet, - Numeric, - ExtendNumLet, - ZWJ, - WSegSpace -} +const String _packedWordBreakProperties = + '000a!E000b000cF000d!D000w!R000y!A0013!B0018!M001a!N001c001lO001m!L001n!M001t002iK002n!P002p003eK003p!F004q!K004t!I0051!K0053!L0056!K005c005yK0060006uK006w00k7K00ke00lbK00lc00ofG00og00okK00om00onK00oq00otK00ou!M00ov!K00p2!K00p3!L00p400p6K00p8!K00pa00ptK00pv00s5K00s700w1K00w300w9G00wa010vK010x011yK01210124K0126!K0127!L0128013cK013d!M013e!K013l014tG014v!G014x014yG01500151G0153!G015c0162C0167016aC016b!K016c!L016o016tI01700171M0174017eG017g!I017k018qK018r019bG019c019lO019n!O019o!M019q019rK019s!G019t01cjK01cl!K01cm01csG01ct!I01cv01d0G01d101d2K01d301d4G01d601d9G01da01dbK01dc01dlO01dm01doK01dr!K01e7!I01e8!K01e9!G01ea01f3K01f401fuG01fx01idK01ie01ioG01ip!K01j401jdO01je01kaK01kb01kjG01kk01klK01ko!M01kq!K01kt!G01kw01lhK01li01llG01lm!K01ln01lvG01lw!K01lx01lzG01m0!K01m101m5G01mo01ncK01nd01nfG01nk01nuK01pc01pwK01py01qfK01qr01r5G01r6!I01r701s3G01s401tlK01tm01toG01tp!K01tq01u7G01u8!K01u901ufG01ug01upK01uq01urG01uu01v3O01v501vkK01vl01vnG01vp01vwK01vz01w0K01w301woK01wq01wwK01wy!K01x201x5K01x8!G01x9!K01xa01xgG01xj01xkG01xn01xpG01xq!K01xz!G01y401y5K01y701y9K01ya01ybG01ye01ynO01yo01ypK01z0!K01z2!G01z501z7G01z901zeK01zj01zkK01zn0208K020a020gK020i020jK020l020mK020o020pK020s!G020u020yG02130214G02170219G021d!G021l021oK021q!K021y0227O02280229G022a022cK022d!G022p022rG022t0231K02330235K0237023sK023u0240K02420243K02450249K024c!G024d!K024e024lG024n024pG024r024tG024w!K025c025dK025e025fG025i025rO0261!K02620267G0269026bG026d026kK026n026oK026r027cK027e027kK027m027nK027p027tK027w!G027x!K027y0284G02870288G028b028dG028l028nG028s028tK028v028xK028y028zG0292029bO029d!K029u!G029v!K029x02a2K02a602a8K02aa02adK02ah02aiK02ak!K02am02anK02ar02asK02aw02ayK02b202bdK02bi02bmG02bq02bsG02bu02bxG02c0!K02c7!G02cm02cvO02dc02dgG02dh02doK02dq02dsK02du02egK02ei02exK02f1!K02f202f8G02fa02fcG02fe02fhG02fp02fqG02fs02fuK02g002g1K02g202g3G02g602gfO02gw!K02gx02gzG02h102h8K02ha02hcK02he02i0K02i202ibK02id02ihK02ik!G02il!K02im02isG02iu02iwG02iy02j1G02j902jaG02ji!K02jk02jlK02jm02jnG02jq02jzO02k102k2K02kg02kjG02kk02ksK02ku02kwK02ky02m2K02m302m4G02m5!K02m602mcG02me02mgG02mi02mlG02mm!K02ms02muK02mv!G02n302n5K02n602n7G02na02njO02nu02nzK02o102o3G02o502omK02oq02pdK02pf02pnK02pp!K02ps02pyK02q2!G02q702qcG02qe!G02qg02qnG02qu02r3O02r602r7G02sx!G02t002t6G02tj02tqG02ts02u1O02wh!G02wk02wsG02x402x9G02xc02xlO02yo!K02zc02zdG02zk02ztO0305!G0307!G0309!G030e030fG030g030nK030p031oK031t032cG032e032fG032g032kK032l032vG032x033wG0346!G036z037iG037k037tO03860389G038e038gG038i038kG038n038tG038x0390G039e039pG039r!G039s03a1O03a203a5G03a803b9K03bb!K03bh!K03bk03cqK03cs03m0K03m203m5K03m803meK03mg!K03mi03mlK03mo03nsK03nu03nxK03o003owK03oy03p1K03p403paK03pc!K03pe03phK03pk03pyK03q003rkK03rm03rpK03rs03tmK03tp03trG03uo03v3K03vk03xxK03y003y5K03y904fgK04fj04fzK04g0!R04g104gqK04gw04iyK04j204jcK04jk04jwK04jy04k1K04k204k4G04kg04kxK04ky04l0G04lc04ltK04lu04lvG04m804mkK04mm04moK04mq04mrG04ok04pfG04pp!G04ps04q1O04qz04r1G04r2!I04r404rdO04rk04u0K04u804ucK04ud04ueG04uf04vcK04vd!G04ve!K04vk04xhK04xs04ymK04yo04yzG04z404zfG04zq04zzO053k053tO054w055iK055j055nG0579057iG057k058cG058f!G058g058pO058w0595O059s05a8G05c005c4G05c505dfK05dg05dwG05dx05e3K05e805ehO05ez05f7G05fk05fmG05fn05ggK05gh05gtG05gu05gvK05gw05h5O05h605idK05ie05irG05j405k3K05k405knG05kw05l5O05l905lbK05lc05llO05lm05mlK05mo05mwK05n405oaK05od05ofK05ow05oyG05p005pkG05pl05poK05pp!G05pq05pvK05pw!G05px05pyK05pz05q1G05q2!K05q805vjK05vk05x5G05x705xbG05xc0651K06540659K065c066dK066g066lK066o066vK066x!K066z!K0671!K0673067xK0680069gK069i069oK069q!K069u069wK069y06a4K06a806abK06ae06ajK06ao06b0K06b606b8K06ba06bgK06bk06bqR06bs06buR06bw!G06bx!Q06by06bzI06c806c9N06ck!N06cn!L06co06cpF06cq06cuI06cv!P06db06dcP06dg!M06dw!P06e7!R06e806ecI06ee06enI06ep!K06f3!K06fk06fwK06hc06i8G06iq!K06iv!K06iy06j7K06j9!K06jd06jhK06jo!K06jq!K06js!K06ju06jxK06jz06k9K06kc06kfK06kl06kpK06ku!K06lc06mgK079207ahK08ow08q6K08q808riK08rk08v8K08vf08viK08vj08vlG08vm08vnK08w008x1K08x3!K08x9!K08xc08yvK08z3!K08zj!G08zk0906K090g090mK090o090uK090w0912K0914091aK091c091iK091k091qK091s091yK09200926K09280933G094f!K09hc!R09hh!K09ii09inG09ip09itJ09iz09j0K09ll09lmG09ln09loJ09ls09oaJ09oc09ofJ09ol09prK09pt09seK09sw09trK09v409vjJ0a1c0a2mJ0a2o0a53J0vls0wi4K0wk00wl9K0wlc0wssK0wsw0wtbK0wtc0wtlO0wtm0wtnK0wu80wviK0wvj0wvmG0wvo0wvxG0wvz0wwtK0wwu0wwvG0www0wz3K0wz40wz5G0wzs0x4vK0x4y0x56K0x6d0x6pK0x6q!G0x6r0x6tK0x6u!G0x6v0x6yK0x6z!G0x700x7mK0x7n0x7rG0x7w!G0x8g0x9vK0xa80xa9G0xaa0xbnK0xbo0xc5G0xcg0xcpO0xcw0xddG0xde0xdjK0xdn!K0xdp0xdqK0xdr!G0xds0xe1O0xe20xetK0xeu0xf1G0xf40xfqK0xfr0xg3G0xgg0xh8K0xhc0xhfG0xhg0xiqK0xir0xj4G0xjj!K0xjk0xjtO0xk5!G0xkg0xkpO0xkw0xm0K0xm10xmeG0xmo0xmqK0xmr!G0xms0xmzK0xn00xn1G0xn40xndO0xob0xodG0xps!G0xpu0xpwG0xpz0xq0G0xq60xq7G0xq9!G0xr40xreK0xrf0xrjG0xrm0xroK0xrp0xrqG0xs10xs6K0xs90xseK0xsh0xsmK0xsw0xt2K0xt40xtaK0xtc0xuxK0xv40xyaK0xyb0xyiG0xyk0xylG0xyo0xyxO0xz416lfK16ls16meK16mj16nvK1dkw1dl2K1dlf1dljK1dlp!C1dlq!G1dlr1dm0C1dm21dmeC1dmg1dmkC1dmm!C1dmo1dmpC1dmr1dmsC1dmu1dn3C1dn41dptK1dqr1e0tK1e1c1e33K1e361e4nK1e5s1e63K1e681e6nG1e6o!M1e6r!L1e6s!M1e741e7jG1e7n1e7oP1e8d1e8fP1e8g!M1e8i!N1e8k!M1e8l!L1e9c1e9gK1e9i1ed8K1edb!I1edj!N1edo!M1edq!N1eds1ee1O1ee2!L1ee3!M1ee91eeyK1ef3!P1ef51efuK1eg61ehpJ1ehq1ehrG1ehs1eimK1eiq1eivK1eiy1ej3K1ej61ejbK1eje1ejgK1ek91ekbI1ekg1ekrK1ekt1eliK1elk1em2K1em41em5K1em71emlK1emo1en1K1eo01ereK1etc1eusK1eyl!G1f281f30K1f341f4gK1f4w!G1f5s1f6nK1f711f7uK1f801f91K1f921f96G1f9c1fa5K1fa81fb7K1fbc1fbjK1fbl1fbpK1fcw1fh9K1fhc1fhlO1fhs1firK1fiw1fjvK1fk01fl3K1flc1fmrK1fr41fzqK1g001g0lK1g0w1g13K1g5c1g5hK1g5k!K1g5m1g6tK1g6v1g6wK1g70!K1g731g7pK1g801g8mK1g8w1g9qK1gbk1gc2K1gc41gc5K1gcg1gd1K1gdc1ge1K1gg01ghjK1ghq1ghrK1gjk!K1gjl1gjnG1gjp1gjqG1gjw1gjzG1gk01gk3K1gk51gk7K1gk91gl1K1gl41gl6G1glb!G1gm81gn0K1gn41gnwK1gow1gp3K1gp51gpwK1gpx1gpyG1gqo1gs5K1gsg1gt1K1gtc1gtuK1gu81gupK1gxs1gzsK1h1c1h2qK1h341h4iK1h4w1h5vK1h5w1h5zG1h681h6hO1hfk1hgpK1hgr1hgsG1hgw1hgxK1hj41hjwK1hk7!K1hkg1hl1K1hl21hlcG1ho01hokK1hpc1hpyK1hq81hqaG1hqb1hrrK1hrs1hs6G1ht21htbO1htr1htuG1htv1hv3K1hv41hveG1hvh!I1hvx!I1hw01hwoK1hww1hx5O1hxc1hxeG1hxf1hyeK1hyf1hysG1hyu1hz3O1hz8!K1hz91hzaG1hzb!K1hzk1i0iK1i0j!G1i0m!K1i0w1i0yG1i0z1i2aK1i2b1i2oG1i2p1i2sK1i2x1i30G1i321i33G1i341i3dO1i3e!K1i3g!K1i4g1i4xK1i4z1i5nK1i5o1i5zG1i66!G1i801i86K1i88!K1i8a1i8dK1i8f1i8tK1i8v1i94K1i9c1iamK1ian1iayG1ib41ibdO1ibk1ibnG1ibp1ibwK1ibz1ic0K1ic31icoK1icq1icwK1icy1iczK1id11id5K1id71id8G1id9!K1ida1idgG1idj1idkG1idn1idpG1ids!K1idz!G1ie51ie9K1iea1iebG1iee1iekG1ieo1iesG1iio1ik4K1ik51ikmG1ikn1ikqK1ikw1il5O1ila!G1ilb1ildK1im81injK1ink1io3G1io41io5K1io7!K1iog1iopO1itc1iumK1iun1iutG1iuw1iv4G1ivs1ivvK1ivw1ivxG1iww1iy7K1iy81iyoG1iys!K1iz41izdO1j0g1j1mK1j1n1j1zG1j20!K1j281j2hO1j4t1j57G1j5c1j5lO1jb41jcbK1jcc1jcqG1jfk1jhbK1jhc1jhlO1ji71jieK1jih!K1jik1jirK1jit1jiuK1jiw1jjjK1jjk1jjpG1jjr1jjsG1jjv1jjyG1jjz!K1jk0!G1jk1!K1jk21jk3G1jkg1jkpO1jmo1jmvK1jmy1jo0K1jo11jo7G1joa1jogG1joh!K1joj!K1jok!G1jpc!K1jpd1jpmG1jpn1jqqK1jqr1jqxG1jqy!K1jqz1jr2G1jrb!G1jrk!K1jrl1jrvG1jrw1jt5K1jt61jtlG1jtp!K1juo1jw8K1k3k1k3sK1k3u1k4uK1k4v1k52G1k541k5bG1k5c!K1k5s1k61O1k6q1k7jK1k7m1k87G1k891k8mG1kao1kauK1kaw1kaxK1kaz1kc0K1kc11kc6G1kca!G1kcc1kcdG1kcf1kclG1kcm!K1kcn!G1kcw1kd5O1kdc1kdhK1kdj1kdkK1kdm1kehK1kei1kemG1keo1kepG1ker1kevG1kew!K1kf41kfdO1ko01koiK1koj1komG1kts!K1kw01lllK1log1lriK1ls01lxfK1o1s1oviK1ovk1ovsI1s001sg6K1z401zjsK1zk01zkuK1zkw1zl5O1zo01zotK1zow1zp0G1zpc1zqnK1zqo1zquG1zr41zr7K1zrk1zrtO1zs31zsnK1zst1ztbK20cg20e7K20hs20juK20jz!G20k0!K20k120ljG20lr20luG20lv20m7K20o020o1K20o3!K20o4!G20og20ohG2dc0!J2dlw2dlzJ2fpc2fsaK2fsg2fssK2fsw2ft4K2ftc2ftlK2ftp2ftqG2fts2ftvI2jxh2jxlG2jxp2jxuG2jxv2jy2I2jy32jyaG2jyd2jyjG2jze2jzhG2k3m2k3oG2kg02kicK2kie2kkcK2kke2kkfK2kki!K2kkl2kkmK2kkp2kksK2kku2kl5K2kl7!K2kl92klfK2klh2kn9K2knb2kneK2knh2knoK2knq2knwK2kny2kopK2kor2kouK2kow2kp0K2kp2!K2kp62kpcK2kpe2kytK2kyw2kzkK2kzm2l0aK2l0c2l16K2l182l1wK2l1y2l2sK2l2u2l3iK2l3k2l4eK2l4g2l54K2l562l60K2l622l6qK2l6s2l6zK2l722l8fO2lmo2lo6G2lob2lpoG2lpx!G2lqc!G2lqz2lr3G2lr52lrjG2mtc2mtiG2mtk2mu0G2mu32mu9G2mub2mucG2mue2muiG2n0g2n1oK2n1s2n1yG2n1z2n25K2n282n2hO2n2m!K2ncw2ne3K2ne42ne7G2ne82nehO2oe82ojoK2ok02ok6G2olc2on7K2on82oneG2onf!K2onk2ontO2pkw2pkzK2pl12plrK2plt2pluK2plw!K2plz!K2pm12pmaK2pmc2pmfK2pmh!K2pmj!K2pmq!K2pmv!K2pmx!K2pmz!K2pn12pn3K2pn52pn6K2pn8!K2pnb!K2pnd!K2pnf!K2pnh!K2pnj!K2pnl2pnmK2pno!K2pnr2pnuK2pnw2po2K2po42po7K2po92pocK2poe!K2pog2popK2por2pp7K2ppd2ppfK2pph2pplK2ppn2pq3K2q7k2q89K2q8g2q95K2q9c2qa1K2qcm2qdbH2qrf2qrjG2sc02sc9Ojny9!Ijnz4jo1rGjo5cjobzG'; -const UnicodePropertyLookup lookup = - UnicodePropertyLookup(>[ - UnicodeRange(0x000A, 0x000A, CharProperty.LF), - UnicodeRange(0x000B, 0x000C, CharProperty.Newline), - UnicodeRange(0x000D, 0x000D, CharProperty.CR), - UnicodeRange(0x0020, 0x0020, CharProperty.WSegSpace), - UnicodeRange(0x0022, 0x0022, CharProperty.DoubleQuote), - UnicodeRange(0x0027, 0x0027, CharProperty.SingleQuote), - UnicodeRange(0x002C, 0x002C, CharProperty.MidNum), - UnicodeRange(0x002E, 0x002E, CharProperty.MidNumLet), - UnicodeRange(0x0030, 0x0039, CharProperty.Numeric), - UnicodeRange(0x003A, 0x003A, CharProperty.MidLetter), - UnicodeRange(0x003B, 0x003B, CharProperty.MidNum), - UnicodeRange(0x0041, 0x005A, CharProperty.ALetter), - UnicodeRange(0x005F, 0x005F, CharProperty.ExtendNumLet), - UnicodeRange(0x0061, 0x007A, CharProperty.ALetter), - UnicodeRange(0x0085, 0x0085, CharProperty.Newline), - UnicodeRange(0x00AA, 0x00AA, CharProperty.ALetter), - UnicodeRange(0x00AD, 0x00AD, CharProperty.Format), - UnicodeRange(0x00B5, 0x00B5, CharProperty.ALetter), - UnicodeRange(0x00B7, 0x00B7, CharProperty.MidLetter), - UnicodeRange(0x00BA, 0x00BA, CharProperty.ALetter), - UnicodeRange(0x00C0, 0x00D6, CharProperty.ALetter), - UnicodeRange(0x00D8, 0x00F6, CharProperty.ALetter), - UnicodeRange(0x00F8, 0x02D7, CharProperty.ALetter), - UnicodeRange(0x02DE, 0x02E4, CharProperty.ALetter), - UnicodeRange(0x02EC, 0x02FF, CharProperty.ALetter), - UnicodeRange(0x0300, 0x036F, CharProperty.Extend), - UnicodeRange(0x0370, 0x0374, CharProperty.ALetter), - UnicodeRange(0x0376, 0x0377, CharProperty.ALetter), - UnicodeRange(0x037A, 0x037D, CharProperty.ALetter), - UnicodeRange(0x037E, 0x037E, CharProperty.MidNum), - UnicodeRange(0x037F, 0x037F, CharProperty.ALetter), - UnicodeRange(0x0386, 0x0386, CharProperty.ALetter), - UnicodeRange(0x0387, 0x0387, CharProperty.MidLetter), - UnicodeRange(0x0388, 0x038A, CharProperty.ALetter), - UnicodeRange(0x038C, 0x038C, CharProperty.ALetter), - UnicodeRange(0x038E, 0x03A1, CharProperty.ALetter), - UnicodeRange(0x03A3, 0x03F5, CharProperty.ALetter), - UnicodeRange(0x03F7, 0x0481, CharProperty.ALetter), - UnicodeRange(0x0483, 0x0489, CharProperty.Extend), - UnicodeRange(0x048A, 0x052F, CharProperty.ALetter), - UnicodeRange(0x0531, 0x0556, CharProperty.ALetter), - UnicodeRange(0x0559, 0x0559, CharProperty.ALetter), - UnicodeRange(0x055B, 0x055C, CharProperty.ALetter), - UnicodeRange(0x055E, 0x055E, CharProperty.ALetter), - UnicodeRange(0x0560, 0x0588, CharProperty.ALetter), - UnicodeRange(0x0589, 0x0589, CharProperty.MidNum), - UnicodeRange(0x0591, 0x05BD, CharProperty.Extend), - UnicodeRange(0x05BF, 0x05BF, CharProperty.Extend), - UnicodeRange(0x05C1, 0x05C2, CharProperty.Extend), - UnicodeRange(0x05C4, 0x05C5, CharProperty.Extend), - UnicodeRange(0x05C7, 0x05C7, CharProperty.Extend), - UnicodeRange(0x05D0, 0x05EA, CharProperty.HebrewLetter), - UnicodeRange(0x05EF, 0x05F2, CharProperty.HebrewLetter), - UnicodeRange(0x05F3, 0x05F3, CharProperty.ALetter), - UnicodeRange(0x05F4, 0x05F4, CharProperty.MidLetter), - UnicodeRange(0x0600, 0x0605, CharProperty.Format), - UnicodeRange(0x060C, 0x060D, CharProperty.MidNum), - UnicodeRange(0x0610, 0x061A, CharProperty.Extend), - UnicodeRange(0x061C, 0x061C, CharProperty.Format), - UnicodeRange(0x0620, 0x064A, CharProperty.ALetter), - UnicodeRange(0x064B, 0x065F, CharProperty.Extend), - UnicodeRange(0x0660, 0x0669, CharProperty.Numeric), - UnicodeRange(0x066B, 0x066B, CharProperty.Numeric), - UnicodeRange(0x066C, 0x066C, CharProperty.MidNum), - UnicodeRange(0x066E, 0x066F, CharProperty.ALetter), - UnicodeRange(0x0670, 0x0670, CharProperty.Extend), - UnicodeRange(0x0671, 0x06D3, CharProperty.ALetter), - UnicodeRange(0x06D5, 0x06D5, CharProperty.ALetter), - UnicodeRange(0x06D6, 0x06DC, CharProperty.Extend), - UnicodeRange(0x06DD, 0x06DD, CharProperty.Format), - UnicodeRange(0x06DF, 0x06E4, CharProperty.Extend), - UnicodeRange(0x06E5, 0x06E6, CharProperty.ALetter), - UnicodeRange(0x06E7, 0x06E8, CharProperty.Extend), - UnicodeRange(0x06EA, 0x06ED, CharProperty.Extend), - UnicodeRange(0x06EE, 0x06EF, CharProperty.ALetter), - UnicodeRange(0x06F0, 0x06F9, CharProperty.Numeric), - UnicodeRange(0x06FA, 0x06FC, CharProperty.ALetter), - UnicodeRange(0x06FF, 0x06FF, CharProperty.ALetter), - UnicodeRange(0x070F, 0x070F, CharProperty.Format), - UnicodeRange(0x0710, 0x0710, CharProperty.ALetter), - UnicodeRange(0x0711, 0x0711, CharProperty.Extend), - UnicodeRange(0x0712, 0x072F, CharProperty.ALetter), - UnicodeRange(0x0730, 0x074A, CharProperty.Extend), - UnicodeRange(0x074D, 0x07A5, CharProperty.ALetter), - UnicodeRange(0x07A6, 0x07B0, CharProperty.Extend), - UnicodeRange(0x07B1, 0x07B1, CharProperty.ALetter), - UnicodeRange(0x07C0, 0x07C9, CharProperty.Numeric), - UnicodeRange(0x07CA, 0x07EA, CharProperty.ALetter), - UnicodeRange(0x07EB, 0x07F3, CharProperty.Extend), - UnicodeRange(0x07F4, 0x07F5, CharProperty.ALetter), - UnicodeRange(0x07F8, 0x07F8, CharProperty.MidNum), - UnicodeRange(0x07FA, 0x07FA, CharProperty.ALetter), - UnicodeRange(0x07FD, 0x07FD, CharProperty.Extend), - UnicodeRange(0x0800, 0x0815, CharProperty.ALetter), - UnicodeRange(0x0816, 0x0819, CharProperty.Extend), - UnicodeRange(0x081A, 0x081A, CharProperty.ALetter), - UnicodeRange(0x081B, 0x0823, CharProperty.Extend), - UnicodeRange(0x0824, 0x0824, CharProperty.ALetter), - UnicodeRange(0x0825, 0x0827, CharProperty.Extend), - UnicodeRange(0x0828, 0x0828, CharProperty.ALetter), - UnicodeRange(0x0829, 0x082D, CharProperty.Extend), - UnicodeRange(0x0840, 0x0858, CharProperty.ALetter), - UnicodeRange(0x0859, 0x085B, CharProperty.Extend), - UnicodeRange(0x0860, 0x086A, CharProperty.ALetter), - UnicodeRange(0x08A0, 0x08B4, CharProperty.ALetter), - UnicodeRange(0x08B6, 0x08BD, CharProperty.ALetter), - UnicodeRange(0x08D3, 0x08E1, CharProperty.Extend), - UnicodeRange(0x08E2, 0x08E2, CharProperty.Format), - UnicodeRange(0x08E3, 0x0903, CharProperty.Extend), - UnicodeRange(0x0904, 0x0939, CharProperty.ALetter), - UnicodeRange(0x093A, 0x093C, CharProperty.Extend), - UnicodeRange(0x093D, 0x093D, CharProperty.ALetter), - UnicodeRange(0x093E, 0x094F, CharProperty.Extend), - UnicodeRange(0x0950, 0x0950, CharProperty.ALetter), - UnicodeRange(0x0951, 0x0957, CharProperty.Extend), - UnicodeRange(0x0958, 0x0961, CharProperty.ALetter), - UnicodeRange(0x0962, 0x0963, CharProperty.Extend), - UnicodeRange(0x0966, 0x096F, CharProperty.Numeric), - UnicodeRange(0x0971, 0x0980, CharProperty.ALetter), - UnicodeRange(0x0981, 0x0983, CharProperty.Extend), - UnicodeRange(0x0985, 0x098C, CharProperty.ALetter), - UnicodeRange(0x098F, 0x0990, CharProperty.ALetter), - UnicodeRange(0x0993, 0x09A8, CharProperty.ALetter), - UnicodeRange(0x09AA, 0x09B0, CharProperty.ALetter), - UnicodeRange(0x09B2, 0x09B2, CharProperty.ALetter), - UnicodeRange(0x09B6, 0x09B9, CharProperty.ALetter), - UnicodeRange(0x09BC, 0x09BC, CharProperty.Extend), - UnicodeRange(0x09BD, 0x09BD, CharProperty.ALetter), - UnicodeRange(0x09BE, 0x09C4, CharProperty.Extend), - UnicodeRange(0x09C7, 0x09C8, CharProperty.Extend), - UnicodeRange(0x09CB, 0x09CD, CharProperty.Extend), - UnicodeRange(0x09CE, 0x09CE, CharProperty.ALetter), - UnicodeRange(0x09D7, 0x09D7, CharProperty.Extend), - UnicodeRange(0x09DC, 0x09DD, CharProperty.ALetter), - UnicodeRange(0x09DF, 0x09E1, CharProperty.ALetter), - UnicodeRange(0x09E2, 0x09E3, CharProperty.Extend), - UnicodeRange(0x09E6, 0x09EF, CharProperty.Numeric), - UnicodeRange(0x09F0, 0x09F1, CharProperty.ALetter), - UnicodeRange(0x09FC, 0x09FC, CharProperty.ALetter), - UnicodeRange(0x09FE, 0x09FE, CharProperty.Extend), - UnicodeRange(0x0A01, 0x0A03, CharProperty.Extend), - UnicodeRange(0x0A05, 0x0A0A, CharProperty.ALetter), - UnicodeRange(0x0A0F, 0x0A10, CharProperty.ALetter), - UnicodeRange(0x0A13, 0x0A28, CharProperty.ALetter), - UnicodeRange(0x0A2A, 0x0A30, CharProperty.ALetter), - UnicodeRange(0x0A32, 0x0A33, CharProperty.ALetter), - UnicodeRange(0x0A35, 0x0A36, CharProperty.ALetter), - UnicodeRange(0x0A38, 0x0A39, CharProperty.ALetter), - UnicodeRange(0x0A3C, 0x0A3C, CharProperty.Extend), - UnicodeRange(0x0A3E, 0x0A42, CharProperty.Extend), - UnicodeRange(0x0A47, 0x0A48, CharProperty.Extend), - UnicodeRange(0x0A4B, 0x0A4D, CharProperty.Extend), - UnicodeRange(0x0A51, 0x0A51, CharProperty.Extend), - UnicodeRange(0x0A59, 0x0A5C, CharProperty.ALetter), - UnicodeRange(0x0A5E, 0x0A5E, CharProperty.ALetter), - UnicodeRange(0x0A66, 0x0A6F, CharProperty.Numeric), - UnicodeRange(0x0A70, 0x0A71, CharProperty.Extend), - UnicodeRange(0x0A72, 0x0A74, CharProperty.ALetter), - UnicodeRange(0x0A75, 0x0A75, CharProperty.Extend), - UnicodeRange(0x0A81, 0x0A83, CharProperty.Extend), - UnicodeRange(0x0A85, 0x0A8D, CharProperty.ALetter), - UnicodeRange(0x0A8F, 0x0A91, CharProperty.ALetter), - UnicodeRange(0x0A93, 0x0AA8, CharProperty.ALetter), - UnicodeRange(0x0AAA, 0x0AB0, CharProperty.ALetter), - UnicodeRange(0x0AB2, 0x0AB3, CharProperty.ALetter), - UnicodeRange(0x0AB5, 0x0AB9, CharProperty.ALetter), - UnicodeRange(0x0ABC, 0x0ABC, CharProperty.Extend), - UnicodeRange(0x0ABD, 0x0ABD, CharProperty.ALetter), - UnicodeRange(0x0ABE, 0x0AC5, CharProperty.Extend), - UnicodeRange(0x0AC7, 0x0AC9, CharProperty.Extend), - UnicodeRange(0x0ACB, 0x0ACD, CharProperty.Extend), - UnicodeRange(0x0AD0, 0x0AD0, CharProperty.ALetter), - UnicodeRange(0x0AE0, 0x0AE1, CharProperty.ALetter), - UnicodeRange(0x0AE2, 0x0AE3, CharProperty.Extend), - UnicodeRange(0x0AE6, 0x0AEF, CharProperty.Numeric), - UnicodeRange(0x0AF9, 0x0AF9, CharProperty.ALetter), - UnicodeRange(0x0AFA, 0x0AFF, CharProperty.Extend), - UnicodeRange(0x0B01, 0x0B03, CharProperty.Extend), - UnicodeRange(0x0B05, 0x0B0C, CharProperty.ALetter), - UnicodeRange(0x0B0F, 0x0B10, CharProperty.ALetter), - UnicodeRange(0x0B13, 0x0B28, CharProperty.ALetter), - UnicodeRange(0x0B2A, 0x0B30, CharProperty.ALetter), - UnicodeRange(0x0B32, 0x0B33, CharProperty.ALetter), - UnicodeRange(0x0B35, 0x0B39, CharProperty.ALetter), - UnicodeRange(0x0B3C, 0x0B3C, CharProperty.Extend), - UnicodeRange(0x0B3D, 0x0B3D, CharProperty.ALetter), - UnicodeRange(0x0B3E, 0x0B44, CharProperty.Extend), - UnicodeRange(0x0B47, 0x0B48, CharProperty.Extend), - UnicodeRange(0x0B4B, 0x0B4D, CharProperty.Extend), - UnicodeRange(0x0B56, 0x0B57, CharProperty.Extend), - UnicodeRange(0x0B5C, 0x0B5D, CharProperty.ALetter), - UnicodeRange(0x0B5F, 0x0B61, CharProperty.ALetter), - UnicodeRange(0x0B62, 0x0B63, CharProperty.Extend), - UnicodeRange(0x0B66, 0x0B6F, CharProperty.Numeric), - UnicodeRange(0x0B71, 0x0B71, CharProperty.ALetter), - UnicodeRange(0x0B82, 0x0B82, CharProperty.Extend), - UnicodeRange(0x0B83, 0x0B83, CharProperty.ALetter), - UnicodeRange(0x0B85, 0x0B8A, CharProperty.ALetter), - UnicodeRange(0x0B8E, 0x0B90, CharProperty.ALetter), - UnicodeRange(0x0B92, 0x0B95, CharProperty.ALetter), - UnicodeRange(0x0B99, 0x0B9A, CharProperty.ALetter), - UnicodeRange(0x0B9C, 0x0B9C, CharProperty.ALetter), - UnicodeRange(0x0B9E, 0x0B9F, CharProperty.ALetter), - UnicodeRange(0x0BA3, 0x0BA4, CharProperty.ALetter), - UnicodeRange(0x0BA8, 0x0BAA, CharProperty.ALetter), - UnicodeRange(0x0BAE, 0x0BB9, CharProperty.ALetter), - UnicodeRange(0x0BBE, 0x0BC2, CharProperty.Extend), - UnicodeRange(0x0BC6, 0x0BC8, CharProperty.Extend), - UnicodeRange(0x0BCA, 0x0BCD, CharProperty.Extend), - UnicodeRange(0x0BD0, 0x0BD0, CharProperty.ALetter), - UnicodeRange(0x0BD7, 0x0BD7, CharProperty.Extend), - UnicodeRange(0x0BE6, 0x0BEF, CharProperty.Numeric), - UnicodeRange(0x0C00, 0x0C04, CharProperty.Extend), - UnicodeRange(0x0C05, 0x0C0C, CharProperty.ALetter), - UnicodeRange(0x0C0E, 0x0C10, CharProperty.ALetter), - UnicodeRange(0x0C12, 0x0C28, CharProperty.ALetter), - UnicodeRange(0x0C2A, 0x0C39, CharProperty.ALetter), - UnicodeRange(0x0C3D, 0x0C3D, CharProperty.ALetter), - UnicodeRange(0x0C3E, 0x0C44, CharProperty.Extend), - UnicodeRange(0x0C46, 0x0C48, CharProperty.Extend), - UnicodeRange(0x0C4A, 0x0C4D, CharProperty.Extend), - UnicodeRange(0x0C55, 0x0C56, CharProperty.Extend), - UnicodeRange(0x0C58, 0x0C5A, CharProperty.ALetter), - UnicodeRange(0x0C60, 0x0C61, CharProperty.ALetter), - UnicodeRange(0x0C62, 0x0C63, CharProperty.Extend), - UnicodeRange(0x0C66, 0x0C6F, CharProperty.Numeric), - UnicodeRange(0x0C80, 0x0C80, CharProperty.ALetter), - UnicodeRange(0x0C81, 0x0C83, CharProperty.Extend), - UnicodeRange(0x0C85, 0x0C8C, CharProperty.ALetter), - UnicodeRange(0x0C8E, 0x0C90, CharProperty.ALetter), - UnicodeRange(0x0C92, 0x0CA8, CharProperty.ALetter), - UnicodeRange(0x0CAA, 0x0CB3, CharProperty.ALetter), - UnicodeRange(0x0CB5, 0x0CB9, CharProperty.ALetter), - UnicodeRange(0x0CBC, 0x0CBC, CharProperty.Extend), - UnicodeRange(0x0CBD, 0x0CBD, CharProperty.ALetter), - UnicodeRange(0x0CBE, 0x0CC4, CharProperty.Extend), - UnicodeRange(0x0CC6, 0x0CC8, CharProperty.Extend), - UnicodeRange(0x0CCA, 0x0CCD, CharProperty.Extend), - UnicodeRange(0x0CD5, 0x0CD6, CharProperty.Extend), - UnicodeRange(0x0CDE, 0x0CDE, CharProperty.ALetter), - UnicodeRange(0x0CE0, 0x0CE1, CharProperty.ALetter), - UnicodeRange(0x0CE2, 0x0CE3, CharProperty.Extend), - UnicodeRange(0x0CE6, 0x0CEF, CharProperty.Numeric), - UnicodeRange(0x0CF1, 0x0CF2, CharProperty.ALetter), - UnicodeRange(0x0D00, 0x0D03, CharProperty.Extend), - UnicodeRange(0x0D05, 0x0D0C, CharProperty.ALetter), - UnicodeRange(0x0D0E, 0x0D10, CharProperty.ALetter), - UnicodeRange(0x0D12, 0x0D3A, CharProperty.ALetter), - UnicodeRange(0x0D3B, 0x0D3C, CharProperty.Extend), - UnicodeRange(0x0D3D, 0x0D3D, CharProperty.ALetter), - UnicodeRange(0x0D3E, 0x0D44, CharProperty.Extend), - UnicodeRange(0x0D46, 0x0D48, CharProperty.Extend), - UnicodeRange(0x0D4A, 0x0D4D, CharProperty.Extend), - UnicodeRange(0x0D4E, 0x0D4E, CharProperty.ALetter), - UnicodeRange(0x0D54, 0x0D56, CharProperty.ALetter), - UnicodeRange(0x0D57, 0x0D57, CharProperty.Extend), - UnicodeRange(0x0D5F, 0x0D61, CharProperty.ALetter), - UnicodeRange(0x0D62, 0x0D63, CharProperty.Extend), - UnicodeRange(0x0D66, 0x0D6F, CharProperty.Numeric), - UnicodeRange(0x0D7A, 0x0D7F, CharProperty.ALetter), - UnicodeRange(0x0D82, 0x0D83, CharProperty.Extend), - UnicodeRange(0x0D85, 0x0D96, CharProperty.ALetter), - UnicodeRange(0x0D9A, 0x0DB1, CharProperty.ALetter), - UnicodeRange(0x0DB3, 0x0DBB, CharProperty.ALetter), - UnicodeRange(0x0DBD, 0x0DBD, CharProperty.ALetter), - UnicodeRange(0x0DC0, 0x0DC6, CharProperty.ALetter), - UnicodeRange(0x0DCA, 0x0DCA, CharProperty.Extend), - UnicodeRange(0x0DCF, 0x0DD4, CharProperty.Extend), - UnicodeRange(0x0DD6, 0x0DD6, CharProperty.Extend), - UnicodeRange(0x0DD8, 0x0DDF, CharProperty.Extend), - UnicodeRange(0x0DE6, 0x0DEF, CharProperty.Numeric), - UnicodeRange(0x0DF2, 0x0DF3, CharProperty.Extend), - UnicodeRange(0x0E31, 0x0E31, CharProperty.Extend), - UnicodeRange(0x0E34, 0x0E3A, CharProperty.Extend), - UnicodeRange(0x0E47, 0x0E4E, CharProperty.Extend), - UnicodeRange(0x0E50, 0x0E59, CharProperty.Numeric), - UnicodeRange(0x0EB1, 0x0EB1, CharProperty.Extend), - UnicodeRange(0x0EB4, 0x0EBC, CharProperty.Extend), - UnicodeRange(0x0EC8, 0x0ECD, CharProperty.Extend), - UnicodeRange(0x0ED0, 0x0ED9, CharProperty.Numeric), - UnicodeRange(0x0F00, 0x0F00, CharProperty.ALetter), - UnicodeRange(0x0F18, 0x0F19, CharProperty.Extend), - UnicodeRange(0x0F20, 0x0F29, CharProperty.Numeric), - UnicodeRange(0x0F35, 0x0F35, CharProperty.Extend), - UnicodeRange(0x0F37, 0x0F37, CharProperty.Extend), - UnicodeRange(0x0F39, 0x0F39, CharProperty.Extend), - UnicodeRange(0x0F3E, 0x0F3F, CharProperty.Extend), - UnicodeRange(0x0F40, 0x0F47, CharProperty.ALetter), - UnicodeRange(0x0F49, 0x0F6C, CharProperty.ALetter), - UnicodeRange(0x0F71, 0x0F84, CharProperty.Extend), - UnicodeRange(0x0F86, 0x0F87, CharProperty.Extend), - UnicodeRange(0x0F88, 0x0F8C, CharProperty.ALetter), - UnicodeRange(0x0F8D, 0x0F97, CharProperty.Extend), - UnicodeRange(0x0F99, 0x0FBC, CharProperty.Extend), - UnicodeRange(0x0FC6, 0x0FC6, CharProperty.Extend), - UnicodeRange(0x102B, 0x103E, CharProperty.Extend), - UnicodeRange(0x1040, 0x1049, CharProperty.Numeric), - UnicodeRange(0x1056, 0x1059, CharProperty.Extend), - UnicodeRange(0x105E, 0x1060, CharProperty.Extend), - UnicodeRange(0x1062, 0x1064, CharProperty.Extend), - UnicodeRange(0x1067, 0x106D, CharProperty.Extend), - UnicodeRange(0x1071, 0x1074, CharProperty.Extend), - UnicodeRange(0x1082, 0x108D, CharProperty.Extend), - UnicodeRange(0x108F, 0x108F, CharProperty.Extend), - UnicodeRange(0x1090, 0x1099, CharProperty.Numeric), - UnicodeRange(0x109A, 0x109D, CharProperty.Extend), - UnicodeRange(0x10A0, 0x10C5, CharProperty.ALetter), - UnicodeRange(0x10C7, 0x10C7, CharProperty.ALetter), - UnicodeRange(0x10CD, 0x10CD, CharProperty.ALetter), - UnicodeRange(0x10D0, 0x10FA, CharProperty.ALetter), - UnicodeRange(0x10FC, 0x1248, CharProperty.ALetter), - UnicodeRange(0x124A, 0x124D, CharProperty.ALetter), - UnicodeRange(0x1250, 0x1256, CharProperty.ALetter), - UnicodeRange(0x1258, 0x1258, CharProperty.ALetter), - UnicodeRange(0x125A, 0x125D, CharProperty.ALetter), - UnicodeRange(0x1260, 0x1288, CharProperty.ALetter), - UnicodeRange(0x128A, 0x128D, CharProperty.ALetter), - UnicodeRange(0x1290, 0x12B0, CharProperty.ALetter), - UnicodeRange(0x12B2, 0x12B5, CharProperty.ALetter), - UnicodeRange(0x12B8, 0x12BE, CharProperty.ALetter), - UnicodeRange(0x12C0, 0x12C0, CharProperty.ALetter), - UnicodeRange(0x12C2, 0x12C5, CharProperty.ALetter), - UnicodeRange(0x12C8, 0x12D6, CharProperty.ALetter), - UnicodeRange(0x12D8, 0x1310, CharProperty.ALetter), - UnicodeRange(0x1312, 0x1315, CharProperty.ALetter), - UnicodeRange(0x1318, 0x135A, CharProperty.ALetter), - UnicodeRange(0x135D, 0x135F, CharProperty.Extend), - UnicodeRange(0x1380, 0x138F, CharProperty.ALetter), - UnicodeRange(0x13A0, 0x13F5, CharProperty.ALetter), - UnicodeRange(0x13F8, 0x13FD, CharProperty.ALetter), - UnicodeRange(0x1401, 0x166C, CharProperty.ALetter), - UnicodeRange(0x166F, 0x167F, CharProperty.ALetter), - UnicodeRange(0x1680, 0x1680, CharProperty.WSegSpace), - UnicodeRange(0x1681, 0x169A, CharProperty.ALetter), - UnicodeRange(0x16A0, 0x16EA, CharProperty.ALetter), - UnicodeRange(0x16EE, 0x16F8, CharProperty.ALetter), - UnicodeRange(0x1700, 0x170C, CharProperty.ALetter), - UnicodeRange(0x170E, 0x1711, CharProperty.ALetter), - UnicodeRange(0x1712, 0x1714, CharProperty.Extend), - UnicodeRange(0x1720, 0x1731, CharProperty.ALetter), - UnicodeRange(0x1732, 0x1734, CharProperty.Extend), - UnicodeRange(0x1740, 0x1751, CharProperty.ALetter), - UnicodeRange(0x1752, 0x1753, CharProperty.Extend), - UnicodeRange(0x1760, 0x176C, CharProperty.ALetter), - UnicodeRange(0x176E, 0x1770, CharProperty.ALetter), - UnicodeRange(0x1772, 0x1773, CharProperty.Extend), - UnicodeRange(0x17B4, 0x17D3, CharProperty.Extend), - UnicodeRange(0x17DD, 0x17DD, CharProperty.Extend), - UnicodeRange(0x17E0, 0x17E9, CharProperty.Numeric), - UnicodeRange(0x180B, 0x180D, CharProperty.Extend), - UnicodeRange(0x180E, 0x180E, CharProperty.Format), - UnicodeRange(0x1810, 0x1819, CharProperty.Numeric), - UnicodeRange(0x1820, 0x1878, CharProperty.ALetter), - UnicodeRange(0x1880, 0x1884, CharProperty.ALetter), - UnicodeRange(0x1885, 0x1886, CharProperty.Extend), - UnicodeRange(0x1887, 0x18A8, CharProperty.ALetter), - UnicodeRange(0x18A9, 0x18A9, CharProperty.Extend), - UnicodeRange(0x18AA, 0x18AA, CharProperty.ALetter), - UnicodeRange(0x18B0, 0x18F5, CharProperty.ALetter), - UnicodeRange(0x1900, 0x191E, CharProperty.ALetter), - UnicodeRange(0x1920, 0x192B, CharProperty.Extend), - UnicodeRange(0x1930, 0x193B, CharProperty.Extend), - UnicodeRange(0x1946, 0x194F, CharProperty.Numeric), - UnicodeRange(0x19D0, 0x19D9, CharProperty.Numeric), - UnicodeRange(0x1A00, 0x1A16, CharProperty.ALetter), - UnicodeRange(0x1A17, 0x1A1B, CharProperty.Extend), - UnicodeRange(0x1A55, 0x1A5E, CharProperty.Extend), - UnicodeRange(0x1A60, 0x1A7C, CharProperty.Extend), - UnicodeRange(0x1A7F, 0x1A7F, CharProperty.Extend), - UnicodeRange(0x1A80, 0x1A89, CharProperty.Numeric), - UnicodeRange(0x1A90, 0x1A99, CharProperty.Numeric), - UnicodeRange(0x1AB0, 0x1ABE, CharProperty.Extend), - UnicodeRange(0x1B00, 0x1B04, CharProperty.Extend), - UnicodeRange(0x1B05, 0x1B33, CharProperty.ALetter), - UnicodeRange(0x1B34, 0x1B44, CharProperty.Extend), - UnicodeRange(0x1B45, 0x1B4B, CharProperty.ALetter), - UnicodeRange(0x1B50, 0x1B59, CharProperty.Numeric), - UnicodeRange(0x1B6B, 0x1B73, CharProperty.Extend), - UnicodeRange(0x1B80, 0x1B82, CharProperty.Extend), - UnicodeRange(0x1B83, 0x1BA0, CharProperty.ALetter), - UnicodeRange(0x1BA1, 0x1BAD, CharProperty.Extend), - UnicodeRange(0x1BAE, 0x1BAF, CharProperty.ALetter), - UnicodeRange(0x1BB0, 0x1BB9, CharProperty.Numeric), - UnicodeRange(0x1BBA, 0x1BE5, CharProperty.ALetter), - UnicodeRange(0x1BE6, 0x1BF3, CharProperty.Extend), - UnicodeRange(0x1C00, 0x1C23, CharProperty.ALetter), - UnicodeRange(0x1C24, 0x1C37, CharProperty.Extend), - UnicodeRange(0x1C40, 0x1C49, CharProperty.Numeric), - UnicodeRange(0x1C4D, 0x1C4F, CharProperty.ALetter), - UnicodeRange(0x1C50, 0x1C59, CharProperty.Numeric), - UnicodeRange(0x1C5A, 0x1C7D, CharProperty.ALetter), - UnicodeRange(0x1C80, 0x1C88, CharProperty.ALetter), - UnicodeRange(0x1C90, 0x1CBA, CharProperty.ALetter), - UnicodeRange(0x1CBD, 0x1CBF, CharProperty.ALetter), - UnicodeRange(0x1CD0, 0x1CD2, CharProperty.Extend), - UnicodeRange(0x1CD4, 0x1CE8, CharProperty.Extend), - UnicodeRange(0x1CE9, 0x1CEC, CharProperty.ALetter), - UnicodeRange(0x1CED, 0x1CED, CharProperty.Extend), - UnicodeRange(0x1CEE, 0x1CF3, CharProperty.ALetter), - UnicodeRange(0x1CF4, 0x1CF4, CharProperty.Extend), - UnicodeRange(0x1CF5, 0x1CF6, CharProperty.ALetter), - UnicodeRange(0x1CF7, 0x1CF9, CharProperty.Extend), - UnicodeRange(0x1CFA, 0x1CFA, CharProperty.ALetter), - UnicodeRange(0x1D00, 0x1DBF, CharProperty.ALetter), - UnicodeRange(0x1DC0, 0x1DF9, CharProperty.Extend), - UnicodeRange(0x1DFB, 0x1DFF, CharProperty.Extend), - UnicodeRange(0x1E00, 0x1F15, CharProperty.ALetter), - UnicodeRange(0x1F18, 0x1F1D, CharProperty.ALetter), - UnicodeRange(0x1F20, 0x1F45, CharProperty.ALetter), - UnicodeRange(0x1F48, 0x1F4D, CharProperty.ALetter), - UnicodeRange(0x1F50, 0x1F57, CharProperty.ALetter), - UnicodeRange(0x1F59, 0x1F59, CharProperty.ALetter), - UnicodeRange(0x1F5B, 0x1F5B, CharProperty.ALetter), - UnicodeRange(0x1F5D, 0x1F5D, CharProperty.ALetter), - UnicodeRange(0x1F5F, 0x1F7D, CharProperty.ALetter), - UnicodeRange(0x1F80, 0x1FB4, CharProperty.ALetter), - UnicodeRange(0x1FB6, 0x1FBC, CharProperty.ALetter), - UnicodeRange(0x1FBE, 0x1FBE, CharProperty.ALetter), - UnicodeRange(0x1FC2, 0x1FC4, CharProperty.ALetter), - UnicodeRange(0x1FC6, 0x1FCC, CharProperty.ALetter), - UnicodeRange(0x1FD0, 0x1FD3, CharProperty.ALetter), - UnicodeRange(0x1FD6, 0x1FDB, CharProperty.ALetter), - UnicodeRange(0x1FE0, 0x1FEC, CharProperty.ALetter), - UnicodeRange(0x1FF2, 0x1FF4, CharProperty.ALetter), - UnicodeRange(0x1FF6, 0x1FFC, CharProperty.ALetter), - UnicodeRange(0x2000, 0x2006, CharProperty.WSegSpace), - UnicodeRange(0x2008, 0x200A, CharProperty.WSegSpace), - UnicodeRange(0x200C, 0x200C, CharProperty.Extend), - UnicodeRange(0x200D, 0x200D, CharProperty.ZWJ), - UnicodeRange(0x200E, 0x200F, CharProperty.Format), - UnicodeRange(0x2018, 0x2019, CharProperty.MidNumLet), - UnicodeRange(0x2024, 0x2024, CharProperty.MidNumLet), - UnicodeRange(0x2027, 0x2027, CharProperty.MidLetter), - UnicodeRange(0x2028, 0x2029, CharProperty.Newline), - UnicodeRange(0x202A, 0x202E, CharProperty.Format), - UnicodeRange(0x202F, 0x202F, CharProperty.ExtendNumLet), - UnicodeRange(0x203F, 0x2040, CharProperty.ExtendNumLet), - UnicodeRange(0x2044, 0x2044, CharProperty.MidNum), - UnicodeRange(0x2054, 0x2054, CharProperty.ExtendNumLet), - UnicodeRange(0x205F, 0x205F, CharProperty.WSegSpace), - UnicodeRange(0x2060, 0x2064, CharProperty.Format), - UnicodeRange(0x2066, 0x206F, CharProperty.Format), - UnicodeRange(0x2071, 0x2071, CharProperty.ALetter), - UnicodeRange(0x207F, 0x207F, CharProperty.ALetter), - UnicodeRange(0x2090, 0x209C, CharProperty.ALetter), - UnicodeRange(0x20D0, 0x20F0, CharProperty.Extend), - UnicodeRange(0x2102, 0x2102, CharProperty.ALetter), - UnicodeRange(0x2107, 0x2107, CharProperty.ALetter), - UnicodeRange(0x210A, 0x2113, CharProperty.ALetter), - UnicodeRange(0x2115, 0x2115, CharProperty.ALetter), - UnicodeRange(0x2119, 0x211D, CharProperty.ALetter), - UnicodeRange(0x2124, 0x2124, CharProperty.ALetter), - UnicodeRange(0x2126, 0x2126, CharProperty.ALetter), - UnicodeRange(0x2128, 0x2128, CharProperty.ALetter), - UnicodeRange(0x212A, 0x212D, CharProperty.ALetter), - UnicodeRange(0x212F, 0x2139, CharProperty.ALetter), - UnicodeRange(0x213C, 0x213F, CharProperty.ALetter), - UnicodeRange(0x2145, 0x2149, CharProperty.ALetter), - UnicodeRange(0x214E, 0x214E, CharProperty.ALetter), - UnicodeRange(0x2160, 0x2188, CharProperty.ALetter), - UnicodeRange(0x24B6, 0x24E9, CharProperty.ALetter), - UnicodeRange(0x2C00, 0x2C2E, CharProperty.ALetter), - UnicodeRange(0x2C30, 0x2C5E, CharProperty.ALetter), - UnicodeRange(0x2C60, 0x2CE4, CharProperty.ALetter), - UnicodeRange(0x2CEB, 0x2CEE, CharProperty.ALetter), - UnicodeRange(0x2CEF, 0x2CF1, CharProperty.Extend), - UnicodeRange(0x2CF2, 0x2CF3, CharProperty.ALetter), - UnicodeRange(0x2D00, 0x2D25, CharProperty.ALetter), - UnicodeRange(0x2D27, 0x2D27, CharProperty.ALetter), - UnicodeRange(0x2D2D, 0x2D2D, CharProperty.ALetter), - UnicodeRange(0x2D30, 0x2D67, CharProperty.ALetter), - UnicodeRange(0x2D6F, 0x2D6F, CharProperty.ALetter), - UnicodeRange(0x2D7F, 0x2D7F, CharProperty.Extend), - UnicodeRange(0x2D80, 0x2D96, CharProperty.ALetter), - UnicodeRange(0x2DA0, 0x2DA6, CharProperty.ALetter), - UnicodeRange(0x2DA8, 0x2DAE, CharProperty.ALetter), - UnicodeRange(0x2DB0, 0x2DB6, CharProperty.ALetter), - UnicodeRange(0x2DB8, 0x2DBE, CharProperty.ALetter), - UnicodeRange(0x2DC0, 0x2DC6, CharProperty.ALetter), - UnicodeRange(0x2DC8, 0x2DCE, CharProperty.ALetter), - UnicodeRange(0x2DD0, 0x2DD6, CharProperty.ALetter), - UnicodeRange(0x2DD8, 0x2DDE, CharProperty.ALetter), - UnicodeRange(0x2DE0, 0x2DFF, CharProperty.Extend), - UnicodeRange(0x2E2F, 0x2E2F, CharProperty.ALetter), - UnicodeRange(0x3000, 0x3000, CharProperty.WSegSpace), - UnicodeRange(0x3005, 0x3005, CharProperty.ALetter), - UnicodeRange(0x302A, 0x302F, CharProperty.Extend), - UnicodeRange(0x3031, 0x3035, CharProperty.Katakana), - UnicodeRange(0x303B, 0x303C, CharProperty.ALetter), - UnicodeRange(0x3099, 0x309A, CharProperty.Extend), - UnicodeRange(0x309B, 0x309C, CharProperty.Katakana), - UnicodeRange(0x30A0, 0x30FA, CharProperty.Katakana), - UnicodeRange(0x30FC, 0x30FF, CharProperty.Katakana), - UnicodeRange(0x3105, 0x312F, CharProperty.ALetter), - UnicodeRange(0x3131, 0x318E, CharProperty.ALetter), - UnicodeRange(0x31A0, 0x31BA, CharProperty.ALetter), - UnicodeRange(0x31F0, 0x31FF, CharProperty.Katakana), - UnicodeRange(0x32D0, 0x32FE, CharProperty.Katakana), - UnicodeRange(0x3300, 0x3357, CharProperty.Katakana), - UnicodeRange(0xA000, 0xA48C, CharProperty.ALetter), - UnicodeRange(0xA4D0, 0xA4FD, CharProperty.ALetter), - UnicodeRange(0xA500, 0xA60C, CharProperty.ALetter), - UnicodeRange(0xA610, 0xA61F, CharProperty.ALetter), - UnicodeRange(0xA620, 0xA629, CharProperty.Numeric), - UnicodeRange(0xA62A, 0xA62B, CharProperty.ALetter), - UnicodeRange(0xA640, 0xA66E, CharProperty.ALetter), - UnicodeRange(0xA66F, 0xA672, CharProperty.Extend), - UnicodeRange(0xA674, 0xA67D, CharProperty.Extend), - UnicodeRange(0xA67F, 0xA69D, CharProperty.ALetter), - UnicodeRange(0xA69E, 0xA69F, CharProperty.Extend), - UnicodeRange(0xA6A0, 0xA6EF, CharProperty.ALetter), - UnicodeRange(0xA6F0, 0xA6F1, CharProperty.Extend), - UnicodeRange(0xA717, 0xA7BF, CharProperty.ALetter), - UnicodeRange(0xA7C2, 0xA7C6, CharProperty.ALetter), - UnicodeRange(0xA7F7, 0xA801, CharProperty.ALetter), - UnicodeRange(0xA802, 0xA802, CharProperty.Extend), - UnicodeRange(0xA803, 0xA805, CharProperty.ALetter), - UnicodeRange(0xA806, 0xA806, CharProperty.Extend), - UnicodeRange(0xA807, 0xA80A, CharProperty.ALetter), - UnicodeRange(0xA80B, 0xA80B, CharProperty.Extend), - UnicodeRange(0xA80C, 0xA822, CharProperty.ALetter), - UnicodeRange(0xA823, 0xA827, CharProperty.Extend), - UnicodeRange(0xA840, 0xA873, CharProperty.ALetter), - UnicodeRange(0xA880, 0xA881, CharProperty.Extend), - UnicodeRange(0xA882, 0xA8B3, CharProperty.ALetter), - UnicodeRange(0xA8B4, 0xA8C5, CharProperty.Extend), - UnicodeRange(0xA8D0, 0xA8D9, CharProperty.Numeric), - UnicodeRange(0xA8E0, 0xA8F1, CharProperty.Extend), - UnicodeRange(0xA8F2, 0xA8F7, CharProperty.ALetter), - UnicodeRange(0xA8FB, 0xA8FB, CharProperty.ALetter), - UnicodeRange(0xA8FD, 0xA8FE, CharProperty.ALetter), - UnicodeRange(0xA8FF, 0xA8FF, CharProperty.Extend), - UnicodeRange(0xA900, 0xA909, CharProperty.Numeric), - UnicodeRange(0xA90A, 0xA925, CharProperty.ALetter), - UnicodeRange(0xA926, 0xA92D, CharProperty.Extend), - UnicodeRange(0xA930, 0xA946, CharProperty.ALetter), - UnicodeRange(0xA947, 0xA953, CharProperty.Extend), - UnicodeRange(0xA960, 0xA97C, CharProperty.ALetter), - UnicodeRange(0xA980, 0xA983, CharProperty.Extend), - UnicodeRange(0xA984, 0xA9B2, CharProperty.ALetter), - UnicodeRange(0xA9B3, 0xA9C0, CharProperty.Extend), - UnicodeRange(0xA9CF, 0xA9CF, CharProperty.ALetter), - UnicodeRange(0xA9D0, 0xA9D9, CharProperty.Numeric), - UnicodeRange(0xA9E5, 0xA9E5, CharProperty.Extend), - UnicodeRange(0xA9F0, 0xA9F9, CharProperty.Numeric), - UnicodeRange(0xAA00, 0xAA28, CharProperty.ALetter), - UnicodeRange(0xAA29, 0xAA36, CharProperty.Extend), - UnicodeRange(0xAA40, 0xAA42, CharProperty.ALetter), - UnicodeRange(0xAA43, 0xAA43, CharProperty.Extend), - UnicodeRange(0xAA44, 0xAA4B, CharProperty.ALetter), - UnicodeRange(0xAA4C, 0xAA4D, CharProperty.Extend), - UnicodeRange(0xAA50, 0xAA59, CharProperty.Numeric), - UnicodeRange(0xAA7B, 0xAA7D, CharProperty.Extend), - UnicodeRange(0xAAB0, 0xAAB0, CharProperty.Extend), - UnicodeRange(0xAAB2, 0xAAB4, CharProperty.Extend), - UnicodeRange(0xAAB7, 0xAAB8, CharProperty.Extend), - UnicodeRange(0xAABE, 0xAABF, CharProperty.Extend), - UnicodeRange(0xAAC1, 0xAAC1, CharProperty.Extend), - UnicodeRange(0xAAE0, 0xAAEA, CharProperty.ALetter), - UnicodeRange(0xAAEB, 0xAAEF, CharProperty.Extend), - UnicodeRange(0xAAF2, 0xAAF4, CharProperty.ALetter), - UnicodeRange(0xAAF5, 0xAAF6, CharProperty.Extend), - UnicodeRange(0xAB01, 0xAB06, CharProperty.ALetter), - UnicodeRange(0xAB09, 0xAB0E, CharProperty.ALetter), - UnicodeRange(0xAB11, 0xAB16, CharProperty.ALetter), - UnicodeRange(0xAB20, 0xAB26, CharProperty.ALetter), - UnicodeRange(0xAB28, 0xAB2E, CharProperty.ALetter), - UnicodeRange(0xAB30, 0xAB67, CharProperty.ALetter), - UnicodeRange(0xAB70, 0xABE2, CharProperty.ALetter), - UnicodeRange(0xABE3, 0xABEA, CharProperty.Extend), - UnicodeRange(0xABEC, 0xABED, CharProperty.Extend), - UnicodeRange(0xABF0, 0xABF9, CharProperty.Numeric), - UnicodeRange(0xAC00, 0xD7A3, CharProperty.ALetter), - UnicodeRange(0xD7B0, 0xD7C6, CharProperty.ALetter), - UnicodeRange(0xD7CB, 0xD7FB, CharProperty.ALetter), - UnicodeRange(0xFB00, 0xFB06, CharProperty.ALetter), - UnicodeRange(0xFB13, 0xFB17, CharProperty.ALetter), - UnicodeRange(0xFB1D, 0xFB1D, CharProperty.HebrewLetter), - UnicodeRange(0xFB1E, 0xFB1E, CharProperty.Extend), - UnicodeRange(0xFB1F, 0xFB28, CharProperty.HebrewLetter), - UnicodeRange(0xFB2A, 0xFB36, CharProperty.HebrewLetter), - UnicodeRange(0xFB38, 0xFB3C, CharProperty.HebrewLetter), - UnicodeRange(0xFB3E, 0xFB3E, CharProperty.HebrewLetter), - UnicodeRange(0xFB40, 0xFB41, CharProperty.HebrewLetter), - UnicodeRange(0xFB43, 0xFB44, CharProperty.HebrewLetter), - UnicodeRange(0xFB46, 0xFB4F, CharProperty.HebrewLetter), - UnicodeRange(0xFB50, 0xFBB1, CharProperty.ALetter), - UnicodeRange(0xFBD3, 0xFD3D, CharProperty.ALetter), - UnicodeRange(0xFD50, 0xFD8F, CharProperty.ALetter), - UnicodeRange(0xFD92, 0xFDC7, CharProperty.ALetter), - UnicodeRange(0xFDF0, 0xFDFB, CharProperty.ALetter), - UnicodeRange(0xFE00, 0xFE0F, CharProperty.Extend), - UnicodeRange(0xFE10, 0xFE10, CharProperty.MidNum), - UnicodeRange(0xFE13, 0xFE13, CharProperty.MidLetter), - UnicodeRange(0xFE14, 0xFE14, CharProperty.MidNum), - UnicodeRange(0xFE20, 0xFE2F, CharProperty.Extend), - UnicodeRange(0xFE33, 0xFE34, CharProperty.ExtendNumLet), - UnicodeRange(0xFE4D, 0xFE4F, CharProperty.ExtendNumLet), - UnicodeRange(0xFE50, 0xFE50, CharProperty.MidNum), - UnicodeRange(0xFE52, 0xFE52, CharProperty.MidNumLet), - UnicodeRange(0xFE54, 0xFE54, CharProperty.MidNum), - UnicodeRange(0xFE55, 0xFE55, CharProperty.MidLetter), - UnicodeRange(0xFE70, 0xFE74, CharProperty.ALetter), - UnicodeRange(0xFE76, 0xFEFC, CharProperty.ALetter), - UnicodeRange(0xFEFF, 0xFEFF, CharProperty.Format), - UnicodeRange(0xFF07, 0xFF07, CharProperty.MidNumLet), - UnicodeRange(0xFF0C, 0xFF0C, CharProperty.MidNum), - UnicodeRange(0xFF0E, 0xFF0E, CharProperty.MidNumLet), - UnicodeRange(0xFF10, 0xFF19, CharProperty.Numeric), - UnicodeRange(0xFF1A, 0xFF1A, CharProperty.MidLetter), - UnicodeRange(0xFF1B, 0xFF1B, CharProperty.MidNum), - UnicodeRange(0xFF21, 0xFF3A, CharProperty.ALetter), - UnicodeRange(0xFF3F, 0xFF3F, CharProperty.ExtendNumLet), - UnicodeRange(0xFF41, 0xFF5A, CharProperty.ALetter), - UnicodeRange(0xFF66, 0xFF9D, CharProperty.Katakana), - UnicodeRange(0xFF9E, 0xFF9F, CharProperty.Extend), - UnicodeRange(0xFFA0, 0xFFBE, CharProperty.ALetter), - UnicodeRange(0xFFC2, 0xFFC7, CharProperty.ALetter), - UnicodeRange(0xFFCA, 0xFFCF, CharProperty.ALetter), - UnicodeRange(0xFFD2, 0xFFD7, CharProperty.ALetter), - UnicodeRange(0xFFDA, 0xFFDC, CharProperty.ALetter), - UnicodeRange(0xFFF9, 0xFFFB, CharProperty.Format), - UnicodeRange(0x10000, 0x1000B, CharProperty.ALetter), - UnicodeRange(0x1000D, 0x10026, CharProperty.ALetter), - UnicodeRange(0x10028, 0x1003A, CharProperty.ALetter), - UnicodeRange(0x1003C, 0x1003D, CharProperty.ALetter), - UnicodeRange(0x1003F, 0x1004D, CharProperty.ALetter), - UnicodeRange(0x10050, 0x1005D, CharProperty.ALetter), - UnicodeRange(0x10080, 0x100FA, CharProperty.ALetter), - UnicodeRange(0x10140, 0x10174, CharProperty.ALetter), - UnicodeRange(0x101FD, 0x101FD, CharProperty.Extend), - UnicodeRange(0x10280, 0x1029C, CharProperty.ALetter), - UnicodeRange(0x102A0, 0x102D0, CharProperty.ALetter), - UnicodeRange(0x102E0, 0x102E0, CharProperty.Extend), - UnicodeRange(0x10300, 0x1031F, CharProperty.ALetter), - UnicodeRange(0x1032D, 0x1034A, CharProperty.ALetter), - UnicodeRange(0x10350, 0x10375, CharProperty.ALetter), - UnicodeRange(0x10376, 0x1037A, CharProperty.Extend), - UnicodeRange(0x10380, 0x1039D, CharProperty.ALetter), - UnicodeRange(0x103A0, 0x103C3, CharProperty.ALetter), - UnicodeRange(0x103C8, 0x103CF, CharProperty.ALetter), - UnicodeRange(0x103D1, 0x103D5, CharProperty.ALetter), - UnicodeRange(0x10400, 0x1049D, CharProperty.ALetter), - UnicodeRange(0x104A0, 0x104A9, CharProperty.Numeric), - UnicodeRange(0x104B0, 0x104D3, CharProperty.ALetter), - UnicodeRange(0x104D8, 0x104FB, CharProperty.ALetter), - UnicodeRange(0x10500, 0x10527, CharProperty.ALetter), - UnicodeRange(0x10530, 0x10563, CharProperty.ALetter), - UnicodeRange(0x10600, 0x10736, CharProperty.ALetter), - UnicodeRange(0x10740, 0x10755, CharProperty.ALetter), - UnicodeRange(0x10760, 0x10767, CharProperty.ALetter), - UnicodeRange(0x10800, 0x10805, CharProperty.ALetter), - UnicodeRange(0x10808, 0x10808, CharProperty.ALetter), - UnicodeRange(0x1080A, 0x10835, CharProperty.ALetter), - UnicodeRange(0x10837, 0x10838, CharProperty.ALetter), - UnicodeRange(0x1083C, 0x1083C, CharProperty.ALetter), - UnicodeRange(0x1083F, 0x10855, CharProperty.ALetter), - UnicodeRange(0x10860, 0x10876, CharProperty.ALetter), - UnicodeRange(0x10880, 0x1089E, CharProperty.ALetter), - UnicodeRange(0x108E0, 0x108F2, CharProperty.ALetter), - UnicodeRange(0x108F4, 0x108F5, CharProperty.ALetter), - UnicodeRange(0x10900, 0x10915, CharProperty.ALetter), - UnicodeRange(0x10920, 0x10939, CharProperty.ALetter), - UnicodeRange(0x10980, 0x109B7, CharProperty.ALetter), - UnicodeRange(0x109BE, 0x109BF, CharProperty.ALetter), - UnicodeRange(0x10A00, 0x10A00, CharProperty.ALetter), - UnicodeRange(0x10A01, 0x10A03, CharProperty.Extend), - UnicodeRange(0x10A05, 0x10A06, CharProperty.Extend), - UnicodeRange(0x10A0C, 0x10A0F, CharProperty.Extend), - UnicodeRange(0x10A10, 0x10A13, CharProperty.ALetter), - UnicodeRange(0x10A15, 0x10A17, CharProperty.ALetter), - UnicodeRange(0x10A19, 0x10A35, CharProperty.ALetter), - UnicodeRange(0x10A38, 0x10A3A, CharProperty.Extend), - UnicodeRange(0x10A3F, 0x10A3F, CharProperty.Extend), - UnicodeRange(0x10A60, 0x10A7C, CharProperty.ALetter), - UnicodeRange(0x10A80, 0x10A9C, CharProperty.ALetter), - UnicodeRange(0x10AC0, 0x10AC7, CharProperty.ALetter), - UnicodeRange(0x10AC9, 0x10AE4, CharProperty.ALetter), - UnicodeRange(0x10AE5, 0x10AE6, CharProperty.Extend), - UnicodeRange(0x10B00, 0x10B35, CharProperty.ALetter), - UnicodeRange(0x10B40, 0x10B55, CharProperty.ALetter), - UnicodeRange(0x10B60, 0x10B72, CharProperty.ALetter), - UnicodeRange(0x10B80, 0x10B91, CharProperty.ALetter), - UnicodeRange(0x10C00, 0x10C48, CharProperty.ALetter), - UnicodeRange(0x10C80, 0x10CB2, CharProperty.ALetter), - UnicodeRange(0x10CC0, 0x10CF2, CharProperty.ALetter), - UnicodeRange(0x10D00, 0x10D23, CharProperty.ALetter), - UnicodeRange(0x10D24, 0x10D27, CharProperty.Extend), - UnicodeRange(0x10D30, 0x10D39, CharProperty.Numeric), - UnicodeRange(0x10F00, 0x10F1C, CharProperty.ALetter), - UnicodeRange(0x10F27, 0x10F27, CharProperty.ALetter), - UnicodeRange(0x10F30, 0x10F45, CharProperty.ALetter), - UnicodeRange(0x10F46, 0x10F50, CharProperty.Extend), - UnicodeRange(0x10FE0, 0x10FF6, CharProperty.ALetter), - UnicodeRange(0x11000, 0x11002, CharProperty.Extend), - UnicodeRange(0x11003, 0x11037, CharProperty.ALetter), - UnicodeRange(0x11038, 0x11046, CharProperty.Extend), - UnicodeRange(0x11066, 0x1106F, CharProperty.Numeric), - UnicodeRange(0x1107F, 0x11082, CharProperty.Extend), - UnicodeRange(0x11083, 0x110AF, CharProperty.ALetter), - UnicodeRange(0x110B0, 0x110BA, CharProperty.Extend), - UnicodeRange(0x110BD, 0x110BD, CharProperty.Format), - UnicodeRange(0x110CD, 0x110CD, CharProperty.Format), - UnicodeRange(0x110D0, 0x110E8, CharProperty.ALetter), - UnicodeRange(0x110F0, 0x110F9, CharProperty.Numeric), - UnicodeRange(0x11100, 0x11102, CharProperty.Extend), - UnicodeRange(0x11103, 0x11126, CharProperty.ALetter), - UnicodeRange(0x11127, 0x11134, CharProperty.Extend), - UnicodeRange(0x11136, 0x1113F, CharProperty.Numeric), - UnicodeRange(0x11144, 0x11144, CharProperty.ALetter), - UnicodeRange(0x11145, 0x11146, CharProperty.Extend), - UnicodeRange(0x11150, 0x11172, CharProperty.ALetter), - UnicodeRange(0x11173, 0x11173, CharProperty.Extend), - UnicodeRange(0x11176, 0x11176, CharProperty.ALetter), - UnicodeRange(0x11180, 0x11182, CharProperty.Extend), - UnicodeRange(0x11183, 0x111B2, CharProperty.ALetter), - UnicodeRange(0x111B3, 0x111C0, CharProperty.Extend), - UnicodeRange(0x111C1, 0x111C4, CharProperty.ALetter), - UnicodeRange(0x111C9, 0x111CC, CharProperty.Extend), - UnicodeRange(0x111D0, 0x111D9, CharProperty.Numeric), - UnicodeRange(0x111DA, 0x111DA, CharProperty.ALetter), - UnicodeRange(0x111DC, 0x111DC, CharProperty.ALetter), - UnicodeRange(0x11200, 0x11211, CharProperty.ALetter), - UnicodeRange(0x11213, 0x1122B, CharProperty.ALetter), - UnicodeRange(0x1122C, 0x11237, CharProperty.Extend), - UnicodeRange(0x1123E, 0x1123E, CharProperty.Extend), - UnicodeRange(0x11280, 0x11286, CharProperty.ALetter), - UnicodeRange(0x11288, 0x11288, CharProperty.ALetter), - UnicodeRange(0x1128A, 0x1128D, CharProperty.ALetter), - UnicodeRange(0x1128F, 0x1129D, CharProperty.ALetter), - UnicodeRange(0x1129F, 0x112A8, CharProperty.ALetter), - UnicodeRange(0x112B0, 0x112DE, CharProperty.ALetter), - UnicodeRange(0x112DF, 0x112EA, CharProperty.Extend), - UnicodeRange(0x112F0, 0x112F9, CharProperty.Numeric), - UnicodeRange(0x11300, 0x11303, CharProperty.Extend), - UnicodeRange(0x11305, 0x1130C, CharProperty.ALetter), - UnicodeRange(0x1130F, 0x11310, CharProperty.ALetter), - UnicodeRange(0x11313, 0x11328, CharProperty.ALetter), - UnicodeRange(0x1132A, 0x11330, CharProperty.ALetter), - UnicodeRange(0x11332, 0x11333, CharProperty.ALetter), - UnicodeRange(0x11335, 0x11339, CharProperty.ALetter), - UnicodeRange(0x1133B, 0x1133C, CharProperty.Extend), - UnicodeRange(0x1133D, 0x1133D, CharProperty.ALetter), - UnicodeRange(0x1133E, 0x11344, CharProperty.Extend), - UnicodeRange(0x11347, 0x11348, CharProperty.Extend), - UnicodeRange(0x1134B, 0x1134D, CharProperty.Extend), - UnicodeRange(0x11350, 0x11350, CharProperty.ALetter), - UnicodeRange(0x11357, 0x11357, CharProperty.Extend), - UnicodeRange(0x1135D, 0x11361, CharProperty.ALetter), - UnicodeRange(0x11362, 0x11363, CharProperty.Extend), - UnicodeRange(0x11366, 0x1136C, CharProperty.Extend), - UnicodeRange(0x11370, 0x11374, CharProperty.Extend), - UnicodeRange(0x11400, 0x11434, CharProperty.ALetter), - UnicodeRange(0x11435, 0x11446, CharProperty.Extend), - UnicodeRange(0x11447, 0x1144A, CharProperty.ALetter), - UnicodeRange(0x11450, 0x11459, CharProperty.Numeric), - UnicodeRange(0x1145E, 0x1145E, CharProperty.Extend), - UnicodeRange(0x1145F, 0x1145F, CharProperty.ALetter), - UnicodeRange(0x11480, 0x114AF, CharProperty.ALetter), - UnicodeRange(0x114B0, 0x114C3, CharProperty.Extend), - UnicodeRange(0x114C4, 0x114C5, CharProperty.ALetter), - UnicodeRange(0x114C7, 0x114C7, CharProperty.ALetter), - UnicodeRange(0x114D0, 0x114D9, CharProperty.Numeric), - UnicodeRange(0x11580, 0x115AE, CharProperty.ALetter), - UnicodeRange(0x115AF, 0x115B5, CharProperty.Extend), - UnicodeRange(0x115B8, 0x115C0, CharProperty.Extend), - UnicodeRange(0x115D8, 0x115DB, CharProperty.ALetter), - UnicodeRange(0x115DC, 0x115DD, CharProperty.Extend), - UnicodeRange(0x11600, 0x1162F, CharProperty.ALetter), - UnicodeRange(0x11630, 0x11640, CharProperty.Extend), - UnicodeRange(0x11644, 0x11644, CharProperty.ALetter), - UnicodeRange(0x11650, 0x11659, CharProperty.Numeric), - UnicodeRange(0x11680, 0x116AA, CharProperty.ALetter), - UnicodeRange(0x116AB, 0x116B7, CharProperty.Extend), - UnicodeRange(0x116B8, 0x116B8, CharProperty.ALetter), - UnicodeRange(0x116C0, 0x116C9, CharProperty.Numeric), - UnicodeRange(0x1171D, 0x1172B, CharProperty.Extend), - UnicodeRange(0x11730, 0x11739, CharProperty.Numeric), - UnicodeRange(0x11800, 0x1182B, CharProperty.ALetter), - UnicodeRange(0x1182C, 0x1183A, CharProperty.Extend), - UnicodeRange(0x118A0, 0x118DF, CharProperty.ALetter), - UnicodeRange(0x118E0, 0x118E9, CharProperty.Numeric), - UnicodeRange(0x118FF, 0x118FF, CharProperty.ALetter), - UnicodeRange(0x119A0, 0x119A7, CharProperty.ALetter), - UnicodeRange(0x119AA, 0x119D0, CharProperty.ALetter), - UnicodeRange(0x119D1, 0x119D7, CharProperty.Extend), - UnicodeRange(0x119DA, 0x119E0, CharProperty.Extend), - UnicodeRange(0x119E1, 0x119E1, CharProperty.ALetter), - UnicodeRange(0x119E3, 0x119E3, CharProperty.ALetter), - UnicodeRange(0x119E4, 0x119E4, CharProperty.Extend), - UnicodeRange(0x11A00, 0x11A00, CharProperty.ALetter), - UnicodeRange(0x11A01, 0x11A0A, CharProperty.Extend), - UnicodeRange(0x11A0B, 0x11A32, CharProperty.ALetter), - UnicodeRange(0x11A33, 0x11A39, CharProperty.Extend), - UnicodeRange(0x11A3A, 0x11A3A, CharProperty.ALetter), - UnicodeRange(0x11A3B, 0x11A3E, CharProperty.Extend), - UnicodeRange(0x11A47, 0x11A47, CharProperty.Extend), - UnicodeRange(0x11A50, 0x11A50, CharProperty.ALetter), - UnicodeRange(0x11A51, 0x11A5B, CharProperty.Extend), - UnicodeRange(0x11A5C, 0x11A89, CharProperty.ALetter), - UnicodeRange(0x11A8A, 0x11A99, CharProperty.Extend), - UnicodeRange(0x11A9D, 0x11A9D, CharProperty.ALetter), - UnicodeRange(0x11AC0, 0x11AF8, CharProperty.ALetter), - UnicodeRange(0x11C00, 0x11C08, CharProperty.ALetter), - UnicodeRange(0x11C0A, 0x11C2E, CharProperty.ALetter), - UnicodeRange(0x11C2F, 0x11C36, CharProperty.Extend), - UnicodeRange(0x11C38, 0x11C3F, CharProperty.Extend), - UnicodeRange(0x11C40, 0x11C40, CharProperty.ALetter), - UnicodeRange(0x11C50, 0x11C59, CharProperty.Numeric), - UnicodeRange(0x11C72, 0x11C8F, CharProperty.ALetter), - UnicodeRange(0x11C92, 0x11CA7, CharProperty.Extend), - UnicodeRange(0x11CA9, 0x11CB6, CharProperty.Extend), - UnicodeRange(0x11D00, 0x11D06, CharProperty.ALetter), - UnicodeRange(0x11D08, 0x11D09, CharProperty.ALetter), - UnicodeRange(0x11D0B, 0x11D30, CharProperty.ALetter), - UnicodeRange(0x11D31, 0x11D36, CharProperty.Extend), - UnicodeRange(0x11D3A, 0x11D3A, CharProperty.Extend), - UnicodeRange(0x11D3C, 0x11D3D, CharProperty.Extend), - UnicodeRange(0x11D3F, 0x11D45, CharProperty.Extend), - UnicodeRange(0x11D46, 0x11D46, CharProperty.ALetter), - UnicodeRange(0x11D47, 0x11D47, CharProperty.Extend), - UnicodeRange(0x11D50, 0x11D59, CharProperty.Numeric), - UnicodeRange(0x11D60, 0x11D65, CharProperty.ALetter), - UnicodeRange(0x11D67, 0x11D68, CharProperty.ALetter), - UnicodeRange(0x11D6A, 0x11D89, CharProperty.ALetter), - UnicodeRange(0x11D8A, 0x11D8E, CharProperty.Extend), - UnicodeRange(0x11D90, 0x11D91, CharProperty.Extend), - UnicodeRange(0x11D93, 0x11D97, CharProperty.Extend), - UnicodeRange(0x11D98, 0x11D98, CharProperty.ALetter), - UnicodeRange(0x11DA0, 0x11DA9, CharProperty.Numeric), - UnicodeRange(0x11EE0, 0x11EF2, CharProperty.ALetter), - UnicodeRange(0x11EF3, 0x11EF6, CharProperty.Extend), - UnicodeRange(0x12000, 0x12399, CharProperty.ALetter), - UnicodeRange(0x12400, 0x1246E, CharProperty.ALetter), - UnicodeRange(0x12480, 0x12543, CharProperty.ALetter), - UnicodeRange(0x13000, 0x1342E, CharProperty.ALetter), - UnicodeRange(0x13430, 0x13438, CharProperty.Format), - UnicodeRange(0x14400, 0x14646, CharProperty.ALetter), - UnicodeRange(0x16800, 0x16A38, CharProperty.ALetter), - UnicodeRange(0x16A40, 0x16A5E, CharProperty.ALetter), - UnicodeRange(0x16A60, 0x16A69, CharProperty.Numeric), - UnicodeRange(0x16AD0, 0x16AED, CharProperty.ALetter), - UnicodeRange(0x16AF0, 0x16AF4, CharProperty.Extend), - UnicodeRange(0x16B00, 0x16B2F, CharProperty.ALetter), - UnicodeRange(0x16B30, 0x16B36, CharProperty.Extend), - UnicodeRange(0x16B40, 0x16B43, CharProperty.ALetter), - UnicodeRange(0x16B50, 0x16B59, CharProperty.Numeric), - UnicodeRange(0x16B63, 0x16B77, CharProperty.ALetter), - UnicodeRange(0x16B7D, 0x16B8F, CharProperty.ALetter), - UnicodeRange(0x16E40, 0x16E7F, CharProperty.ALetter), - UnicodeRange(0x16F00, 0x16F4A, CharProperty.ALetter), - UnicodeRange(0x16F4F, 0x16F4F, CharProperty.Extend), - UnicodeRange(0x16F50, 0x16F50, CharProperty.ALetter), - UnicodeRange(0x16F51, 0x16F87, CharProperty.Extend), - UnicodeRange(0x16F8F, 0x16F92, CharProperty.Extend), - UnicodeRange(0x16F93, 0x16F9F, CharProperty.ALetter), - UnicodeRange(0x16FE0, 0x16FE1, CharProperty.ALetter), - UnicodeRange(0x16FE3, 0x16FE3, CharProperty.ALetter), - UnicodeRange(0x1B000, 0x1B000, CharProperty.Katakana), - UnicodeRange(0x1B164, 0x1B167, CharProperty.Katakana), - UnicodeRange(0x1BC00, 0x1BC6A, CharProperty.ALetter), - UnicodeRange(0x1BC70, 0x1BC7C, CharProperty.ALetter), - UnicodeRange(0x1BC80, 0x1BC88, CharProperty.ALetter), - UnicodeRange(0x1BC90, 0x1BC99, CharProperty.ALetter), - UnicodeRange(0x1BC9D, 0x1BC9E, CharProperty.Extend), - UnicodeRange(0x1BCA0, 0x1BCA3, CharProperty.Format), - UnicodeRange(0x1D165, 0x1D169, CharProperty.Extend), - UnicodeRange(0x1D16D, 0x1D172, CharProperty.Extend), - UnicodeRange(0x1D173, 0x1D17A, CharProperty.Format), - UnicodeRange(0x1D17B, 0x1D182, CharProperty.Extend), - UnicodeRange(0x1D185, 0x1D18B, CharProperty.Extend), - UnicodeRange(0x1D1AA, 0x1D1AD, CharProperty.Extend), - UnicodeRange(0x1D242, 0x1D244, CharProperty.Extend), - UnicodeRange(0x1D400, 0x1D454, CharProperty.ALetter), - UnicodeRange(0x1D456, 0x1D49C, CharProperty.ALetter), - UnicodeRange(0x1D49E, 0x1D49F, CharProperty.ALetter), - UnicodeRange(0x1D4A2, 0x1D4A2, CharProperty.ALetter), - UnicodeRange(0x1D4A5, 0x1D4A6, CharProperty.ALetter), - UnicodeRange(0x1D4A9, 0x1D4AC, CharProperty.ALetter), - UnicodeRange(0x1D4AE, 0x1D4B9, CharProperty.ALetter), - UnicodeRange(0x1D4BB, 0x1D4BB, CharProperty.ALetter), - UnicodeRange(0x1D4BD, 0x1D4C3, CharProperty.ALetter), - UnicodeRange(0x1D4C5, 0x1D505, CharProperty.ALetter), - UnicodeRange(0x1D507, 0x1D50A, CharProperty.ALetter), - UnicodeRange(0x1D50D, 0x1D514, CharProperty.ALetter), - UnicodeRange(0x1D516, 0x1D51C, CharProperty.ALetter), - UnicodeRange(0x1D51E, 0x1D539, CharProperty.ALetter), - UnicodeRange(0x1D53B, 0x1D53E, CharProperty.ALetter), - UnicodeRange(0x1D540, 0x1D544, CharProperty.ALetter), - UnicodeRange(0x1D546, 0x1D546, CharProperty.ALetter), - UnicodeRange(0x1D54A, 0x1D550, CharProperty.ALetter), - UnicodeRange(0x1D552, 0x1D6A5, CharProperty.ALetter), - UnicodeRange(0x1D6A8, 0x1D6C0, CharProperty.ALetter), - UnicodeRange(0x1D6C2, 0x1D6DA, CharProperty.ALetter), - UnicodeRange(0x1D6DC, 0x1D6FA, CharProperty.ALetter), - UnicodeRange(0x1D6FC, 0x1D714, CharProperty.ALetter), - UnicodeRange(0x1D716, 0x1D734, CharProperty.ALetter), - UnicodeRange(0x1D736, 0x1D74E, CharProperty.ALetter), - UnicodeRange(0x1D750, 0x1D76E, CharProperty.ALetter), - UnicodeRange(0x1D770, 0x1D788, CharProperty.ALetter), - UnicodeRange(0x1D78A, 0x1D7A8, CharProperty.ALetter), - UnicodeRange(0x1D7AA, 0x1D7C2, CharProperty.ALetter), - UnicodeRange(0x1D7C4, 0x1D7CB, CharProperty.ALetter), - UnicodeRange(0x1D7CE, 0x1D7FF, CharProperty.Numeric), - UnicodeRange(0x1DA00, 0x1DA36, CharProperty.Extend), - UnicodeRange(0x1DA3B, 0x1DA6C, CharProperty.Extend), - UnicodeRange(0x1DA75, 0x1DA75, CharProperty.Extend), - UnicodeRange(0x1DA84, 0x1DA84, CharProperty.Extend), - UnicodeRange(0x1DA9B, 0x1DA9F, CharProperty.Extend), - UnicodeRange(0x1DAA1, 0x1DAAF, CharProperty.Extend), - UnicodeRange(0x1E000, 0x1E006, CharProperty.Extend), - UnicodeRange(0x1E008, 0x1E018, CharProperty.Extend), - UnicodeRange(0x1E01B, 0x1E021, CharProperty.Extend), - UnicodeRange(0x1E023, 0x1E024, CharProperty.Extend), - UnicodeRange(0x1E026, 0x1E02A, CharProperty.Extend), - UnicodeRange(0x1E100, 0x1E12C, CharProperty.ALetter), - UnicodeRange(0x1E130, 0x1E136, CharProperty.Extend), - UnicodeRange(0x1E137, 0x1E13D, CharProperty.ALetter), - UnicodeRange(0x1E140, 0x1E149, CharProperty.Numeric), - UnicodeRange(0x1E14E, 0x1E14E, CharProperty.ALetter), - UnicodeRange(0x1E2C0, 0x1E2EB, CharProperty.ALetter), - UnicodeRange(0x1E2EC, 0x1E2EF, CharProperty.Extend), - UnicodeRange(0x1E2F0, 0x1E2F9, CharProperty.Numeric), - UnicodeRange(0x1E800, 0x1E8C4, CharProperty.ALetter), - UnicodeRange(0x1E8D0, 0x1E8D6, CharProperty.Extend), - UnicodeRange(0x1E900, 0x1E943, CharProperty.ALetter), - UnicodeRange(0x1E944, 0x1E94A, CharProperty.Extend), - UnicodeRange(0x1E94B, 0x1E94B, CharProperty.ALetter), - UnicodeRange(0x1E950, 0x1E959, CharProperty.Numeric), - UnicodeRange(0x1EE00, 0x1EE03, CharProperty.ALetter), - UnicodeRange(0x1EE05, 0x1EE1F, CharProperty.ALetter), - UnicodeRange(0x1EE21, 0x1EE22, CharProperty.ALetter), - UnicodeRange(0x1EE24, 0x1EE24, CharProperty.ALetter), - UnicodeRange(0x1EE27, 0x1EE27, CharProperty.ALetter), - UnicodeRange(0x1EE29, 0x1EE32, CharProperty.ALetter), - UnicodeRange(0x1EE34, 0x1EE37, CharProperty.ALetter), - UnicodeRange(0x1EE39, 0x1EE39, CharProperty.ALetter), - UnicodeRange(0x1EE3B, 0x1EE3B, CharProperty.ALetter), - UnicodeRange(0x1EE42, 0x1EE42, CharProperty.ALetter), - UnicodeRange(0x1EE47, 0x1EE47, CharProperty.ALetter), - UnicodeRange(0x1EE49, 0x1EE49, CharProperty.ALetter), - UnicodeRange(0x1EE4B, 0x1EE4B, CharProperty.ALetter), - UnicodeRange(0x1EE4D, 0x1EE4F, CharProperty.ALetter), - UnicodeRange(0x1EE51, 0x1EE52, CharProperty.ALetter), - UnicodeRange(0x1EE54, 0x1EE54, CharProperty.ALetter), - UnicodeRange(0x1EE57, 0x1EE57, CharProperty.ALetter), - UnicodeRange(0x1EE59, 0x1EE59, CharProperty.ALetter), - UnicodeRange(0x1EE5B, 0x1EE5B, CharProperty.ALetter), - UnicodeRange(0x1EE5D, 0x1EE5D, CharProperty.ALetter), - UnicodeRange(0x1EE5F, 0x1EE5F, CharProperty.ALetter), - UnicodeRange(0x1EE61, 0x1EE62, CharProperty.ALetter), - UnicodeRange(0x1EE64, 0x1EE64, CharProperty.ALetter), - UnicodeRange(0x1EE67, 0x1EE6A, CharProperty.ALetter), - UnicodeRange(0x1EE6C, 0x1EE72, CharProperty.ALetter), - UnicodeRange(0x1EE74, 0x1EE77, CharProperty.ALetter), - UnicodeRange(0x1EE79, 0x1EE7C, CharProperty.ALetter), - UnicodeRange(0x1EE7E, 0x1EE7E, CharProperty.ALetter), - UnicodeRange(0x1EE80, 0x1EE89, CharProperty.ALetter), - UnicodeRange(0x1EE8B, 0x1EE9B, CharProperty.ALetter), - UnicodeRange(0x1EEA1, 0x1EEA3, CharProperty.ALetter), - UnicodeRange(0x1EEA5, 0x1EEA9, CharProperty.ALetter), - UnicodeRange(0x1EEAB, 0x1EEBB, CharProperty.ALetter), - UnicodeRange(0x1F130, 0x1F149, CharProperty.ALetter), - UnicodeRange(0x1F150, 0x1F169, CharProperty.ALetter), - UnicodeRange(0x1F170, 0x1F189, CharProperty.ALetter), - UnicodeRange(0x1F1E6, 0x1F1FF, CharProperty.RegionalIndicator), - UnicodeRange(0x1F3FB, 0x1F3FF, CharProperty.Extend), - UnicodeRange(0xE0001, 0xE0001, CharProperty.Format), - UnicodeRange(0xE0020, 0xE007F, CharProperty.Extend), - UnicodeRange(0xE0100, 0xE01EF, CharProperty.Extend) -]); + +UnicodePropertyLookup wordLookup = + UnicodePropertyLookup.fromPackedData( + _packedWordBreakProperties, + 231, + WordCharProperty.values, +); diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/text/word_breaker.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/text/word_breaker.dart index 5aa2cdcb5b0..6df70db3f1a 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/text/word_breaker.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/text/word_breaker.dart @@ -65,21 +65,21 @@ abstract class WordBreaker { return false; } - final CharProperty immediateRight = getCharProperty(text, index); - CharProperty immediateLeft = getCharProperty(text, index - 1); + final WordCharProperty immediateRight = wordLookup.find(text, index); + WordCharProperty immediateLeft = wordLookup.find(text, index - 1); // Do not break within CRLF. // WB3: CR × LF - if (immediateLeft == CharProperty.CR && immediateRight == CharProperty.LF) + if (immediateLeft == WordCharProperty.CR && immediateRight == WordCharProperty.LF) return false; // Otherwise break before and after Newlines (including CR and LF) // WB3a: (Newline | CR | LF) ÷ if (_oneOf( immediateLeft, - CharProperty.Newline, - CharProperty.CR, - CharProperty.LF, + WordCharProperty.Newline, + WordCharProperty.CR, + WordCharProperty.LF, )) { return true; } @@ -87,9 +87,9 @@ abstract class WordBreaker { // WB3b: ÷ (Newline | CR | LF) if (_oneOf( immediateRight, - CharProperty.Newline, - CharProperty.CR, - CharProperty.LF, + WordCharProperty.Newline, + WordCharProperty.CR, + WordCharProperty.LF, )) { return true; } @@ -99,8 +99,8 @@ abstract class WordBreaker { // Keep horizontal whitespace together. // WB3d: WSegSpace × WSegSpace - if (immediateLeft == CharProperty.WSegSpace && - immediateRight == CharProperty.WSegSpace) { + if (immediateLeft == WordCharProperty.WSegSpace && + immediateRight == WordCharProperty.WSegSpace) { return false; } @@ -109,9 +109,9 @@ abstract class WordBreaker { // WB4: X (Extend | Format | ZWJ)* → X if (_oneOf( immediateRight, - CharProperty.Extend, - CharProperty.Format, - CharProperty.ZWJ, + WordCharProperty.Extend, + WordCharProperty.Format, + WordCharProperty.ZWJ, )) { // The Extend|Format|ZWJ character is to the right, so it is attached // to a character to the left, don't split here @@ -122,16 +122,16 @@ abstract class WordBreaker { int l = 0; while (_oneOf( immediateLeft, - CharProperty.Extend, - CharProperty.Format, - CharProperty.ZWJ, + WordCharProperty.Extend, + WordCharProperty.Format, + WordCharProperty.ZWJ, )) { l++; if (index - l - 1 < 0) { // Reached the beginning of text. return true; } - immediateLeft = getCharProperty(text, index - l - 1); + immediateLeft = wordLookup.find(text, index - l - 1); } // Do not break between most letters. @@ -145,27 +145,27 @@ abstract class WordBreaker { // Skip all Format, Extend and ZWJ to the right. int r = 0; - CharProperty nextRight; + WordCharProperty nextRight; do { r++; - nextRight = getCharProperty(text, index + r); + nextRight = wordLookup.find(text, index + r); } while (_oneOf( nextRight, - CharProperty.Extend, - CharProperty.Format, - CharProperty.ZWJ, + WordCharProperty.Extend, + WordCharProperty.Format, + WordCharProperty.ZWJ, )); // Skip all Format, Extend and ZWJ to the left. - CharProperty nextLeft; + WordCharProperty nextLeft; do { l++; - nextLeft = getCharProperty(text, index - l - 1); + nextLeft = wordLookup.find(text, index - l - 1); } while (_oneOf( nextLeft, - CharProperty.Extend, - CharProperty.Format, - CharProperty.ZWJ, + WordCharProperty.Extend, + WordCharProperty.Format, + WordCharProperty.ZWJ, )); // Do not break letters across certain punctuation. @@ -173,9 +173,9 @@ abstract class WordBreaker { if (_isAHLetter(immediateLeft) && _oneOf( immediateRight, - CharProperty.MidLetter, - CharProperty.MidNumLet, - CharProperty.SingleQuote, + WordCharProperty.MidLetter, + WordCharProperty.MidNumLet, + WordCharProperty.SingleQuote, ) && _isAHLetter(nextRight)) { return false; @@ -185,79 +185,79 @@ abstract class WordBreaker { if (_isAHLetter(nextLeft) && _oneOf( immediateLeft, - CharProperty.MidLetter, - CharProperty.MidNumLet, - CharProperty.SingleQuote, + WordCharProperty.MidLetter, + WordCharProperty.MidNumLet, + WordCharProperty.SingleQuote, ) && _isAHLetter(immediateRight)) { return false; } // WB7a: Hebrew_Letter × Single_Quote - if (immediateLeft == CharProperty.HebrewLetter && - immediateRight == CharProperty.SingleQuote) { + if (immediateLeft == WordCharProperty.HebrewLetter && + immediateRight == WordCharProperty.SingleQuote) { return false; } // WB7b: Hebrew_Letter × Double_Quote Hebrew_Letter - if (immediateLeft == CharProperty.HebrewLetter && - immediateRight == CharProperty.DoubleQuote && - nextRight == CharProperty.HebrewLetter) { + if (immediateLeft == WordCharProperty.HebrewLetter && + immediateRight == WordCharProperty.DoubleQuote && + nextRight == WordCharProperty.HebrewLetter) { return false; } // WB7c: Hebrew_Letter Double_Quote × Hebrew_Letter - if (nextLeft == CharProperty.HebrewLetter && - immediateLeft == CharProperty.DoubleQuote && - immediateRight == CharProperty.HebrewLetter) { + if (nextLeft == WordCharProperty.HebrewLetter && + immediateLeft == WordCharProperty.DoubleQuote && + immediateRight == WordCharProperty.HebrewLetter) { return false; } // Do not break within sequences of digits, or digits adjacent to letters // (“3a”, or “A3”). // WB8: Numeric × Numeric - if (immediateLeft == CharProperty.Numeric && - immediateRight == CharProperty.Numeric) { + if (immediateLeft == WordCharProperty.Numeric && + immediateRight == WordCharProperty.Numeric) { return false; } // WB9: AHLetter × Numeric - if (_isAHLetter(immediateLeft) && immediateRight == CharProperty.Numeric) + if (_isAHLetter(immediateLeft) && immediateRight == WordCharProperty.Numeric) return false; // WB10: Numeric × AHLetter - if (immediateLeft == CharProperty.Numeric && _isAHLetter(immediateRight)) + if (immediateLeft == WordCharProperty.Numeric && _isAHLetter(immediateRight)) return false; // Do not break within sequences, such as “3.2” or “3,456.789”. // WB11: Numeric (MidNum | MidNumLet | Single_Quote) × Numeric - if (nextLeft == CharProperty.Numeric && + if (nextLeft == WordCharProperty.Numeric && _oneOf( immediateLeft, - CharProperty.MidNum, - CharProperty.MidNumLet, - CharProperty.SingleQuote, + WordCharProperty.MidNum, + WordCharProperty.MidNumLet, + WordCharProperty.SingleQuote, ) && - immediateRight == CharProperty.Numeric) { + immediateRight == WordCharProperty.Numeric) { return false; } // WB12: Numeric × (MidNum | MidNumLet | Single_Quote) Numeric - if (immediateLeft == CharProperty.Numeric && + if (immediateLeft == WordCharProperty.Numeric && _oneOf( immediateRight, - CharProperty.MidNum, - CharProperty.MidNumLet, - CharProperty.SingleQuote, + WordCharProperty.MidNum, + WordCharProperty.MidNumLet, + WordCharProperty.SingleQuote, ) && - nextRight == CharProperty.Numeric) { + nextRight == WordCharProperty.Numeric) { return false; } // Do not break between Katakana. // WB13: Katakana × Katakana - if (immediateLeft == CharProperty.Katakana && - immediateRight == CharProperty.Katakana) { + if (immediateLeft == WordCharProperty.Katakana && + immediateRight == WordCharProperty.Katakana) { return false; } @@ -265,24 +265,24 @@ abstract class WordBreaker { // WB13a: (AHLetter | Numeric | Katakana | ExtendNumLet) × ExtendNumLet if (_oneOf( immediateLeft, - CharProperty.ALetter, - CharProperty.HebrewLetter, - CharProperty.Numeric, - CharProperty.Katakana, - CharProperty.ExtendNumLet, + WordCharProperty.ALetter, + WordCharProperty.HebrewLetter, + WordCharProperty.Numeric, + WordCharProperty.Katakana, + WordCharProperty.ExtendNumLet, ) && - immediateRight == CharProperty.ExtendNumLet) { + immediateRight == WordCharProperty.ExtendNumLet) { return false; } // WB13b: ExtendNumLet × (AHLetter | Numeric | Katakana) - if (immediateLeft == CharProperty.ExtendNumLet && + if (immediateLeft == WordCharProperty.ExtendNumLet && _oneOf( immediateRight, - CharProperty.ALetter, - CharProperty.HebrewLetter, - CharProperty.Numeric, - CharProperty.Katakana, + WordCharProperty.ALetter, + WordCharProperty.HebrewLetter, + WordCharProperty.Numeric, + WordCharProperty.Katakana, )) { return false; } @@ -306,12 +306,12 @@ abstract class WordBreaker { } static bool _oneOf( - CharProperty value, - CharProperty choice1, - CharProperty choice2, [ - CharProperty choice3, - CharProperty choice4, - CharProperty choice5, + WordCharProperty value, + WordCharProperty choice1, + WordCharProperty choice2, [ + WordCharProperty choice3, + WordCharProperty choice4, + WordCharProperty choice5, ]) { if (value == choice1) { return true; @@ -331,7 +331,7 @@ abstract class WordBreaker { return false; } - static bool _isAHLetter(CharProperty property) { - return _oneOf(property, CharProperty.ALetter, CharProperty.HebrewLetter); + static bool _isAHLetter(WordCharProperty property) { + return _oneOf(property, WordCharProperty.ALetter, WordCharProperty.HebrewLetter); } } diff --git a/engine/src/flutter/lib/web_ui/lib/src/ui/initialization.dart b/engine/src/flutter/lib/web_ui/lib/src/ui/initialization.dart index b1456489bb7..3c75a06b8da 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/ui/initialization.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/ui/initialization.dart @@ -8,6 +8,19 @@ part of ui; /// Initializes the platform. Future webOnlyInitializePlatform({ engine.AssetManager assetManager, +}) { + final Future initializationFuture = _initializePlatform(assetManager: assetManager); + scheduleMicrotask(() { + // Access [engine.lineLookup] to force the lazy unpacking of line break data + // now. Removing this line won't break anything. It's just an optimization + // to make the unpacking happen while we are waiting for network requests. + engine.lineLookup; + }); + return initializationFuture; +} + +Future _initializePlatform({ + engine.AssetManager assetManager, }) async { if (!debugEmulateFlutterTesterEnvironment) { engine.window.locationStrategy = const engine.HashLocationStrategy(); diff --git a/engine/src/flutter/lib/web_ui/tool/unicode_sync_script.dart b/engine/src/flutter/lib/web_ui/tool/unicode_sync_script.dart index 26ac6d25c25..b03f6077415 100644 --- a/engine/src/flutter/lib/web_ui/tool/unicode_sync_script.dart +++ b/engine/src/flutter/lib/web_ui/tool/unicode_sync_script.dart @@ -2,76 +2,139 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// TODO(mdebbar): To reduce the size of generated code, we could pack the data -// into a smaller format, e.g: -// -// ```dart -// const _rawData = [ -// 0x000A, 0x000A, 1, -// 0x000B, 0x000C, 2, -// 0x000D, 0x000D, 3, -// 0x0020, 0x0020, 4, -// // ... -// ]; -// ``` -// -// Then we could lazily build the lookup instance on demand. // @dart = 2.6 import 'dart:io'; + +import 'package:args/args.dart'; import 'package:path/path.dart' as path; +const int _kChar_A = 65; +const int _kChar_a = 97; + +final ArgParser argParser = ArgParser() + ..addOption( + 'words', + abbr: 'w', + help: 'Sync the word break properties.', + ) + ..addOption( + 'lines', + abbr: 'l', + help: 'Sync the line break properties.', + ) + ..addFlag( + 'dry', + abbr: 'd', + help: 'Dry mode does not write anything to disk. ' + 'The output is printed to the console.', + ); + /// A tuple that holds a [start] and [end] of a unicode range and a [property]. -class PropertyTuple { - const PropertyTuple(this.start, this.end, this.property); +class UnicodeRange { + const UnicodeRange(this.start, this.end, this.property); final int start; final int end; - final String property; + final EnumValue property; - /// Checks if there's an overlap between this tuple's range and [other]'s - /// range. - bool isOverlapping(PropertyTuple other) { + /// Checks if there's an overlap between this range and the [other] range. + bool isOverlapping(UnicodeRange other) { return start <= other.end && end >= other.start; } - /// Checks if the [other] tuple is adjacent to this tuple. + /// Checks if the [other] range is adjacent to this range. /// - /// Two tuples are considered adjacent if: - /// - The new tuple's range immediately follows this tuple's range, and - /// - The new tuple has the same property as this tuple. - bool isAdjacent(PropertyTuple other) { + /// Two ranges are considered adjacent if: + /// - The new range immediately follows this range, and + /// - The new range has the same property as this range. + bool isAdjacent(UnicodeRange other) { return other.start == end + 1 && property == other.property; } - /// Merges the ranges of the 2 [PropertyTuples] if they are adjacent. - PropertyTuple extendRange(PropertyTuple extension) { + /// Merges the ranges of the 2 [UnicodeRange]s if they are adjacent. + UnicodeRange extendRange(UnicodeRange extension) { assert(isAdjacent(extension)); - return PropertyTuple(start, extension.end, property); + return UnicodeRange(start, extension.end, property); } } -/// Usage (from the root of the project): +final String codegenPath = path.join( + path.dirname(Platform.script.toFilePath()), + '../lib/src/engine/text', +); +final String wordBreakCodegen = + path.join(codegenPath, 'word_break_properties.dart'); +final String lineBreakCodegen = + path.join(codegenPath, 'line_break_properties.dart'); + +/// Usage (from the root of the web_ui project). /// +/// To generate code for word break properties: /// ``` -/// dart tool/unicode_sync_script.dart +/// dart tool/unicode_sync_script.dart -w /// ``` /// -/// This script parses the unicode word break properties(1) and generates Dart +/// To generate code for line break properties: +/// ``` +/// dart tool/unicode_sync_script.dart -l +/// ``` +/// +/// To do a dry run, add the `-d` flag: +/// +/// ``` +/// dart tool/unicode_sync_script.dart -d ... +/// ``` +/// +/// This script parses the unicode word/line break properties(1) and generates Dart /// code(2) that can perform lookups in the unicode ranges to find what property /// a letter has. /// -/// (1) The properties file can be downloaded from: -/// https://www.unicode.org/Public/11.0.0/ucd/auxiliary/WordBreakProperty.txt +/// (1) The word break properties file can be downloaded from: +/// https://www.unicode.org/Public/13.0.0/ucd/auxiliary/WordBreakProperty.txt /// -/// (2) The codegen'd Dart file is located at: -/// lib/src/text/word_break_properties.dart +/// The line break properties file can be downloaded from: +/// https://www.unicode.org/Public/13.0.0/ucd/LineBreak.txt +/// +/// (2) The codegen'd Dart files is located at: +/// lib/src/engine/text/word_break_properties.dart +/// lib/src/engine/text/line_break_properties.dart void main(List arguments) async { - final String propertiesFile = arguments[0]; - final String codegenFile = path.join( - path.dirname(Platform.script.toFilePath()), - '../lib/src/engine/text/word_break_properties.dart', + final ArgResults result = argParser.parse(arguments); + final PropertiesSyncer syncer = getSyncer( + result['words'], + result['lines'], + result['dry'], ); - WordBreakPropertiesSyncer(propertiesFile, codegenFile).perform(); + + syncer.perform(); +} + +PropertiesSyncer getSyncer( + String wordBreakProperties, + String lineBreakProperties, + bool dry, +) { + if (wordBreakProperties == null && lineBreakProperties == null) { + print( + 'Expecting either a word break properties file or a line break properties file. None was given.\n'); + print(argParser.usage); + exit(64); + } + if (wordBreakProperties != null && lineBreakProperties != null) { + print( + 'Expecting either a word break properties file or a line break properties file. Both were given.\n'); + print(argParser.usage); + exit(64); + } + if (wordBreakProperties != null) { + return dry + ? WordBreakPropertiesSyncer.dry(wordBreakProperties) + : WordBreakPropertiesSyncer(wordBreakProperties, '$wordBreakCodegen'); + } else { + return dry + ? LineBreakPropertiesSyncer.dry(lineBreakProperties) + : LineBreakPropertiesSyncer(lineBreakProperties, '$lineBreakCodegen'); + } } /// Base class that provides common logic for syncing all kinds of unicode @@ -80,29 +143,34 @@ void main(List arguments) async { /// Subclasses implement the [template] method which receives as argument the /// list of data parsed by [processLines]. abstract class PropertiesSyncer { - PropertiesSyncer(this._src, this._dest); + PropertiesSyncer(this._src, this._dest) : _dryRun = false; + PropertiesSyncer.dry(this._src) + : _dest = null, + _dryRun = true; final String _src; final String _dest; + final bool _dryRun; + + String get prefix; + String get enumDocLink; void perform() async { final List lines = await File(_src).readAsLines(); final List header = extractHeader(lines); - final List data = processLines(lines); + final PropertyCollection data = PropertyCollection.fromLines(lines); - final IOSink sink = File(_dest).openWrite(); - sink.write(template(header, data)); + final String output = template(header, data); + + if (_dryRun) { + print(output); + } else { + final IOSink sink = File(_dest).openWrite(); + sink.write(output); + } } - String template(List header, List data); -} - -/// Syncs Unicode's word break properties. -class WordBreakPropertiesSyncer extends PropertiesSyncer { - WordBreakPropertiesSyncer(String src, String dest) : super(src, dest); - - @override - String template(List header, List data) { + String template(List header, PropertyCollection data) { return ''' // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be @@ -117,64 +185,198 @@ class WordBreakPropertiesSyncer extends PropertiesSyncer { // @dart = 2.6 part of engine; -CharProperty getCharProperty(String text, int index) { - if (index < 0 || index >= text.length) { - return null; - } - return lookup.find(text.codeUnitAt(index)); +/// For an explanation of these enum values, see: +/// +/// * ${enumDocLink} +enum ${prefix}CharProperty { + ${_getEnumValues(data.enumCollection).join('\n ')} } -enum CharProperty { - ${getEnumValues(data).join(',\n ')} -} +const String _packed${prefix}BreakProperties = + '${_packProperties(data)}'; -const UnicodePropertyLookup lookup = - UnicodePropertyLookup(>[ - ${getLookupEntries(data).join(',\n ')} -]); + +UnicodePropertyLookup<${prefix}CharProperty> ${prefix.toLowerCase()}Lookup = + UnicodePropertyLookup<${prefix}CharProperty>.fromPackedData( + _packed${prefix}BreakProperties, + ${_getSingleRangesCount(data)}, + ${prefix}CharProperty.values, +); '''; } - Iterable getEnumValues(List data) { - return Set.from( - data.map((PropertyTuple tuple) => tuple.property)) - .map(normalizePropertyName); - } - - Iterable getLookupEntries(List data) { - data.sort( - // Ranges don't overlap so it's safe to sort based on the start of each - // range. - (PropertyTuple tuple1, PropertyTuple tuple2) => - tuple1.start.compareTo(tuple2.start), + Iterable _getEnumValues(EnumCollection enumCollection) { + return enumCollection.values.map( + (EnumValue value) => + '${value.enumName}, // serialized as "${value.serialized}"', ); - verifyNoOverlappingRanges(data); - return combineAdjacentRanges(data) - .map((PropertyTuple tuple) => generateLookupEntry(tuple)); } - String generateLookupEntry(PropertyTuple tuple) { - final String propertyStr = - 'CharProperty.${normalizePropertyName(tuple.property)}'; - return 'UnicodeRange(${toHex(tuple.start)}, ${toHex(tuple.end)}, $propertyStr)'; + int _getSingleRangesCount(PropertyCollection data) { + int count = 0; + for (final UnicodeRange range in data.ranges) { + if (range.start == range.end) { + count++; + } + } + return count; } + + String _packProperties(PropertyCollection data) { + final StringBuffer buffer = StringBuffer(); + for (final UnicodeRange range in data.ranges) { + buffer.write(range.start.toRadixString(36).padLeft(4, '0')); + if (range.start == range.end) { + buffer.write('!'); + } else { + buffer.write(range.end.toRadixString(36).padLeft(4, '0')); + } + buffer.write(range.property.serialized); + } + return buffer.toString(); + } +} + +/// Syncs Unicode's word break properties. +class WordBreakPropertiesSyncer extends PropertiesSyncer { + WordBreakPropertiesSyncer(String src, String dest) : super(src, dest); + WordBreakPropertiesSyncer.dry(String src) : super.dry(src); + + final String prefix = 'Word'; + final String enumDocLink = + 'http://unicode.org/reports/tr29/#Table_Word_Break_Property_Values'; +} + +/// Syncs Unicode's line break properties. +class LineBreakPropertiesSyncer extends PropertiesSyncer { + LineBreakPropertiesSyncer(String src, String dest) : super(src, dest); + LineBreakPropertiesSyncer.dry(String src) : super.dry(src); + + final String prefix = 'Line'; + final String enumDocLink = + 'https://unicode.org/reports/tr14/#DescriptionOfProperties'; +} + +/// Holds the collection of properties parsed from the unicode spec file. +class PropertyCollection { + PropertyCollection.fromLines(List lines) { + final List unprocessedRanges = lines + .map(removeCommentFromLine) + .where((String line) => line.isNotEmpty) + .map(parseLineIntoUnicodeRange) + .toList(); + ranges = processRanges(unprocessedRanges); + } + + List ranges; + + final EnumCollection enumCollection = EnumCollection(); + + /// Examples: + /// + /// 00C0..00D6 ; ALetter + /// 037F ; ALetter + /// + /// Would be parsed into: + /// + /// ```dart + /// UnicodeRange(192, 214, EnumValue('ALetter')); + /// UnicodeRange(895, 895, EnumValue('ALetter')); + /// ``` + UnicodeRange parseLineIntoUnicodeRange(String line) { + final List split = line.split(';'); + final String rangeStr = split[0].trim(); + final String propertyStr = split[1].trim(); + + return UnicodeRange( + getRangeStart(rangeStr), + getRangeEnd(rangeStr), + enumCollection.add(propertyStr), + ); + } +} + +/// Represents the collection of values of an enum. +class EnumCollection { + final List values = []; + + EnumValue add(String name) { + final int index = + values.indexWhere((EnumValue value) => value.name == name); + EnumValue value; + if (index == -1) { + value = EnumValue(values.length, name); + values.add(value); + } else { + value = values[index]; + } + return value; + } +} + +/// Represents a single value in an [EnumCollection]. +class EnumValue { + EnumValue(this.index, this.name); + + final int index; + final String name; + + /// Returns a serialized, compact format of the enum value. + /// + /// Enum values are serialized based on their index. We start serializing them + /// to "A", "B", "C", etc until we reach "Z". Then we continue with "a", "b", + /// "c", etc. + String get serialized { + // We assign uppercase letters to the first 26 enum values. + if (index < 26) { + return String.fromCharCode(_kChar_A + index); + } + // Enum values above 26 will be assigned a lowercase letter. + return String.fromCharCode(_kChar_a + index - 26); + } + + /// Returns the enum name that'll be used in the Dart code. + /// + /// ```dart + /// enum CharProperty { + /// ALetter, // <-- this is the name returned by this method ("ALetter"). + /// Numeric, + /// // etc... + /// } + /// ``` + String get enumName { + return name.replaceAll('_', ''); + } +} + +/// Sorts ranges and combines adjacent ranges that have the same property and +/// can be merged. +Iterable processRanges(List data) { + data.sort( + // Ranges don't overlap so it's safe to sort based on the start of each + // range. + (UnicodeRange range1, UnicodeRange range2) => + range1.start.compareTo(range2.start), + ); + verifyNoOverlappingRanges(data); + return combineAdjacentRanges(data); } /// Example: /// /// ``` -/// UnicodeRange(0x01C4, 0x0293, CharProperty.ALetter), -/// UnicodeRange(0x0294, 0x0294, CharProperty.ALetter), -/// UnicodeRange(0x0295, 0x02AF, CharProperty.ALetter), +/// 0x01C4..0x0293; ALetter +/// 0x0294..0x0294; ALetter +/// 0x0295..0x02AF; ALetter /// ``` /// /// will get combined into: /// /// ``` -/// UnicodeRange(0x01C4, 0x02AF, CharProperty.ALetter) +/// 0x01C4..0x02AF; ALetter /// ``` -List combineAdjacentRanges(List data) { - final List result = [data.first]; +List combineAdjacentRanges(List data) { + final List result = [data.first]; for (int i = 1; i < data.length; i++) { if (result.last.isAdjacent(data[i])) { result.last = result.last.extendRange(data[i]); @@ -196,11 +398,7 @@ int getRangeEnd(String range) { return int.parse(range, radix: 16); } -String toHex(int value) { - return '0x${value.toRadixString(16).padLeft(4, '0').toUpperCase()}'; -} - -void verifyNoOverlappingRanges(List data) { +void verifyNoOverlappingRanges(List data) { for (int i = 1; i < data.length; i++) { if (data[i].isOverlapping(data[i - 1])) { throw Exception('Data contains overlapping ranges.'); @@ -211,7 +409,7 @@ void verifyNoOverlappingRanges(List data) { List extractHeader(List lines) { final List headerLines = []; for (String line in lines) { - if (line.contains('=======')) { + if (line.trim() == '#' || line.trim().isEmpty) { break; } if (line.isNotEmpty) { @@ -221,45 +419,7 @@ List extractHeader(List lines) { return headerLines; } -List processLines(List lines) { - return lines - .map(removeCommentFromLine) - .where((String line) => line.isNotEmpty) - .map(parseLineIntoPropertyTuple) - .toList(); -} - -String normalizePropertyName(String property) { - return property.replaceAll('_', ''); -} - String removeCommentFromLine(String line) { final int poundIdx = line.indexOf('#'); return (poundIdx == -1) ? line : line.substring(0, poundIdx); } - -/// Examples: -/// -/// 00C0..00D6 ; ALetter -/// 037F ; ALetter -/// -/// Would be parsed into: -/// -/// ```dart -/// PropertyTuple(192, 214, 'ALetter'); -/// PropertyTuple(895, 895, 'ALetter'); -/// ``` -PropertyTuple parseLineIntoPropertyTuple(String line) { - final List split = line.split(';'); - final String rangeStr = split[0].trim(); - final String propertyStr = split[1].trim(); - - final List rangeSplit = rangeStr.contains('..') - ? rangeStr.split('..') - : [rangeStr, rangeStr]; - return PropertyTuple( - int.parse(rangeSplit[0], radix: 16), - int.parse(rangeSplit[1], radix: 16), - propertyStr, - ); -}