add inline State
This commit is contained in:
parent
3c5093f4db
commit
7c53d1a093
2 changed files with 60 additions and 16 deletions
|
@ -21,7 +21,6 @@ pub enum Atom {
|
||||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||||
pub enum Container {
|
pub enum Container {
|
||||||
Span,
|
Span,
|
||||||
Attributes,
|
|
||||||
// typesetting
|
// typesetting
|
||||||
Subscript,
|
Subscript,
|
||||||
Superscript,
|
Superscript,
|
||||||
|
@ -38,6 +37,10 @@ pub enum Container {
|
||||||
RawFormat,
|
RawFormat,
|
||||||
InlineMath,
|
InlineMath,
|
||||||
DisplayMath,
|
DisplayMath,
|
||||||
|
// Links
|
||||||
|
ReferenceLink,
|
||||||
|
InlineLink,
|
||||||
|
AutoLink,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq)]
|
#[derive(Debug, PartialEq, Eq)]
|
||||||
|
@ -46,6 +49,7 @@ pub enum EventKind {
|
||||||
Exit(Container),
|
Exit(Container),
|
||||||
Atom(Atom),
|
Atom(Atom),
|
||||||
Str,
|
Str,
|
||||||
|
Attributes,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq)]
|
#[derive(Debug, PartialEq, Eq)]
|
||||||
|
@ -54,11 +58,36 @@ pub struct Event {
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
/// Current parsing state of elements that are not recursive, i.e. may not contain arbitrary inline
|
||||||
pub enum Dir {
|
/// elements, can only be one of these at a time.
|
||||||
Open,
|
enum State {
|
||||||
Close,
|
None,
|
||||||
Both,
|
/// Within a verbatim element, e.g. '$`xxxxx'
|
||||||
|
Verbatim {
|
||||||
|
kind: Container,
|
||||||
|
opener_len: usize,
|
||||||
|
},
|
||||||
|
/// Potentially within an attribute list, e.g. '{a=b '.
|
||||||
|
Attributes {
|
||||||
|
comment: bool,
|
||||||
|
},
|
||||||
|
/// Potentially within an autolink URL or an inline link URL, e.g. '<https://' or
|
||||||
|
/// '[text](https://'.
|
||||||
|
Url {
|
||||||
|
auto: bool,
|
||||||
|
},
|
||||||
|
/// Potentially within a reference link tag, e.g. '[text][tag '
|
||||||
|
ReferenceLinkTag,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl State {
|
||||||
|
fn verbatim(&self) -> Option<(Container, usize)> {
|
||||||
|
if let Self::Verbatim { kind, opener_len } = self {
|
||||||
|
Some((*kind, *opener_len))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Parser<'s> {
|
pub struct Parser<'s> {
|
||||||
|
@ -68,7 +97,7 @@ pub struct Parser<'s> {
|
||||||
|
|
||||||
lexer: lex::Lexer<'s>,
|
lexer: lex::Lexer<'s>,
|
||||||
|
|
||||||
verbatim: Option<(Container, usize)>,
|
state: State,
|
||||||
last: bool,
|
last: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,7 +110,7 @@ impl<'s> Parser<'s> {
|
||||||
|
|
||||||
lexer: lex::Lexer::new(""),
|
lexer: lex::Lexer::new(""),
|
||||||
|
|
||||||
verbatim: None,
|
state: State::None,
|
||||||
last: false,
|
last: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -142,13 +171,18 @@ impl<'s> Parser<'s> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_verbatim(&mut self, first: &lex::Token) -> Option<Event> {
|
fn parse_verbatim(&mut self, first: &lex::Token) -> Option<Event> {
|
||||||
self.verbatim
|
self.state
|
||||||
|
.verbatim()
|
||||||
.map(|(kind, opener_len)| {
|
.map(|(kind, opener_len)| {
|
||||||
let kind = if matches!(first.kind, lex::Kind::Seq(lex::Sequence::Backtick))
|
let kind = if matches!(first.kind, lex::Kind::Seq(lex::Sequence::Backtick))
|
||||||
&& first.len == opener_len
|
&& first.len == opener_len
|
||||||
{
|
{
|
||||||
self.verbatim = None;
|
self.state = State::None;
|
||||||
|
if matches!(kind, Container::Span) {
|
||||||
|
todo!()
|
||||||
|
} else {
|
||||||
EventKind::Exit(kind)
|
EventKind::Exit(kind)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
EventKind::Str
|
EventKind::Str
|
||||||
};
|
};
|
||||||
|
@ -191,7 +225,7 @@ impl<'s> Parser<'s> {
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
.map(|(kind, opener_len)| {
|
.map(|(kind, opener_len)| {
|
||||||
self.verbatim = Some((kind, opener_len));
|
self.state = State::Verbatim { kind, opener_len };
|
||||||
Event {
|
Event {
|
||||||
kind: EventKind::Enter(kind),
|
kind: EventKind::Enter(kind),
|
||||||
span: self.span,
|
span: self.span,
|
||||||
|
@ -201,6 +235,12 @@ impl<'s> Parser<'s> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_container(&mut self, first: &lex::Token) -> Option<Event> {
|
fn parse_container(&mut self, first: &lex::Token) -> Option<Event> {
|
||||||
|
enum Dir {
|
||||||
|
Open,
|
||||||
|
Close,
|
||||||
|
Both,
|
||||||
|
}
|
||||||
|
|
||||||
match first.kind {
|
match first.kind {
|
||||||
lex::Kind::Sym(Symbol::Asterisk) => Some((Strong, Dir::Both)),
|
lex::Kind::Sym(Symbol::Asterisk) => Some((Strong, Dir::Both)),
|
||||||
lex::Kind::Sym(Symbol::Underscore) => Some((Emphasis, Dir::Both)),
|
lex::Kind::Sym(Symbol::Underscore) => Some((Emphasis, Dir::Both)),
|
||||||
|
@ -294,9 +334,12 @@ impl<'s> Iterator for Parser<'s> {
|
||||||
})
|
})
|
||||||
.or_else(|| {
|
.or_else(|| {
|
||||||
if self.last {
|
if self.last {
|
||||||
self.verbatim.take().map(|(kind, _)| Event {
|
self.state.verbatim().map(|(kind, _)| {
|
||||||
|
self.state = State::None;
|
||||||
|
Event {
|
||||||
kind: EventKind::Exit(kind),
|
kind: EventKind::Exit(kind),
|
||||||
span: self.span,
|
span: self.span,
|
||||||
|
}
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
|
|
|
@ -166,7 +166,7 @@ impl<'s> Container<'s> {
|
||||||
pub enum LinkType {
|
pub enum LinkType {
|
||||||
Inline,
|
Inline,
|
||||||
Reference,
|
Reference,
|
||||||
Autolink,
|
AutoLink,
|
||||||
Email,
|
Email,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -262,6 +262,7 @@ impl<'s> Event<'s> {
|
||||||
inline::Atom::Escape => Atom::Escape,
|
inline::Atom::Escape => Atom::Escape,
|
||||||
}),
|
}),
|
||||||
inline::EventKind::Str => Self::Str(content),
|
inline::EventKind::Str => Self::Str(content),
|
||||||
|
inline::EventKind::Attributes => todo!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue