-fn render_row(columns: &[String], row: &mut Row) -> HTML {
- let row_label = HTML::escape(row.label.as_ref());
- HTML(format!(
- "<tr><th id=\"{row_label}\">{row_label}</th>{}</tr>\n",
- &columns
- .iter()
- .map(|col| render_cell(col, row))
- .collect::<HTML>()
- ))
+fn render_leftover(notcol: &str, instances: &[Option<String>]) -> HTML {
+ let label = HTML::escape(notcol);
+ let rest = render_instances(instances);
+ if rest == HTML::from("") {
+ HTML(format!("{label}"))
+ } else {
+ HTML(format!("{label}: {rest}"))
+ }
+}
+
+fn render_all_leftovers(row: &Row) -> HTML {
+ let mut order: Vec<_> = row.entries.keys().collect();
+ order.sort_unstable();
+ HTML(
+ order
+ .into_iter()
+ .map(|notcol| render_leftover(notcol, row.entries.get(notcol).expect("Key vanished?!")))
+ .map(|html| html.0) // Waiting for slice_concat_trait to stabilize
+ .collect::<Vec<_>>()
+ .join(", "),
+ )
+}
+
+fn render_row(config: &Config, columns: &[String], rowlike: &mut Rowlike) -> HTML {
+ match rowlike {
+ Rowlike::Spacer => HTML::from("<tr><th class=\"spacer_row\"></th></tr>\n"),
+ Rowlike::Row(row) => {
+ let row_label = HTML::escape(row.label.as_ref());
+ let static_cells = config
+ .static_columns
+ .iter()
+ .map(|col| render_cell(col, row))
+ .collect::<HTML>();
+ let dynamic_cells = columns
+ .iter()
+ .map(|col| render_cell(col, row))
+ .collect::<HTML>();
+ let leftovers = render_all_leftovers(row);
+ HTML(format!(
+ "<tr><th id=\"{row_label}\">{row_label}</th>{static_cells}{dynamic_cells}<td class=\"leftover\" onmouseover=\"highlight('{row_label}')\" onmouseout=\"clear_highlight('{row_label}')\">{leftovers}</td></tr>\n"
+ ))
+ }
+ }