tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

line_loose_cj.txt (10602B)


      1 #
      2 # Copyright (C) 2016 and later: Unicode, Inc. and others.
      3 # License & terms of use: http://www.unicode.org/copyright.html
      4 # Copyright (c) 2016, International Business Machines Corporation and others. All Rights Reserved.
      5 #
      6 #  file:  line_loose_cj.txt
      7 #
      8 # Reference Line Break rules for intltest rbbi/RBBIMonkeyTest.
      9 # Rules derived from Unicode Standard Annex #14 for Unicode 16.0.
     10 #
     11 # Note: Rule syntax and the monkey test itself are still a work in progress.
     12 #       They are expected to change with review and the addition of support for rule tailoring.
     13 #
     14 #         Line Breaking Rules
     15 #         Implement default line breaking as defined by
     16 #         Unicode Standard Annex #14
     17 #         http://www.unicode.org/reports/tr14/, tailored as noted below.
     18 #
     19 #         This tailors the line break behavior to correspond to CSS
     20 #         line-break=loose (BCP47 -u-lb-loose) as defined for Chinese & Japanese.
     21 #         It sets characters of class CJ to behave like ID.
     22 #         In addition, it allows breaks:
     23 #         * between ID and hyphens 2010 & 2013 (as well as the rest of the HH class)
     24 #         * before 301C, 30A0 (both NS)
     25 #         * before iteration marks 3005, 303B, 309D, 309E, 30FD, 30FE (all NS)
     26 #         * between characters of LineBreak class IN such as 2026
     27 #         * before some centered punct 203C, 2047, 2048, 2049, 30FB, FF1A, FF1B,
     28 #           FF65 (all NS) and FF01, FF1F (both EX).
     29 #         * before suffix characters with LineBreak class PO and EastAsianWidth A,F,W;
     30 #           this includes: 00B0 2030 2032 2033 2035 2103 2109 FE6A FF05 FFE0
     31 #         * after prefix characters with LineBreak class PR and EastAsianWidth A,F,W;
     32 #           this includes: 00A4 00B1 20AC 2116 FE69 FF04 FFE1 FFE5 FFE6
     33 #         It allows breaking before 201C and after 201D, for zh_Hans, zh_Hant, and ja.
     34 
     35 
     36 type = line;
     37 locale = ja@lb=loose;
     38 
     39 
     40 AI = [:LineBreak =  Ambiguous:];
     41 AK = [:LineBreak =  Aksara:];
     42 AL = [:LineBreak =  Alphabetic:];
     43 AP = [:LineBreak =  Aksara_Prebase:];
     44 AS = [:LineBreak =  Aksara_Start:];
     45 BA = [:LineBreak =  Break_After:];
     46 HH = [:LineBreak =  Unambiguous_Hyphen:];
     47 BB = [:LineBreak =  Break_Before:];
     48 BK = [:LineBreak =  Mandatory_Break:];
     49 B2 = [:LineBreak =  Break_Both:];
     50 CB = [:LineBreak =  Contingent_Break:];
     51 CJ = [:LineBreak =  Conditional_Japanese_Starter:];
     52 CL = [[:LineBreak =  Close_Punctuation:] \u201d];
     53 CMS = [:LineBreak =  Combining_Mark:];
     54 CP = [:LineBreak =  Close_Parenthesis:];
     55 CR = [:LineBreak =  Carriage_Return:];
     56 EB = [:LineBreak =  EB:];
     57 EM = [:LineBreak =  EM:];
     58 EXX = [\uFF01 \uFF1F];
     59 EX = [[:LineBreak =  Exclamation:] - EXX];
     60 GL = [:LineBreak =  Glue:];
     61 HL = [:LineBreak =  Hebrew_Letter:];
     62 HY = [:LineBreak =  Hyphen:];
     63 H2 = [:LineBreak =  H2:];
     64 H3 = [:LineBreak =  H3:];
     65 ID = [[:LineBreak =  Ideographic:] CJ];  # CSS Loose tailoring: CJ resolves to ID
     66 IN = [:LineBreak =  Inseperable:];
     67 IS = [:LineBreak =  Infix_Numeric:];
     68 JL = [:LineBreak =  JL:];
     69 JV = [:LineBreak =  JV:];
     70 JT = [:LineBreak =  JT:];
     71 LF = [:LineBreak =  Line_Feed:];
     72 NL = [:LineBreak =  Next_Line:];
     73 NSX = [\u301C \u30A0 \u3005 \u303B \u309D \u309E \u30FD \u30FE \u203C \u2047 \u2048 \u2049 \u30FB \uFF1A \uFF1B \uFF65];
     74 NS = [[:LineBreak =  Nonstarter:] - NSX];
     75 NU = [:LineBreak =  Numeric:];
     76 OP = [[:LineBreak =  Open_Punctuation:] \u201c];
     77 POX = [\u00B0 \u2030 \u2032 \u2033 \u2035 \u2103 \u2109 \uFE6A \uFF05 \uFFE0];
     78 PO = [[:LineBreak =  Postfix_Numeric:] - POX];
     79 PRX = [\u00A4 \u00B1 \u20AC \u2116 \uFE69 \uFF04 \uFFE1 \uFFE5 \uFFE6];
     80 PR = [[:LineBreak =  Prefix_Numeric:] - PRX];
     81 QU = [[:LineBreak =  Quotation:] - [\u201c\u201d]];
     82 RI = [:LineBreak =  Regional_Indicator:];
     83 SA = [:LineBreak =  Complex_Context:];
     84 SG = [:LineBreak =  Surrogate:];
     85 SP = [:LineBreak =  Space:];
     86 SY = [:LineBreak =  Break_Symbols:];
     87 VF = [:LineBreak =  Virama_Final:];
     88 VI = [:LineBreak =  Virama:];
     89 WJ = [:LineBreak =  Word_Joiner:];
     90 XX = [:LineBreak =  Unknown:];
     91 ZW = [:LineBreak =  ZWSpace:];
     92 ZWJ = [:LineBreak =  ZWJ:];
     93 
     94 # OP30 and CP30 are variants of OP and CP that appear in rule LB30 from UAX 14.
     95 # Limitations of this monkey test rule parser require that these definitions be pulled out
     96 # rather than appearing in-line in LB 30.
     97 
     98 OP30 = [OP - [\p{ea=F}\p{ea=W}\p{ea=H}]];
     99 CP30 = [CP - [\p{ea=F}\p{ea=W}\p{ea=H}]];
    100 
    101 eaFWH            = [\p{ea=F}\p{ea=W}\p{ea=H}];
    102 eaFWHminusCMOPGL   = [ eaFWH - [CMS OP GL] ];
    103 eaFWHminusCM     = [ eaFWH - CMS ];
    104 eaFWHBreakableAtLB19 = [ eaFWH - [NS BA EX CL IN IS GL CMS] ];
    105 BAminuseaFWH = [BA - eaFWH ];
    106 
    107 PiQU = [\p{Pi}&QU];
    108 PfQU = [\p{Pf}&QU];
    109 
    110 # The redundant-looking inner brackets are required for the current parser in the test code.
    111 ExtPictUnassigned = [[\p{Extended_Pictographic}]&[\p{Cn}]];
    112 
    113 # LB1 - Resolve AI, CB, CJ, SA, SG, and XX into other line breaking classes
    114 AL = [AL AI SG XX ];
    115 dictionary = SA;
    116 
    117 # By LB9, a ZWJ also behaves as a CM. Including it in the definition of CM avoids having to explicitly
    118 #         list it in the numerous rules that use CM.
    119 CM = [CMS ZWJ];
    120 
    121 LB4:        BK ÷;
    122 LB5:        CR LF;
    123 LB5.1:      CR ÷;
    124 LB5.2:      LF ÷;
    125 LB5.3:      NL ÷;
    126 
    127 LB6:        . (BK | CR | LF | NL);
    128 LB6.1:      [^BK CR LF NL SP ZW] CM* (BK | CR | LF | NL);
    129 
    130 # LB8   break after ZW SP*.
    131 # Precedes LB7 because both rules will match the sequences like ZW SP,
    132 # and LB8 must take precedence.
    133 
    134 LB8:        ZW SP* ÷ [^ZW SP BK CR LF NL];
    135 
    136 # Numbers. Equivalent to Tailoring example 8 from UAX 14.
    137 # Moved up, before LB14, because it can match longer sequences which must take precedence.
    138 #          Loose_cj tailoring: do not include $PRX at the beginning or $POX at the end.
    139 LB25:        ((PR | PO | POX)CM*)? ((OP | HY)CM*)? (IS CM*)? NU (CM*(NU | SY | IS))* (CM*(CL | CP))? (CM*(PR | PRX | PO))?;
    140 
    141 # Rules LB14 - LB17.
    142 
    143 # Moved before LB14, because it matches a supersequence.
    144 LB20a.3: ( OP CM* SP* | QU CM* | GL CM* ) (PiQU CM* SP*)+ SP (HY | HH) CM* (AL | HL);
    145 LB15a.1:       ( OP CM* SP* | QU CM* | GL CM* ) (PiQU CM* SP*)+ .;
    146 
    147 # Moved before LB14.  These are really the cases where LB19a does not apply, but
    148 # the old LB19 would.  This is to avoid many instances of chaining over two code
    149 # points.
    150 LB19a.1: eaFWHminusCMOPGL         ÷ PiQU CM* eaFWHminusCM;
    151 LB19a.2: eaFWHminusCMOPGL CM* CMS ÷ PiQU CM* eaFWHminusCM;
    152 LB19a.5: eaFWHminusCM CM* PfQU         ÷ eaFWHBreakableAtLB19;
    153 LB19a.6: eaFWHminusCM CM* PfQU CM* CMS ÷ eaFWHBreakableAtLB19;
    154 
    155 # Moved up, before LB7, because they can match a longer sequence that would also match LB7.
    156 # For example, the sequence "OP CM SP AL" matches LB14
    157 # while the prefix of it, "OP CM SP" matches LB7.1
    158 LB20a.7:     OP CM* SP+ (HY | HH) CM* (AL | HL);
    159 LB14:        OP CM* SP* .;
    160 
    161 LB20a.4:       ^ (PiQU CM* SP*)+ SP (HY | HH) CM* (AL | HL);
    162 LB15a.2:       ^ (PiQU CM* SP*)+ .;
    163 # LB15b/LB15a chaining.
    164 LB20a.5:       ([^SP] CM* | SP) PfQU CM* (PiQU CM* SP*)+ SP (HY | HH) CM* (AL | HL);
    165 LB15b.1:       ([^SP] CM* | SP) PfQU CM* (PiQU CM* SP*)+ .;
    166 LB15b.2:       ([^SP] CM* | SP) PfQU CM* ( SP | GL | WJ | CL | QU | CP | EX | IS | SY | BK | CR | LF | NL | ZW | $ );
    167 
    168 # LB 15c Break before an IS that begins a number and follows a space.
    169 LB15c:       SP ÷ IS CM* NU;
    170 
    171 # LB15d       × IS
    172 LB15d.1:     [^SP] CM* IS;
    173 LB15d.2:     SP IS;
    174 
    175 LB16:        (CL | CP)CM* SP* NS;
    176 LB17:        B2 CM* SP* B2;
    177 
    178 
    179 # LB7 Do not break before spaces or zero width space.
    180 
    181 LB7.1:      [^ZW SP] CM* [SP ZW];
    182 LB7.2:      [ZW SP] [SP ZW];
    183 
    184 # LB8a
    185 #      ZWJ x
    186 #      Don't match a CM on the right - let other rules pick up CM sequences, where
    187 #      the ZWJ behaves as just another generic CM.
    188 LB8a:       ZWJ [^CM];
    189 
    190 
    191 # LB9:  X CM -> X
    192 # LB10: Unattached CM -> AL
    193 
    194 #LB11:       × WJ;
    195 #            WJ ×
    196 
    197 LB11.1:      [^SP] CM* WJ;
    198 LB11.2:      SP WJ;
    199 LB11.3:      WJ CM* [^CM];
    200 
    201 # Needs to apply before LB12, because the new monkeys are not greedy.
    202 LB20a.2:   GL CM* (HY | HH) CM* (AL | HL);
    203 LB12:      GL CM* [^CM];
    204 
    205 LB12a:       [^SP BA HY HH] CM* GL;
    206 
    207 # LB 13 Do not break before ‘]’ or ‘!’ or ‘/’, even after spaces.
    208 LB13.1: [^SP] CM* [CL CP EX SY];
    209 LB13.2: SP [CL CP EX SY];
    210 
    211 
    212 # LB 14-17 are moved above LB 7.
    213 
    214 LB18:        SP ÷;
    215 
    216 LB19:        . CM* QU;
    217 LB19.1:      QU CM* [^CM];
    218 
    219 # LB 20   Break before and after CB.
    220 #         Interaction with LB8a:  ZWJ x . is tricky because CM includes ZWJ.
    221 #                                 ZWJ acts like a CM to the left, combining with CB.
    222 #                                 ZWJ acts independently to the right, no break after by LB8a.
    223 LB20.1:      . CM* ZWJ CB;
    224 LB20.2:      . CM* ÷ CB;
    225 
    226 LB20a.6:     CB CM* ZWJ (HY | HH) CM* (AL | HL);
    227 LB20.3:      CB CM* ZWJ [^CM];
    228 LB20.4:      CB CM* ÷;
    229 
    230 # LB 20a    Do not break after a word-initial hyphen.
    231 LB20a.1:     ^(HY | HH) CM* (AL | HL);
    232 
    233 # Note: Rule 21a must come before 21 to prevent 21.1 from matching HL BA, then
    234 #       not picking up the continuing match after the BA from 21a.
    235 # LB 21a Don't break after Hebrew + Hyphen
    236 #   HL (HY | BA) x
    237 
    238 LB21a:       HL CM* (HY | HH) CM* [^CM CB HL];
    239 
    240 LB21.1:      [^ID] CM* [BA HY HH NS];
    241 LB21.2:      ID CM* [BA HY NS];
    242 LB21.3:      BB CM* [^CM CB];
    243 
    244 LB21b:       SY CM* HL;
    245 
    246 
    247 LB22:        [^IN] CM* IN;   # For CSS Loose, allow breaks between adjacent ellipses characters.
    248 
    249 LB23.1:      (AL | HL | CM) CM* NU;
    250 LB23.2:      NU CM* (AL | HL);
    251 
    252 LB23a.1:     PR CM* (ID | EB | EM);
    253 LB23a.2:     (ID | EB | EM) CM* PO;
    254 
    255 LB24.2:      (PR | PO | POX) CM* (AL | HL);
    256 LB24.3:      (AL | HL | CM) CM* (PR | PO | POX);
    257 
    258 
    259 LB26.1:      JL CM* (JL | JV | H2 | H3);
    260 LB26.2:      (JV | H2) CM* (JV | JT);
    261 LB26.3:      (JT | H3) CM* JT;
    262 
    263 LB27.1:      (JL | JV | JT | H2 | H3) CM* PO;
    264 LB27.2:      PR CM* (JL | JV | JT | H2 | H3);
    265 
    266 # LB28 Do not break between Alphabetics.
    267 #      Unattached (leading) CM treated as AL.
    268 LB28:        (AL | HL | CM)CM* (AL | HL);
    269 
    270 LB28: (AP CM*)? (AS | AK | [◌] ) (CM* VI CM* (AK | [◌] ))* (CM* VI | ((CM* (AS | AK | [◌] ) )? CM* VF))?;
    271 
    272 LB29:        IS CM* (AL | HL);
    273 
    274 # LB30  is adjusted for unattached leading CM being treated as AL.
    275 LB30.1:      (AL | CM | HL | NU) CM* OP30;
    276 LB30.2:      CP30 CM* (AL | HL | NU);
    277 
    278 # LB30a  keep pairs of RI together.
    279 LB30a.1:     RI CM* RI         ÷ [^BK CR LF NL SP ZW WJ CL CP EX IS SY GL QU BA HH HY NS IN CM];
    280 LB30a.2:     RI CM* RI CM* CMS ÷ [^BK CR LF NL SP ZW WJ CL CP EX IS SY GL QU BA HH HY NS IN CM];
    281 LB30a.3:     RI CM* RI CM* [BK CR LF NL SP ZW WJ GL CL CP EX IS SY QU BA HH HY NS IN ZWJ]?;
    282 
    283 # LB30b Do not break between Emoji Base (or potential emoji) and Emoji Modifier
    284 LB30b.1:       EB CM* EM;
    285 LB30b.2:       ExtPictUnassigned CM* EM;
    286 
    287 # LB31 Break Everywhere Else.
    288 #      Include combining marks
    289 LB31.1:        . CM* ZWJ [^CM];
    290 LB31.2:        . CM* ÷;