Handle table cell separator cases

This commit is contained in:
Juno Takano 2026-02-16 01:54:19 -03:00
commit 6b7123b1ad
2 changed files with 57 additions and 42 deletions

View file

@ -41,21 +41,14 @@ pub fn parse(
if buffer.in_header {
log!(VERBOSE, "Adding unterminated header: {lexeme}");
candidate.add_header(&parse_text(&buffer.cell));
buffer.cell.clear();
iterator.next();
iterator.next();
} else if buffer.in_cell {
log!(VERBOSE, "Adding unterminated cell: {lexeme}");
candidate.add_cell(&parse_text(&buffer.cell));
buffer.cell.clear();
iterator.next();
iterator.next();
} else {
log!(VERBOSE, "Adding undelimited cell: {lexeme}");
let descriptor = if buffer.in_cell {
"unterminated"
} else {
"undelimited"
};
log!(VERBOSE, "Adding {descriptor} cell: {lexeme}");
candidate.add_cell(&parse_text(&buffer.cell));
buffer.cell.clear();
iterator.next();
iterator.next();
}
tokens.push(Token::Table(candidate.clone()));
@ -63,42 +56,53 @@ pub fn parse(
state.context.block = Block::None;
*buffer = state::TableBuffer::default();
iterator.next();
} else if lexeme.match_char('\n') {
} else if lexeme.match_char('\n')
|| lexeme.match_char_triple(' ', '!', '\n')
|| lexeme.match_char_triple(' ', '|', '\n')
{
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));
buffer.cell.clear();
iterator.next();
iterator.next();
} else if buffer.in_cell {
log!(VERBOSE, "Adding unterminated cell: {lexeme}");
candidate.add_cell(&parse_text(&buffer.cell));
buffer.cell.clear();
iterator.next();
iterator.next();
} else {
log!(VERBOSE, "Adding undelimited cell: {lexeme}");
let descriptor = if buffer.in_cell {
"unterminated"
} else {
"undelimited"
};
log!(VERBOSE, "Adding {descriptor} cell: {lexeme}");
candidate.add_cell(&parse_text(&buffer.cell));
buffer.cell.clear();
iterator.next();
iterator.next();
}
buffer.cell.clear();
}
if lexeme.match_next_either_char('|', '!') {
iterator.next();
}
buffer.in_header = false;
buffer.in_cell = false;
candidate.add_row(vec![]);
} else if lexeme.match_char_triple(' ', '!', ' ') {
log!(VERBOSE, "Adding header: found spaced ! on {lexeme}");
candidate.add_header(&parse_text(&buffer.cell));
buffer.cell.clear();
buffer.in_header = true;
if !buffer.cell.trim().is_empty() {
log!(VERBOSE, "Adding header: found spaced ! on {lexeme}");
candidate.add_header(&parse_text(&buffer.cell));
buffer.cell.clear();
}
iterator.next();
iterator.next();
} else if lexeme.match_char_triple(' ', '|', ' ') {
log!(VERBOSE, "Adding cell: found spaced | on {lexeme}");
candidate.add_cell(&parse_text(&buffer.cell));
buffer.cell.clear();
buffer.in_cell = true;
if !buffer.cell.trim().is_empty() {
log!(VERBOSE, "Adding cell: found spaced | on {lexeme}");
candidate.add_cell(&parse_text(&buffer.cell));
buffer.cell.clear();
}
iterator.next();
iterator.next();
} else {

View file

@ -24,11 +24,19 @@ impl Table {
last.push(content.trim().to_string());
}
}
pub fn last_row_count(&self) -> usize {
if let Some(last) = self.contents.last() {
last.len()
} else {
0
}
}
}
impl Parseable for Table {
fn probe(lexeme: &Lexeme) -> bool {
lexeme.match_char_triple('\n', '%', '\n')
lexeme.match_char_sequence('%', '\n')
}
fn lex(_lexeme: &Lexeme) -> Table {
@ -37,26 +45,29 @@ impl Parseable for Table {
fn render(&self) -> String {
let mut xml = String::from("\n<table>\n");
let tab = " ";
if !self.headers.is_empty() {
xml.push_str("<tr>\n");
xml.push_str(format!("{tab}<tr>\n").as_str());
for header in &self.headers {
xml.push_str(format!("<th>{header}</th>\n").as_str());
xml.push_str(format!("{tab}{tab}<th>{header}</th>\n").as_str());
}
xml.push_str("\n</tr>\n");
xml.push_str(format!("{tab}</tr>\n").as_str());
}
for row in &self.contents {
if !row.is_empty() {
xml.push_str("<tr>\n");
if !row.is_empty() && row.iter().any(|cell| !cell.is_empty()) {
xml.push_str(format!("{tab}<tr>\n").as_str());
for cell in row {
xml.push_str(format!("<td>{cell}</td>\n").as_str());
xml.push_str(
format!("{tab}{tab}<td>{cell}</td>\n").as_str(),
);
}
xml.push_str("\n</tr>\n");
xml.push_str(format!("{tab}</tr>\n").as_str());
}
}
xml.push_str("\n</table>\n");
xml.push_str("</table>\n");
xml
}