zola/components/rendering/tests/toc.rs

113 lines
3 KiB
Rust
Raw Normal View History

Shortcodes (#1640) * Next version * Added tests for shortcode insertion * Added TOC tests * Added test for #1475 and #1355 * Basic internal / external links tests * Added integration test * Added pseudocode and started on logos * Logos parsing for shortcodes * Fixed string literal parsing Moved string literal parsing to a new lexer in order to have greater control of control characters which are parsed. This fixes the bug that was present in the `string_from_quoted` function and also moves the `QuoteType` to be in the `ArgValueToken`. * Moved string literal logic to seperate module * Added square bracket notation for variables * Error handling rewritten Remove the Result from the `fetch_shortcodes` function. Added proper messages within the internal parsing. * Reorganized and documented the shortcode submodule * Added all logic for ShortcodeContext spans * Added working insertion code for MD files * Made functions generic over Markdown or HTML * Add check for embedding bodies * Structure of main function clear * Added test for `new_with_transforms` function * It runs! * Added the code for handling p-ed html shortcodes * Removed placeholders in markdown function * Adjusted integration tests * fetch_shortcodes now also returns a string * Start of HTML insertion * Kinda working everything * Loading of shortcodes and builtins * Fix tests * Some missed fixes * Tweaks + fmt * Remove string literal handling * Fix benches * Grab shortcode def only once per site * Fix benches * Rewrite of parser * Fix tests * Add test for #1655 * Re-enable integration test * Add test for #1601 * Add test for #1600 * Add test for #1500 * Add test for #1320 * Fix test on windows? Co-authored-by: Gijs Burghoorn <g.burghoorn@gmail.com>
2021-11-19 19:31:42 +00:00
mod common;
use libs::tera;
Shortcodes (#1640) * Next version * Added tests for shortcode insertion * Added TOC tests * Added test for #1475 and #1355 * Basic internal / external links tests * Added integration test * Added pseudocode and started on logos * Logos parsing for shortcodes * Fixed string literal parsing Moved string literal parsing to a new lexer in order to have greater control of control characters which are parsed. This fixes the bug that was present in the `string_from_quoted` function and also moves the `QuoteType` to be in the `ArgValueToken`. * Moved string literal logic to seperate module * Added square bracket notation for variables * Error handling rewritten Remove the Result from the `fetch_shortcodes` function. Added proper messages within the internal parsing. * Reorganized and documented the shortcode submodule * Added all logic for ShortcodeContext spans * Added working insertion code for MD files * Made functions generic over Markdown or HTML * Add check for embedding bodies * Structure of main function clear * Added test for `new_with_transforms` function * It runs! * Added the code for handling p-ed html shortcodes * Removed placeholders in markdown function * Adjusted integration tests * fetch_shortcodes now also returns a string * Start of HTML insertion * Kinda working everything * Loading of shortcodes and builtins * Fix tests * Some missed fixes * Tweaks + fmt * Remove string literal handling * Fix benches * Grab shortcode def only once per site * Fix benches * Rewrite of parser * Fix tests * Add test for #1655 * Re-enable integration test * Add test for #1601 * Add test for #1600 * Add test for #1500 * Add test for #1320 * Fix test on windows? Co-authored-by: Gijs Burghoorn <g.burghoorn@gmail.com>
2021-11-19 19:31:42 +00:00
use rendering::Heading;
#[derive(PartialEq, Debug)]
struct HelperHeader {
title: String,
children: Vec<HelperHeader>,
}
impl PartialEq<Heading> for HelperHeader {
fn eq(&self, other: &Heading) -> bool {
self.title == other.title && self.children == other.children
}
}
macro_rules! hh {
($title:literal, [$($children:expr),*]) => {{
HelperHeader {
title: $title.to_string(),
children: vec![$($children),*],
}
}}
}
macro_rules! test_toc {
($in_str:literal, $toc:expr, [$($shortcodes:ident),*]) => {
let config = config::Config::default_for_test();
#[allow(unused_mut)]
let mut tera = tera::Tera::default();
// Add all shortcodes
$(
tera.add_raw_template(
&format!("shortcodes/{}", $shortcodes.filename()),
$shortcodes.output
).expect("Failed to add raw template");
)*
let permalinks = std::collections::HashMap::new();
let mut context = rendering::RenderContext::new(
&tera,
&config,
&config.default_language,
"",
&permalinks,
front_matter::InsertAnchor::None,
);
let shortcode_def = utils::templates::get_shortcodes(&tera);
context.set_shortcode_definitions(&shortcode_def);
let rendered = rendering::render_content($in_str, &context);
assert!(rendered.is_ok());
let rendered = rendered.unwrap();
let toc = rendered.toc.clone();
assert!($toc == toc);
}
}
#[test]
fn basic_toc() {
test_toc!("Hello World!", <Vec<HelperHeader>>::new(), []);
test_toc!("# ABC\n## DEF", vec![hh!("ABC", [hh!("DEF", [])])], []);
}
#[test]
fn all_layers() {
test_toc!(
"# A\n## B\n### C\n#### D\n##### E\n###### F\n",
vec![hh!("A", [hh!("B", [hh!("C", [hh!("D", [hh!("E", [hh!("F", [])])])])])])],
[]
);
}
#[test]
fn multiple_on_layer() {
test_toc!(
"# A\n## B\n## C\n### D\n## E\n### F\n",
vec![hh!("A", [hh!("B", []), hh!("C", [hh!("D", [])]), hh!("E", [hh!("F", [])])])],
[]
);
}
// const MD_SIMPLE1: ShortCode = ShortCode::new("simple", "Hello World!", true);
// const MD_SIMPLE2: ShortCode = ShortCode::new("simple2", "Wow, much cool!", true);
//
// #[test]
// fn with_shortcode_titles() {
// test_toc!(
// "# {{ simple() }}\n## {{ simple2() }}\n### ABC\n#### {{ simple() }}\n",
// vec![hh!(
// "Hello World!",
// [hh!("Wow, much cool!", [hh!("ABC", [hh!("Hello World!", [])])])]
// )],
// [MD_SIMPLE1, MD_SIMPLE2]
// );
// }
//
// const MD_MULTILINE: ShortCode = ShortCode::new("multiline", "<div>\n Wow!\n</div>", false);
//
// #[test]
// fn with_multiline_shortcodes() {
// test_toc!(
// "# {{ multiline() }}\n{{ multiline() }}\n## {{ multiline()() }}\n",
// vec![hh!("Wow!", [hh!("Wow!", [])])],
// [MD_MULTILINE]
// );
// }