mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 06:07:44 +00:00
LibWeb: Fix whitespace getting trimmed incorrectly
Whitespace at the end of line should only be trimmed when 'white-space' is set to 'normal', 'nowrap', or 'pre-line'.
This commit is contained in:
parent
ce4b09dfd1
commit
92b56ded02
3 changed files with 41 additions and 13 deletions
|
@ -33,27 +33,39 @@ void LineBox::add_fragment(Node const& layout_node, int start, int length, CSSPi
|
|||
|
||||
void LineBox::trim_trailing_whitespace()
|
||||
{
|
||||
while (!m_fragments.is_empty() && m_fragments.last().is_justifiable_whitespace()) {
|
||||
auto fragment = m_fragments.take_last();
|
||||
m_width -= fragment.width();
|
||||
auto should_trim = [](LineBoxFragment* fragment) {
|
||||
auto ws = fragment->layout_node().computed_values().white_space();
|
||||
return ws == CSS::WhiteSpace::Normal || ws == CSS::WhiteSpace::Nowrap || ws == CSS::WhiteSpace::PreLine;
|
||||
};
|
||||
|
||||
LineBoxFragment* last_fragment = nullptr;
|
||||
for (;;) {
|
||||
if (m_fragments.is_empty())
|
||||
return;
|
||||
// last_fragment cannot be null from here on down, as m_fragments is not empty.
|
||||
last_fragment = &m_fragments.last();
|
||||
if (!should_trim(last_fragment))
|
||||
return;
|
||||
if (last_fragment->is_justifiable_whitespace()) {
|
||||
m_width -= last_fragment->width();
|
||||
m_fragments.remove(m_fragments.size() - 1);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_fragments.is_empty())
|
||||
return;
|
||||
|
||||
auto& last_fragment = m_fragments.last();
|
||||
auto last_text = last_fragment.text();
|
||||
auto last_text = last_fragment->text();
|
||||
if (last_text.is_null())
|
||||
return;
|
||||
|
||||
while (last_fragment.length()) {
|
||||
auto last_character = last_text[last_fragment.length() - 1];
|
||||
while (last_fragment->length()) {
|
||||
auto last_character = last_text[last_fragment->length() - 1];
|
||||
if (!is_ascii_space(last_character))
|
||||
break;
|
||||
|
||||
int last_character_width = last_fragment.layout_node().font().glyph_width(last_character);
|
||||
last_fragment.m_length -= 1;
|
||||
last_fragment.set_width(last_fragment.width() - last_character_width);
|
||||
int last_character_width = last_fragment->layout_node().font().glyph_width(last_character);
|
||||
last_fragment->m_length -= 1;
|
||||
last_fragment->set_width(last_fragment->width() - last_character_width);
|
||||
m_width -= last_character_width;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue