///|
fn html_data_range(range : DataByteRange) -> String {
"[" +
range.offset.to_string() +
", " +
(range.offset + range.size).to_string() +
")"
}
///|
/// One bounded metadata row. Keep this wording in sync with appendDataEntry.
fn html_data_entry(entry : DataSegment) -> String {
let out = StringBuilder()
out.write_string(
"" +
entry.index.to_string() +
" ",
)
out.write_string(
"" +
html_escape(data_mode_text(entry.mode)) +
" " +
(match entry.memory_index {
Some(index) => index.to_string()
None => "n/a"
}) +
" ",
)
out.write_string(
"" +
grouped(entry.payload.size) +
" " +
grouped(entry.encoding.size) +
" ",
)
out.write_string(
"" +
html_data_range(entry.encoding) +
"
Payload file range " +
html_data_range(entry.payload) +
"
",
)
out.write_string(
match entry.offset_expression {
Some(range) =>
"Offset expression file range " +
html_data_range(range) +
"; not_evaluated (includes end).
"
None => "Offset expression not_applicable.
"
},
)
out.write_string(" \n")
out.to_string()
}
///|
/// Static first batch is readable without JavaScript or the chart library.
fn html_data_segments_panel(report : DataSegmentsReport) -> String {
let out = StringBuilder()
out.write_string(
"Data segment encodings · Current input
File byte ledger · no baseline entry comparison
\n",
)
out.write_string("")
for
(label, size) in [
("Data complete B", report.section_size),
("Payload B", report.payload_size),
("Entry metadata B", report.entry_metadata_size),
("Section overhead B", report.header_size + report.count_size),
("Entries", report.entries.length()),
] {
out.write_string(
"- " + label + "
- " + grouped(size) + "
",
)
}
out.write_string(
"
Complete data " +
grouped(report.section_size) +
" B = payload " +
grouped(report.payload_size) +
" B + entry metadata " +
grouped(report.entry_metadata_size) +
" B + section overhead " +
grouped(report.header_size + report.count_size) +
" B (header " +
grouped(report.header_size) +
" B + count field " +
grouped(report.count_size) +
" B). Datacount: " +
(match report.datacount {
Some(n) => n.to_string()
None => "absent"
}) +
" (independent section; excluded).
\n",
)
out.write_string(
"" +
html_escape(data_scope()) +
"
",
)
let entries = report.entries.copy()
entries.sort_by(fn(a, b) {
if a.payload.size != b.payload.size {
b.payload.size - a.payload.size
} else {
a.index - b.index
}
})
let shown = if entries.length() < 20 { entries.length() } else { 20 }
out.write_string(
"Showing " +
shown.to_string() +
" of " +
entries.length().to_string() +
" entries. Printing includes only the displayed subset.
",
)
out.write_string(
"Current input only. Payload descending, original index ascending. All ranges are file offsets [start, end). Open a range for initialization details. ",
)
out.write_string(
"Index Mode Memory Payload B Encoded B File range ",
)
for i = 0; i < shown; i = i + 1 {
out.write_string(html_data_entry(entries[i]))
}
if entries.is_empty() {
out.write_string(
"" +
(if report.section is None {
"No data section in this input."
} else {
"Data section is present with zero entries."
}) +
" ",
)
}
out.write_string(
"
\n",
)
out.to_string()
}