diff --git a/src/syntax/content/parser/context/table.rs b/src/syntax/content/parser/context/table.rs
index a4c3f8e..357f599 100644
--- a/src/syntax/content/parser/context/table.rs
+++ b/src/syntax/content/parser/context/table.rs
@@ -63,7 +63,6 @@ pub fn parse(
log!(VERBOSE, "Adding row: found newline on {lexeme}");
if !buffer.cell.is_empty() {
-
if buffer.in_header {
log!(VERBOSE, "Adding unterminated header: {lexeme}");
candidate.add_header(&parse_text(&buffer.cell));
@@ -86,7 +85,6 @@ pub fn parse(
buffer.in_header = false;
buffer.in_cell = false;
candidate.add_row(vec![]);
-
} else if lexeme.match_char_triple(' ', '!', ' ') {
buffer.in_header = true;
if !buffer.cell.trim().is_empty() {
@@ -116,3 +114,331 @@ pub fn parse(
}
true
}
+
+#[cfg(test)]
+mod tests {
+ use crate::{syntax::content::parser, graph::Graph};
+
+ fn read(input: &str) -> String {
+ parser::read(input, &Graph::default())
+ }
+
+ fn read_loaded(input: &str) -> String {
+ parser::read(input, &Graph::load())
+ }
+
+ #[test]
+ fn single_row() {
+ assert_eq!(
+ read(concat!("%", "\n", "a | b | c", "\n", "%", "\n")),
+ concat!(
+ "\n",
+ "
", "\n",
+ " ", "\n",
+ " | a | ", "\n",
+ " b | ", "\n",
+ " c | ", "\n",
+ "
", "\n",
+ "
", "\n",
+ )
+ );
+ }
+
+ #[test]
+ fn two_rows() {
+ assert_eq!(
+ read(concat!(
+ "%", "\n",
+ "a | b | c", "\n",
+ "d | e | f", "\n",
+ "%", "\n",
+ )),
+ concat!(
+ "\n",
+ "", "\n",
+ " ", "\n",
+ " | a | ", "\n",
+ " b | ", "\n",
+ " c | ", "\n",
+ "
", "\n",
+ " ", "\n",
+ " | d | ", "\n",
+ " e | ", "\n",
+ " f | ", "\n",
+ "
", "\n",
+ "
", "\n",
+ )
+ );
+ }
+
+ #[test]
+ fn three_rows() {
+ assert_eq!(
+ read(concat!(
+ "%", "\n",
+ "a | b | c", "\n",
+ "d | e | f", "\n",
+ "g | h | i", "\n",
+ "%", "\n",
+ )),
+ concat!(
+ "\n",
+ "", "\n",
+ " ", "\n",
+ " | a | ", "\n",
+ " b | ", "\n",
+ " c | ", "\n",
+ "
", "\n",
+ " ", "\n",
+ " | d | ", "\n",
+ " e | ", "\n",
+ " f | ", "\n",
+ "
", "\n",
+ " ", "\n",
+ " | g | ", "\n",
+ " h | ", "\n",
+ " i | ", "\n",
+ "
", "\n",
+ "
", "\n",
+ )
+ );
+ }
+
+ #[test]
+ fn with_header() {
+ assert_eq!(
+ read(concat!(
+ "%", "\n",
+ "hA ! hB ! hC", "\n",
+ "a | b | c", "\n",
+ "d | e | f", "\n",
+ "%", "\n",
+ )),
+ concat!(
+ "\n",
+ "", "\n",
+ " ", "\n",
+ " | hA | ", "\n",
+ " hB | ", "\n",
+ " hC | ", "\n",
+ "
", "\n",
+ " ", "\n",
+ " | a | ", "\n",
+ " b | ", "\n",
+ " c | ", "\n",
+ "
", "\n",
+ " ", "\n",
+ " | d | ", "\n",
+ " e | ", "\n",
+ " f | ", "\n",
+ "
", "\n",
+ "
", "\n",
+ )
+ );
+ }
+
+ #[test]
+ fn with_anchor() {
+ assert_eq!(
+ read(concat!(
+ "%", "\n",
+ "a | |Node| | c", "\n",
+ "%", "\n",
+ )),
+ concat!(
+ "\n",
+ "", "\n",
+ " ", "\n",
+ " | a | ", "\n",
+ r#" Node | "#, "\n",
+ " c | ", "\n",
+ "
", "\n",
+ "
", "\n",
+ ));
+ }
+
+ #[test]
+ fn with_loaded_anchor() {
+ assert_eq!(
+ read_loaded(concat!(
+ "%", "\n",
+ "a | |Node| | c", "\n",
+ "%", "\n",
+ )),
+ concat!(
+ "\n",
+ "", "\n",
+ " ", "\n",
+ " | a | ", "\n",
+ r#" Node | "#, "\n",
+ " c | ", "\n",
+ "
", "\n",
+ "
", "\n",
+ ));
+ }
+
+ #[test]
+ fn no_leading_delimiters() {
+ assert_eq!(
+ read_loaded(concat!(
+ "%", "\n",
+ "a ! b ! c !", "\n",
+ "d | e | f |", "\n",
+ "g | h | i |", "\n",
+ "%", "\n",
+ )),
+ concat!(
+ "\n",
+ "", "\n",
+ " ", "\n",
+ " | a | ", "\n",
+ " b | ", "\n",
+ " c | ", "\n",
+ "
", "\n",
+ " ", "\n",
+ " | d | ", "\n",
+ " e | ", "\n",
+ " f | ", "\n",
+ "
", "\n",
+ " ", "\n",
+ " | g | ", "\n",
+ " h | ", "\n",
+ " i | ", "\n",
+ "
", "\n",
+ "
", "\n",
+ )
+ );
+ }
+
+ #[test]
+ fn no_trailing_delimiters() {
+ assert_eq!(
+ read_loaded(concat!(
+ "%", "\n",
+ " ! a ! b ! c", "\n",
+ " | d | e | f", "\n",
+ " | g | h | i", "\n",
+ "%", "\n",
+ )),
+ concat!(
+ "\n",
+ "", "\n",
+ " ", "\n",
+ " | a | ", "\n",
+ " b | ", "\n",
+ " c | ", "\n",
+ "
", "\n",
+ " ", "\n",
+ " | d | ", "\n",
+ " e | ", "\n",
+ " f | ", "\n",
+ "
", "\n",
+ " ", "\n",
+ " | g | ", "\n",
+ " h | ", "\n",
+ " i | ", "\n",
+ "
", "\n",
+ "
", "\n",
+ )
+ );
+ }
+
+ #[test]
+ fn with_leading_and_trailing_delimiters() {
+ assert_eq!(
+ read_loaded(concat!(
+ "%", "\n",
+ " ! a ! b ! c !", "\n",
+ " | d | e | f |", "\n",
+ " | g | h | i |", "\n",
+ "%", "\n",
+ )),
+ concat!(
+ "\n",
+ "", "\n",
+ " ", "\n",
+ " | a | ", "\n",
+ " b | ", "\n",
+ " c | ", "\n",
+ "
", "\n",
+ " ", "\n",
+ " | d | ", "\n",
+ " e | ", "\n",
+ " f | ", "\n",
+ "
", "\n",
+ " ", "\n",
+ " | g | ", "\n",
+ " h | ", "\n",
+ " i | ", "\n",
+ "
", "\n",
+ "
", "\n",
+ )
+ );
+ }
+
+ #[test]
+ fn no_flanking_delimiters() {
+ assert_eq!(
+ read_loaded(concat!(
+ "%", "\n",
+ "a ! b ! c", "\n",
+ "d | e | f", "\n",
+ "g | h | i", "\n",
+ "%", "\n",
+ )),
+ concat!(
+ "\n",
+ "", "\n",
+ " ", "\n",
+ " | a | ", "\n",
+ " b | ", "\n",
+ " c | ", "\n",
+ "
", "\n",
+ " ", "\n",
+ " | d | ", "\n",
+ " e | ", "\n",
+ " f | ", "\n",
+ "
", "\n",
+ " ", "\n",
+ " | g | ", "\n",
+ " h | ", "\n",
+ " i | ", "\n",
+ "
", "\n",
+ "
", "\n",
+ )
+ );
+ }
+
+ #[test]
+ fn with_indent() {
+ assert_eq!(
+ read_loaded(concat!(
+ "%", "\n",
+ " ! a ! b ! c !", "\n",
+ " | d | e | f |", "\n",
+ " | g | h | i |", "\n",
+ "%", "\n",
+ )),
+ concat!(
+ "\n",
+ "", "\n",
+ " ", "\n",
+ " | a | ", "\n",
+ " b | ", "\n",
+ " c | ", "\n",
+ "
", "\n",
+ " ", "\n",
+ " | d | ", "\n",
+ " e | ", "\n",
+ " f | ", "\n",
+ "
", "\n",
+ " ", "\n",
+ " | g | ", "\n",
+ " h | ", "\n",
+ " i | ", "\n",
+ "
", "\n",
+ "
", "\n",
+ )
+ );
+ }
+}