@@ -13,7 +13,6 @@ slug = "0.1" | |||
serde = "1.0" | |||
serde_derive = "1.0" | |||
errors = { path = "../errors" } | |||
front_matter = { path = "../front_matter" } | |||
utils = { path = "../utils" } | |||
@@ -0,0 +1,100 @@ | |||
#![feature(test)] | |||
extern crate test; | |||
extern crate tera; | |||
extern crate rendering; | |||
extern crate front_matter; | |||
use std::collections::HashMap; | |||
use tera::Tera; | |||
use rendering::{Context, markdown_to_html}; | |||
use front_matter::InsertAnchor; | |||
static CONTENT: &'static str = r#" | |||
# Modus cognitius profanam ne duae virtutis mundi | |||
## Ut vita | |||
Lorem markdownum litora, care ponto nomina, et ut aspicit gelidas sui et | |||
purpureo genuit. Tamen colla venientis [delphina](http://nil-sol.com/ecquis) | |||
Tusci et temptata citaeque curam isto ubi vult vulnere reppulit. | |||
- Seque vidit flendoque de quodam | |||
- Dabit minimos deiecto caputque noctis pluma | |||
- Leti coniunx est Helicen | |||
- Illius pulvereumque Icare inpositos | |||
- Vivunt pereo pluvio tot ramos Olenios gelidis | |||
- Quater teretes natura inde | |||
### A subsection | |||
Protinus dicunt, breve per, et vivacis genus Orphei munere. Me terram [dimittere | |||
casside](http://corpus.org/) pervenit saxo primoque frequentat genuum sorori | |||
praeferre causas Libys. Illud in serpit adsuetam utrimque nunc haberent, | |||
**terrae si** veni! Hectoreis potes sumite [Mavortis retusa](http://tua.org/) | |||
granum captantur potuisse Minervae, frugum. | |||
> Clivo sub inprovisoque nostrum minus fama est, discordia patrem petebat precatur | |||
absumitur, poena per sit. Foramina *tamen cupidine* memor supplex tollentes | |||
dictum unam orbem, Anubis caecae. Viderat formosior tegebat satis, Aethiopasque | |||
sit submisso coniuge tristis ubi! | |||
## Praeceps Corinthus totidem quem crus vultum cape | |||
```rs | |||
#[derive(Debug)] | |||
pub struct Site { | |||
/// The base path of the gutenberg site | |||
pub base_path: PathBuf, | |||
/// The parsed config for the site | |||
pub config: Config, | |||
pub pages: HashMap<PathBuf, Page>, | |||
pub sections: HashMap<PathBuf, Section>, | |||
pub tera: Tera, | |||
live_reload: bool, | |||
output_path: PathBuf, | |||
static_path: PathBuf, | |||
pub tags: Option<Taxonomy>, | |||
pub categories: Option<Taxonomy>, | |||
/// A map of all .md files (section and pages) and their permalink | |||
/// We need that if there are relative links in the content that need to be resolved | |||
pub permalinks: HashMap<String, String>, | |||
} | |||
``` | |||
## More stuff | |||
And a shortcode: | |||
{{ youtube(id="my_youtube_id") }} | |||
### Another subsection | |||
Gotta make the toc do a little bit of work | |||
# A big title | |||
- hello | |||
- world | |||
- ! | |||
```py | |||
if __name__ == "__main__": | |||
gen_site("basic-blog", [""], 250, paginate=True) | |||
``` | |||
"#; | |||
#[bench] | |||
fn bench_markdown_to_html_with_highlighting(b: &mut test::Bencher) { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
b.iter(|| markdown_to_html(CONTENT, &context)); | |||
} | |||
#[bench] | |||
fn bench_markdown_to_html_without_highlighting(b: &mut test::Bencher) { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera_ctx, false, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
b.iter(|| markdown_to_html(CONTENT, &context)); | |||
} |
@@ -262,290 +262,3 @@ pub fn markdown_to_html(content: &str, context: &Context) -> Result<(String, Vec | |||
None => Ok((html.replace("<p></p>", ""), make_table_of_contents(headers))), | |||
} | |||
} | |||
#[cfg(test)] | |||
mod tests { | |||
use std::collections::HashMap; | |||
use tera::Tera; | |||
use front_matter::InsertAnchor; | |||
use templates::GUTENBERG_TERA; | |||
use context::Context; | |||
use super::markdown_to_html; | |||
#[test] | |||
fn can_do_markdown_to_html_simple() { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html("hello", &context).unwrap(); | |||
assert_eq!(res.0, "<p>hello</p>\n"); | |||
} | |||
#[test] | |||
fn doesnt_highlight_code_block_with_highlighting_off() { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let mut context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
context.highlight_code = false; | |||
let res = markdown_to_html("```\n$ gutenberg server\n```", &context).unwrap(); | |||
assert_eq!( | |||
res.0, | |||
"<pre><code>$ gutenberg server\n</code></pre>\n" | |||
); | |||
} | |||
#[test] | |||
fn can_highlight_code_block_no_lang() { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html("```\n$ gutenberg server\n$ ping\n```", &context).unwrap(); | |||
assert_eq!( | |||
res.0, | |||
"<pre style=\"background-color:#2b303b\">\n<span style=\"background-color:#2b303b;color:#c0c5ce;\">$ gutenberg server\n</span><span style=\"background-color:#2b303b;color:#c0c5ce;\">$ ping\n</span></pre>" | |||
); | |||
} | |||
#[test] | |||
fn can_highlight_code_block_with_lang() { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html("```python\nlist.append(1)\n```", &context).unwrap(); | |||
assert_eq!( | |||
res.0, | |||
"<pre style=\"background-color:#2b303b\">\n<span style=\"background-color:#2b303b;color:#c0c5ce;\">list</span><span style=\"background-color:#2b303b;color:#c0c5ce;\">.</span><span style=\"background-color:#2b303b;color:#bf616a;\">append</span><span style=\"background-color:#2b303b;color:#c0c5ce;\">(</span><span style=\"background-color:#2b303b;color:#d08770;\">1</span><span style=\"background-color:#2b303b;color:#c0c5ce;\">)</span><span style=\"background-color:#2b303b;color:#c0c5ce;\">\n</span></pre>" | |||
); | |||
} | |||
#[test] | |||
fn can_higlight_code_block_with_unknown_lang() { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html("```yolo\nlist.append(1)\n```", &context).unwrap(); | |||
// defaults to plain text | |||
assert_eq!( | |||
res.0, | |||
"<pre style=\"background-color:#2b303b\">\n<span style=\"background-color:#2b303b;color:#c0c5ce;\">list.append(1)\n</span></pre>" | |||
); | |||
} | |||
#[test] | |||
fn can_render_shortcode() { | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&GUTENBERG_TERA, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html(r#" | |||
Hello | |||
{{ youtube(id="ub36ffWAqgQ") }} | |||
"#, &context).unwrap(); | |||
assert!(res.0.contains("<p>Hello</p>\n<div >")); | |||
assert!(res.0.contains(r#"<iframe src="https://www.youtube.com/embed/ub36ffWAqgQ""#)); | |||
} | |||
#[test] | |||
fn can_render_several_shortcode_in_row() { | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&GUTENBERG_TERA, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html(r#" | |||
Hello | |||
{{ youtube(id="ub36ffWAqgQ") }} | |||
{{ youtube(id="ub36ffWAqgQ", autoplay=true) }} | |||
{{ vimeo(id="210073083") }} | |||
{{ streamable(id="c0ic") }} | |||
{{ gist(url="https://gist.github.com/Keats/32d26f699dcc13ebd41b") }} | |||
"#, &context).unwrap(); | |||
assert!(res.0.contains("<p>Hello</p>\n<div >")); | |||
assert!(res.0.contains(r#"<iframe src="https://www.youtube.com/embed/ub36ffWAqgQ""#)); | |||
assert!(res.0.contains(r#"<iframe src="https://www.youtube.com/embed/ub36ffWAqgQ?autoplay=1""#)); | |||
assert!(res.0.contains(r#"<iframe src="https://www.streamable.com/e/c0ic""#)); | |||
assert!(res.0.contains(r#"//player.vimeo.com/video/210073083""#)); | |||
} | |||
#[test] | |||
fn doesnt_render_shortcode_in_code_block() { | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&GUTENBERG_TERA, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html(r#"```{{ youtube(id="w7Ft2ymGmfc") }}```"#, &context).unwrap(); | |||
assert_eq!(res.0, "<p><code>{{ youtube(id="w7Ft2ymGmfc") }}</code></p>\n"); | |||
} | |||
#[test] | |||
fn can_render_shortcode_with_body() { | |||
let mut tera = Tera::default(); | |||
tera.extend(&GUTENBERG_TERA).unwrap(); | |||
tera.add_raw_template("shortcodes/quote.html", "<blockquote>{{ body }} - {{ author}}</blockquote>").unwrap(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html(r#" | |||
Hello | |||
{% quote(author="Keats") %} | |||
A quote | |||
{% end %} | |||
"#, &context).unwrap(); | |||
assert_eq!(res.0, "<p>Hello\n</p><blockquote>A quote - Keats</blockquote>"); | |||
} | |||
#[test] | |||
fn errors_rendering_unknown_shortcode() { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html("{{ hello(flash=true) }}", &context); | |||
assert!(res.is_err()); | |||
} | |||
#[test] | |||
fn can_make_valid_relative_link() { | |||
let mut permalinks = HashMap::new(); | |||
permalinks.insert("pages/about.md".to_string(), "https://vincent.is/about".to_string()); | |||
let tera_ctx = Tera::default(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks, InsertAnchor::None); | |||
let res = markdown_to_html( | |||
r#"[rel link](./pages/about.md), [abs link](https://vincent.is/about)"#, | |||
&context | |||
).unwrap(); | |||
assert!( | |||
res.0.contains(r#"<p><a href="https://vincent.is/about">rel link</a>, <a href="https://vincent.is/about">abs link</a></p>"#) | |||
); | |||
} | |||
#[test] | |||
fn can_make_relative_links_with_anchors() { | |||
let mut permalinks = HashMap::new(); | |||
permalinks.insert("pages/about.md".to_string(), "https://vincent.is/about".to_string()); | |||
let tera_ctx = Tera::default(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks, InsertAnchor::None); | |||
let res = markdown_to_html(r#"[rel link](./pages/about.md#cv)"#, &context).unwrap(); | |||
assert!( | |||
res.0.contains(r#"<p><a href="https://vincent.is/about#cv">rel link</a></p>"#) | |||
); | |||
} | |||
#[test] | |||
fn errors_relative_link_inexistant() { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html("[rel link](./pages/about.md)", &context); | |||
assert!(res.is_err()); | |||
} | |||
#[test] | |||
fn can_add_id_to_headers() { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html(r#"# Hello"#, &context).unwrap(); | |||
assert_eq!(res.0, "<h1 id=\"hello\">Hello</h1>\n"); | |||
} | |||
#[test] | |||
fn can_add_id_to_headers_same_slug() { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html("# Hello\n# Hello", &context).unwrap(); | |||
assert_eq!(res.0, "<h1 id=\"hello\">Hello</h1>\n<h1 id=\"hello-1\">Hello</h1>\n"); | |||
} | |||
#[test] | |||
fn can_insert_anchor_left() { | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&GUTENBERG_TERA, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::Left); | |||
let res = markdown_to_html("# Hello", &context).unwrap(); | |||
assert_eq!( | |||
res.0, | |||
"<h1 id=\"hello\"><a class=\"gutenberg-anchor\" href=\"#hello\" aria-label=\"Anchor link for: hello\">π</a>\nHello</h1>\n" | |||
); | |||
} | |||
#[test] | |||
fn can_insert_anchor_right() { | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&GUTENBERG_TERA, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::Right); | |||
let res = markdown_to_html("# Hello", &context).unwrap(); | |||
assert_eq!( | |||
res.0, | |||
"<h1 id=\"hello\">Hello<a class=\"gutenberg-anchor\" href=\"#hello\" aria-label=\"Anchor link for: hello\">π</a>\n</h1>\n" | |||
); | |||
} | |||
// See https://github.com/Keats/gutenberg/issues/42 | |||
#[test] | |||
fn can_insert_anchor_with_exclamation_mark() { | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&GUTENBERG_TERA, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::Left); | |||
let res = markdown_to_html("# Hello!", &context).unwrap(); | |||
assert_eq!( | |||
res.0, | |||
"<h1 id=\"hello\"><a class=\"gutenberg-anchor\" href=\"#hello\" aria-label=\"Anchor link for: hello\">π</a>\nHello!</h1>\n" | |||
); | |||
} | |||
// See https://github.com/Keats/gutenberg/issues/53 | |||
#[test] | |||
fn can_insert_anchor_with_link() { | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&GUTENBERG_TERA, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::Left); | |||
let res = markdown_to_html("## [](#xresources)Xresources", &context).unwrap(); | |||
assert_eq!( | |||
res.0, | |||
"<h2 id=\"xresources\"><a class=\"gutenberg-anchor\" href=\"#xresources\" aria-label=\"Anchor link for: xresources\">π</a>\nXresources</h2>\n" | |||
); | |||
} | |||
#[test] | |||
fn can_insert_anchor_with_other_special_chars() { | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&GUTENBERG_TERA, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::Left); | |||
let res = markdown_to_html("# Hello*_()", &context).unwrap(); | |||
assert_eq!( | |||
res.0, | |||
"<h1 id=\"hello\"><a class=\"gutenberg-anchor\" href=\"#hello\" aria-label=\"Anchor link for: hello\">π</a>\nHello*_()</h1>\n" | |||
); | |||
} | |||
#[test] | |||
fn can_make_toc() { | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new( | |||
&GUTENBERG_TERA, | |||
true, | |||
"base16-ocean-dark".to_string(), | |||
"https://mysite.com/something", | |||
&permalinks_ctx, | |||
InsertAnchor::Left | |||
); | |||
let res = markdown_to_html(r#" | |||
# Header 1 | |||
## Header 2 | |||
## Another Header 2 | |||
### Last one | |||
"#, &context).unwrap(); | |||
let toc = res.1; | |||
assert_eq!(toc.len(), 1); | |||
assert_eq!(toc[0].children.len(), 2); | |||
assert_eq!(toc[0].children[1].children.len(), 1); | |||
} | |||
} |
@@ -0,0 +1,286 @@ | |||
extern crate tera; | |||
extern crate front_matter; | |||
extern crate templates; | |||
extern crate rendering; | |||
use std::collections::HashMap; | |||
use tera::Tera; | |||
use front_matter::InsertAnchor; | |||
use templates::GUTENBERG_TERA; | |||
use rendering::{Context, markdown_to_html}; | |||
#[test] | |||
fn can_do_markdown_to_html_simple() { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html("hello", &context).unwrap(); | |||
assert_eq!(res.0, "<p>hello</p>\n"); | |||
} | |||
#[test] | |||
fn doesnt_highlight_code_block_with_highlighting_off() { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let mut context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
context.highlight_code = false; | |||
let res = markdown_to_html("```\n$ gutenberg server\n```", &context).unwrap(); | |||
assert_eq!( | |||
res.0, | |||
"<pre><code>$ gutenberg server\n</code></pre>\n" | |||
); | |||
} | |||
#[test] | |||
fn can_highlight_code_block_no_lang() { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html("```\n$ gutenberg server\n$ ping\n```", &context).unwrap(); | |||
assert_eq!( | |||
res.0, | |||
"<pre style=\"background-color:#2b303b\">\n<span style=\"background-color:#2b303b;color:#c0c5ce;\">$ gutenberg server\n</span><span style=\"background-color:#2b303b;color:#c0c5ce;\">$ ping\n</span></pre>" | |||
); | |||
} | |||
#[test] | |||
fn can_highlight_code_block_with_lang() { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html("```python\nlist.append(1)\n```", &context).unwrap(); | |||
assert_eq!( | |||
res.0, | |||
"<pre style=\"background-color:#2b303b\">\n<span style=\"background-color:#2b303b;color:#c0c5ce;\">list</span><span style=\"background-color:#2b303b;color:#c0c5ce;\">.</span><span style=\"background-color:#2b303b;color:#bf616a;\">append</span><span style=\"background-color:#2b303b;color:#c0c5ce;\">(</span><span style=\"background-color:#2b303b;color:#d08770;\">1</span><span style=\"background-color:#2b303b;color:#c0c5ce;\">)</span><span style=\"background-color:#2b303b;color:#c0c5ce;\">\n</span></pre>" | |||
); | |||
} | |||
#[test] | |||
fn can_higlight_code_block_with_unknown_lang() { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html("```yolo\nlist.append(1)\n```", &context).unwrap(); | |||
// defaults to plain text | |||
assert_eq!( | |||
res.0, | |||
"<pre style=\"background-color:#2b303b\">\n<span style=\"background-color:#2b303b;color:#c0c5ce;\">list.append(1)\n</span></pre>" | |||
); | |||
} | |||
#[test] | |||
fn can_render_shortcode() { | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&GUTENBERG_TERA, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html(r#" | |||
Hello | |||
{{ youtube(id="ub36ffWAqgQ") }} | |||
"#, &context).unwrap(); | |||
assert!(res.0.contains("<p>Hello</p>\n<div >")); | |||
assert!(res.0.contains(r#"<iframe src="https://www.youtube.com/embed/ub36ffWAqgQ""#)); | |||
} | |||
#[test] | |||
fn can_render_several_shortcode_in_row() { | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&GUTENBERG_TERA, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html(r#" | |||
Hello | |||
{{ youtube(id="ub36ffWAqgQ") }} | |||
{{ youtube(id="ub36ffWAqgQ", autoplay=true) }} | |||
{{ vimeo(id="210073083") }} | |||
{{ streamable(id="c0ic") }} | |||
{{ gist(url="https://gist.github.com/Keats/32d26f699dcc13ebd41b") }} | |||
"#, &context).unwrap(); | |||
assert!(res.0.contains("<p>Hello</p>\n<div >")); | |||
assert!(res.0.contains(r#"<iframe src="https://www.youtube.com/embed/ub36ffWAqgQ""#)); | |||
assert!(res.0.contains(r#"<iframe src="https://www.youtube.com/embed/ub36ffWAqgQ?autoplay=1""#)); | |||
assert!(res.0.contains(r#"<iframe src="https://www.streamable.com/e/c0ic""#)); | |||
assert!(res.0.contains(r#"//player.vimeo.com/video/210073083""#)); | |||
} | |||
#[test] | |||
fn doesnt_render_shortcode_in_code_block() { | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&GUTENBERG_TERA, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html(r#"```{{ youtube(id="w7Ft2ymGmfc") }}```"#, &context).unwrap(); | |||
assert_eq!(res.0, "<p><code>{{ youtube(id="w7Ft2ymGmfc") }}</code></p>\n"); | |||
} | |||
#[test] | |||
fn can_render_shortcode_with_body() { | |||
let mut tera = Tera::default(); | |||
tera.extend(&GUTENBERG_TERA).unwrap(); | |||
tera.add_raw_template("shortcodes/quote.html", "<blockquote>{{ body }} - {{ author}}</blockquote>").unwrap(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html(r#" | |||
Hello | |||
{% quote(author="Keats") %} | |||
A quote | |||
{% end %} | |||
"#, &context).unwrap(); | |||
assert_eq!(res.0, "<p>Hello\n</p><blockquote>A quote - Keats</blockquote>"); | |||
} | |||
#[test] | |||
fn errors_rendering_unknown_shortcode() { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html("{{ hello(flash=true) }}", &context); | |||
assert!(res.is_err()); | |||
} | |||
#[test] | |||
fn can_make_valid_relative_link() { | |||
let mut permalinks = HashMap::new(); | |||
permalinks.insert("pages/about.md".to_string(), "https://vincent.is/about".to_string()); | |||
let tera_ctx = Tera::default(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks, InsertAnchor::None); | |||
let res = markdown_to_html( | |||
r#"[rel link](./pages/about.md), [abs link](https://vincent.is/about)"#, | |||
&context | |||
).unwrap(); | |||
assert!( | |||
res.0.contains(r#"<p><a href="https://vincent.is/about">rel link</a>, <a href="https://vincent.is/about">abs link</a></p>"#) | |||
); | |||
} | |||
#[test] | |||
fn can_make_relative_links_with_anchors() { | |||
let mut permalinks = HashMap::new(); | |||
permalinks.insert("pages/about.md".to_string(), "https://vincent.is/about".to_string()); | |||
let tera_ctx = Tera::default(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks, InsertAnchor::None); | |||
let res = markdown_to_html(r#"[rel link](./pages/about.md#cv)"#, &context).unwrap(); | |||
assert!( | |||
res.0.contains(r#"<p><a href="https://vincent.is/about#cv">rel link</a></p>"#) | |||
); | |||
} | |||
#[test] | |||
fn errors_relative_link_inexistant() { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html("[rel link](./pages/about.md)", &context); | |||
assert!(res.is_err()); | |||
} | |||
#[test] | |||
fn can_add_id_to_headers() { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html(r#"# Hello"#, &context).unwrap(); | |||
assert_eq!(res.0, "<h1 id=\"hello\">Hello</h1>\n"); | |||
} | |||
#[test] | |||
fn can_add_id_to_headers_same_slug() { | |||
let tera_ctx = Tera::default(); | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); | |||
let res = markdown_to_html("# Hello\n# Hello", &context).unwrap(); | |||
assert_eq!(res.0, "<h1 id=\"hello\">Hello</h1>\n<h1 id=\"hello-1\">Hello</h1>\n"); | |||
} | |||
#[test] | |||
fn can_insert_anchor_left() { | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&GUTENBERG_TERA, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::Left); | |||
let res = markdown_to_html("# Hello", &context).unwrap(); | |||
assert_eq!( | |||
res.0, | |||
"<h1 id=\"hello\"><a class=\"gutenberg-anchor\" href=\"#hello\" aria-label=\"Anchor link for: hello\">π</a>\nHello</h1>\n" | |||
); | |||
} | |||
#[test] | |||
fn can_insert_anchor_right() { | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&GUTENBERG_TERA, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::Right); | |||
let res = markdown_to_html("# Hello", &context).unwrap(); | |||
assert_eq!( | |||
res.0, | |||
"<h1 id=\"hello\">Hello<a class=\"gutenberg-anchor\" href=\"#hello\" aria-label=\"Anchor link for: hello\">π</a>\n</h1>\n" | |||
); | |||
} | |||
// See https://github.com/Keats/gutenberg/issues/42 | |||
#[test] | |||
fn can_insert_anchor_with_exclamation_mark() { | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&GUTENBERG_TERA, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::Left); | |||
let res = markdown_to_html("# Hello!", &context).unwrap(); | |||
assert_eq!( | |||
res.0, | |||
"<h1 id=\"hello\"><a class=\"gutenberg-anchor\" href=\"#hello\" aria-label=\"Anchor link for: hello\">π</a>\nHello!</h1>\n" | |||
); | |||
} | |||
// See https://github.com/Keats/gutenberg/issues/53 | |||
#[test] | |||
fn can_insert_anchor_with_link() { | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&GUTENBERG_TERA, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::Left); | |||
let res = markdown_to_html("## [](#xresources)Xresources", &context).unwrap(); | |||
assert_eq!( | |||
res.0, | |||
"<h2 id=\"xresources\"><a class=\"gutenberg-anchor\" href=\"#xresources\" aria-label=\"Anchor link for: xresources\">π</a>\nXresources</h2>\n" | |||
); | |||
} | |||
#[test] | |||
fn can_insert_anchor_with_other_special_chars() { | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new(&GUTENBERG_TERA, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::Left); | |||
let res = markdown_to_html("# Hello*_()", &context).unwrap(); | |||
assert_eq!( | |||
res.0, | |||
"<h1 id=\"hello\"><a class=\"gutenberg-anchor\" href=\"#hello\" aria-label=\"Anchor link for: hello\">π</a>\nHello*_()</h1>\n" | |||
); | |||
} | |||
#[test] | |||
fn can_make_toc() { | |||
let permalinks_ctx = HashMap::new(); | |||
let context = Context::new( | |||
&GUTENBERG_TERA, | |||
true, | |||
"base16-ocean-dark".to_string(), | |||
"https://mysite.com/something", | |||
&permalinks_ctx, | |||
InsertAnchor::Left | |||
); | |||
let res = markdown_to_html(r#" | |||
# Header 1 | |||
## Header 2 | |||
## Another Header 2 | |||
### Last one | |||
"#, &context).unwrap(); | |||
let toc = res.1; | |||
assert_eq!(toc.len(), 1); | |||
assert_eq!(toc[0].children.len(), 2); | |||
assert_eq!(toc[0].children[1].children.len(), 1); | |||
} |