LibWeb: Port text segmentation to the ICU text segmenter

This commit is contained in:
Timothy Flynn
2024-06-19 09:02:21 -04:00
committed by Andreas Kling
parent 14071c52f9
commit 12f177e9e9
5 changed files with 40 additions and 20 deletions

View File

@@ -4,6 +4,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibLocale/Segmenter.h>
#include <LibWeb/Bindings/CharacterDataPrototype.h>
#include <LibWeb/DOM/CharacterData.h>
#include <LibWeb/DOM/Document.h>
@@ -22,6 +23,8 @@ CharacterData::CharacterData(Document& document, NodeType type, String const& da
{
}
CharacterData::~CharacterData() = default;
void CharacterData::initialize(JS::Realm& realm)
{
Base::initialize(realm);
@@ -124,6 +127,10 @@ WebIDL::ExceptionOr<void> CharacterData::replace_data(size_t offset, size_t coun
static_cast<Layout::TextNode&>(*layout_node).invalidate_text_for_rendering();
document().set_needs_layout();
if (m_segmenter)
m_segmenter->set_segmented_text(m_data);
return {};
}
@@ -148,4 +155,14 @@ WebIDL::ExceptionOr<void> CharacterData::delete_data(size_t offset, size_t count
return replace_data(offset, count, String {});
}
Locale::Segmenter& CharacterData::segmenter()
{
if (!m_segmenter) {
m_segmenter = Locale::Segmenter::create(Locale::SegmenterGranularity::Grapheme);
m_segmenter->set_segmented_text(m_data);
}
return *m_segmenter;
}
}