diff --git a/README.md b/README.md index d3a6f44..21567db 100644 --- a/README.md +++ b/README.md @@ -24,11 +24,11 @@ let gemtext = md2gemtext::convert("some markdown")?; - code blocks get turned into code blocks (info strings are discarded) - something happens to HTML, i forget what - paragraphs get empty lines between them, because i think that looks better -- block quotes get turned into quotes +- block quotes get turned into quotes (multi-paragraph contiguous block quotes break though) - lists get turned into lists ("loose lists" probably misbehave, nested lists *definitely* misbehave, numbering is not preserved) -- `` `markdown code spans` `` turn into `` `code spans` `` -- `*markdown italics*` turn into `_italics_` -- `**markdown bold**` turns into `**bold**` +- `` `markdown code spans` `` retain their backticks +- `_italics_` are surrounded by single underscores +- `**bold**` is surrounded by double asterisks - `a [link](a://url) with context` turns into `a link with context` followed by `=> a://url link` - `an ![inline](a://url) image` turns into `an [image: inline] image` followed by `=> a://url [image: inline]` - if a link or image is its own paragraph, it becomes just the gemtext link, to not be redundant diff --git a/src/lib.rs b/src/lib.rs index 7b3eabe..9469141 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,7 +11,6 @@ pub fn convert(markdown_text: &str) -> String { let mut state = State::new(); for event in parser { - println!("{:?}", event); match event { md::Event::Start(md::Tag::Paragraph) => (), md::Event::Start(md::Tag::Heading(level)) => state.start_heading(level), @@ -32,7 +31,7 @@ pub fn convert(markdown_text: &str) -> String { md::Event::End(md::Tag::Paragraph) => state.finish_node(), md::Event::End(md::Tag::Heading(_)) => state.finish_node(), - md::Event::End(md::Tag::BlockQuote) => state.finish_node(), + md::Event::End(md::Tag::BlockQuote) => (), md::Event::End(md::Tag::CodeBlock(_)) => state.finish_node(), md::Event::End(md::Tag::List(_)) => state.finish_list(), md::Event::End(md::Tag::Item) => state.finish_node(), @@ -60,6 +59,7 @@ pub fn convert(markdown_text: &str) -> String { let nodes = state.nodes .into_iter() + .filter(|cluster| !cluster.is_empty()) .map(condense) .collect::>() .join(&gemtext::Node::blank()); @@ -205,5 +205,74 @@ impl State { fn add_rule(&mut self) { self.add_text("-----"); + self.finish_node(); } } + +#[cfg(test)] +#[test] +fn run_tests() { + let markdown_demo = r#" +# h1 +## h2 +### h3 + +--- + +``` +sample + text +``` + +> implying + +1. don't pick up the phone +2. don't let him in +3. don't be his friend + +some `code` and some `` fancy`code `` and *italics* +and __bold__ and ***semi-overlapping* bold *and* italics** + +this [paragraph](http://example.com) has [several links](http://example.org) +and an ![inline image](a://url) in it + +![this one's just an image](https://placekitten.com/200/300) +"#; + let gemtext_demo = r#"# h1 + +## h2 + +### h3 + +----- + +``` +sample + text +``` + +> implying + +* don't pick up the phone +* don't let him in +* don't be his friend + +some `code` and some `fancy`code` and _italics_ and **bold** and **_semi-overlapping_ bold _and_ italics** + +this paragraph has several links and an [image: inline image] in it +=> http://example.com paragraph +=> http://example.org several links +=> a://url [image: inline image] + +=> https://placekitten.com/200/300 [image: this one's just an image] +"#; + assert_eq!(convert(markdown_demo), gemtext_demo); +} + +#[cfg(test)] +#[test] +fn test_list_start() { + let markdown = "> hi\n\n1. uh\n2. ah\n"; + let gemtext = "> hi\n\n* uh\n* ah\n"; + assert_eq!(convert(markdown), gemtext); +}