use std::io::BufRead;
use std::iter::Iterator;
-pub struct Config {}
+pub struct Config {
+ pub column_threshold: usize,
+}
const HEADER: &str = r#"<!DOCTYPE html>
<html>
tr.key > th > div { width: 1em; }
tr.key > th > div > div { width: 5em; transform-origin: bottom left; transform: translateX(1em) rotate(-65deg) }
td { border: thin solid gray; }
+ td.leftover { text-align: left; border: none; padding-left: .4em; }
td.yes { border: thin solid gray; background-color: #ddd; }
/* h/t https://stackoverflow.com/questions/5687035/css-bolding-some-text-without-changing-its-containers-size/46452396#46452396 */
.highlight { text-shadow: -0.06ex 0 black, 0.06ex 0 black; }
counts.sort_unstable_by(|(an, acol), (bn, bcol)| bn.cmp(an).then(acol.cmp(bcol)));
counts
}
-fn column_order(rows: &[Row]) -> Vec<String> {
+fn column_order(config: &Config, rows: &[Row]) -> Vec<String> {
column_counts(rows)
.into_iter()
- .map(|(_, col)| col)
+ .filter_map(|(n, col)| (n >= config.column_threshold).then_some(col))
.collect()
}
.collect::<HTML>();
let leftovers = render_all_leftovers(row);
HTML(format!(
- "<tr><th id=\"{row_label}\">{row_label}</th>{cells}<td onmouseover=\"highlight('{row_label}')\" onmouseout=\"clear_highlight('{row_label}')\">{leftovers}</td></tr>\n"
+ "<tr><th id=\"{row_label}\">{row_label}</th>{cells}<td class=\"leftover\" onmouseover=\"highlight('{row_label}')\" onmouseout=\"clear_highlight('{row_label}')\">{leftovers}</td></tr>\n"
))
}
/// * an indented line with no preceding non-indented line
pub fn tablify(config: &Config, input: impl std::io::Read) -> Result<HTML, std::io::Error> {
let rows = read_rows(input).collect::<Result<Vec<_>, _>>()?;
- let columns = column_order(&rows);
+ let columns = column_order(config, &rows);
Ok(HTML(format!(
"{HEADER}{}{}{FOOTER}",
render_column_headers(&columns),
}
),
HTML::from(
- r#"<tr><th id="nope">nope</th><td class="" onmouseover="h2('nope','foo')" onmouseout="ch2('nope','foo')"></td><td onmouseover="highlight('nope')" onmouseout="clear_highlight('nope')">bar</td></tr>
+ r#"<tr><th id="nope">nope</th><td class="" onmouseover="h2('nope','foo')" onmouseout="ch2('nope','foo')"></td><td class="leftover" onmouseover="highlight('nope')" onmouseout="clear_highlight('nope')">bar</td></tr>
"#
)
);