UnicodeSet fSY;
UnicodeSet fAI;
UnicodeSet fAL;
+ UnicodeSet fHL;
UnicodeSet fID;
UnicodeSet fSA;
UnicodeSet fJL;
fSY = new UnicodeSet("[\\p{Line_break=SY}]");
fAI = new UnicodeSet("[\\p{Line_break=AI}]");
fAL = new UnicodeSet("[\\p{Line_break=AL}]");
+ fHL = new UnicodeSet("[\\p{Line_break=HL}]");
fID = new UnicodeSet("[\\p{Line_break=ID}]");
fSA = new UnicodeSet("[\\p{Line_break=SA}]");
fJL = new UnicodeSet("[\\p{Line_break=JL}]");
fSets.add(fSY);
fSets.add(fAI);
fSets.add(fAL);
+ fSets.add(fHL);
fSets.add(fID);
fSets.add(fWJ);
fSets.add(fSA);
int prevChar; // Character at above position. Note that prevChar
// and thisChar may not be adjacent because combining
// characters between them will be ignored.
+ int prevCharX2; // Character before prevChar, more contex for LB 21a
int nextPos; // Index of the next character following pos.
// Usually skips over combining marks.
// while the invalid values shift out and the "this" and
// "prev" positions are filled in with good values.
pos = prevPos = -1; // Invalid value, serves as flag for initial loop iteration.
- thisChar = prevChar = 0;
+ thisChar = prevChar = prevCharX2 = 0;
nextPos = startPos;
// "prevPos" can be arbitrarily far before "pos".
for (;;) {
// Advance to the next position to be tested.
+ prevCharX2 = prevChar;
prevPos = pos;
prevChar = thisChar;
pos = nextPos;
continue;
}
- // LB 22
+ // LB 21a, HL (HY | BA) x
+ if (fHL.contains(prevCharX2) && (fHY.contains(prevChar) || fBA.contains(prevChar))) {
+ continue;
+ }
+
+ // LB 21b, SY x HL
+ if (fSY.contains(prevChar) && fHL.contains(thisChar)) {
+ continue;
+ }
+
+ // LB 22
if (fAL.contains(prevChar) && fIN.contains(thisChar) ||
+ fHL.contains(prevChar) && fIN.contains(thisChar) ||
fID.contains(prevChar) && fIN.contains(thisChar) ||
fIN.contains(prevChar) && fIN.contains(thisChar) ||
fNU.contains(prevChar) && fIN.contains(thisChar) ) {
// NU x AL
if (fID.contains(prevChar) && fPO.contains(thisChar) ||
fAL.contains(prevChar) && fNU.contains(thisChar) ||
- fNU.contains(prevChar) && fAL.contains(thisChar) ) {
- continue;
+ fHL.contains(prevChar) && fNU.contains(thisChar) ||
+ fNU.contains(prevChar) && fAL.contains(thisChar) ||
+ fNU.contains(prevChar) && fHL.contains(thisChar) ) {
+ continue;
}
// LB 24 Do not break between prefix and letters or ideographs.
// PR x AL
// PO x AL
if (fPR.contains(prevChar) && fID.contains(thisChar) ||
- fPR.contains(prevChar) && fAL.contains(thisChar) ||
- fPO.contains(prevChar) && fAL.contains(thisChar)) {
+ fPR.contains(prevChar) && (fAL.contains(thisChar) || fHL.contains(thisChar)) ||
+ fPO.contains(prevChar) && (fAL.contains(thisChar) || fHL.contains(thisChar))) {
continue;
}
// LB 28 Do not break between alphabetics
- if (fAL.contains(prevChar) && fAL.contains(thisChar)) {
+ if ((fAL.contains(prevChar) || fHL.contains(prevChar)) && (fAL.contains(thisChar) || fHL.contains(thisChar))) {
continue;
}
// LB 29 Do not break between numeric punctuation and alphabetics
- if (fIS.contains(prevChar) && fAL.contains(thisChar)) {
+ if (fIS.contains(prevChar) && (fAL.contains(thisChar) || fHL.contains(thisChar))) {
continue;
}
// LB 30 Do not break between letters, numbers, or ordinary symbols and opening or closing punctuation.
// (AL | NU) x OP
// CP x (AL | NU)
- if ((fAL.contains(prevChar) || fNU.contains(prevChar)) && fOP.contains(thisChar)) {
+ if ((fAL.contains(prevChar) || fHL.contains(prevChar) || fNU.contains(prevChar)) && fOP.contains(thisChar)) {
continue;
}
- if (fCP.contains(prevChar) && (fAL.contains(thisChar) || fNU.contains(thisChar))) {
+ if (fCP.contains(prevChar) && (fAL.contains(thisChar) || fHL.contains(thisChar) || fNU.contains(thisChar))) {
continue;
}
<data>•\ufffc•\u30e3\u000c<100>\u1b39\u300a\u002f\u203a\u200b•\ufffc•\uaf64•\udcfb•</data>
<data>•\u114d\u31f3•\ube44\u002d•\u0362\u24e2\u276e\u2014\u205f\ufe16•\uc877•\u0fd0\u000a<100>\u20a3•</data>
<data>•\u080a\u215b\U0001d7d3\u002c•\u2025\U000e012e•\u02df\u118d\u0029\ua8d6\u0085<100>\u6cc4\u2024\u202f\ufffc•</data>
-
+
+# Test for #10176 (in root)
+<line>
+<data>•abc/•s •def•</data>
+<data>•abc/\u05D9 •def•</data>
+<data>•\u05E7\u05D7/\u05D9 •\u05DE\u05E2\u05D9\u05DC•</data>
+<data>•\u05D3\u05E8\u05D5\u05E9\u05D9\u05DD •\u05E9\u05D7\u05E7\u05E0\u05D9\u05DD/\u05D9\u05D5\u05EA•</data>
+
########################################################################################
#
<word>
<data>•私<400>達<400>に<400>一<400>〇<400>〇〇<400>の<400>コンピュータ<400>が<400>ある<400>。<0>奈<400>々<400>は<400>ワ<400>ー<400>ドで<400>あ<400>る<400>。•</data>
+# Test for #10176 (in ja)
+<line>
+<data>•abc/•s •def•</data>
+<data>•abc/\u05D9 •def•</data>
+<data>•\u05E7\u05D7/\u05D9 •\u05DE\u05E2\u05D9\u05DC•</data>
+<data>•\u05D3\u05E8\u05D5\u05E9\u05D9\u05DD •\u05E9\u05D7\u05E7\u05E0\u05D9\u05DD/\u05D9\u05D5\u05EA•</data>
+
<locale root>
<word>
<data>•私<400>達<400>に<400>一<400>〇<400>〇〇<400>の<400>コンピュータ<400>が<400>ある<400>。<0>奈<400>々<400>は<400>ワ<400>ー<400>ドで<400>あ<400>る<400>。•</data>
<data>•abc •- •def •abc •-def •abc- •def •</data> # With ASCII hyphen
<data>•abc •‐ •def •abc •‐def •abc‐ •def •</data> # With Unicode u2010 hyphen
+
+# Test for #10176 (in fi)
+<line>
+<data>•abc/•s •def•</data>
+<data>•abc/\u05D9 •def•</data>
+<data>•\u05E7\u05D7/\u05D9 •\u05DE\u05E2\u05D9\u05DC•</data>
+<data>•\u05D3\u05E8\u05D5\u05E9\u05D9\u05DD •\u05E9\u05D7\u05E7\u05E0\u05D9\u05DD/\u05D9\u05D5\u05EA•</data>