flowchart LR
VM["view_model.ViewLineData<br>text + tokens + parts"] --> R["render_line_html"]
VL["view_layout.LineDecoration[]"] --> R
OPT["RenderWhitespace<br>render_control_characters"] --> R
R --> HTML["one line's HTML string"]
HTML --> DOM["internal/viewer/browser/view<br>(the only place DOM happens)"]///|
test "escaping covers the markup-significant characters" {
debug_inspect(
@common.escape_html("<span class=\"x\"> a & b '</span>"),
content=(
#|"<span class="x"> a & b '</span>"
),
)
}///|
test "the line class has one definition" {
debug_inspect(
@common.render_line_class(),
content=(
#|"view-line"
),
)
}///|
test "a tokenized line renders to token spans" {
let text_model = @model.TextModel(
@base_common.Uri::parse("file:///line-html-doc.mbt"),
"line-html-doc.mbt",
"moonbit",
1,
"rev-1",
"let x = 1\n",
)
let view_model = @view_model.ViewModel(text_model)
let line_data = view_model.lines().get_view_line_data(1)
debug_inspect(
@common.render_line_html(line_data, []),
content=(
#|"<span class=\"view-line-content\"><span class=\"mtk1\">let x = 1</span></span>"
),
)
}///|
test "whitespace rendering is opt-in per call" {
let text_model = @model.TextModel(
@base_common.Uri::parse("file:///line-html-ws.mbt"),
"line-html-ws.mbt",
"moonbit",
1,
"rev-1",
" a b\n",
)
let view_model = @view_model.ViewModel(text_model)
let line_data = view_model.lines().get_view_line_data(1)
let plain = @common.render_line_html(line_data, [])
let all_whitespace = @common.render_line_html(
line_data,
[],
render_whitespace=All,
)
debug_inspect(
(plain == all_whitespace, all_whitespace.contains("mtkw")),
content=(
#|(false, true)
),
)
}moon test --target js viewer/commonfn escape_html(text : String) -> Stringfn render_line_class() -> Stringfn render_line_html(line : ViewLineData, line_decorations : Array[LineDecoration], render_whitespace? : RenderWhitespace, render_control_characters? : Bool) -> StringInstall
Download zipReadonly MoonBit code viewer harness inspired by Monaco and CodeMirror.