Fix breaking formatting tag on newline.

This commit is contained in:
John Preston 2021-06-22 11:08:04 +04:00
parent f646439624
commit ff0daf7d83

View file

@ -760,9 +760,9 @@ bool WasInsertTillTheEndOfTag(
return false; return false;
} }
} }
block = block.next();
if (block.isValid()) { if (block.isValid()) {
fragmentIt = block.begin(); fragmentIt = block.begin();
block = block.next();
} else { } else {
break; break;
} }
@ -1991,6 +1991,7 @@ void InputField::processFormatting(int insertPosition, int insertEnd) {
while (true) { while (true) {
FormattingAction action; FormattingAction action;
auto checkedTill = insertPosition;
auto fromBlock = document->findBlock(insertPosition); auto fromBlock = document->findBlock(insertPosition);
auto tillBlock = document->findBlock(insertEnd); auto tillBlock = document->findBlock(insertEnd);
if (tillBlock.isValid()) tillBlock = tillBlock.next(); if (tillBlock.isValid()) tillBlock = tillBlock.next();
@ -2000,8 +2001,13 @@ void InputField::processFormatting(int insertPosition, int insertEnd) {
auto fragment = fragmentIt.fragment(); auto fragment = fragmentIt.fragment();
Assert(fragment.isValid()); Assert(fragment.isValid());
int fragmentPosition = fragment.position(); const auto fragmentPosition = fragment.position();
if (insertPosition >= fragmentPosition + fragment.length()) { const auto fragmentEnd = fragmentPosition + fragment.length();
if (insertPosition > fragmentEnd) {
// In case insertPosition == fragmentEnd we still
// need to fill startTagFound / breakTagOnNotLetter.
// This can happen if we inserted a newline after
// a text fragment with some formatting tag, like Bold.
continue; continue;
} }
int changedPositionInFragment = insertPosition - fragmentPosition; // Can be negative. int changedPositionInFragment = insertPosition - fragmentPosition; // Can be negative.
@ -2121,6 +2127,7 @@ void InputField::processFormatting(int insertPosition, int insertEnd) {
if (action.type != ActionType::Invalid) { if (action.type != ActionType::Invalid) {
break; break;
} }
checkedTill = fragmentEnd;
} }
if (action.type != ActionType::Invalid) { if (action.type != ActionType::Invalid) {
break; break;
@ -2130,6 +2137,16 @@ void InputField::processFormatting(int insertPosition, int insertEnd) {
action.intervalStart = block.next().position() - 1; action.intervalStart = block.next().position() - 1;
action.intervalEnd = action.intervalStart + 1; action.intervalEnd = action.intervalStart + 1;
break; break;
} else if (breakTagOnNotLetter) {
// In case we need to break on not letter and we didn't
// find any non letter symbol, we found it here - a newline.
breakTagOnNotLetter = false;
if (checkedTill < breakTagOnNotLetterTill) {
action.type = ActionType::RemoveTag;
action.intervalStart = checkedTill;
action.intervalEnd = breakTagOnNotLetterTill;
break;
}
} }
} }
if (action.type != ActionType::Invalid) { if (action.type != ActionType::Invalid) {