@@ -13,7 +13,6 @@ slug = "0.1" | |||||
serde = "1.0" | serde = "1.0" | ||||
serde_derive = "1.0" | serde_derive = "1.0" | ||||
errors = { path = "../errors" } | errors = { path = "../errors" } | ||||
front_matter = { path = "../front_matter" } | front_matter = { path = "../front_matter" } | ||||
utils = { path = "../utils" } | 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))), | 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); | |||||
} |