From 903578b04d4c895afd2f9eb2dbbc0632e68d154f Mon Sep 17 00:00:00 2001 From: Noah Hellman Date: Tue, 13 Dec 2022 21:19:16 +0100 Subject: [PATCH] add cowstr --- src/html.rs | 53 +++++++++++++++++++++++++----------------------- src/lib.rs | 58 +++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 75 insertions(+), 36 deletions(-) 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), + ); + } }