jotdown/src/inline.rs

239 lines
6.9 KiB
Rust
Raw Normal View History

2022-11-21 13:44:59 -05:00
use crate::lex;
2022-11-16 16:11:55 -05:00
2022-11-21 13:44:59 -05:00
use lex::Delimiter;
use lex::Symbol;
2022-11-16 16:11:55 -05:00
use Atom::*;
use Container::*;
#[derive(Debug, Clone, PartialEq, Eq)]
2022-11-21 13:44:59 -05:00
pub enum Atom {
2022-11-16 16:11:55 -05:00
Str,
Softbreak,
Hardbreak,
Escape,
2022-11-21 13:44:59 -05:00
Nbsp,
OpenMarker, // ??
Ellipses,
2022-11-20 13:13:48 -05:00
ImageMarker, // ??
2022-11-21 13:44:59 -05:00
EmDash,
EnDash,
FootnoteReference,
Link,
ReferenceLink,
Emoji,
RawFormat,
// math
DisplayMath,
InlineMath,
Verbatim,
2022-11-16 16:11:55 -05:00
}
2022-11-20 13:13:48 -05:00
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
2022-11-16 16:11:55 -05:00
pub enum Container {
// attributes
Attributes,
Span,
// typesetting
Subscript,
Superscript,
Insert,
Delete,
2022-11-21 13:44:59 -05:00
Emphasis,
2022-11-16 16:11:55 -05:00
Strong,
Mark,
// smart quoting
SingleQuoted,
DoubleQuoted,
// URLs
2022-11-21 13:44:59 -05:00
AutoUrl,
2022-11-16 16:11:55 -05:00
Url,
ImageText,
LinkText,
Reference,
Destination,
}
2022-11-20 13:13:48 -05:00
#[derive(Debug)]
2022-11-21 13:44:59 -05:00
pub enum Event {
Start(Container),
2022-11-20 13:13:48 -05:00
End(Container),
2022-11-21 13:44:59 -05:00
Atom(Atom),
2022-11-20 13:13:48 -05:00
}
2022-11-21 13:44:59 -05:00
/*
2022-11-20 13:13:48 -05:00
#[derive(Debug)]
pub enum OpenerState {
Unclosed,
Closed,
Discarded,
}
2022-11-21 13:44:59 -05:00
*/
2022-11-20 13:13:48 -05:00
#[derive(Debug)]
2022-11-21 13:44:59 -05:00
pub enum Dir {
Open,
Close,
2022-11-20 13:13:48 -05:00
Both,
}
2022-11-16 16:11:55 -05:00
2022-11-21 13:56:11 -05:00
pub struct Parser {
2022-11-21 13:44:59 -05:00
openers: Vec<Container>,
2022-11-21 13:56:11 -05:00
events: Vec<Event>,
2022-11-16 16:11:55 -05:00
//tree: tree::Builder<Container, Atom>,
}
2022-11-21 13:56:11 -05:00
impl Parser {
pub fn new() -> Self {
2022-11-16 16:11:55 -05:00
Self {
openers: Vec::new(),
2022-11-21 13:56:11 -05:00
events: Vec::new(),
2022-11-20 13:13:48 -05:00
}
}
2022-11-21 13:56:11 -05:00
/*
pub fn parse(mut self, src: &str) -> impl Iterator<Event> {
todo!()
}
*/
}
struct Parse<'s> {
src: &'s str,
lexer: lex::Lexer<'s>,
events: &'s mut Vec<Event>,
}
impl<'s> Parse<'s> {
fn new(src: &'s str, events: &'s mut Vec<Event>) -> Self {
todo!()
}
/*
fn parse(mut self, src: &str, evs: &mut Vec<Event>) {
let mut chars = src.chars();
while let Some(t) = chars.next() {
2022-11-21 13:44:59 -05:00
{
let verbatim_opt = match t.kind {
lex::Kind::Seq(lex::Sequence::Dollar) => {
let math_opt = (t.len <= 2)
.then(|| {
if let Some(lex::Token {
kind: lex::Kind::Seq(lex::Sequence::Backtick),
len,
2022-11-21 13:56:11 -05:00
}) = self.chars.clone().next()
2022-11-20 13:13:48 -05:00
{
2022-11-21 13:44:59 -05:00
Some((DisplayMath, *len))
2022-11-20 13:13:48 -05:00
} else {
None
}
})
2022-11-21 13:44:59 -05:00
.flatten();
if math_opt.is_some() {
2022-11-21 13:56:11 -05:00
chars.next(); // backticks
2022-11-21 13:44:59 -05:00
}
math_opt
}
lex::Kind::Seq(lex::Sequence::Backtick) => Some((Verbatim, t.len)),
_ => None,
};
if let Some((atom, opener_len)) = verbatim_opt {
2022-11-21 13:56:11 -05:00
for tok in chars {
2022-11-21 13:44:59 -05:00
if let lex::Kind::Seq(lex::Sequence::Backtick) = tok.kind {
if tok.len >= opener_len {
break;
}
}
}
evs.push(Event::Atom(atom));
return;
}
}
2022-11-20 13:13:48 -05:00
2022-11-21 13:44:59 -05:00
{
let container_opt = match t.kind {
lex::Kind::Sym(Symbol::Asterisk) => Some((Strong, Dir::Both)),
lex::Kind::Sym(Symbol::Underscore) => Some((Emphasis, Dir::Both)),
lex::Kind::Sym(Symbol::Caret) => Some((Superscript, Dir::Both)),
lex::Kind::Sym(Symbol::Tilde) => Some((Subscript, Dir::Both)),
lex::Kind::Sym(Symbol::Quote1) => Some((SingleQuoted, Dir::Both)),
lex::Kind::Sym(Symbol::Quote2) => Some((DoubleQuoted, Dir::Both)),
lex::Kind::Open(Delimiter::Bracket) => Some((LinkText, Dir::Open)),
lex::Kind::Open(Delimiter::BraceAsterisk) => Some((Strong, Dir::Open)),
lex::Kind::Open(Delimiter::BraceCaret) => Some((Superscript, Dir::Open)),
lex::Kind::Open(Delimiter::BraceEqual) => Some((Mark, Dir::Open)),
lex::Kind::Open(Delimiter::BraceHyphen) => Some((Delete, Dir::Open)),
lex::Kind::Open(Delimiter::BracePlus) => Some((Insert, Dir::Open)),
lex::Kind::Open(Delimiter::BraceTilde) => Some((Subscript, Dir::Open)),
lex::Kind::Open(Delimiter::BraceUnderscore) => Some((Emphasis, Dir::Open)),
lex::Kind::Close(Delimiter::Bracket) => Some((LinkText, Dir::Close)),
lex::Kind::Close(Delimiter::BraceAsterisk) => Some((Strong, Dir::Close)),
lex::Kind::Close(Delimiter::BraceCaret) => Some((Superscript, Dir::Close)),
lex::Kind::Close(Delimiter::BraceEqual) => Some((Mark, Dir::Close)),
lex::Kind::Close(Delimiter::BraceHyphen) => Some((Delete, Dir::Close)),
lex::Kind::Close(Delimiter::BracePlus) => Some((Insert, Dir::Close)),
lex::Kind::Close(Delimiter::BraceTilde) => Some((Subscript, Dir::Close)),
lex::Kind::Close(Delimiter::BraceUnderscore) => Some((Emphasis, Dir::Close)),
_ => None,
};
if let Some((cont, ty)) = container_opt {
if matches!(ty, Dir::Close | Dir::Both) && self.openers.contains(&cont) {
loop {
let c = self.openers.pop().unwrap();
evs.push(Event::End(c));
if c == cont {
break;
}
}
return;
} else if matches!(ty, Dir::Open | Dir::Both) {
self.openers.push(cont);
evs.push(Event::Start(cont));
}
return;
}
}
{
if let lex::Kind::Open(Delimiter::Brace) = t.kind {
todo!(); // check for attr
}
}
if let Some(Event::Atom(Str)) = evs.last() {
} else {
evs.push(Event::Atom(Str));
}
2022-11-20 13:13:48 -05:00
}
2022-11-16 16:11:55 -05:00
}
2022-11-21 13:56:11 -05:00
*/
2022-11-16 16:11:55 -05:00
}
2022-11-20 13:13:48 -05:00
/*
impl<'s> Iterator for Parser<'s> {
type Item = (Event<'s>, Span);
fn next(&mut self) -> Option<Self::Item> {
self.chars.next().map(|c| {
match c {
'*' => todo!(),
'_' => todo!(),
'^' => todo!(),
'~' => todo!(),
'\'' => todo!(),
'"' => todo!(),
'$' => todo!(),
'<' => todo!(),
'{' => todo!(),
'[' => todo!(),
_ =>
}
})
}
}
*/
2022-11-21 13:56:11 -05:00
mod test {}