Grapheme-aware display-cell text boundaries for terminal UIs.
Dependencies
> moon add moonbit-community/displaytext///|
test {
let lines = @displaytext.split_lines("a你好b\nnext")
let line = lines[0]
// Whole-line display width.
assert_eq(line.width(), 6)
// Move by legal textual positions, not UTF-16 code units.
let after_a = line.next(line.start()).unwrap()
let after_ni = line.next(after_a).unwrap()
assert_eq(line.display_position(after_ni).column(), 3)
// Convert a display column inside a wide character back to text boundaries.
let middle = @displaytext.DisplayPosition::new(column=2)
assert_eq(
line.view(line.start(), line.textual_position_at_or_before(middle)),
"a",
)
assert_eq(
line.view(line.start(), line.textual_position_at_or_after(middle)),
"a你",
)
// Truncate without cutting through a display unit.
assert_eq(line.truncate(4), "a你…")
}///|
test {
let line = @displaytext.DisplayText::DisplayText("ab你好")
let remaining = @displaytext.DisplayPosition::new(column=3)
let end = line.textual_position_at_or_before(remaining)
assert_eq(line.view(line.start(), end), "ab")
}> moon testpub struct DisplayText {
// private fields
} derive(Debug)
#alias(new)
fn DisplayText::DisplayText(text : String, cjk? : Bool) -> DisplayTextimpl Eq for DisplayTextfn DisplayText::textual_position_at_or_after(self : DisplayText, position : DisplayPosition) -> TextualPositionfn DisplayText::textual_position_at_or_before(self : DisplayText, position : DisplayPosition) -> TextualPositionfn DisplayText::view(self : DisplayText, start : TextualPosition, end : TextualPosition) -> StringViewGrapheme-aware display-cell text boundaries for terminal UIs.
Dependencies