Allow links to .md pages in pages contents

This commit is contained in:
Vincent Prouillet 2017-03-30 14:48:07 +09:00
parent ad03aba945
commit 3aa2b89451
3 changed files with 56 additions and 0 deletions

View file

@ -6,3 +6,4 @@
- Add sections to the index page context
- Fix page rendering not working when containing `+++`
- Add shortcodes (see README for details)
- Allow relative links to other content in markdown links

View file

@ -150,6 +150,14 @@ built-in:
A gallery containing lots of themes at https://tmtheme-editor.herokuapp.com/#!/editor/theme/Agola%20Dark.
More themes can be easily added to gutenberg, just make a PR with the wanted theme.
### Internal links
You can have internal links in your markdown that will be replaced with the full URL when rendering.
To do so, use the normal markdown link syntax, start the link with `./` and point to the `.md` file you want
to link to. The path to the file starts from the `content` directory.
For example, linking to a file located at `content/pages/about.md` would be `[my link](./pages/about.md).
### Shortcodes
Gutenberg uses markdown for content but sometimes you want to insert some HTML, for example for a YouTube video.
Rather than copy/pasting the HTML around, Gutenberg supports shortcodes, allowing you to define templates using Tera and call those templates inside markdown.

View file

@ -204,6 +204,22 @@ pub fn markdown_to_html(content: &str, permalinks: &HashMap<String, String>, ter
highlighter = None;
Event::Html(Owned("</pre>".to_owned()))
},
// Need to handle relative links
Event::Start(Tag::Link(ref link, ref title)) => {
if link.starts_with("./") {
let permalink = match permalinks.get(&link.replacen("./", "", 1)) {
Some(p) => p,
None => {
error = Some(format!("Relative link {} not found.", link).into());
return Event::Html(Owned("".to_string()));
}
};
return Event::Start(Tag::Link(Owned(permalink.clone()), title.clone()));
}
return Event::Start(Tag::Link(link.clone(), title.clone()));
},
// need to know when we are in a code block to disable shortcodes in them
Event::Start(Tag::Code) => {
in_code_block = true;
event
@ -212,6 +228,7 @@ pub fn markdown_to_html(content: &str, permalinks: &HashMap<String, String>, ter
in_code_block = false;
event
},
// If we added shortcodes, don't close a paragraph since there's none
Event::End(Tag::Paragraph) => {
if added_shortcode {
added_shortcode = false;
@ -219,6 +236,7 @@ pub fn markdown_to_html(content: &str, permalinks: &HashMap<String, String>, ter
}
event
},
// Ignore softbreaks inside shortcodes
Event::SoftBreak => {
if shortcode_block.is_some() {
return Event::Html(Owned("".to_owned()));
@ -369,4 +387,33 @@ A quote
"#, &HashMap::new(), &tera, &Config::default()).unwrap();
assert_eq!(res, "<p>Hello\n</p><blockquote>A quote - Keats</blockquote>");
}
#[test]
fn test_markdown_to_html_unknown_shortcode() {
let res = markdown_to_html("{{ hello(flash=true) }}", &HashMap::new(), &Tera::default(), &Config::default());
assert!(res.is_err());
}
#[test]
fn test_markdown_to_html_relative_link_exists() {
let mut permalinks = HashMap::new();
permalinks.insert("pages/about.md".to_string(), "https://vincent.is/about".to_string());
let res = markdown_to_html(
r#"[rel link](./pages/about.md), [abs link](https://vincent.is/about)"#,
&permalinks,
&GUTENBERG_TERA,
&Config::default()
).unwrap();
assert!(
res.contains(r#"<p><a href="https://vincent.is/about">rel link</a>, <a href="https://vincent.is/about">abs link</a></p>"#)
);
}
#[test]
fn test_markdown_to_html_relative_link_inexistant() {
let res = markdown_to_html("[rel link](./pages/about.md)", &HashMap::new(), &Tera::default(), &Config::default());
assert!(res.is_err());
}
}