mirror of
https://github.com/Helium314/HeliBoard.git
synced 2025-06-08 15:47:43 +00:00
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:
parent
4a9dc6bff6
commit
fc0d27459f
2 changed files with 50 additions and 8 deletions
|
@ -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);
|
||||||
|
|
|
@ -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')
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue