diff --git a/src/lib.rs b/src/lib.rs index f2d0516..c438b4e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -27,7 +27,7 @@ pub fn convert(markdown_text: &str) -> String { md::Event::Start(md::Tag::Table(_)) => state.start_table_building(), md::Event::Start(md::Tag::TableHead) => state.add_table_row(), md::Event::Start(md::Tag::TableRow) => state.add_table_row(), - md::Event::Start(md::Tag::TableCell) => (), + md::Event::Start(md::Tag::TableCell) => state.add_table_cell(), md::Event::Start(md::Tag::Emphasis) => state.toggle_emphasis(), md::Event::Start(md::Tag::Strong) => state.toggle_strong(), md::Event::Start(md::Tag::Strikethrough) => unimplemented!("strikethrough disabled"), @@ -150,12 +150,20 @@ impl State { self.table.push(vec![]); } + fn add_table_cell(&mut self) { + if let Some(last) = self.table.last_mut() { + last.push(String::new()); + } + } + fn start_block_quote(&mut self) { self.pending_node_type = NodeType::Quote; } fn start_code_block(&mut self) { - self.pending_node_type = NodeType::Preformatted; + if !self.building_table { + self.pending_node_type = NodeType::Preformatted; + } } fn start_list_item(&mut self) { @@ -163,11 +171,15 @@ impl State { } fn toggle_emphasis(&mut self) { - self.add_text("_"); + if !self.building_table { + self.add_text("_"); + } } fn toggle_strong(&mut self) { - self.add_text("**"); + if !self.building_table { + self.add_text("**"); + } } fn start_link(&mut self) { @@ -191,7 +203,7 @@ impl State { self.building_table = false; self.table = vec![]; - self.finish_node(); + self.pending_node_type = NodeType::Preformatted; self.pending_node_content += &table.to_string(); self.finish_node(); } @@ -245,7 +257,9 @@ impl State { fn add_text(&mut self, text: &str) { if self.building_table { if let Some(last_row) = self.table.last_mut() { - last_row.push(text.to_string()); + if let Some(last_cell) = last_row.last_mut() { + last_cell.push_str(&text.split("
").collect::>().join("\n")); + } } } else { for link_text in &mut self.link_text_stack { @@ -256,9 +270,23 @@ impl State { } fn add_inline_code(&mut self, code: &str) { - self.pending_node_content += "`"; - self.pending_node_content += code; - self.pending_node_content += "`"; + if self.building_table { + if let Some(last_row) = self.table.last_mut() { + if let Some(last_cell) = last_row.last_mut() { + last_cell.push_str( + &code + .replace("\\_", "_") + .split("
") + .collect::>() + .join("\n"), + ); + } + } + } else { + self.pending_node_content += "`"; + self.pending_node_content += code; + self.pending_node_content += "`"; + } } fn add_rule(&mut self) {