fix(parsers): fix paragraph appendding behave
This commit is contained in:
parent
f235354046
commit
2b155484dd
|
@ -16,7 +16,7 @@ use crate::config::ParseConfig;
|
||||||
use crate::elements::*;
|
use crate::elements::*;
|
||||||
|
|
||||||
pub trait ElementArena<'a> {
|
pub trait ElementArena<'a> {
|
||||||
fn push_element<T: Into<Element<'a>>>(&mut self, element: T, parent: NodeId) -> NodeId;
|
fn append_element<T: Into<Element<'a>>>(&mut self, element: T, parent: NodeId) -> NodeId;
|
||||||
fn insert_before_last_child<T: Into<Element<'a>>>(
|
fn insert_before_last_child<T: Into<Element<'a>>>(
|
||||||
&mut self,
|
&mut self,
|
||||||
element: T,
|
element: T,
|
||||||
|
@ -25,7 +25,7 @@ pub trait ElementArena<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> ElementArena<'a> for Arena<Element<'a>> {
|
impl<'a> ElementArena<'a> for Arena<Element<'a>> {
|
||||||
fn push_element<T: Into<Element<'a>>>(&mut self, element: T, parent: NodeId) -> NodeId {
|
fn append_element<T: Into<Element<'a>>>(&mut self, element: T, parent: NodeId) -> NodeId {
|
||||||
let node = self.new_node(element.into());
|
let node = self.new_node(element.into());
|
||||||
parent.append(node, self);
|
parent.append(node, self);
|
||||||
node
|
node
|
||||||
|
@ -41,7 +41,7 @@ impl<'a> ElementArena<'a> for Arena<Element<'a>> {
|
||||||
child.insert_before(node, self);
|
child.insert_before(node, self);
|
||||||
node
|
node
|
||||||
} else {
|
} else {
|
||||||
self.push_element(element, parent)
|
self.append_element(element, parent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,7 @@ impl<'a, 'b, 'c> OwnedArena<'a, 'b, 'c> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> ElementArena<'a> for OwnedArena<'a, '_, '_> {
|
impl<'a> ElementArena<'a> for OwnedArena<'a, '_, '_> {
|
||||||
fn push_element<T: Into<Element<'a>>>(&mut self, element: T, parent: NodeId) -> NodeId {
|
fn append_element<T: Into<Element<'a>>>(&mut self, element: T, parent: NodeId) -> NodeId {
|
||||||
let node = self.arena.new_node(element.into().into_owned());
|
let node = self.arena.new_node(element.into().into_owned());
|
||||||
parent.append(node, self.arena);
|
parent.append(node, self.arena);
|
||||||
node
|
node
|
||||||
|
@ -77,7 +77,7 @@ impl<'a> ElementArena<'a> for OwnedArena<'a, '_, '_> {
|
||||||
child.insert_before(node, self.arena);
|
child.insert_before(node, self.arena);
|
||||||
node
|
node
|
||||||
} else {
|
} else {
|
||||||
self.push_element(element, parent)
|
self.append_element(element, parent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -152,7 +152,7 @@ pub fn parse_headline_content<'a, T: ElementArena<'a>>(
|
||||||
config: &ParseConfig,
|
config: &ParseConfig,
|
||||||
) {
|
) {
|
||||||
let (tail, (title, content)) = Title::parse(content, config).unwrap();
|
let (tail, (title, content)) = Title::parse(content, config).unwrap();
|
||||||
let node = arena.push_element(title, parent);
|
let node = arena.append_element(title, parent);
|
||||||
containers.push(Container::Inline { content, node });
|
containers.push(Container::Inline { content, node });
|
||||||
parse_section_and_headlines(arena, tail, parent, containers);
|
parse_section_and_headlines(arena, tail, parent, containers);
|
||||||
}
|
}
|
||||||
|
@ -172,12 +172,12 @@ pub fn parse_section_and_headlines<'a, T: ElementArena<'a>>(
|
||||||
for i in memchr_iter(b'\n', content.as_bytes()).chain(once(content.len())) {
|
for i in memchr_iter(b'\n', content.as_bytes()).chain(once(content.len())) {
|
||||||
if let Ok((mut tail, (headline_content, level))) = parse_headline(&content[last_end..]) {
|
if let Ok((mut tail, (headline_content, level))) = parse_headline(&content[last_end..]) {
|
||||||
if last_end != 0 {
|
if last_end != 0 {
|
||||||
let node = arena.push_element(Element::Section, parent);
|
let node = arena.append_element(Element::Section, parent);
|
||||||
let content = &content[0..last_end];
|
let content = &content[0..last_end];
|
||||||
containers.push(Container::Block { content, node });
|
containers.push(Container::Block { content, node });
|
||||||
}
|
}
|
||||||
|
|
||||||
let node = arena.push_element(Element::Headline { level }, parent);
|
let node = arena.append_element(Element::Headline { level }, parent);
|
||||||
containers.push(Container::Headline {
|
containers.push(Container::Headline {
|
||||||
content: headline_content,
|
content: headline_content,
|
||||||
node,
|
node,
|
||||||
|
@ -185,7 +185,7 @@ pub fn parse_section_and_headlines<'a, T: ElementArena<'a>>(
|
||||||
|
|
||||||
while let Ok((new_tail, (content, level))) = parse_headline(tail) {
|
while let Ok((new_tail, (content, level))) = parse_headline(tail) {
|
||||||
debug_assert_ne!(tail, new_tail);
|
debug_assert_ne!(tail, new_tail);
|
||||||
let node = arena.push_element(Element::Headline { level }, parent);
|
let node = arena.append_element(Element::Headline { level }, parent);
|
||||||
containers.push(Container::Headline { content, node });
|
containers.push(Container::Headline { content, node });
|
||||||
tail = new_tail;
|
tail = new_tail;
|
||||||
}
|
}
|
||||||
|
@ -194,7 +194,7 @@ pub fn parse_section_and_headlines<'a, T: ElementArena<'a>>(
|
||||||
last_end = i + 1;
|
last_end = i + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
let node = arena.push_element(Element::Section, parent);
|
let node = arena.append_element(Element::Section, parent);
|
||||||
containers.push(Container::Block { content, node });
|
containers.push(Container::Block { content, node });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,32 +213,34 @@ pub fn parse_blocks<'a, T: ElementArena<'a>>(
|
||||||
let mut text = tail;
|
let mut text = tail;
|
||||||
let mut pos = 0;
|
let mut pos = 0;
|
||||||
|
|
||||||
macro_rules! insert_paragraph {
|
|
||||||
($content:expr) => {
|
|
||||||
let node = arena.insert_before_last_child(Element::Paragraph, parent);
|
|
||||||
containers.push(Container::Inline {
|
|
||||||
content: $content,
|
|
||||||
node,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
while !tail.is_empty() {
|
while !tail.is_empty() {
|
||||||
let i = memchr(b'\n', tail.as_bytes())
|
let i = memchr(b'\n', tail.as_bytes())
|
||||||
.map(|i| i + 1)
|
.map(|i| i + 1)
|
||||||
.unwrap_or_else(|| tail.len());
|
.unwrap_or_else(|| tail.len());
|
||||||
if tail.as_bytes()[0..i].iter().all(u8::is_ascii_whitespace) {
|
if tail.as_bytes()[0..i].iter().all(u8::is_ascii_whitespace) {
|
||||||
debug_assert_ne!(tail, skip_empty_lines(&tail[i..]));
|
let node = arena.append_element(Element::Paragraph, parent);
|
||||||
insert_paragraph!(&text[0..pos].trim_end_matches('\n'));
|
|
||||||
|
containers.push(Container::Inline {
|
||||||
|
content: &text[0..pos].trim_end_matches('\n'),
|
||||||
|
node,
|
||||||
|
});
|
||||||
|
|
||||||
pos = 0;
|
pos = 0;
|
||||||
|
debug_assert_ne!(tail, skip_empty_lines(&tail[i..]));
|
||||||
tail = skip_empty_lines(&tail[i..]);
|
tail = skip_empty_lines(&tail[i..]);
|
||||||
text = tail;
|
text = tail;
|
||||||
} else if let Some(new_tail) = parse_block(tail, arena, parent, containers) {
|
} else if let Some(new_tail) = parse_block(tail, arena, parent, containers) {
|
||||||
debug_assert_ne!(tail, new_tail);
|
|
||||||
if pos != 0 {
|
if pos != 0 {
|
||||||
insert_paragraph!(&text[0..pos].trim_end_matches('\n'));
|
let node = arena.insert_before_last_child(Element::Paragraph, parent);
|
||||||
|
|
||||||
|
containers.push(Container::Inline {
|
||||||
|
content: &text[0..pos].trim_end_matches('\n'),
|
||||||
|
node,
|
||||||
|
});
|
||||||
|
|
||||||
pos = 0;
|
pos = 0;
|
||||||
}
|
}
|
||||||
|
debug_assert_ne!(tail, skip_empty_lines(new_tail));
|
||||||
tail = skip_empty_lines(new_tail);
|
tail = skip_empty_lines(new_tail);
|
||||||
text = tail;
|
text = tail;
|
||||||
} else {
|
} else {
|
||||||
|
@ -249,7 +251,12 @@ pub fn parse_blocks<'a, T: ElementArena<'a>>(
|
||||||
}
|
}
|
||||||
|
|
||||||
if !text.is_empty() {
|
if !text.is_empty() {
|
||||||
insert_paragraph!(&text[0..pos].trim_end_matches('\n'));
|
let node = arena.append_element(Element::Paragraph, parent);
|
||||||
|
|
||||||
|
containers.push(Container::Inline {
|
||||||
|
content: &text[0..pos].trim_end_matches('\n'),
|
||||||
|
node,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -260,12 +267,12 @@ pub fn parse_block<'a, T: ElementArena<'a>>(
|
||||||
containers: &mut Vec<Container<'a>>,
|
containers: &mut Vec<Container<'a>>,
|
||||||
) -> Option<&'a str> {
|
) -> Option<&'a str> {
|
||||||
if let Ok((tail, (fn_def, content))) = FnDef::parse(contents) {
|
if let Ok((tail, (fn_def, content))) = FnDef::parse(contents) {
|
||||||
let node = arena.push_element(fn_def, parent);
|
let node = arena.append_element(fn_def, parent);
|
||||||
containers.push(Container::Block { content, node });
|
containers.push(Container::Block { content, node });
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
} else if let Some((tail, list, content)) = List::parse(contents) {
|
} else if let Some((tail, list, content)) = List::parse(contents) {
|
||||||
let indent = list.indent;
|
let indent = list.indent;
|
||||||
let node = arena.push_element(list, parent);
|
let node = arena.append_element(list, parent);
|
||||||
containers.push(Container::List {
|
containers.push(Container::List {
|
||||||
content,
|
content,
|
||||||
node,
|
node,
|
||||||
|
@ -279,7 +286,7 @@ pub fn parse_block<'a, T: ElementArena<'a>>(
|
||||||
match contents.as_bytes().get(0)? {
|
match contents.as_bytes().get(0)? {
|
||||||
b'C' => {
|
b'C' => {
|
||||||
if let Ok((tail, clock)) = Clock::parse(contents) {
|
if let Ok((tail, clock)) = Clock::parse(contents) {
|
||||||
arena.push_element(clock, parent);
|
arena.append_element(clock, parent);
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -288,17 +295,17 @@ pub fn parse_block<'a, T: ElementArena<'a>>(
|
||||||
}
|
}
|
||||||
b'-' => {
|
b'-' => {
|
||||||
if let Ok((tail, _)) = parse_rule(contents) {
|
if let Ok((tail, _)) = parse_rule(contents) {
|
||||||
arena.push_element(Element::Rule, parent);
|
arena.append_element(Element::Rule, parent);
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b':' => {
|
b':' => {
|
||||||
if let Ok((tail, (drawer, content))) = Drawer::parse(contents) {
|
if let Ok((tail, (drawer, content))) = Drawer::parse(contents) {
|
||||||
let node = arena.push_element(drawer, parent);
|
let node = arena.append_element(drawer, parent);
|
||||||
containers.push(Container::Block { content, node });
|
containers.push(Container::Block { content, node });
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
} else if let Ok((tail, value)) = parse_fixed_width(contents) {
|
} else if let Ok((tail, value)) = parse_fixed_width(contents) {
|
||||||
arena.push_element(
|
arena.append_element(
|
||||||
Element::FixedWidth {
|
Element::FixedWidth {
|
||||||
value: value.into(),
|
value: value.into(),
|
||||||
},
|
},
|
||||||
|
@ -324,19 +331,19 @@ pub fn parse_block<'a, T: ElementArena<'a>>(
|
||||||
);
|
);
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
} else if let Ok((tail, (dyn_block, content))) = DynBlock::parse(contents) {
|
} else if let Ok((tail, (dyn_block, content))) = DynBlock::parse(contents) {
|
||||||
let node = arena.push_element(dyn_block, parent);
|
let node = arena.append_element(dyn_block, parent);
|
||||||
containers.push(Container::Block { content, node });
|
containers.push(Container::Block { content, node });
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
} else if let Ok((tail, (key, optional, value))) = parse_keyword(contents) {
|
} else if let Ok((tail, (key, optional, value))) = parse_keyword(contents) {
|
||||||
if (&*key).eq_ignore_ascii_case("CALL") {
|
if (&*key).eq_ignore_ascii_case("CALL") {
|
||||||
arena.push_element(
|
arena.append_element(
|
||||||
BabelCall {
|
BabelCall {
|
||||||
value: value.into(),
|
value: value.into(),
|
||||||
},
|
},
|
||||||
parent,
|
parent,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
arena.push_element(
|
arena.append_element(
|
||||||
Keyword {
|
Keyword {
|
||||||
key: key.into(),
|
key: key.into(),
|
||||||
optional: optional.map(Into::into),
|
optional: optional.map(Into::into),
|
||||||
|
@ -347,7 +354,7 @@ pub fn parse_block<'a, T: ElementArena<'a>>(
|
||||||
}
|
}
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
} else if let Ok((tail, value)) = parse_comment(contents) {
|
} else if let Ok((tail, value)) = parse_comment(contents) {
|
||||||
arena.push_element(
|
arena.append_element(
|
||||||
Element::Comment {
|
Element::Comment {
|
||||||
value: value.into(),
|
value: value.into(),
|
||||||
},
|
},
|
||||||
|
@ -372,15 +379,15 @@ pub fn match_block<'a, T: ElementArena<'a>>(
|
||||||
) {
|
) {
|
||||||
match &*name.to_uppercase() {
|
match &*name.to_uppercase() {
|
||||||
"CENTER" => {
|
"CENTER" => {
|
||||||
let node = arena.push_element(CenterBlock { parameters: args }, parent);
|
let node = arena.append_element(CenterBlock { parameters: args }, parent);
|
||||||
containers.push(Container::Block { content, node });
|
containers.push(Container::Block { content, node });
|
||||||
}
|
}
|
||||||
"QUOTE" => {
|
"QUOTE" => {
|
||||||
let node = arena.push_element(QuoteBlock { parameters: args }, parent);
|
let node = arena.append_element(QuoteBlock { parameters: args }, parent);
|
||||||
containers.push(Container::Block { content, node });
|
containers.push(Container::Block { content, node });
|
||||||
}
|
}
|
||||||
"COMMENT" => {
|
"COMMENT" => {
|
||||||
arena.push_element(
|
arena.append_element(
|
||||||
CommentBlock {
|
CommentBlock {
|
||||||
data: args,
|
data: args,
|
||||||
contents: content.into(),
|
contents: content.into(),
|
||||||
|
@ -389,7 +396,7 @@ pub fn match_block<'a, T: ElementArena<'a>>(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
"EXAMPLE" => {
|
"EXAMPLE" => {
|
||||||
arena.push_element(
|
arena.append_element(
|
||||||
ExampleBlock {
|
ExampleBlock {
|
||||||
data: args,
|
data: args,
|
||||||
contents: content.into(),
|
contents: content.into(),
|
||||||
|
@ -398,7 +405,7 @@ pub fn match_block<'a, T: ElementArena<'a>>(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
"EXPORT" => {
|
"EXPORT" => {
|
||||||
arena.push_element(
|
arena.append_element(
|
||||||
ExportBlock {
|
ExportBlock {
|
||||||
data: args.unwrap_or_default(),
|
data: args.unwrap_or_default(),
|
||||||
contents: content.into(),
|
contents: content.into(),
|
||||||
|
@ -416,7 +423,7 @@ pub fn match_block<'a, T: ElementArena<'a>>(
|
||||||
None => (Cow::Borrowed(""), Cow::Borrowed("")),
|
None => (Cow::Borrowed(""), Cow::Borrowed("")),
|
||||||
_ => unreachable!("`parse_block_element` returns `Some(Cow::Borrowed)` or `None`"),
|
_ => unreachable!("`parse_block_element` returns `Some(Cow::Borrowed)` or `None`"),
|
||||||
};
|
};
|
||||||
arena.push_element(
|
arena.append_element(
|
||||||
SourceBlock {
|
SourceBlock {
|
||||||
arguments,
|
arguments,
|
||||||
language,
|
language,
|
||||||
|
@ -426,11 +433,11 @@ pub fn match_block<'a, T: ElementArena<'a>>(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
"VERSE" => {
|
"VERSE" => {
|
||||||
let node = arena.push_element(VerseBlock { parameters: args }, parent);
|
let node = arena.append_element(VerseBlock { parameters: args }, parent);
|
||||||
containers.push(Container::Block { content, node });
|
containers.push(Container::Block { content, node });
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
let node = arena.push_element(
|
let node = arena.append_element(
|
||||||
SpecialBlock {
|
SpecialBlock {
|
||||||
parameters: args,
|
parameters: args,
|
||||||
name,
|
name,
|
||||||
|
@ -521,7 +528,7 @@ pub fn parse_inlines<'a, T: ElementArena<'a>>(
|
||||||
}
|
}
|
||||||
|
|
||||||
if !text.is_empty() {
|
if !text.is_empty() {
|
||||||
arena.push_element(Element::Text { value: text.into() }, parent);
|
arena.append_element(Element::Text { value: text.into() }, parent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -539,77 +546,77 @@ pub fn parse_inline<'a, T: ElementArena<'a>>(
|
||||||
match bytes[0] {
|
match bytes[0] {
|
||||||
b'@' => {
|
b'@' => {
|
||||||
if let Ok((tail, snippet)) = Snippet::parse(contents) {
|
if let Ok((tail, snippet)) = Snippet::parse(contents) {
|
||||||
arena.push_element(snippet, parent);
|
arena.append_element(snippet, parent);
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b'{' => {
|
b'{' => {
|
||||||
if let Ok((tail, macros)) = Macros::parse(contents) {
|
if let Ok((tail, macros)) = Macros::parse(contents) {
|
||||||
arena.push_element(macros, parent);
|
arena.append_element(macros, parent);
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b'<' => {
|
b'<' => {
|
||||||
if let Ok((tail, _content)) = parse_radio_target(contents) {
|
if let Ok((tail, _content)) = parse_radio_target(contents) {
|
||||||
arena.push_element(Element::RadioTarget, parent);
|
arena.append_element(Element::RadioTarget, parent);
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
} else if let Ok((tail, target)) = Target::parse(contents) {
|
} else if let Ok((tail, target)) = Target::parse(contents) {
|
||||||
arena.push_element(target, parent);
|
arena.append_element(target, parent);
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
} else if let Ok((tail, timestamp)) = Timestamp::parse_active(contents) {
|
} else if let Ok((tail, timestamp)) = Timestamp::parse_active(contents) {
|
||||||
arena.push_element(timestamp, parent);
|
arena.append_element(timestamp, parent);
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
} else if let Ok((tail, timestamp)) = Timestamp::parse_diary(contents) {
|
} else if let Ok((tail, timestamp)) = Timestamp::parse_diary(contents) {
|
||||||
arena.push_element(timestamp, parent);
|
arena.append_element(timestamp, parent);
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b'[' => {
|
b'[' => {
|
||||||
if let Ok((tail, fn_ref)) = FnRef::parse(contents) {
|
if let Ok((tail, fn_ref)) = FnRef::parse(contents) {
|
||||||
arena.push_element(fn_ref, parent);
|
arena.append_element(fn_ref, parent);
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
} else if let Ok((tail, link)) = Link::parse(contents) {
|
} else if let Ok((tail, link)) = Link::parse(contents) {
|
||||||
arena.push_element(link, parent);
|
arena.append_element(link, parent);
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
} else if let Ok((tail, cookie)) = Cookie::parse(contents) {
|
} else if let Ok((tail, cookie)) = Cookie::parse(contents) {
|
||||||
arena.push_element(cookie, parent);
|
arena.append_element(cookie, parent);
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
} else if let Ok((tail, timestamp)) = Timestamp::parse_inactive(contents) {
|
} else if let Ok((tail, timestamp)) = Timestamp::parse_inactive(contents) {
|
||||||
arena.push_element(timestamp, parent);
|
arena.append_element(timestamp, parent);
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b'*' => {
|
b'*' => {
|
||||||
if let Some((tail, content)) = parse_emphasis(contents, b'*') {
|
if let Some((tail, content)) = parse_emphasis(contents, b'*') {
|
||||||
let node = arena.push_element(Element::Bold, parent);
|
let node = arena.append_element(Element::Bold, parent);
|
||||||
containers.push(Container::Inline { content, node });
|
containers.push(Container::Inline { content, node });
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b'+' => {
|
b'+' => {
|
||||||
if let Some((tail, content)) = parse_emphasis(contents, b'+') {
|
if let Some((tail, content)) = parse_emphasis(contents, b'+') {
|
||||||
let node = arena.push_element(Element::Strike, parent);
|
let node = arena.append_element(Element::Strike, parent);
|
||||||
containers.push(Container::Inline { content, node });
|
containers.push(Container::Inline { content, node });
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b'/' => {
|
b'/' => {
|
||||||
if let Some((tail, content)) = parse_emphasis(contents, b'/') {
|
if let Some((tail, content)) = parse_emphasis(contents, b'/') {
|
||||||
let node = arena.push_element(Element::Italic, parent);
|
let node = arena.append_element(Element::Italic, parent);
|
||||||
containers.push(Container::Inline { content, node });
|
containers.push(Container::Inline { content, node });
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b'_' => {
|
b'_' => {
|
||||||
if let Some((tail, content)) = parse_emphasis(contents, b'_') {
|
if let Some((tail, content)) = parse_emphasis(contents, b'_') {
|
||||||
let node = arena.push_element(Element::Underline, parent);
|
let node = arena.append_element(Element::Underline, parent);
|
||||||
containers.push(Container::Inline { content, node });
|
containers.push(Container::Inline { content, node });
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b'=' => {
|
b'=' => {
|
||||||
if let Some((tail, value)) = parse_emphasis(contents, b'=') {
|
if let Some((tail, value)) = parse_emphasis(contents, b'=') {
|
||||||
arena.push_element(
|
arena.append_element(
|
||||||
Element::Verbatim {
|
Element::Verbatim {
|
||||||
value: value.into(),
|
value: value.into(),
|
||||||
},
|
},
|
||||||
|
@ -620,7 +627,7 @@ pub fn parse_inline<'a, T: ElementArena<'a>>(
|
||||||
}
|
}
|
||||||
b'~' => {
|
b'~' => {
|
||||||
if let Some((tail, value)) = parse_emphasis(contents, b'~') {
|
if let Some((tail, value)) = parse_emphasis(contents, b'~') {
|
||||||
arena.push_element(
|
arena.append_element(
|
||||||
Element::Code {
|
Element::Code {
|
||||||
value: value.into(),
|
value: value.into(),
|
||||||
},
|
},
|
||||||
|
@ -631,13 +638,13 @@ pub fn parse_inline<'a, T: ElementArena<'a>>(
|
||||||
}
|
}
|
||||||
b's' => {
|
b's' => {
|
||||||
if let Ok((tail, inline_src)) = InlineSrc::parse(contents) {
|
if let Ok((tail, inline_src)) = InlineSrc::parse(contents) {
|
||||||
arena.push_element(inline_src, parent);
|
arena.append_element(inline_src, parent);
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b'c' => {
|
b'c' => {
|
||||||
if let Ok((tail, inline_call)) = InlineCall::parse(contents) {
|
if let Ok((tail, inline_call)) = InlineCall::parse(contents) {
|
||||||
arena.push_element(inline_call, parent);
|
arena.append_element(inline_call, parent);
|
||||||
return Some(tail);
|
return Some(tail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -656,7 +663,7 @@ pub fn parse_list_items<'a, T: ElementArena<'a>>(
|
||||||
) {
|
) {
|
||||||
while !contents.is_empty() {
|
while !contents.is_empty() {
|
||||||
let (tail, list_item, content) = ListItem::parse(contents, indent);
|
let (tail, list_item, content) = ListItem::parse(contents, indent);
|
||||||
let node = arena.push_element(list_item, parent);
|
let node = arena.append_element(list_item, parent);
|
||||||
containers.push(Container::Block { content, node });
|
containers.push(Container::Block { content, node });
|
||||||
contents = tail;
|
contents = tail;
|
||||||
}
|
}
|
||||||
|
@ -669,16 +676,16 @@ pub fn parse_table<'a, T: ElementArena<'a>>(
|
||||||
parent: NodeId,
|
parent: NodeId,
|
||||||
) -> Option<&'a str> {
|
) -> Option<&'a str> {
|
||||||
if contents.trim_start().starts_with('|') {
|
if contents.trim_start().starts_with('|') {
|
||||||
let table_node = arena.push_element(Table::Org { tblfm: None }, parent);
|
let table_node = arena.append_element(Table::Org { tblfm: None }, parent);
|
||||||
|
|
||||||
let mut last_end = 0;
|
let mut last_end = 0;
|
||||||
for start in memchr_iter(b'\n', contents.as_bytes()).chain(once(contents.len())) {
|
for start in memchr_iter(b'\n', contents.as_bytes()).chain(once(contents.len())) {
|
||||||
let line = contents[last_end..start].trim();
|
let line = contents[last_end..start].trim();
|
||||||
match TableRow::parse(line) {
|
match TableRow::parse(line) {
|
||||||
Some(TableRow::Standard) => {
|
Some(TableRow::Standard) => {
|
||||||
let row_node = arena.push_element(TableRow::Standard, table_node);
|
let row_node = arena.append_element(TableRow::Standard, table_node);
|
||||||
for cell in line[1..].split_terminator('|') {
|
for cell in line[1..].split_terminator('|') {
|
||||||
let cell_node = arena.push_element(Element::TableCell, row_node);
|
let cell_node = arena.append_element(Element::TableCell, row_node);
|
||||||
containers.push(Container::Inline {
|
containers.push(Container::Inline {
|
||||||
content: cell.trim(),
|
content: cell.trim(),
|
||||||
node: cell_node,
|
node: cell_node,
|
||||||
|
@ -686,7 +693,7 @@ pub fn parse_table<'a, T: ElementArena<'a>>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some(TableRow::Rule) => {
|
Some(TableRow::Rule) => {
|
||||||
arena.push_element(TableRow::Rule, table_node);
|
arena.append_element(TableRow::Rule, table_node);
|
||||||
}
|
}
|
||||||
None => return Some(&contents[last_end..]),
|
None => return Some(&contents[last_end..]),
|
||||||
}
|
}
|
||||||
|
@ -695,7 +702,7 @@ pub fn parse_table<'a, T: ElementArena<'a>>(
|
||||||
|
|
||||||
Some("")
|
Some("")
|
||||||
} else if let Ok((tail, value)) = parse_table_el(contents) {
|
} else if let Ok((tail, value)) = parse_table_el(contents) {
|
||||||
arena.push_element(
|
arena.append_element(
|
||||||
Table::TableEl {
|
Table::TableEl {
|
||||||
value: value.into(),
|
value: value.into(),
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in a new issue