///|
/// Converts a palette and scene metrics into a stable key-value report.
pub fn palette_report(palette : Palette) -> String {
let builder = StringBuilder()
builder.write_string("palette=")
builder.write_string(palette.name)
builder.write_string("\ncolors=")
builder.write_string(palette.colors.length().to_string())
builder.write_string("\n")
for i in 0.. String {
"elements=\{metrics.element_count}\noccupied_area=\{metrics.occupied_area}\npath_length=\{metrics.path_length}\ndensity=\{metrics.density}\nbounds=\{metrics.bounds.x},\{metrics.bounds.y},\{metrics.bounds.width},\{metrics.bounds.height}\n"
}
///|
pub fn benchmark_csv(results : Array[BenchmarkResult]) -> String {
let builder = StringBuilder()
builder.write_string("name,iterations,output_size,checksum\n")
for result in results {
builder.write_string(
"\{result.name},\{result.iterations},\{result.output_size},\{result.checksum}\n",
)
}
builder.to_string()
}
///|
pub fn point_list_csv(points : Array[Vec2]) -> String {
let builder = StringBuilder()
builder.write_string("x,y\n")
for point in points {
builder.write_string("\{point.x},\{point.y}\n")
}
builder.to_string()
}
///|
pub fn rect_list_csv(rectangles : Array[Rect]) -> String {
let builder = StringBuilder()
builder.write_string("x,y,width,height\n")
for rect in rectangles {
builder.write_string("\{rect.x},\{rect.y},\{rect.width},\{rect.height}\n")
}
builder.to_string()
}
///|
pub fn svg_data_uri(svg : String) -> String {
let encoded = svg
.replace(old="#", new="%23")
.replace(old="<", new="%3C")
.replace(old=">", new="%3E")
.replace(old="\n", new="%0A")
"data:image/svg+xml," + encoded
}
///|
pub fn html_preview(document : SvgDocument, title : String) -> String {
"\{escape_svg(title)}\{document.to_svg_string()}"
}