X-Git-Url: http://git.scottworley.com/tablify/blobdiff_plain/de408c29be1f465f08fc0ba4114704d3ef8bdcef..92476edc57b23a42c640f55f3a00b69bbee809b5:/src/lib.rs
diff --git a/src/lib.rs b/src/lib.rs
index 9504c7f..2e9bfcc 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,4 +1,5 @@
use std::collections::{HashMap, HashSet};
+use std::fmt::Write;
use std::io::BufRead;
use std::iter::Iterator;
@@ -17,7 +18,7 @@ const HEADER: &str = "
tr.key > th > div > div { width: 5em; transform-origin: bottom left; transform: translateX(1em) rotate(-65deg) }
td { border: thin solid gray; }
td.numeric { text-align: right; }
- td.yes { border: thin solid gray; background-color: gray; }
+ td.yes { border: thin solid gray; background-color: #ddd; }
td.spacer { border: none; }
/* 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; }
@@ -32,7 +33,8 @@ const HEADER: &str = "
- ";
+
+";
const FOOTER: &str = "
@@ -157,6 +159,7 @@ fn render_instance(entry: &Entry) -> String {
fn render_cell(col: &str, row: &RowInput) -> String {
// TODO: Escape HTML special characters
+ let row_label = &row.label;
let entries: Vec<&Entry> = row.entries.iter().filter(|e| e.col == col).collect();
let class = if entries.is_empty() { "" } else { "yes" };
let all_empty = entries.iter().all(|e| e.instance.is_none());
@@ -170,15 +173,15 @@ fn render_cell(col: &str, row: &RowInput) -> String {
.map(|i| render_instance(i))
.collect::()
};
- format!("{} | ", contents.trim())
+ format!("{} | ", contents.trim())
}
fn render_row(columns: &[String], row: &RowInput) -> String {
// This is O(n^2) & doesn't need to be
// TODO: Escape HTML special characters
+ let row_label = &row.label;
format!(
- "{} | {}
\n",
- row.label,
+ "{row_label} | {}
\n",
&columns
.iter()
.map(|col| render_cell(col, row))
@@ -186,6 +189,16 @@ fn render_row(columns: &[String], row: &RowInput) -> String {
)
}
+fn render_column_headers(columns: &[String]) -> String {
+ // TODO: Escape HTML special characters
+ String::from(" | ")
+ + &columns.iter().fold(String::new(), |mut acc, c| {
+ write!(&mut acc, " | ").unwrap();
+ acc
+ })
+ + "
\n"
+}
+
/// # Errors
///
/// Will return `Err` if
@@ -196,6 +209,7 @@ pub fn tablify(input: impl std::io::Read) -> Result {
let rows = read_rows(input).collect::, _>>()?;
let columns = column_order(&rows);
Ok(String::from(HEADER)
+ + &render_column_headers(&columns)
+ &rows
.into_iter()
.map(|r| render_row(&columns, &r))
@@ -372,7 +386,7 @@ mod tests {
entries: vec![]
}
),
- String::from(" | ")
+ String::from(" | ")
);
assert_eq!(
render_cell(
@@ -382,7 +396,7 @@ mod tests {
entries: vec![Entry::from("bar")]
}
),
- String::from(" | ")
+ String::from(" | ")
);
assert_eq!(
render_cell(
@@ -392,7 +406,7 @@ mod tests {
entries: vec![Entry::from("foo")]
}
),
- String::from(" | ")
+ String::from(" | ")
);
assert_eq!(
render_cell(
@@ -402,7 +416,7 @@ mod tests {
entries: vec![Entry::from("foo"), Entry::from("foo")]
}
),
- String::from("2 | ")
+ String::from("2 | ")
);
assert_eq!(
render_cell(
@@ -412,7 +426,7 @@ mod tests {
entries: vec![Entry::from("foo: 5"), Entry::from("foo: 10")]
}
),
- String::from("5 10 | ")
+ String::from("5 10 | ")
);
assert_eq!(
render_cell(
@@ -422,7 +436,7 @@ mod tests {
entries: vec![Entry::from("foo: 5"), Entry::from("foo")]
}
),
- String::from("5 â | ")
+ String::from("5 â | ")
);
}
}