• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1diff --git a/source/data/brkitr/rules/word.txt b/source/data/brkitr/rules/word.txt
2index 0f0e734d..b4603823 100644
3--- a/source/data/brkitr/rules/word.txt
4+++ b/source/data/brkitr/rules/word.txt
5@@ -38,12 +38,34 @@ $Regional_Indicator = [\p{Word_Break = Regional_Indicator}];
6 $Format             = [\p{Word_Break = Format}];
7 $Katakana           = [\p{Word_Break = Katakana}];
8 $Hebrew_Letter      = [\p{Word_Break = Hebrew_Letter}];
9-$ALetter            = [\p{Word_Break = ALetter} @];
10+
11+# Exclude '@' (commercial at, \u0040) from ALetter to maintain breaking at '@'.
12+# ICU 49d192fefe09, in ICU 72, stopped breaking at '@' in order to not break up
13+# e-mail addresses (https://unicode-org.atlassian.net/browse/CLDR-15767). In
14+# light of the Chromium-specific change below that breaks on full-stop (period,
15+# dot, \u002e below in MidNumLet), e-mail addresses will be broken in any case.
16+# Thus, although the upstream intent was to not break "user.name@example.com" at
17+# all, it actually would break down into {"user", ".", "name@example", ".",
18+# "com"}, which is undesirable. See https://crbug.com/1410331. Maintain the
19+# previous Chromium behavior of breaking at both '@' and '.'.
20+#
21+# TODO: Determine whether it's feasible to drop the Chromium-specific behaviors
22+# (and thus this patch) for '.' and now '@'.
23+$ALetter            = [\p{Word_Break = ALetter}];
24+
25 $Single_Quote       = [\p{Word_Break = Single_Quote}];
26 $Double_Quote       = [\p{Word_Break = Double_Quote}];
27-$MidNumLet          = [\p{Word_Break = MidNumLet}];
28+
29+# Remove two full stop characters from $MidNumLet and add them to $MidNum
30+# to break a hostname into its components at the cost of breaking
31+# 'e.g.' and 'i.e.' as well.
32+# $MidNumLet is used in rules 6/7 (rules of our interest) and rules 11/12.
33+# Because it's OR'd with $MidNum in rules 11/12, rules 11/12 are not affected
34+# while rules 6/7 are reverted to the old behavior we want.
35+$MidNumLet          = [[\p{Word_Break = MidNumLet}] - [\u002E \uFF0E]];
36 $MidLetter          = [\p{Word_Break = MidLetter} - [\: \uFE55 \uFF1A]];
37-$MidNum             = [\p{Word_Break = MidNum}];
38+$MidNum             = [\p{Word_Break = MidNum}[\u002E \uFF0E]];
39+
40 $Numeric            = [\p{Word_Break = Numeric}];
41 $ExtendNumLet       = [\p{Word_Break = ExtendNumLet}];
42 $WSegSpace          = [\p{Word_Break = WSegSpace}];
43diff --git a/source/data/brkitr/rules/word_POSIX.txt b/source/data/brkitr/rules/word_POSIX.txt
44index e62fd7fa..1115b464 100644
45--- a/source/data/brkitr/rules/word_POSIX.txt
46+++ b/source/data/brkitr/rules/word_POSIX.txt
47@@ -38,12 +38,30 @@ $Regional_Indicator = [\p{Word_Break = Regional_Indicator}];
48 $Format             = [\p{Word_Break = Format}];
49 $Katakana           = [\p{Word_Break = Katakana}];
50 $Hebrew_Letter      = [\p{Word_Break = Hebrew_Letter}];
51-$ALetter            = [\p{Word_Break = ALetter} @];
52+
53+# Exclude '@' (commercial at, \u0040) from ALetter to maintain breaking at '@'.
54+# ICU 49d192fefe09, in ICU 72, stopped breaking at '@' in order to not break up
55+# e-mail addresses (https://unicode-org.atlassian.net/browse/CLDR-15767). In
56+# light of the Chromium-specific change below that breaks on full-stop (period,
57+# dot, \u002e below in MidNumLet), e-mail addresses will be broken in any case.
58+# Thus, although the upstream intent was to not break "user.name@example.com" at
59+# all, it actually would break down into {"user", ".", "name@example", ".",
60+# "com"}, which is undesirable. See https://crbug.com/1410331. Maintain the
61+# previous Chromium behavior of breaking at both '@' and '.'.
62+#
63+# TODO: Determine whether it's feasible to drop the Chromium-specific behaviors
64+# (and thus this patch) for '.' and now '@'.
65+$ALetter            = [\p{Word_Break = ALetter}];
66+
67 $Single_Quote       = [\p{Word_Break = Single_Quote}];
68 $Double_Quote       = [\p{Word_Break = Double_Quote}];
69-$MidNumLet          = [\p{Word_Break = MidNumLet} - [.]];
70+
71+# Remove full-width full stop (\uff0e) from $MidNumLet and add it to $MidNum, in
72+# addition to the ordinary full stop (dot, period, '.', \u002e).
73+$MidNumLet          = [[\p{Word_Break = MidNumLet}] - [\u002E \uFF0E]];
74 $MidLetter          = [\p{Word_Break = MidLetter} - [\: \uFE55 \uFF1A]];
75-$MidNum             = [\p{Word_Break = MidNum} [.]];
76+$MidNum             = [\p{Word_Break = MidNum}[\u002E \uFF0E]];
77+
78 $Numeric            = [\p{Word_Break = Numeric}];
79 $ExtendNumLet       = [\p{Word_Break = ExtendNumLet}];
80 $WSegSpace          = [\p{Word_Break = WSegSpace}];
81diff --git a/source/data/brkitr/rules/word_fi_sv.txt b/source/data/brkitr/rules/word_fi_sv.txt
82index 544558f9..da793853 100644
83--- a/source/data/brkitr/rules/word_fi_sv.txt
84+++ b/source/data/brkitr/rules/word_fi_sv.txt
85@@ -38,12 +38,34 @@ $Regional_Indicator = [\p{Word_Break = Regional_Indicator}];
86 $Format             = [\p{Word_Break = Format}];
87 $Katakana           = [\p{Word_Break = Katakana}];
88 $Hebrew_Letter      = [\p{Word_Break = Hebrew_Letter}];
89-$ALetter            = [\p{Word_Break = ALetter} @];
90+
91+# Exclude '@' (commercial at, \u0040) from ALetter to maintain breaking at '@'.
92+# ICU 49d192fefe09, in ICU 72, stopped breaking at '@' in order to not break up
93+# e-mail addresses (https://unicode-org.atlassian.net/browse/CLDR-15767). In
94+# light of the Chromium-specific change below that breaks on full-stop (period,
95+# dot, \u002e below in MidNumLet), e-mail addresses will be broken in any case.
96+# Thus, although the upstream intent was to not break "user.name@example.com" at
97+# all, it actually would break down into {"user", ".", "name@example", ".",
98+# "com"}, which is undesirable. See https://crbug.com/1410331. Maintain the
99+# previous Chromium behavior of breaking at both '@' and '.'.
100+#
101+# TODO: Determine whether it's feasible to drop the Chromium-specific behaviors
102+# (and thus this patch) for '.' and now '@'.
103+$ALetter            = [\p{Word_Break = ALetter}];
104+
105 $Single_Quote       = [\p{Word_Break = Single_Quote}];
106 $Double_Quote       = [\p{Word_Break = Double_Quote}];
107-$MidNumLet          = [\p{Word_Break = MidNumLet}];
108+
109+# Remove two full stop characters from $MidNumLet and add them to $MidNum
110+# to break a hostname into its components at the cost of breaking
111+# 'e.g.' and 'i.e.' as well.
112+# $MidNumLet is used in rules 6/7 (rules of our interest) and rules 11/12.
113+# Because it's OR'd with $MidNum in rules 11/12, rules 11/12 are not affected
114+# while rules 6/7 are reverted to the old behavior we want.
115+$MidNumLet          = [[\p{Word_Break = MidNumLet}] - [\u002E \uFF0E]];
116 $MidLetter          = [\p{Word_Break = MidLetter}];
117-$MidNum             = [\p{Word_Break = MidNum}];
118+$MidNum             = [\p{Word_Break = MidNum}[\u002E \uFF0E]];
119+
120 $Numeric            = [\p{Word_Break = Numeric}];
121 $ExtendNumLet       = [\p{Word_Break = ExtendNumLet}];
122 $WSegSpace          = [\p{Word_Break = WSegSpace}];
123