///|
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( "
", ) out.write_string( "", ) for i = 0; i < shown; i = i + 1 { out.write_string(html_data_entry(entries[i])) } if entries.is_empty() { out.write_string( "", ) } out.write_string( "
Current input only. Payload descending, original index ascending. All ranges are file offsets [start, end). Open a range for initialization details.
IndexModeMemoryPayload BEncoded BFile range
" + (if report.section is None { "No data section in this input." } else { "Data section is present with zero entries." }) + "
\n", ) out.to_string() }