Add data-lang on code blocks
This commit is contained in:
parent
7540ecd58e
commit
b9b4ef9f04
|
@ -8,7 +8,7 @@
|
||||||
- Allow specifying default language in filenames
|
- Allow specifying default language in filenames
|
||||||
- Render emoji in Markdown content if the `render_emoji` option is enabled
|
- Render emoji in Markdown content if the `render_emoji` option is enabled
|
||||||
- Enable YouTube privacy mode for the YouTube shortcode
|
- Enable YouTube privacy mode for the YouTube shortcode
|
||||||
- Add language as class to the `<code>` block
|
- Add language as class to the `<code>` block and as `data-lang`
|
||||||
- Add bibtex to `load_data`
|
- Add bibtex to `load_data`
|
||||||
- Add a `[markdown]` section to `config.toml` to configure rendering
|
- Add a `[markdown]` section to `config.toml` to configure rendering
|
||||||
- Add `highlight_code` and `highlight_theme` to a `[markdown]` section in `config.toml`
|
- Add `highlight_code` and `highlight_theme` to a `[markdown]` section in `config.toml`
|
||||||
|
|
|
@ -7,10 +7,10 @@ use std::collections::HashMap;
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::iter::FromIterator;
|
use std::iter::FromIterator;
|
||||||
|
use std::path::Path;
|
||||||
use syntect::dumps::*;
|
use syntect::dumps::*;
|
||||||
use syntect::highlighting::ThemeSet;
|
use syntect::highlighting::ThemeSet;
|
||||||
use syntect::parsing::SyntaxSetBuilder;
|
use syntect::parsing::SyntaxSetBuilder;
|
||||||
use std::path::Path;
|
|
||||||
|
|
||||||
fn usage_and_exit() -> ! {
|
fn usage_and_exit() -> ! {
|
||||||
println!("USAGE: cargo run --example generate_sublime synpack source-dir newlines.packdump nonewlines.packdump\n
|
println!("USAGE: cargo run --example generate_sublime synpack source-dir newlines.packdump nonewlines.packdump\n
|
||||||
|
@ -45,7 +45,6 @@ fn main() {
|
||||||
Err(e) => println!("Loading error: {:?}", e),
|
Err(e) => println!("Loading error: {:?}", e),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
let ss = builder.build();
|
let ss = builder.build();
|
||||||
dump_to_file(&ss, packpath_newlines).unwrap();
|
dump_to_file(&ss, packpath_newlines).unwrap();
|
||||||
let mut syntaxes: HashMap<String, HashSet<String>> = HashMap::new();
|
let mut syntaxes: HashMap<String, HashSet<String>> = HashMap::new();
|
||||||
|
|
|
@ -10,7 +10,7 @@ use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
use globset::{Glob, GlobSet, GlobSetBuilder};
|
use globset::{Glob, GlobSet, GlobSetBuilder};
|
||||||
use serde_derive::{Deserialize, Serialize};
|
use serde_derive::{Deserialize, Serialize};
|
||||||
use syntect::parsing::{SyntaxSetBuilder};
|
use syntect::parsing::SyntaxSetBuilder;
|
||||||
use toml::Value as Toml;
|
use toml::Value as Toml;
|
||||||
|
|
||||||
use crate::highlighting::THEME_SET;
|
use crate::highlighting::THEME_SET;
|
||||||
|
|
|
@ -35,7 +35,8 @@ pub fn get_highlighter(language: Option<&str>, config: &Config) -> (HighlightLin
|
||||||
// https://github.com/getzola/zola/issues/1174
|
// https://github.com/getzola/zola/issues/1174
|
||||||
let hacked_lang = if *lang == "js" || *lang == "javascript" { "ts" } else { lang };
|
let hacked_lang = if *lang == "js" || *lang == "javascript" { "ts" } else { lang };
|
||||||
SYNTAX_SET.find_syntax_by_token(hacked_lang)
|
SYNTAX_SET.find_syntax_by_token(hacked_lang)
|
||||||
}.unwrap_or_else(|| SYNTAX_SET.find_syntax_plain_text());
|
}
|
||||||
|
.unwrap_or_else(|| SYNTAX_SET.find_syntax_plain_text());
|
||||||
(HighlightLines::new(syntax, theme), in_extra)
|
(HighlightLines::new(syntax, theme), in_extra)
|
||||||
} else {
|
} else {
|
||||||
(HighlightLines::new(SYNTAX_SET.find_syntax_plain_text(), theme), false)
|
(HighlightLines::new(SYNTAX_SET.find_syntax_plain_text(), theme), false)
|
||||||
|
|
|
@ -218,7 +218,10 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<Render
|
||||||
|
|
||||||
if !context.config.highlight_code() {
|
if !context.config.highlight_code() {
|
||||||
if let Some(lang) = language {
|
if let Some(lang) = language {
|
||||||
let html = format!(r#"<pre><code class="language-{}">"#, lang);
|
let html = format!(
|
||||||
|
r#"<pre><code class="language-{}" data-lang="{}">"#,
|
||||||
|
lang, lang
|
||||||
|
);
|
||||||
return Event::Html(html.into());
|
return Event::Html(html.into());
|
||||||
}
|
}
|
||||||
return Event::Html("<pre><code>".into());
|
return Event::Html("<pre><code>".into());
|
||||||
|
@ -245,9 +248,10 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<Render
|
||||||
let snippet = start_highlighted_html_snippet(theme);
|
let snippet = start_highlighted_html_snippet(theme);
|
||||||
let mut html = snippet.0;
|
let mut html = snippet.0;
|
||||||
if let Some(lang) = language {
|
if let Some(lang) = language {
|
||||||
html.push_str(r#"<code class="language-"#);
|
html.push_str(&format!(
|
||||||
html.push_str(lang);
|
r#"<code class="language-{}" data-lang="{}">"#,
|
||||||
html.push_str(r#"">"#);
|
lang, lang
|
||||||
|
));
|
||||||
} else {
|
} else {
|
||||||
html.push_str("<code>");
|
html.push_str("<code>");
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,7 +53,7 @@ fn can_highlight_code_block_with_lang() {
|
||||||
let res = render_content("```python\nlist.append(1)\n```", &context).unwrap();
|
let res = render_content("```python\nlist.append(1)\n```", &context).unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
res.body,
|
res.body,
|
||||||
"<pre style=\"background-color:#2b303b;\">\n<code class=\"language-python\"><span style=\"color:#c0c5ce;\">list.</span><span style=\"color:#bf616a;\">append</span><span style=\"color:#c0c5ce;\">(</span><span style=\"color:#d08770;\">1</span><span style=\"color:#c0c5ce;\">)\n</span></code></pre>"
|
"<pre style=\"background-color:#2b303b;\">\n<code class=\"language-python\" data-lang=\"python\"><span style=\"color:#c0c5ce;\">list.</span><span style=\"color:#bf616a;\">append</span><span style=\"color:#c0c5ce;\">(</span><span style=\"color:#d08770;\">1</span><span style=\"color:#c0c5ce;\">)\n</span></code></pre>"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ fn can_higlight_code_block_with_unknown_lang() {
|
||||||
// defaults to plain text
|
// defaults to plain text
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
res.body,
|
res.body,
|
||||||
"<pre style=\"background-color:#2b303b;\">\n<code class=\"language-yolo\"><span style=\"color:#c0c5ce;\">list.append(1)\n</span></code></pre>"
|
"<pre style=\"background-color:#2b303b;\">\n<code class=\"language-yolo\" data-lang=\"yolo\"><span style=\"color:#c0c5ce;\">list.append(1)\n</span></code></pre>"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,13 +20,13 @@ use errors::{bail, Error, Result};
|
||||||
use front_matter::InsertAnchor;
|
use front_matter::InsertAnchor;
|
||||||
use library::{find_taxonomies, Library, Page, Paginator, Section, Taxonomy};
|
use library::{find_taxonomies, Library, Page, Paginator, Section, Taxonomy};
|
||||||
use relative_path::RelativePathBuf;
|
use relative_path::RelativePathBuf;
|
||||||
|
use std::time::Instant;
|
||||||
use templates::render_redirect_template;
|
use templates::render_redirect_template;
|
||||||
use utils::fs::{
|
use utils::fs::{
|
||||||
copy_directory, copy_file_if_needed, create_directory, create_file, ensure_directory_exists,
|
copy_directory, copy_file_if_needed, create_directory, create_file, ensure_directory_exists,
|
||||||
};
|
};
|
||||||
use utils::net::get_available_port;
|
use utils::net::get_available_port;
|
||||||
use utils::templates::render_template;
|
use utils::templates::render_template;
|
||||||
use std::time::Instant;
|
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
/// The in-memory rendered map content
|
/// The in-memory rendered map content
|
||||||
|
@ -175,7 +175,8 @@ impl Site {
|
||||||
// which we can only decide to use after we've deserialised the section
|
// which we can only decide to use after we've deserialised the section
|
||||||
// so it's kinda necessecary
|
// so it's kinda necessecary
|
||||||
let mut dir_walker = WalkDir::new(format!("{}/{}", base_path, "content/")).into_iter();
|
let mut dir_walker = WalkDir::new(format!("{}/{}", base_path, "content/")).into_iter();
|
||||||
let mut allowed_index_filenames: Vec<_> = self.config.languages.iter().map(|l| format!("_index.{}.md", l.code)).collect();
|
let mut allowed_index_filenames: Vec<_> =
|
||||||
|
self.config.languages.iter().map(|l| format!("_index.{}.md", l.code)).collect();
|
||||||
allowed_index_filenames.push("_index.md".to_string());
|
allowed_index_filenames.push("_index.md".to_string());
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
|
@ -1115,7 +1116,6 @@ impl Site {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn log_time(start: Instant, message: &str) -> Instant {
|
fn log_time(start: Instant, message: &str) -> Instant {
|
||||||
let do_print = std::env::var("ZOLA_PERF_LOG").is_ok();
|
let do_print = std::env::var("ZOLA_PERF_LOG").is_ok();
|
||||||
let now = Instant::now();
|
let now = Instant::now();
|
||||||
|
@ -1123,4 +1123,4 @@ fn log_time(start: Instant, message: &str) -> Instant {
|
||||||
println!("{} took {}ms", message, now.duration_since(start).as_millis());
|
println!("{} took {}ms", message, now.duration_since(start).as_millis());
|
||||||
}
|
}
|
||||||
now
|
now
|
||||||
}
|
}
|
||||||
|
|
|
@ -666,11 +666,7 @@ fn can_build_with_extra_syntaxes() {
|
||||||
|
|
||||||
assert!(&public.exists());
|
assert!(&public.exists());
|
||||||
assert!(file_exists!(public, "posts/extra-syntax/index.html"));
|
assert!(file_exists!(public, "posts/extra-syntax/index.html"));
|
||||||
assert!(file_contains!(
|
assert!(file_contains!(public, "posts/extra-syntax/index.html", r#"<span style="color:"#));
|
||||||
public,
|
|
||||||
"posts/extra-syntax/index.html",
|
|
||||||
r#"<span style="color:"#
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
Loading…
Reference in a new issue