1#
2# Copyright (C) 2002-2013, International Business Machines Corporation 
3# and others. All Rights Reserved.
4#
5# file:  word_POSIX.txt
6#
7# ICU Word Break Rules, POSIX locale.
8#      See Unicode Standard Annex #29.
9#      These rules are based on UAX #29 Revision 22 for Unicode Version 6.3
10#
11# Note:  Updates to word.txt will usually need to be merged into
12#        word_POSIX.txt also.
13
14##############################################################################
15#
16#  Character class definitions from TR 29
17#
18##############################################################################
19
20!!chain;
21
22
23#
24#  Character Class Definitions.
25#
26
27$CR                 = [\p{Word_Break = CR}];
28$LF                 = [\p{Word_Break = LF}];
29$Newline            = [\p{Word_Break = Newline}];
30$Extend             = [\p{Word_Break = Extend}];
31$Regional_Indicator = [\p{Word_Break = Regional_Indicator}];
32$Format             = [\p{Word_Break = Format}];
33$Katakana           = [\p{Word_Break = Katakana}];
34$Hebrew_Letter      = [\p{Word_Break = Hebrew_Letter}];
35$ALetter            = [\p{Word_Break = ALetter}];
36$Single_Quote       = [\p{Word_Break = Single_Quote}];
37$Double_Quote       = [\p{Word_Break = Double_Quote}];
38$MidNumLet          = [\p{Word_Break = MidNumLet} - [.]];
39$MidLetter          = [\p{Word_Break = MidLetter}];
40$MidNum             = [\p{Word_Break = MidNum} [.]];
41$Numeric            = [\p{Word_Break = Numeric}];
42$ExtendNumLet       = [\p{Word_Break = ExtendNumLet}];
43
44$Han                = [:Han:];
45$Hiragana           = [:Hiragana:];
46
47
48#   Dictionary character set, for triggering language-based break engines. Currently
49#   limited to LineBreak=Complex_Context. Note that this set only works in Unicode
50#   5.0 or later as the definition of Complex_Context was corrected to include all
51#   characters requiring dictionary break.
52
53$Control        = [\p{Grapheme_Cluster_Break = Control}]; 
54$HangulSyllable = [\uac00-\ud7a3];
55$ComplexContext = [:LineBreak = Complex_Context:];
56$KanaKanji      = [$Han $Hiragana $Katakana];
57$dictionaryCJK  = [$KanaKanji $HangulSyllable];
58$dictionary     = [$ComplexContext $dictionaryCJK];
59
60# leave CJK scripts out of ALetterPlus
61$ALetterPlus  = [$ALetter-$dictionaryCJK [$ComplexContext-$Extend-$Control]];
62
63
64#
65#  Rules 4    Ignore Format and Extend characters, 
66#             except when they appear at the beginning of a region of text.
67#
68# TODO: check if handling of katakana in dictionary makes rules incorrect/void
69$KatakanaEx           = $Katakana           ($Extend |  $Format)*;
70$Hebrew_LetterEx      = $Hebrew_Letter      ($Extend |  $Format)*;
71$ALetterEx            = $ALetterPlus        ($Extend |  $Format)*;
72$Single_QuoteEx       = $Single_Quote       ($Extend |  $Format)*;
73$Double_QuoteEx       = $Double_Quote       ($Extend |  $Format)*;
74$MidNumLetEx          = $MidNumLet          ($Extend |  $Format)*;
75$MidLetterEx          = $MidLetter          ($Extend |  $Format)*;
76$MidNumEx             = $MidNum             ($Extend |  $Format)*;
77$NumericEx            = $Numeric            ($Extend |  $Format)*;
78$ExtendNumLetEx       = $ExtendNumLet       ($Extend |  $Format)*;
79$Regional_IndicatorEx = $Regional_Indicator ($Extend |  $Format)*;
80
81$Ideographic    = [\p{Ideographic}];
82$HiraganaEx     = $Hiragana     ($Extend |  $Format)*;
83$IdeographicEx  = $Ideographic  ($Extend |  $Format)*;
84
85## -------------------------------------------------
86
87!!forward;
88
89
90# Rule 3 - CR x LF
91#
92$CR $LF;
93
94# Rule 4 - ignore Format and Extend characters, except when they appear at the beginning
95#          of a region of Text.   The rule here comes into play when the start of text
96#          begins with a group of Format chars, or with a "word" consisting of a single
97#          char that is not in any of the listed word break categories followed by
98#          format char(s), or is not a CJK dictionary character.
99[^$CR $LF $Newline]? ($Extend |  $Format)+;
100
101$NumericEx {100};
102$ALetterEx {200};
103$HangulSyllable {200};
104$Hebrew_LetterEx{200};
105$KatakanaEx {400};       # note:  these status values override those from rule 5
106$HiraganaEx {400};       #        by virtue of being numerically larger.
107$IdeographicEx {400};    #
108
109#
110# rule 5
111#    Do not break between most letters.
112#
113($ALetterEx | $Hebrew_LetterEx)  ($ALetterEx | $Hebrew_LetterEx) {200};
114
115# rule 6 and 7
116($ALetterEx | $Hebrew_LetterEx) ($MidLetterEx | $MidNumLetEx | $Single_QuoteEx) ($ALetterEx | $Hebrew_LetterEx) {200};
117
118# rule 7a
119$Hebrew_LetterEx $Single_QuoteEx {200};
120
121# rule 7b and 7c
122$Hebrew_LetterEx $Double_QuoteEx $Hebrew_LetterEx {200};
123
124# rule 8
125
126$NumericEx $NumericEx {100};
127
128# rule 9
129
130($ALetterEx | $Hebrew_LetterEx) $NumericEx {200};
131
132# rule 10
133
134$NumericEx ($ALetterEx | $Hebrew_LetterEx) {200};
135
136# rule 11 and 12 
137
138$NumericEx ($MidNumEx | $MidNumLetEx | $Single_QuoteEx) $NumericEx {100};
139
140# rule 13
141# to be consistent with $KanaKanji $KanaKanhi, changed
142# from 300 to 400.
143# See also TestRuleStatus in intltest/rbbiapts.cpp
144$KatakanaEx  $KatakanaEx {400};
145
146# rule 13a/b
147
148$ALetterEx       $ExtendNumLetEx {200};    #  (13a)
149$Hebrew_LetterEx $ExtendNumLetEx {200};    #  (13a)
150$NumericEx       $ExtendNumLetEx {100};    #  (13a)
151$KatakanaEx      $ExtendNumLetEx {400};    #  (13a)
152$ExtendNumLetEx  $ExtendNumLetEx {200};    #  (13a)
153
154$ExtendNumLetEx  $ALetterEx      {200};    #  (13b)
155$ExtendNumLetEx  $Hebrew_Letter  {200};    #  (13b)
156$ExtendNumLetEx  $NumericEx      {100};    #  (13b)
157$ExtendNumLetEx  $KatakanaEx     {400};    #  (13b)
158
159# rule 13c
160
161$Regional_IndicatorEx $Regional_IndicatorEx;
162
163# special handling for CJK characters: chain for later dictionary segmentation
164$HangulSyllable $HangulSyllable {200};
165$KanaKanji $KanaKanji {400}; # different rule status if both kana and kanji found 
166
167
168## -------------------------------------------------
169
170!!reverse;
171
172$BackHebrew_LetterEx      = ($Format | $Extend)* $Hebrew_Letter;
173$BackALetterEx            = ($Format | $Extend)* $ALetterPlus;
174$BackSingle_QuoteEx       = ($Format | $Extend)* $Single_Quote;
175$BackDouble_QuoteEx       = ($Format | $Extend)* $Double_Quote;
176$BackMidNumLetEx          = ($Format | $Extend)* $MidNumLet;
177$BackNumericEx            = ($Format | $Extend)* $Numeric;
178$BackMidNumEx             = ($Format | $Extend)* $MidNum;
179$BackMidLetterEx          = ($Format | $Extend)* $MidLetter;
180$BackKatakanaEx           = ($Format | $Extend)* $Katakana;
181$BackHiraganaEx           = ($Format | $Extend)* $Hiragana;
182$BackExtendNumLetEx       = ($Format | $Extend)* $ExtendNumLet;
183$BackRegional_IndicatorEx = ($Format | $Extend)* $Regional_Indicator;
184
185# rule 3
186$LF $CR;
187
188# rule 4
189($Format | $Extend)*  [^$CR $LF $Newline]?;
190
191# rule 5
192
193($BackALetterEx | $BackHebrew_LetterEx) ($BackALetterEx | $BackHebrew_LetterEx);
194
195# rule 6 and 7
196
197($BackALetterEx | $BackHebrew_LetterEx) ($BackMidLetterEx | $BackMidNumLetEx | $BackSingle_QuoteEx) ($BackALetterEx | $BackHebrew_LetterEx);
198
199# rule 7a
200$BackSingle_QuoteEx $BackHebrew_LetterEx;
201
202# Rule 7b and 7c
203$BackHebrew_LetterEx $BackDouble_QuoteEx $BackHebrew_LetterEx;
204
205# rule 8
206
207$BackNumericEx $BackNumericEx;
208
209# rule 9
210
211$BackNumericEx ($BackALetterEx | $BackHebrew_LetterEx);
212
213# rule 10
214
215($BackALetterEx | $BackHebrew_LetterEx) $BackNumericEx;
216
217# rule 11 and 12
218
219$BackNumericEx ($BackMidNumEx | $BackMidNumLetEx | $BackSingle_QuoteEx) $BackNumericEx;
220
221# rule 13
222
223$BackKatakanaEx $BackKatakanaEx;
224
225# rules 13 a/b
226#
227$BackExtendNumLetEx ($BackALetterEx | $BackHebrew_LetterEx | $BackNumericEx | $BackKatakanaEx | $BackExtendNumLetEx);
228($BackALetterEx | $BackHebrew_LetterEx | $BackNumericEx | $BackKatakanaEx) $BackExtendNumLetEx; 
229
230# rule 13c
231
232$BackRegional_IndicatorEx $BackRegional_IndicatorEx;
233
234# special handling for CJK characters: chain for later dictionary segmentation
235$HangulSyllable $HangulSyllable;
236$KanaKanji $KanaKanji; #different rule status if both kanji and kana found
237
238## -------------------------------------------------
239
240!!safe_reverse;
241
242# rule 3
243($Extend | $Format)+ .?;
244
245# rule 6
246($MidLetter | $MidNumLet | $Single_Quote) ($BackALetterEx | $BackHebrew_LetterEx);
247
248# rule 7b
249$Double_Quote $BackHebrew_LetterEx;
250
251
252# rule 11
253($MidNum | $MidNumLet | $Single_Quote) $BackNumericEx;
254
255# For dictionary-based break
256$dictionary $dictionary;
257
258## -------------------------------------------------
259
260!!safe_forward;
261
262# rule 4
263($Extend | $Format)+ .?;
264
265# rule 6
266($MidLetterEx | $MidNumLetEx | $Single_QuoteEx) ($ALetterEx | $Hebrew_LetterEx);
267
268# rule 7b
269$Double_QuoteEx $Hebrew_LetterEx;
270
271# rule 11
272($MidNumEx | $MidNumLetEx | $Single_QuoteEx) $NumericEx;
273
274# For dictionary-based break
275$dictionary $dictionary;
276