feat(parsers): update table parsing
This commit is contained in:
parent
5d5fc58027
commit
b8265814aa
6 changed files with 232 additions and 98 deletions
|
|
@ -47,7 +47,7 @@ pub use self::{
|
|||
planning::Planning,
|
||||
rule::Rule,
|
||||
snippet::Snippet,
|
||||
table::{Table, TableRow},
|
||||
table::{Table, TableCell, TableRow},
|
||||
target::Target,
|
||||
timestamp::{Datetime, Timestamp},
|
||||
title::Title,
|
||||
|
|
@ -103,33 +103,32 @@ pub enum Element<'a> {
|
|||
Title(Title<'a>),
|
||||
Table(Table<'a>),
|
||||
TableRow(TableRow),
|
||||
TableCell,
|
||||
TableCell(TableCell),
|
||||
}
|
||||
|
||||
impl Element<'_> {
|
||||
pub fn is_container(&self) -> bool {
|
||||
use Element::*;
|
||||
|
||||
match self {
|
||||
SpecialBlock(_)
|
||||
| QuoteBlock(_)
|
||||
| CenterBlock(_)
|
||||
| VerseBlock(_)
|
||||
| Bold
|
||||
| Document { .. }
|
||||
| DynBlock(_)
|
||||
| Headline { .. }
|
||||
| Italic
|
||||
| List(_)
|
||||
| ListItem(_)
|
||||
| Paragraph { .. }
|
||||
| Section
|
||||
| Strike
|
||||
| Underline
|
||||
| Title(_)
|
||||
| Table(_)
|
||||
| TableRow(_)
|
||||
| TableCell => true,
|
||||
Element::SpecialBlock(_)
|
||||
| Element::QuoteBlock(_)
|
||||
| Element::CenterBlock(_)
|
||||
| Element::VerseBlock(_)
|
||||
| Element::Bold
|
||||
| Element::Document { .. }
|
||||
| Element::DynBlock(_)
|
||||
| Element::Headline { .. }
|
||||
| Element::Italic
|
||||
| Element::List(_)
|
||||
| Element::ListItem(_)
|
||||
| Element::Paragraph { .. }
|
||||
| Element::Section
|
||||
| Element::Strike
|
||||
| Element::Underline
|
||||
| Element::Title(_)
|
||||
| Element::Table(_)
|
||||
| Element::TableRow(TableRow::Header)
|
||||
| Element::TableRow(TableRow::Body)
|
||||
| Element::TableCell(_) => true,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
|
@ -187,7 +186,7 @@ impl Element<'_> {
|
|||
Title(e) => Title(e.into_owned()),
|
||||
Table(e) => Table(e.into_owned()),
|
||||
TableRow(e) => TableRow(e),
|
||||
TableCell => TableCell,
|
||||
TableCell(e) => TableCell(e),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ pub enum Table<'a> {
|
|||
/// Numbers of blank lines between last table's line and next non-blank
|
||||
/// line or buffer's end
|
||||
post_blank: usize,
|
||||
has_header: bool,
|
||||
},
|
||||
/// "table.el" type table
|
||||
#[cfg_attr(feature = "ser", serde(rename = "table.el"))]
|
||||
|
|
@ -63,9 +64,14 @@ impl Table<'_> {
|
|||
|
||||
pub fn into_owned(self) -> Table<'static> {
|
||||
match self {
|
||||
Table::Org { tblfm, post_blank } => Table::Org {
|
||||
Table::Org {
|
||||
tblfm,
|
||||
post_blank,
|
||||
has_header,
|
||||
} => Table::Org {
|
||||
tblfm: tblfm.map(Into::into).map(Cow::Owned),
|
||||
post_blank: post_blank,
|
||||
has_header: has_header,
|
||||
},
|
||||
Table::TableEl { value, post_blank } => Table::TableEl {
|
||||
value: value.into_owned().into(),
|
||||
|
|
@ -76,14 +82,55 @@ impl Table<'_> {
|
|||
}
|
||||
|
||||
/// Table Row Elemenet
|
||||
///
|
||||
/// # Syntax
|
||||
///
|
||||
/// ```text
|
||||
/// | 0 | 1 | 2 | <- TableRow::Body
|
||||
/// | 0 | 1 | 2 | <- TableRow::Body
|
||||
/// ```
|
||||
///
|
||||
/// ```text
|
||||
/// |-----+-----+-----| <- ignores
|
||||
/// | 0 | 1 | 2 | <- TableRow::Header
|
||||
/// | 0 | 1 | 2 | <- TableRow::Header
|
||||
/// |-----+-----+-----| <- TableRow::HeaderRule
|
||||
/// | 0 | 1 | 2 | <- TableRow::Body
|
||||
/// |-----+-----+-----| <- TableRow::BodyRule
|
||||
/// | 0 | 1 | 2 | <- TableRow::Body
|
||||
/// |-----+-----+-----| <- TableRow::BodyRule
|
||||
/// |-----+-----+-----| <- TableRow::BodyRule
|
||||
/// | 0 | 1 | 2 | <- TableRow::Body
|
||||
/// |-----+-----+-----| <- ignores
|
||||
/// ```
|
||||
///
|
||||
#[derive(Debug)]
|
||||
#[cfg_attr(test, derive(PartialEq))]
|
||||
#[cfg_attr(feature = "ser", derive(serde::Serialize))]
|
||||
#[cfg_attr(feature = "ser", serde(tag = "table_row_type"))]
|
||||
#[cfg_attr(feature = "ser", serde(rename_all = "kebab-case"))]
|
||||
pub enum TableRow {
|
||||
Standard,
|
||||
Rule,
|
||||
/// This row is part of table header
|
||||
Header,
|
||||
/// This row is part of table body
|
||||
Body,
|
||||
/// This row is between table header and body
|
||||
HeaderRule,
|
||||
/// This row is between table body and next body
|
||||
BodyRule,
|
||||
}
|
||||
|
||||
/// Table Cell Elemenet
|
||||
#[derive(Debug)]
|
||||
#[cfg_attr(test, derive(PartialEq))]
|
||||
#[cfg_attr(feature = "ser", derive(serde::Serialize))]
|
||||
#[cfg_attr(feature = "ser", serde(tag = "table_cell_type"))]
|
||||
#[cfg_attr(feature = "ser", serde(rename_all = "kebab-case"))]
|
||||
pub enum TableCell {
|
||||
/// Header cell
|
||||
Header,
|
||||
/// Body cell, or standard cell
|
||||
Body,
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue