Implemented emoji aliases support in markdown files (#1194)
* Implemented emoji aliases support in markdown files * Added emoji aliases rendering unit tests * Added bench for emoji
This commit is contained in:
parent
a26422d401
commit
b1091bbb45
11
Cargo.lock
generated
11
Cargo.lock
generated
|
@ -761,6 +761,16 @@ dependencies = [
|
|||
"wasi 0.9.0+wasi-snapshot-preview1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gh-emoji"
|
||||
version = "1.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a17a050b7eb420553344e1cf1db648e8b584c79e98b74e6e6d119eeedd9ddcbc"
|
||||
dependencies = [
|
||||
"phf",
|
||||
"regex",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gif"
|
||||
version = "0.11.1"
|
||||
|
@ -1975,6 +1985,7 @@ dependencies = [
|
|||
"config",
|
||||
"errors",
|
||||
"front_matter",
|
||||
"gh-emoji",
|
||||
"lazy_static",
|
||||
"link_checker",
|
||||
"pest",
|
||||
|
|
|
@ -106,6 +106,9 @@ pub struct Config {
|
|||
/// The search config, telling what to include in the search index
|
||||
pub search: search::Search,
|
||||
|
||||
/// Whether to render emoji aliases (e.g.: :smile: => 😄) in the markdown files
|
||||
pub emoji_rendering: bool,
|
||||
|
||||
/// All user params set in [extra] in the config
|
||||
pub extra: HashMap<String, Toml>,
|
||||
}
|
||||
|
@ -337,6 +340,7 @@ impl Default for Config {
|
|||
slugify: slugify::Slugify::default(),
|
||||
search: search::Search::default(),
|
||||
extra: HashMap::new(),
|
||||
emoji_rendering: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@ pest = "2"
|
|||
pest_derive = "2"
|
||||
regex = "1"
|
||||
lazy_static = "1"
|
||||
gh-emoji = "1.0"
|
||||
|
||||
errors = { path = "../errors" }
|
||||
front_matter = { path = "../front_matter" }
|
||||
|
|
|
@ -17,12 +17,12 @@ 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
|
||||
- :one: Seque vidit flendoque de quodam
|
||||
- :two: Dabit minimos deiecto caputque noctis pluma
|
||||
- :three: Leti coniunx est Helicen
|
||||
- :four: Illius pulvereumque Icare inpositos
|
||||
- :five: Vivunt pereo pluvio tot ramos Olenios gelidis
|
||||
- :six: Quater teretes natura inde
|
||||
|
||||
### A subsection
|
||||
|
||||
|
@ -35,7 +35,7 @@ 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!
|
||||
sit submisso coniuge tristis ubi! :exclamation:
|
||||
|
||||
## Praeceps Corinthus totidem quem crus vultum cape
|
||||
|
||||
|
@ -68,7 +68,7 @@ And a shortcode:
|
|||
### Another subsection
|
||||
Gotta make the toc do a little bit of work
|
||||
|
||||
# A big title
|
||||
# A big title :fire:
|
||||
|
||||
- hello
|
||||
- world
|
||||
|
@ -123,3 +123,16 @@ fn bench_render_shortcodes_one_present(b: &mut test::Bencher) {
|
|||
|
||||
b.iter(|| render_shortcodes(CONTENT, &context));
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn bench_render_content_no_shortcode_with_emoji(b: &mut test::Bencher) {
|
||||
let tera = Tera::default();
|
||||
let content2 = CONTENT.replace(r#"{{ youtube(id="my_youtube_id") }}"#, "");
|
||||
let mut config = Config::default();
|
||||
config.highlight_code = false;
|
||||
config.emoji_rendering = true;
|
||||
let permalinks_ctx = HashMap::new();
|
||||
let context = RenderContext::new(&tera, &config, "", &permalinks_ctx, InsertAnchor::None);
|
||||
|
||||
b.iter(|| render_content(&content2, &context).unwrap());
|
||||
}
|
||||
|
|
|
@ -168,6 +168,10 @@ fn get_heading_refs(events: &[Event]) -> Vec<HeadingRef> {
|
|||
}
|
||||
|
||||
pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<Rendered> {
|
||||
lazy_static! {
|
||||
static ref EMOJI_REPLACER: gh_emoji::Replacer = gh_emoji::Replacer::new();
|
||||
}
|
||||
|
||||
// the rendered html
|
||||
let mut html = String::with_capacity(content.len());
|
||||
// Set while parsing
|
||||
|
@ -197,11 +201,16 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<Render
|
|||
if let Some(ref mut code_block) = highlighter {
|
||||
let html = code_block.highlight(&text);
|
||||
Event::Html(html.into())
|
||||
} else {
|
||||
if context.config.emoji_rendering {
|
||||
let processed_text = EMOJI_REPLACER.replace_all(&text);
|
||||
Event::Text(processed_text.to_string().into())
|
||||
} else {
|
||||
// Business as usual
|
||||
Event::Text(text)
|
||||
}
|
||||
}
|
||||
}
|
||||
Event::Start(Tag::CodeBlock(ref kind)) => {
|
||||
let mut language = None;
|
||||
match kind {
|
||||
|
|
|
@ -1036,3 +1036,28 @@ Again more text"#;
|
|||
let res = render_content(markdown_string, &context).unwrap();
|
||||
assert_eq!(res.body, expected);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn can_render_emoji_alias() {
|
||||
let permalinks_ctx = HashMap::new();
|
||||
let mut config = Config::default();
|
||||
config.emoji_rendering = true;
|
||||
let context = RenderContext::new(&ZOLA_TERA, &config, "", &permalinks_ctx, InsertAnchor::None);
|
||||
let res = render_content("Hello, World! :smile:", &context).unwrap();
|
||||
assert_eq!(
|
||||
res.body,
|
||||
"<p>Hello, World! 😄</p>\n"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn emoji_aliases_are_ignored_when_disabled_in_config() {
|
||||
let permalinks_ctx = HashMap::new();
|
||||
let config = Config::default();
|
||||
let context = RenderContext::new(&ZOLA_TERA, &config, "", &permalinks_ctx, InsertAnchor::None);
|
||||
let res = render_content("Hello, World! :smile:", &context).unwrap();
|
||||
assert_eq!(
|
||||
res.body,
|
||||
"<p>Hello, World! :smile:</p>\n"
|
||||
);
|
||||
}
|
|
@ -61,6 +61,10 @@ generate_feed = false
|
|||
# files are always copied, regardless of this setting.
|
||||
# hard_link_static = false
|
||||
|
||||
# When set to "true", emoji aliases translated to their corresponding
|
||||
# Unicode emoji equivalent in the rendered Markdown files. (e.g.: :smile: => 😄)
|
||||
# emoji_rendering = false
|
||||
|
||||
# The taxonomies to be rendered for the site and their configuration.
|
||||
# Example:
|
||||
# taxonomies = [
|
||||
|
|
Loading…
Reference in a new issue