fix phantom space after double quotes (#842)

and add a bunch of related tests

---------

Co-authored-by: Helium314 <helium314@mailbox.org>
This commit is contained in:
codokie 2024-06-24 19:32:16 +03:00 committed by GitHub
parent 4a9dc6bff6
commit fc0d27459f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 50 additions and 8 deletions

View file

@ -1112,32 +1112,32 @@ public final class InputLogic {
mConnection.commitCodePoint(codePoint); mConnection.commitCodePoint(codePoint);
} }
} else { } else {
if ((SpaceState.PHANTOM == inputTransaction.getMSpaceState() if (SpaceState.PHANTOM == inputTransaction.getMSpaceState()
&& settingsValues.isUsuallyFollowedBySpace(codePoint)) && (settingsValues.isUsuallyFollowedBySpace(codePoint) || isInsideDoubleQuoteOrAfterDigit)) {
|| (Constants.CODE_DOUBLE_QUOTE == codePoint
&& isInsideDoubleQuoteOrAfterDigit)) {
// If we are in phantom space state, and the user presses a separator, we want to // If we are in phantom space state, and the user presses a separator, we want to
// stay in phantom space state so that the next keypress has a chance to add the // stay in phantom space state so that the next keypress has a chance to add the
// space. For example, if I type "Good dat", pick "day" from the suggestion strip // space. For example, if I type "Good dat", pick "day" from the suggestion strip
// then insert a comma and go on to typing the next word, I want the space to be // then insert a comma and go on to typing the next word, I want the space to be
// inserted automatically before the next word, the same way it is when I don't // inserted automatically before the next word, the same way it is when I don't
// input the comma. A double quote behaves like it's usually followed by space if // input the comma. Also when closing a quote the phantom state should be preserved.
// we're inside a double quote.
// The case is a little different if the separator is a space stripper. Such a // The case is a little different if the separator is a space stripper. Such a
// separator does not normally need a space on the right (that's the difference // separator does not normally need a space on the right (that's the difference
// between swappers and strippers), so we should not stay in phantom space state if // between swappers and strippers), so we should not stay in phantom space state if
// the separator is a stripper. Hence the additional test above. // the separator is a stripper. Hence the additional test above.
mSpaceState = SpaceState.PHANTOM; mSpaceState = SpaceState.PHANTOM;
} else } else {
// mSpaceState is still SpaceState.NONE, but some characters should typically // mSpaceState is still SpaceState.NONE, but some characters should typically
// be followed by space. Set phantom space state for such characters if the user // be followed by space. Set phantom space state for such characters if the user
// enabled the setting and was not composing a word. The latter avoids setting // enabled the setting and was not composing a word. The latter avoids setting
// phantom space state when typing decimal numbers, with the drawback of not // phantom space state when typing decimal numbers, with the drawback of not
// setting phantom space state after ending a sentence with a non-word. // setting phantom space state after ending a sentence with a non-word.
// A double quote behaves like it's usually followed by space if we're inside
// a double quote.
if (wasComposingWord if (wasComposingWord
&& settingsValues.mAutospaceAfterPunctuationEnabled && settingsValues.mAutospaceAfterPunctuationEnabled
&& settingsValues.isUsuallyFollowedBySpace(codePoint)) { && (settingsValues.isUsuallyFollowedBySpace(codePoint) || isInsideDoubleQuoteOrAfterDigit)) {
mSpaceState = SpaceState.PHANTOM; mSpaceState = SpaceState.PHANTOM;
}
} }
mConnection.commitCodePoint(codePoint); mConnection.commitCodePoint(codePoint);

View file

@ -545,8 +545,50 @@ class InputLogicTest {
assertEquals("hello ", text) assertEquals("hello ", text)
} }
@Test fun `no weird space inside multi-"`() {
reset()
chainInput("\"\"\"")
assertEquals("\"\"\"", text)
reset()
DeviceProtectedUtils.getSharedPreferences(latinIME).edit { putBoolean(Settings.PREF_AUTOSPACE_AFTER_PUNCTUATION, true) }
chainInput("\"\"\"")
assertEquals("\"\"\"", text)
}
@Test fun `autospace still happens after "`() {
reset()
DeviceProtectedUtils.getSharedPreferences(latinIME).edit { putBoolean(Settings.PREF_AUTOSPACE_AFTER_PUNCTUATION, true) }
chainInput("\"hello\"you")
assertEquals("\"hello\" you", text)
}
@Test fun `autospace still happens after " if next word is in quotes`() {
reset()
DeviceProtectedUtils.getSharedPreferences(latinIME).edit { putBoolean(Settings.PREF_AUTOSPACE_AFTER_PUNCTUATION, true) }
chainInput("\"hello\"\"you\"")
assertEquals("\"hello\" \"you\"", text)
}
@Test fun `autospace propagates over "`() {
reset()
input('"')
pickSuggestion("hello")
assertEquals(spaceState, SpaceState.PHANTOM) // picking a suggestion sets phantom space state
chainInput("\"you")
assertEquals("\"hello\" you", text)
}
@Test fun `autospace still happens after " if nex word is in " and after comma`() {
reset()
DeviceProtectedUtils.getSharedPreferences(latinIME).edit { putBoolean(Settings.PREF_AUTOSPACE_AFTER_PUNCTUATION, true) }
chainInput("\"hello\",\"you\"")
assertEquals("\"hello\", \"you\"", text)
}
@Test fun `autospace in json editor`() { @Test fun `autospace in json editor`() {
reset() reset()
DeviceProtectedUtils.getSharedPreferences(latinIME).edit { putBoolean(Settings.PREF_AUTOSPACE_AFTER_PUNCTUATION, true) }
chainInput("{\"label\":\"") chainInput("{\"label\":\"")
assertEquals("{\"label\": \"", text) assertEquals("{\"label\": \"", text)
input('c') input('c')