Add escape character handling
parent
6db54b449f
commit
110109c882
@ -0,0 +1,246 @@
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum Block {
|
||||
Section(Section),
|
||||
Paragraph(Paragraph),
|
||||
List(List),
|
||||
Table(Table),
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum Inline {
|
||||
Text(Text),
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Document {
|
||||
elements: Vec<Block>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Section {
|
||||
header: Header,
|
||||
elements: Vec<Block>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Header {
|
||||
pub size: u8,
|
||||
pub line: Inline,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct BlockQuote {
|
||||
paragraph: Paragraph,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Paragraph {
|
||||
pub elements: Vec<Inline>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct List {
|
||||
pub ordered: bool,
|
||||
pub items: Vec<ListItem>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct ListItem {
|
||||
text: Inline,
|
||||
pub(crate) level: u16,
|
||||
pub(crate) children: Vec<ListItem>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Table {
|
||||
header: Row,
|
||||
pub rows: Vec<Row>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Row {
|
||||
pub(crate) cells: Vec<Cell>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Cell {
|
||||
pub(crate) text: Inline,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct CodeBlock {
|
||||
language: String,
|
||||
code: String,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Code {
|
||||
code: String,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Text {
|
||||
pub subtext: Vec<SubText>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum SubText {
|
||||
Plain(PlainText),
|
||||
Code(Code),
|
||||
Bold(BoldText),
|
||||
Italic(ItalicText),
|
||||
Underlined(UnderlinedText),
|
||||
Striked(StrikedText),
|
||||
Monospace(MonospaceText),
|
||||
Url(Url),
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct PlainText {
|
||||
pub(crate) value: String,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct BoldText {
|
||||
pub(crate) value: Box<SubText>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct ItalicText {
|
||||
pub(crate) value: Box<SubText>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct UnderlinedText {
|
||||
pub(crate) value: Box<SubText>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct StrikedText {
|
||||
pub(crate) value: Box<SubText>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct MonospaceText {
|
||||
pub(crate) value: PlainText,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Url {
|
||||
title: String,
|
||||
url: String,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Image {
|
||||
url: Url,
|
||||
}
|
||||
|
||||
// implementations
|
||||
|
||||
impl Document {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
elements: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add_element(&mut self, element: Block) {
|
||||
self.elements.push(element)
|
||||
}
|
||||
}
|
||||
|
||||
impl Section {
|
||||
pub fn new(header: Header) -> Self {
|
||||
Self {
|
||||
header,
|
||||
elements: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add_element(&mut self, element: Block) {
|
||||
self.elements.push(element)
|
||||
}
|
||||
}
|
||||
|
||||
impl Paragraph {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
elements: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add_element(&mut self, element: Inline) {
|
||||
self.elements.push(element)
|
||||
}
|
||||
}
|
||||
|
||||
impl List {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
ordered: false,
|
||||
items: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add_item(&mut self, item: ListItem) {
|
||||
self.items.push(item)
|
||||
}
|
||||
}
|
||||
|
||||
impl ListItem {
|
||||
pub fn new(text: Inline, level: u16) -> Self {
|
||||
Self {
|
||||
text,
|
||||
level,
|
||||
children: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add_child(&mut self, child: ListItem) {
|
||||
self.children.push(child)
|
||||
}
|
||||
}
|
||||
|
||||
impl Text {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
subtext: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add_subtext(&mut self, subtext: SubText) {
|
||||
self.subtext.push(subtext)
|
||||
}
|
||||
}
|
||||
|
||||
impl Table {
|
||||
pub fn new(header: Row) -> Self {
|
||||
Self {
|
||||
header,
|
||||
rows: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add_row(&mut self, row: Row) {
|
||||
self.rows.push(row)
|
||||
}
|
||||
}
|
||||
|
||||
impl Row {
|
||||
pub fn new() -> Self {
|
||||
Self { cells: Vec::new() }
|
||||
}
|
||||
|
||||
pub fn add_cell(&mut self, cell: Cell) {
|
||||
self.cells.push(cell)
|
||||
}
|
||||
}
|
||||
|
||||
impl Url {
|
||||
pub fn new(title: String, url: String) -> Self {
|
||||
Self { title, url }
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Images, URIs
|
@ -1,2 +1,3 @@
|
||||
pub mod elements;
|
||||
pub mod parser;
|
||||
pub mod tokens;
|
||||
pub mod parser;
|
@ -1,241 +1,29 @@
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum Block {
|
||||
Section(Section),
|
||||
Paragraph(Paragraph),
|
||||
List(List),
|
||||
Table(Table),
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum Inline {
|
||||
Text(Text),
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Document {
|
||||
elements: Vec<Block>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Section {
|
||||
header: Header,
|
||||
elements: Vec<Block>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Header {
|
||||
pub size: u8,
|
||||
pub line: Inline,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct BlockQuote {
|
||||
paragraph: Paragraph,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Paragraph {
|
||||
pub elements: Vec<Inline>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct List {
|
||||
pub ordered: bool,
|
||||
pub items: Vec<ListItem>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct ListItem {
|
||||
text: Inline,
|
||||
pub(crate) level: u16,
|
||||
pub(crate) children: Vec<ListItem>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Table {
|
||||
header: Row,
|
||||
pub rows: Vec<Row>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Row {
|
||||
pub(crate) cells: Vec<Cell>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Cell {
|
||||
pub(crate) text: Inline,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct CodeBlock {
|
||||
language: String,
|
||||
code: String,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Code {
|
||||
code: String,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Text {
|
||||
pub subtext: Vec<SubText>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum SubText {
|
||||
Plain(PlainText),
|
||||
Code(Code),
|
||||
Bold(BoldText),
|
||||
Italic(ItalicText),
|
||||
Underlined(UnderlinedText),
|
||||
Striked(StrikedText),
|
||||
Monospace(MonospaceText),
|
||||
Url(Url),
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct PlainText {
|
||||
pub(crate) value: String,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct BoldText {
|
||||
pub(crate) value: Box<SubText>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct ItalicText {
|
||||
pub(crate) value: Box<SubText>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct UnderlinedText {
|
||||
pub(crate) value: Box<SubText>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct StrikedText {
|
||||
pub(crate) value: Box<SubText>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct MonospaceText {
|
||||
pub(crate) value: PlainText,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Url {
|
||||
title: String,
|
||||
url: String,
|
||||
}
|
||||
|
||||
// implementations
|
||||
|
||||
impl Document {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
elements: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add_element(&mut self, element: Block) {
|
||||
self.elements.push(element)
|
||||
}
|
||||
}
|
||||
|
||||
impl Section {
|
||||
pub fn new(header: Header) -> Self {
|
||||
Self {
|
||||
header,
|
||||
elements: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add_element(&mut self, element: Block) {
|
||||
self.elements.push(element)
|
||||
}
|
||||
}
|
||||
|
||||
impl Paragraph {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
elements: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add_element(&mut self, element: Inline) {
|
||||
self.elements.push(element)
|
||||
}
|
||||
}
|
||||
|
||||
impl List {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
ordered: false,
|
||||
items: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add_item(&mut self, item: ListItem) {
|
||||
self.items.push(item)
|
||||
}
|
||||
}
|
||||
|
||||
impl ListItem {
|
||||
pub fn new(text: Inline, level: u16) -> Self {
|
||||
Self {
|
||||
text,
|
||||
level,
|
||||
children: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add_child(&mut self, child: ListItem) {
|
||||
self.children.push(child)
|
||||
}
|
||||
}
|
||||
|
||||
impl Text {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
subtext: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add_subtext(&mut self, subtext: SubText) {
|
||||
self.subtext.push(subtext)
|
||||
}
|
||||
}
|
||||
|
||||
impl Table {
|
||||
pub fn new(header: Row) -> Self {
|
||||
Self {
|
||||
header,
|
||||
rows: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add_row(&mut self, row: Row) {
|
||||
self.rows.push(row)
|
||||
}
|
||||
}
|
||||
|
||||
impl Row {
|
||||
pub fn new() -> Self {
|
||||
Self { cells: Vec::new() }
|
||||
}
|
||||
|
||||
pub fn add_cell(&mut self, cell: Cell) {
|
||||
self.cells.push(cell)
|
||||
}
|
||||
}
|
||||
|
||||
impl Url {
|
||||
pub fn new(title: String, url: String) -> Self {
|
||||
Self { title, url }
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Images, URIs
|
||||
#![allow(unused)]
|
||||
|
||||
pub(crate) const BACKSLASH: char = '\\';
|
||||
pub(crate) const LB: char = '\n';
|
||||
pub(crate) const ASTERISK: char = '*';
|
||||
pub(crate) const UNDERSCR: char = '_';
|
||||
pub(crate) const TILDE: char = '~';
|
||||
pub(crate) const PIPE: char = '|';
|
||||
pub(crate) const BACKTICK: char = '`';
|
||||
pub(crate) const R_BRACKET: char = '[';
|
||||
pub(crate) const L_BRACKET: char = ']';
|
||||
pub(crate) const R_PARENTH: char = '(';
|
||||
pub(crate) const L_PARENTH: char = ')';
|
||||
pub(crate) const MINUS: char = '-';
|
||||
pub(crate) const PLUS: char = '+';
|
||||
pub(crate) const HASH: char = '#';
|
||||
pub(crate) const O: char = 'o';
|
||||
pub(crate) const X: char = 'x';
|
||||
|
||||
// aliases
|
||||
|
||||
pub(crate) const SPECIAL_ESCAPE: char = BACKSLASH;
|
||||
|
||||
// groups
|
||||
|
||||
pub(crate) const BLOCK_SPECIAL_CHARS: [char; 4] = [HASH, MINUS, BACKTICK, PIPE];
|
||||
pub(crate) const INLINE_SPECIAL_CHARS: [char; 6] = [LB, ASTERISK, UNDERSCR, TILDE, PIPE, BACKTICK];
|
||||
|
||||
pub(crate) const LIST_SPECIAL_CHARS: [char; 4] = [MINUS, PLUS, ASTERISK, O];
|
||||
|
Loading…
Reference in New Issue