Correct special space handling of punctuation

This fixes two defects:
- One where some separators should promote a phantom space to
a real space. This bug had a unit test but wasn't tracked.
- One where French punctuations would behave incorrectly. Tracked
Bug: 6113693

Change-Id: Ia7f86fc960e00141757632ab2c9bce9168dd6966
main
Jean Chalard 2012-03-06 14:00:34 +09:00
parent e31060dc77
commit 00ed3be95c
4 changed files with 16 additions and 5 deletions

View File

@ -19,11 +19,11 @@
--> -->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Symbols that should be swapped with a magic space --> <!-- Symbols that should be swapped with a magic space -->
<string name="magic_space_swapping_symbols">.,\")]}</string> <string name="weak_space_swapping_symbols">.,\")]}</string>
<!-- Symbols that should strip a magic space --> <!-- Symbols that should strip a magic space -->
<string name="magic_space_stripping_symbols">"&#x0009;&#x0020;\'\n-/_"</string> <string name="weak_space_stripping_symbols">"&#x0009;&#x0020;\'\n-/_"</string>
<!-- Symbols that should promote magic spaces into real space --> <!-- Symbols that should promote magic spaces into real space -->
<string name="magic_space_promoting_symbols">;:!?([*&amp;@{&lt;&gt;+=|</string> <string name="phantom_space_promoting_symbols">;:!?([*&amp;@{&lt;&gt;+=|</string>
<!-- Symbols that do NOT separate words --> <!-- Symbols that do NOT separate words -->
<string name="symbols_excluded_from_word_separators">\'</string> <string name="symbols_excluded_from_word_separators">\'</string>
</resources> </resources>

View File

@ -25,7 +25,7 @@
<!-- Symbols that should strip a weak space --> <!-- Symbols that should strip a weak space -->
<string name="weak_space_stripping_symbols">"&#x0009;&#x0020;\n/_\'-"</string> <string name="weak_space_stripping_symbols">"&#x0009;&#x0020;\n/_\'-"</string>
<!-- Symbols that should convert weak spaces into real space --> <!-- Symbols that should convert weak spaces into real space -->
<string name="weak_space_promoting_symbols">([*&amp;@{&lt;&gt;+=|</string> <string name="phantom_space_promoting_symbols">([*&amp;@{&lt;&gt;+=|</string>
<!-- Symbols that do NOT separate words --> <!-- Symbols that do NOT separate words -->
<string name="symbols_excluded_from_word_separators">\'-</string> <string name="symbols_excluded_from_word_separators">\'-</string>
<!-- Word separator list is the union of all symbols except those that are not separators: <!-- Word separator list is the union of all symbols except those that are not separators:

View File

@ -1610,6 +1610,10 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
final boolean swapWeakSpace = maybeStripSpaceWhileInBatchEdit(ic, primaryCode, spaceState, final boolean swapWeakSpace = maybeStripSpaceWhileInBatchEdit(ic, primaryCode, spaceState,
KeyboardActionListener.SUGGESTION_STRIP_COORDINATE == x); KeyboardActionListener.SUGGESTION_STRIP_COORDINATE == x);
if (SPACE_STATE_PHANTOM == spaceState &&
mSettingsValues.isPhantomSpacePromotingSymbol(primaryCode)) {
sendKeyCodePoint(Keyboard.CODE_SPACE);
}
sendKeyCodePoint(primaryCode); sendKeyCodePoint(primaryCode);
if (Keyboard.CODE_SPACE == primaryCode) { if (Keyboard.CODE_SPACE == primaryCode) {

View File

@ -37,6 +37,7 @@ public class SettingsValues {
public final int mDelayUpdateOldSuggestions; public final int mDelayUpdateOldSuggestions;
public final String mWeakSpaceStrippers; public final String mWeakSpaceStrippers;
public final String mWeakSpaceSwappers; public final String mWeakSpaceSwappers;
private final String mPhantomSpacePromotingSymbols;
private final String mSuggestPuncs; private final String mSuggestPuncs;
public final SuggestedWords mSuggestPuncList; public final SuggestedWords mSuggestPuncList;
public final SuggestedWords mSuggestPuncOutputTextList; public final SuggestedWords mSuggestPuncOutputTextList;
@ -91,6 +92,7 @@ public class SettingsValues {
mDelayUpdateOldSuggestions = res.getInteger(R.integer.config_delay_update_old_suggestions); mDelayUpdateOldSuggestions = res.getInteger(R.integer.config_delay_update_old_suggestions);
mWeakSpaceStrippers = res.getString(R.string.weak_space_stripping_symbols); mWeakSpaceStrippers = res.getString(R.string.weak_space_stripping_symbols);
mWeakSpaceSwappers = res.getString(R.string.weak_space_swapping_symbols); mWeakSpaceSwappers = res.getString(R.string.weak_space_swapping_symbols);
mPhantomSpacePromotingSymbols = res.getString(R.string.phantom_space_promoting_symbols);
if (LatinImeLogger.sDBG) { if (LatinImeLogger.sDBG) {
final int length = mWeakSpaceStrippers.length(); final int length = mWeakSpaceStrippers.length();
for (int i = 0; i < length; i = mWeakSpaceStrippers.offsetByCodePoints(i, 1)) { for (int i = 0; i < length; i = mWeakSpaceStrippers.offsetByCodePoints(i, 1)) {
@ -192,7 +194,7 @@ public class SettingsValues {
final String weakSpaceSwappers, final String symbolsExcludedFromWordSeparators, final String weakSpaceSwappers, final String symbolsExcludedFromWordSeparators,
final Resources res) { final Resources res) {
String wordSeparators = weakSpaceStrippers + weakSpaceSwappers String wordSeparators = weakSpaceStrippers + weakSpaceSwappers
+ res.getString(R.string.weak_space_promoting_symbols); + res.getString(R.string.phantom_space_promoting_symbols);
for (int i = symbolsExcludedFromWordSeparators.length() - 1; i >= 0; --i) { for (int i = symbolsExcludedFromWordSeparators.length() - 1; i >= 0; --i) {
wordSeparators = wordSeparators.replace( wordSeparators = wordSeparators.replace(
symbolsExcludedFromWordSeparators.substring(i, i + 1), ""); symbolsExcludedFromWordSeparators.substring(i, i + 1), "");
@ -225,6 +227,11 @@ public class SettingsValues {
return mWeakSpaceSwappers.contains(String.valueOf((char)code)); return mWeakSpaceSwappers.contains(String.valueOf((char)code));
} }
public boolean isPhantomSpacePromotingSymbol(int code) {
// TODO: this does not work if the code does not fit in a char
return mPhantomSpacePromotingSymbols.contains(String.valueOf((char)code));
}
private static boolean isAutoCorrectEnabled(final Resources resources, private static boolean isAutoCorrectEnabled(final Resources resources,
final String currentAutoCorrectionSetting) { final String currentAutoCorrectionSetting) {
final String autoCorrectionOff = resources.getString( final String autoCorrectionOff = resources.getString(