Bug 1719535 - Part 9. Trim ASCII space at the tail for content serializer. r=TYLin
XML/Plain text Serializer uses line break segmenter to wrap text. New segmenter that is compatible with UAX#14 has different rules for old segmenter. Old segmenter have break opportunity before ASCII space, but UAX#14 doesn't have it (https://www.unicode.org/reports/tr14/#LB7). So we have to trim ASCII space at the tail for text wrap. Depends on D167677 Differential Revision: https://phabricator.services.mozilla.com/D180773
This commit is contained in:
@@ -131,7 +131,19 @@ int32_t nsPlainTextSerializer::CurrentLine::FindWrapIndexForContent(
|
|||||||
// mContent until we find a width less than or equal to wrap column.
|
// mContent until we find a width less than or equal to wrap column.
|
||||||
uint32_t width = 0;
|
uint32_t width = 0;
|
||||||
intl::LineBreakIteratorUtf16 lineBreakIter(mContent);
|
intl::LineBreakIteratorUtf16 lineBreakIter(mContent);
|
||||||
while (const Maybe<uint32_t> nextGoodSpace = lineBreakIter.Next()) {
|
while (Maybe<uint32_t> nextGoodSpace = lineBreakIter.Next()) {
|
||||||
|
// Trim space at the tail. UAX#14 doesn't have break opportunity for
|
||||||
|
// ASCII space at the tail.
|
||||||
|
const Maybe<uint32_t> originalNextGoodSpace = nextGoodSpace;
|
||||||
|
while (*nextGoodSpace > 0 &&
|
||||||
|
mContent.CharAt(*nextGoodSpace - 1) == 0x20) {
|
||||||
|
nextGoodSpace = Some(*nextGoodSpace - 1);
|
||||||
|
}
|
||||||
|
if (*nextGoodSpace == 0) {
|
||||||
|
// Restore the original nextGoodSpace.
|
||||||
|
nextGoodSpace = originalNextGoodSpace;
|
||||||
|
}
|
||||||
|
|
||||||
width += GetUnicharStringWidth(Span<const char16_t>(
|
width += GetUnicharStringWidth(Span<const char16_t>(
|
||||||
mContent.get() + goodSpace, *nextGoodSpace - goodSpace));
|
mContent.get() + goodSpace, *nextGoodSpace - goodSpace));
|
||||||
if (prefixwidth + width > aWrapColumn) {
|
if (prefixwidth + width > aWrapColumn) {
|
||||||
|
|||||||
@@ -1560,6 +1560,19 @@ bool nsXMLContentSerializer::AppendWrapped_NonWhitespaceSequence(
|
|||||||
MOZ_ASSERT(nextWrapPosition.isSome(),
|
MOZ_ASSERT(nextWrapPosition.isSome(),
|
||||||
"We should've exited the loop when reaching the end of "
|
"We should've exited the loop when reaching the end of "
|
||||||
"text in the previous iteration!");
|
"text in the previous iteration!");
|
||||||
|
|
||||||
|
// Trim space at the tail. UAX#14 doesn't have break opportunity
|
||||||
|
// for ASCII space at the tail.
|
||||||
|
const Maybe<uint32_t> originalNextWrapPosition = nextWrapPosition;
|
||||||
|
while (*nextWrapPosition > 0 &&
|
||||||
|
subSeq.at(*nextWrapPosition - 1) == 0x20) {
|
||||||
|
nextWrapPosition = Some(*nextWrapPosition - 1);
|
||||||
|
}
|
||||||
|
if (*nextWrapPosition == 0) {
|
||||||
|
// Restore the original nextWrapPosition.
|
||||||
|
nextWrapPosition = originalNextWrapPosition;
|
||||||
|
}
|
||||||
|
|
||||||
if (aSequenceStart + *nextWrapPosition > aPos) {
|
if (aSequenceStart + *nextWrapPosition > aPos) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user