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