diff --git a/src/html.rs b/src/html.rs
index f71f2e2..39523f7 100644
--- a/src/html.rs
+++ b/src/html.rs
@@ -162,34 +162,37 @@ impl<'s, I: Iterator- >, W: std::fmt::Write> Writer {
Container::DoubleQuoted => self.out.write_str("”")?,
}
}
- Event::Str(mut s) => match self.raw {
- Raw::None => {
- let mut ent = "";
- while let Some(i) = s.chars().position(|c| {
- if let Some(s) = match c {
- '<' => Some("<"),
- '>' => Some(">"),
- '&' => Some("&"),
- '"' => Some("""),
- _ => None,
- } {
- ent = s;
- true
- } else {
- false
+ Event::Str(s) => {
+ let mut s: &str = s.as_ref();
+ match self.raw {
+ Raw::None => {
+ let mut ent = "";
+ while let Some(i) = s.chars().position(|c| {
+ if let Some(s) = match c {
+ '<' => Some("<"),
+ '>' => Some(">"),
+ '&' => Some("&"),
+ '"' => Some("""),
+ _ => None,
+ } {
+ ent = s;
+ true
+ } else {
+ false
+ }
+ }) {
+ self.out.write_str(&s[..i])?;
+ self.out.write_str(ent)?;
+ s = &s[i + 1..];
}
- }) {
- self.out.write_str(&s[..i])?;
- self.out.write_str(ent)?;
- s = &s[i + 1..];
+ self.out.write_str(s)?;
}
- self.out.write_str(s)?;
+ Raw::Html => {
+ self.out.write_str(s)?;
+ }
+ Raw::Other => {}
}
- Raw::Html => {
- self.out.write_str(s)?;
- }
- Raw::Other => {}
- },
+ }
Event::Atom(a) => match a {
Atom::Ellipsis => self.out.write_str("…")?,
diff --git a/src/lib.rs b/src/lib.rs
index 89cb3d3..7006975 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -8,6 +8,8 @@ mod tree;
use span::Span;
+type CowStr<'s> = std::borrow::Cow<'s, str>;
+
const EOF: char = '\0';
#[derive(Debug, PartialEq, Eq)]
@@ -17,7 +19,7 @@ pub enum Event<'s> {
/// End of a container.
End(Container<'s>),
/// A string object, text only.
- Str(&'s str),
+ Str(CowStr<'s>),
/// An atomic element.
Atom(Atom),
}
@@ -57,9 +59,9 @@ pub enum Container<'s> {
/// An inline divider element.
Span,
/// An inline link with a destination URL.
- Link(&'s str, LinkType),
+ Link(CowStr<'s>, LinkType),
/// An inline image.
- Image(&'s str),
+ Image(CowStr<'s>),
/// An inline verbatim string.
Verbatim,
/// An inline or display math element.
@@ -242,6 +244,9 @@ impl<'s> Event<'s> {
inline::Container::Mark => Container::Mark,
inline::Container::SingleQuoted => Container::SingleQuoted,
inline::Container::DoubleQuoted => Container::DoubleQuoted,
+ inline::Container::InlineLink => {
+ Container::Link(content.into(), LinkType::Inline)
+ }
_ => todo!(),
};
if matches!(inline.kind, inline::EventKind::Enter(_)) {
@@ -259,7 +264,7 @@ impl<'s> Event<'s> {
inline::Atom::Hardbreak => Atom::Hardbreak,
inline::Atom::Escape => Atom::Escape,
}),
- inline::EventKind::Str => Self::Str(content),
+ inline::EventKind::Str => Self::Str(content.into()),
inline::EventKind::Attributes => todo!(),
}
}
@@ -418,10 +423,12 @@ mod test {
use super::Atom::*;
use super::Attributes;
use super::Container::*;
+ use super::CowStr;
use super::Event::*;
+ use super::LinkType;
macro_rules! test_parse {
- ($($st:ident,)? $src:expr $(,$($token:expr),* $(,)?)?) => {
+ ($src:expr $(,$($token:expr),* $(,)?)?) => {
#[allow(unused)]
let actual = super::Parser::new($src).collect::>();
let expected = &[$($($token),*,)?];
@@ -469,23 +476,23 @@ mod test {
test_parse!(
"para",
Start(Paragraph, Attributes::none()),
- Str("para"),
+ Str(CowStr::Borrowed("para")),
End(Paragraph),
);
test_parse!(
"pa ra",
Start(Paragraph, Attributes::none()),
- Str("pa ra"),
+ Str(CowStr::Borrowed("pa ra")),
End(Paragraph),
);
test_parse!(
"para0\n\npara1",
Start(Paragraph, Attributes::none()),
- Str("para0"),
+ Str(CowStr::Borrowed("para0")),
End(Paragraph),
Atom(Blankline),
Start(Paragraph, Attributes::none()),
- Str("para1"),
+ Str(CowStr::Borrowed("para1")),
End(Paragraph),
);
}
@@ -496,7 +503,7 @@ mod test {
"`abc\ndef",
Start(Paragraph, Attributes::none()),
Start(Verbatim, Attributes::none()),
- Str("abc\ndef"),
+ Str(CowStr::Borrowed("abc\ndef")),
End(Verbatim),
End(Paragraph),
);
@@ -508,9 +515,38 @@ mod test {
"``raw\nraw``{=format}",
Start(Paragraph, Attributes::none()),
Start(RawInline { format: "format" }, Attributes::none()),
- Str("raw\nraw"),
+ Str(CowStr::Borrowed("raw\nraw")),
End(RawInline { format: "format" }),
End(Paragraph),
);
}
+
+ #[test]
+ fn link_inline() {
+ test_parse!(
+ "[text](url)",
+ Start(Paragraph, Attributes::none()),
+ Start(
+ Link(CowStr::Borrowed("url"), LinkType::Inline),
+ Attributes::none()
+ ),
+ Str(CowStr::Borrowed("text")),
+ End(Link(CowStr::Borrowed("url"), LinkType::Inline)),
+ End(Paragraph),
+ );
+ test_parse!(
+ concat!(
+ "> [text](url\n",
+ "> url)\n", //
+ ),
+ Start(Paragraph, Attributes::none()),
+ Start(
+ Link(CowStr::Borrowed("urlurl"), LinkType::Inline),
+ Attributes::none()
+ ),
+ Str(CowStr::Borrowed("text")),
+ End(Link(CowStr::Borrowed("urlurl"), LinkType::Inline)),
+ End(Paragraph),
+ );
+ }
}