From be57f6c11bb5b26370218044596672bdd57ab07a Mon Sep 17 00:00:00 2001 From: sgoudham Date: Mon, 2 May 2022 10:05:03 +0100 Subject: [PATCH 01/18] [TEM #2] - Allow default values in template files --- src/links.rs | 150 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 112 insertions(+), 38 deletions(-) diff --git a/src/links.rs b/src/links.rs index 632482a..b7daadc 100644 --- a/src/links.rs +++ b/src/links.rs @@ -45,8 +45,16 @@ lazy_static! { | # or \{\{\s* # link opening parens and whitespace(s) - \#([\w'<>.:^\-\(\)\*\+\|\\\/\?]+) # arg name + \#([\S]+) # arg name \s* # optional separating whitespace(s) + \}\} # link closing parens + + | # or + + \{\{\s* # link opening parens and whitespace(s) + \#([\S]+) # arg name + \s+ # optional separating whitespace(s) + ([^}]+) # match everything after space \}\} # link closing parens" ) .unwrap(); @@ -231,12 +239,10 @@ impl<'a> Args<'a> { None => {} Some(value) => replaced.push_str(value), }, - ArgsType::Default(argument, default_value) => { - // [TEM #2] - // check if captured_arg exists within hashmap - // if so, replace arg with corresponding value and push to replaced string - // if not, replace arg with default value and push to replaced string - } + ArgsType::Default(argument, default_value) => match all_args.get(argument) { + None => replaced.push_str(default_value), + Some(value) => replaced.push_str(value), + }, } previous_end_index = captured_arg.end_index; @@ -247,18 +253,12 @@ impl<'a> Args<'a> { } fn from_capture(cap: Captures<'a>) -> Option> { - let arg_type = match (cap.get(0), cap.get(1), cap.get(2)) { - (_, Some(argument), None) => { - println!("Argument -> {:?}", argument); - Some(ArgsType::Plain(argument.as_str())) - } - (_, Some(argument), Some(default_value)) => { - println!("Argument -> {:?}", argument); - println!("Default Value -> {:?}", default_value); + let arg_type = match (cap.get(0), cap.get(1), cap.get(2), cap.get(3)) { + (_, Some(argument), None, None) => Some(ArgsType::Plain(argument.as_str())), + (_, _, Some(argument), Some(default_value)) => { Some(ArgsType::Default(argument.as_str(), default_value.as_str())) } - (Some(mat), _, _) if mat.as_str().starts_with(ESCAPE_CHAR) => { - println!("Escaped -> {}", mat.as_str()); + (Some(mat), _, _, _) if mat.as_str().starts_with(ESCAPE_CHAR) => { Some(ArgsType::Escaped) } _ => None, @@ -303,7 +303,6 @@ fn extract_args(contents: &str) -> ArgsIter<'_> { #[cfg(test)] mod link_tests { - use std::any::Any; use std::collections::HashMap; use std::path::PathBuf; @@ -552,22 +551,6 @@ year=2022 assert_eq!(Args::replace(start, &HashMap::<&str, &str>::new()), end); } - #[test] - fn test_replace_args_simple() { - let start = r" - Example Text - {{#height}} << an argument! - "; - let end = r" - Example Text - 200px << an argument! - "; - assert_eq!( - Args::replace(start, &HashMap::from([("height", "200px")])), - end - ); - } - #[test] fn test_extract_args_with_spaces() { let s1 = "This is some random text with {{ #path }}"; @@ -609,9 +592,100 @@ year=2022 ); } - // #[test] - fn test_extract_args_with_default_value() {} + #[test] + fn test_extract_args_with_default_value() { + let s = "This is some random text with {{#path 200px}} and then some more random text"; + + let res = extract_args(s).collect::>(); - // #[test] - fn test_extract_args_with_default_value_and_spaces() {} + assert_eq!( + res, + vec![Args { + start_index: 30, + end_index: 45, + args_type: ArgsType::Default("path", "200px"), + args_text: "{{#path 200px}}" + }] + ); + } + + #[test] + fn test_extract_args_with_default_value_and_spaces() { + let s = + "This is some random text with {{ #path 400px }} and then some more random text"; + + let res = extract_args(s).collect::>(); + + assert_eq!( + res, + vec![Args { + start_index: 30, + end_index: 52, + args_type: ArgsType::Default("path", "400px "), + args_text: "{{ #path 400px }}" + }] + ); + } + + #[test] + fn test_extract_args_with_multiple_spaced_default_value() { + let s = "{{#title An Amazing Title}}"; + + let res = extract_args(s).collect::>(); + + assert_eq!( + res, + vec![Args { + start_index: 0, + end_index: 27, + args_type: ArgsType::Default("title", "An Amazing Title"), + args_text: "{{#title An Amazing Title}}" + }] + ); + } + + #[test] + fn test_replace_args_simple() { + let start = r" + Example Text + {{#height}} << an argument! + "; + let end = r" + Example Text + 200px << an argument! + "; + assert_eq!( + Args::replace(start, &HashMap::from([("height", "200px")])), + end + ); + } + + #[test] + fn test_replace_args_with_default() { + let start = r" + Example Text + {{#height 300px}} << an argument! + "; + let end = r" + Example Text + 300px << an argument! + "; + assert_eq!(Args::replace(start, &HashMap::<&str, &str>::new()), end); + } + + #[test] + fn test_replace_args_overriding_default() { + let start = r" + Example Text + {{#height 300px}} << an argument! + "; + let end = r" + Example Text + 200px << an argument! + "; + assert_eq!( + Args::replace(start, &HashMap::from([("height", "200px")])), + end + ); + } } \ No newline at end of file From 14189f92ba18a9c47791e98eb77a14b3466a22d8 Mon Sep 17 00:00:00 2001 From: sgoudham Date: Mon, 2 May 2022 10:15:35 +0100 Subject: [PATCH 02/18] [TEM #2] - Remove TemplateArgsIter --- src/links.rs | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/src/links.rs b/src/links.rs index b7daadc..63ea4c7 100644 --- a/src/links.rs +++ b/src/links.rs @@ -116,7 +116,19 @@ impl<'a> Link<'a> { Some(LinkType::Template(PathBuf::from(file.trim()))) } (_, _, Some(file), Some(args)) => { - all_args.extend(extract_template_args(args.as_str()).collect::>()); + let matches = TEMPLATE_ARGS.captures_iter(args.as_str()); + + let split_args = matches + .into_iter() + .map(|mat| { + let mut split_n = mat.unwrap().get(0).unwrap().as_str().splitn(2, '='); + let key = split_n.next().unwrap().trim(); + let value = split_n.next().unwrap(); + (key, value) + }) + .collect::>(); + all_args.extend(split_args); + Some(LinkType::Template(PathBuf::from(file.as_str()))) } (Some(mat), _, _, _) if mat.as_str().starts_with(ESCAPE_CHAR) => { @@ -196,26 +208,6 @@ pub(crate) fn extract_template_links(contents: &str) -> LinkIter<'_> { LinkIter(TEMPLATE.captures_iter(contents)) } -struct TemplateArgsIter<'a>(CaptureMatches<'a, 'a>); - -impl<'a> Iterator for TemplateArgsIter<'a> { - type Item = (&'a str, &'a str); - - fn next(&mut self) -> Option { - if let Some(cap) = (&mut self.0).next() { - let mut split_args = cap.unwrap().get(0).unwrap().as_str().splitn(2, '='); - let key = split_args.next().unwrap().trim(); - let value = split_args.next().unwrap(); - return Some((key, value)); - } - None - } -} - -fn extract_template_args(contents: &str) -> TemplateArgsIter<'_> { - TemplateArgsIter(TEMPLATE_ARGS.captures_iter(contents)) -} - #[derive(PartialEq, Debug, Clone)] struct Args<'a> { start_index: usize, From a6fc4c216b084bf3cac928d7801589bce82629af Mon Sep 17 00:00:00 2001 From: sgoudham Date: Mon, 2 May 2022 16:39:57 +0100 Subject: [PATCH 03/18] [TEM #2] - Change default arg syntax to `{{$ ... }}` --- src/links.rs | 54 ++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/links.rs b/src/links.rs index 63ea4c7..d780f38 100644 --- a/src/links.rs +++ b/src/links.rs @@ -39,20 +39,20 @@ lazy_static! { r"(?x) # enable insignificant whitespace mode \\\{\{ # escaped link opening parens - \#.* # match any character + \$.* # match any character \}\} # escaped link closing parens | # or \{\{\s* # link opening parens and whitespace(s) - \#([\S]+) # arg name + \$([\S]+) # arg name \s* # optional separating whitespace(s) \}\} # link closing parens | # or \{\{\s* # link opening parens and whitespace(s) - \#([\S]+) # arg name + \$([\S]+) # arg name \s+ # optional separating whitespace(s) ([^}]+) # match everything after space \}\} # link closing parens" @@ -497,25 +497,25 @@ year=2022 #[test] fn test_extract_args_partial_match() { - let s = "Some random text with {{#height..."; + let s = "Some random text with {{$height..."; assert_eq!(extract_args(s).collect::>(), vec![]); - let s = "Some random text with {{#image ferris.png..."; + let s = "Some random text with {{$image ferris.png..."; assert_eq!(extract_args(s).collect::>(), vec![]); - let s = "Some random text with {{#width 550..."; + let s = "Some random text with {{$width 550..."; assert_eq!(extract_args(s).collect::>(), vec![]); - let s = "Some random text with \\{{#title..."; + let s = "Some random text with \\{{$title..."; assert_eq!(extract_args(s).collect::>(), vec![]); } #[test] fn test_extract_args_empty() { - let s = "Some random text with {{}} {{#}}..."; + let s = "Some random text with {{}} {{$}}..."; assert_eq!(extract_args(s).collect::>(), vec![]); } #[test] fn test_extract_args_simple() { - let s = "This is some random text with {{#path}} and then some more random text"; + let s = "This is some random text with {{$path}} and then some more random text"; let res = extract_args(s).collect::>(); @@ -525,7 +525,7 @@ year=2022 start_index: 30, end_index: 39, args_type: ArgsType::Plain("path"), - args_text: "{{#path}}" + args_text: "{{$path}}" }] ); } @@ -534,20 +534,20 @@ year=2022 fn test_extract_args_escaped() { let start = r" Example Text - \{{#height 200px}} << an escaped argument! + \{{$height 200px}} << an escaped argument! "; let end = r" Example Text - {{#height 200px}} << an escaped argument! + {{$height 200px}} << an escaped argument! "; assert_eq!(Args::replace(start, &HashMap::<&str, &str>::new()), end); } #[test] fn test_extract_args_with_spaces() { - let s1 = "This is some random text with {{ #path }}"; - let s2 = "This is some random text with {{#path }}"; - let s3 = "This is some random text with {{ #path}}"; + let s1 = "This is some random text with {{ $path }}"; + let s2 = "This is some random text with {{$path }}"; + let s3 = "This is some random text with {{ $path}}"; let res1 = extract_args(s1).collect::>(); let res2 = extract_args(s2).collect::>(); @@ -559,7 +559,7 @@ year=2022 start_index: 30, end_index: 51, args_type: ArgsType::Plain("path"), - args_text: "{{ #path }}" + args_text: "{{ $path }}" }] ); @@ -569,7 +569,7 @@ year=2022 start_index: 30, end_index: 46, args_type: ArgsType::Plain("path"), - args_text: "{{#path }}" + args_text: "{{$path }}" }] ); @@ -579,14 +579,14 @@ year=2022 start_index: 30, end_index: 44, args_type: ArgsType::Plain("path"), - args_text: "{{ #path}}" + args_text: "{{ $path}}" }] ); } #[test] fn test_extract_args_with_default_value() { - let s = "This is some random text with {{#path 200px}} and then some more random text"; + let s = "This is some random text with {{$path 200px}} and then some more random text"; let res = extract_args(s).collect::>(); @@ -596,7 +596,7 @@ year=2022 start_index: 30, end_index: 45, args_type: ArgsType::Default("path", "200px"), - args_text: "{{#path 200px}}" + args_text: "{{$path 200px}}" }] ); } @@ -604,7 +604,7 @@ year=2022 #[test] fn test_extract_args_with_default_value_and_spaces() { let s = - "This is some random text with {{ #path 400px }} and then some more random text"; + "This is some random text with {{ $path 400px }} and then some more random text"; let res = extract_args(s).collect::>(); @@ -614,14 +614,14 @@ year=2022 start_index: 30, end_index: 52, args_type: ArgsType::Default("path", "400px "), - args_text: "{{ #path 400px }}" + args_text: "{{ $path 400px }}" }] ); } #[test] fn test_extract_args_with_multiple_spaced_default_value() { - let s = "{{#title An Amazing Title}}"; + let s = "{{$title An Amazing Title}}"; let res = extract_args(s).collect::>(); @@ -631,7 +631,7 @@ year=2022 start_index: 0, end_index: 27, args_type: ArgsType::Default("title", "An Amazing Title"), - args_text: "{{#title An Amazing Title}}" + args_text: "{{$title An Amazing Title}}" }] ); } @@ -640,7 +640,7 @@ year=2022 fn test_replace_args_simple() { let start = r" Example Text - {{#height}} << an argument! + {{$height}} << an argument! "; let end = r" Example Text @@ -656,7 +656,7 @@ year=2022 fn test_replace_args_with_default() { let start = r" Example Text - {{#height 300px}} << an argument! + {{$height 300px}} << an argument! "; let end = r" Example Text @@ -669,7 +669,7 @@ year=2022 fn test_replace_args_overriding_default() { let start = r" Example Text - {{#height 300px}} << an argument! + {{$height 300px}} << an argument! "; let end = r" Example Text From 0839dceac1126f4d4fa0c2cd05c94f81af273393 Mon Sep 17 00:00:00 2001 From: sgoudham Date: Mon, 2 May 2022 23:14:40 +0100 Subject: [PATCH 04/18] [TEM #2] - Add happy path component tests, Improve regex, Add comments, --- src/lib.rs | 192 +++++++++++++++++++++++++++++++++++++++++- src/links.rs | 232 +++++++++++++++++++++++++++++---------------------- 2 files changed, 319 insertions(+), 105 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index c2b7e2a..0cd59a6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,7 +6,10 @@ use mdbook::errors::Result; use mdbook::preprocess::{Preprocessor, PreprocessorContext}; use mdbook::BookItem; +use crate::utils::{FileReader, SystemFileReader}; + mod links; +mod utils; const MAX_LINK_NESTED_DEPTH: usize = 10; @@ -36,7 +39,13 @@ impl Preprocessor for Template { .map(|dir| src_dir.join(dir)) .expect("All book items have a parent"); - let content = replace_template(&chapter.content, base, source, 0); + let content = replace_template( + &chapter.content, + &SystemFileReader::default(), + base, + source, + 0, + ); chapter.content = content; } } @@ -50,10 +59,17 @@ impl Preprocessor for Template { } } -fn replace_template(chapter_content: &str, base: P1, source: P2, depth: usize) -> String +fn replace_template( + chapter_content: &str, + file_reader: &FR, + base: P1, + source: P2, + depth: usize, +) -> String where P1: AsRef, P2: AsRef, + FR: FileReader, { let path = base.as_ref(); let source = source.as_ref(); @@ -64,12 +80,13 @@ where for link in links::extract_template_links(chapter_content) { replaced.push_str(&chapter_content[previous_end_index..link.start_index]); - match link.replace_args(&path) { + match link.replace_args(&path, file_reader) { Ok(new_content) => { if depth < MAX_LINK_NESTED_DEPTH { if let Some(rel_path) = link.link_type.relative_path(path) { replaced.push_str(&replace_template( &new_content, + file_reader, rel_path, source, depth + 1, @@ -99,4 +116,173 @@ where replaced.push_str(&chapter_content[previous_end_index..]); replaced +} + +#[cfg(test)] +mod lib_tests { + use std::collections::HashMap; + use std::path::PathBuf; + + use crate::replace_template; + use crate::utils::TestFileReader; + + #[test] + fn test_happy_path_escaped() { + let start = r" + Example Text + ```hbs + \{{#template template.md}} << an escaped link! + ```"; + let end = r" + Example Text + ```hbs + {{#template template.md}} << an escaped link! + ```"; + + assert_eq!( + replace_template(start, &TestFileReader::default(), "", "", 0), + end + ); + } + + #[test] + fn test_happy_path_simple() { + let start_chapter_content = "{{#template footer.md}}"; + let end_chapter_content = "Designed & Created With Love From - Goudham & Hazel"; + let file_name = PathBuf::from("footer.md"); + let template_file_contents = + "Designed & Created With Love From - Goudham & Hazel".to_string(); + let map = HashMap::from([(file_name, template_file_contents)]); + let file_reader = &TestFileReader::from(map); + + let actual_chapter_content = + replace_template(start_chapter_content, file_reader, "", "", 0); + + assert_eq!(actual_chapter_content, end_chapter_content); + } + + #[test] + fn test_happy_path_with_args() { + let start_chapter_content = "{{#template footer.md authors=Goudham & Hazel}}"; + let end_chapter_content = "Designed & Created With Love From - Goudham & Hazel"; + let file_name = PathBuf::from("footer.md"); + let template_file_contents = "Designed & Created With Love From - {{$authors}}".to_string(); + let map = HashMap::from([(file_name, template_file_contents)]); + let file_reader = &TestFileReader::from(map); + + let actual_chapter_content = + replace_template(start_chapter_content, file_reader, "", "", 0); + + assert_eq!(actual_chapter_content, end_chapter_content); + } + + #[test] + fn test_happy_path_new_lines() { + let start_chapter_content = r" + Some content... + {{#template footer.md authors=Goudham & Hazel}}"; + let end_chapter_content = r" + Some content... + - - - - + Designed & Created With Love From Goudham & Hazel"; + let file_name = PathBuf::from("footer.md"); + let template_file_contents = r"- - - - + Designed & Created With Love From {{$authors}}" + .to_string(); + let map = HashMap::from([(file_name, template_file_contents)]); + let file_reader = &TestFileReader::from(map); + + let actual_chapter_content = + replace_template(start_chapter_content, file_reader, "", "", 0); + + assert_eq!(actual_chapter_content, end_chapter_content); + } + + #[test] + fn test_happy_path_multiple() { + let start_chapter_content = r" + {{#template header.md title=Example Title}} + Some content... + {{#template + footer.md + authors=Goudham & Hazel}}"; + let end_chapter_content = r" + # Example Title + Some content... + - - - - + Designed & Created With Love From Goudham & Hazel"; + let header_file_name = PathBuf::from("header.md"); + let header_contents = r"# {{$title}}".to_string(); + let footer_file_name = PathBuf::from("footer.md"); + let footer_contents = r"- - - - + Designed & Created With Love From {{$authors}}" + .to_string(); + let map = HashMap::from([ + (footer_file_name, footer_contents), + (header_file_name, header_contents), + ]); + let file_reader = &TestFileReader::from(map); + + let actual_chapter_content = + replace_template(start_chapter_content, file_reader, "", "", 0); + + assert_eq!(actual_chapter_content, end_chapter_content); + } + + #[test] + fn test_happy_path_with_default_values() { + let start_chapter_content = "{{#template footer.md}}"; + let end_chapter_content = "Designed By - Goudham"; + let file_name = PathBuf::from("footer.md"); + let template_file_contents = "Designed By - {{$authors Goudham}}".to_string(); + let map = HashMap::from([(file_name, template_file_contents)]); + let file_reader = &TestFileReader::from(map); + + let actual_chapter_content = + replace_template(start_chapter_content, file_reader, "", "", 0); + + assert_eq!(actual_chapter_content, end_chapter_content); + } + + #[test] + fn test_happy_path_with_overridden_default_values() { + let start_chapter_content = "{{#template footer.md authors=Hazel}}"; + let end_chapter_content = "Designed By - Hazel"; + let file_name = PathBuf::from("footer.md"); + let template_file_contents = "Designed By - {{$authors Goudham}}".to_string(); + let map = HashMap::from([(file_name, template_file_contents)]); + let file_reader = &TestFileReader::from(map); + + let actual_chapter_content = + replace_template(start_chapter_content, file_reader, "", "", 0); + + assert_eq!(actual_chapter_content, end_chapter_content); + } + + #[test] + fn test_happy_path_nested() { + let start_chapter_content = r" + {{#template header.md title=Example Title}} + Some content..."; + let end_chapter_content = r" + # Example Title + Example Title + Some content..."; + let header_file_name = PathBuf::from("header.md"); + let header_contents = r"# {{$title}} + {{#template image.md}}" + .to_string(); + let image_file_name = PathBuf::from("image.md"); + let image_contents = r"Example Title".to_string(); + let map = HashMap::from([ + (image_file_name, image_contents), + (header_file_name, header_contents), + ]); + let file_reader = &TestFileReader::from(map); + + let actual_chapter_content = + replace_template(start_chapter_content, file_reader, "", "", 0); + + assert_eq!(actual_chapter_content, end_chapter_content); + } } \ No newline at end of file diff --git a/src/links.rs b/src/links.rs index d780f38..996f6fe 100644 --- a/src/links.rs +++ b/src/links.rs @@ -1,12 +1,12 @@ -use std::collections::{HashMap, VecDeque}; -use std::fs; +use std::collections::HashMap; use std::path::{Path, PathBuf}; -use anyhow::Context; use fancy_regex::{CaptureMatches, Captures, Regex}; use lazy_static::lazy_static; use mdbook::errors::Result; +use crate::FileReader; + const ESCAPE_CHAR: char = '\\'; const LINE_BREAKS: &[char] = &['\n', '\r']; @@ -14,7 +14,7 @@ lazy_static! { // https://stackoverflow.com/questions/22871602/optimizing-regex-to-fine-key-value-pairs-space-delimited static ref TEMPLATE_ARGS: Regex = Regex::new(r"(?<=\s|\A)([^\s=]+)=(.*?)(?=(?:\s[^\s=]+=|$))").unwrap(); - // r"(?x)\\\{\{\#.*\}\}|\{\{\s*\#(template)\s+([a-zA-Z0-9_^'<>().:*+|\\\/?-]+)\s+([^}]+)\}\}" + // r"(?x)\\\{\{\#.*\}\}|\{\{\s*\#(template)\s+([\S]+)\s*\}\}|\{\{\s*\#(template)\s+([\S]+)\s+([^}]+)\}\}" static ref TEMPLATE: Regex = Regex::new( r"(?x) # enable insignificant whitespace mode @@ -22,12 +22,21 @@ lazy_static! { \#.* # match any character \}\} # escaped link closing parens + | # or + + \{\{\s* # link opening parens and whitespace(s) + \#(template) # link type - template + \s+ # separating whitespace + ([\S]+) # relative path to template file + \s* # optional separating whitespaces(s) + \}\} # link closing parens + | # or \{\{\s* # link opening parens and whitespace(s) \#(template) # link type - template \s+ # separating whitespace - ([\w'<>.:^\-\(\)\*\+\|\\\/\?]+) # relative path to template file + ([\S]+) # relative path to template file \s+ # separating whitespace(s) ([^}]+) # get all template arguments \}\} # link closing parens" @@ -73,67 +82,61 @@ impl<'a> Link<'a> { fn from_capture(cap: Captures<'a>) -> Option> { let mut all_args = HashMap::with_capacity(20); - let link_type = match (cap.get(0), cap.get(1), cap.get(2), cap.get(3)) { - (Some(mat), _, _, _) if mat.as_str().contains(LINE_BREAKS) => { - /* - Given a template string that looks like: - {{#template - footer.md - path=../images - author=Hazel - }} - - The resulting args: will look like: - ["{{#template", "footer.md", "path=../images", "author=Hazel", "}}"] - */ - let mut args = mat - .as_str() - .lines() - .map(|line| { - line.trim_end_matches(LINE_BREAKS) - .trim_start_matches(LINE_BREAKS) - }) - .collect::>(); - - // Remove {{#template - args.pop_front(); - // Remove ending }} - args.pop_back(); - // Store relative path of template file - let file = args.pop_front().unwrap(); - - let split_args = args - .into_iter() - .map(|arg| { - let mut split_n = arg.splitn(2, '='); - let key = split_n.next().unwrap().trim(); - let value = split_n.next().unwrap(); - (key, value) - }) - .collect::>(); - all_args.extend(split_args); - - Some(LinkType::Template(PathBuf::from(file.trim()))) - } - (_, _, Some(file), Some(args)) => { - let matches = TEMPLATE_ARGS.captures_iter(args.as_str()); - - let split_args = matches - .into_iter() - .map(|mat| { - let mut split_n = mat.unwrap().get(0).unwrap().as_str().splitn(2, '='); - let key = split_n.next().unwrap().trim(); - let value = split_n.next().unwrap(); - (key, value) - }) - .collect::>(); - all_args.extend(split_args); - + // https://regex101.com/r/OBywLv/1 + let link_type = match ( + cap.get(0), + cap.get(1), + cap.get(2), + cap.get(3), + cap.get(4), + cap.get(5), + ) { + // This looks like {{#template }} + (_, _, Some(file), None, None, None) => { Some(LinkType::Template(PathBuf::from(file.as_str()))) } - (Some(mat), _, _, _) if mat.as_str().starts_with(ESCAPE_CHAR) => { + // This looks like \{{#}} + (Some(mat), _, _, _, _, _) if mat.as_str().starts_with(ESCAPE_CHAR) => { Some(LinkType::Escaped) } + (_, None, None, _, Some(file), Some(args)) => { + let split_args = match args.as_str().contains(LINE_BREAKS) { + /* + This looks like + {{#template + + + }} + */ + true => args + .as_str() + .split(LINE_BREAKS) + .map(|str| str.trim()) + .filter(|trimmed| !trimmed.is_empty()) + .map(|mat| { + let mut split_n = mat.splitn(2, '='); + let key = split_n.next().unwrap().trim(); + let value = split_n.next().unwrap(); + (key, value) + }) + .collect::>(), + + // This looks like {{#template }} + false => TEMPLATE_ARGS + .captures_iter(args.as_str()) + .into_iter() + .map(|mat| { + let mut split_n = mat.unwrap().get(0).unwrap().as_str().splitn(2, '='); + let key = split_n.next().unwrap().trim(); + let value = split_n.next().unwrap(); + (key, value) + }) + .collect::>(), + }; + + all_args.extend(split_args); + Some(LinkType::Template(PathBuf::from(file.as_str()))) + } _ => None, }; @@ -148,20 +151,16 @@ impl<'a> Link<'a> { }) } - pub(crate) fn replace_args>(&self, base: P) -> Result { + pub(crate) fn replace_args(&self, base: P, file_reader: &FR) -> Result + where + P: AsRef, + FR: FileReader, + { match self.link_type { LinkType::Escaped => Ok((&self.link_text[1..]).to_owned()), LinkType::Template(ref pat) => { let target = base.as_ref().join(pat); - - let contents = fs::read_to_string(&target).with_context(|| { - format!( - "Could not read template file {} ({})", - self.link_text, - target.display(), - ) - })?; - + let contents = file_reader.read_to_string(&target, self.link_text)?; Ok(Args::replace(contents.as_str(), &self.args)) } } @@ -245,11 +244,15 @@ impl<'a> Args<'a> { } fn from_capture(cap: Captures<'a>) -> Option> { + // https://regex101.com/r/lKSOOl/3 let arg_type = match (cap.get(0), cap.get(1), cap.get(2), cap.get(3)) { + // This looks like {{$path}} (_, Some(argument), None, None) => Some(ArgsType::Plain(argument.as_str())), + // This looks like {{$path ../images}} (_, _, Some(argument), Some(default_value)) => { Some(ArgsType::Default(argument.as_str(), default_value.as_str())) } + // This looks like \{{$any string}} (Some(mat), _, _, _) if mat.as_str().starts_with(ESCAPE_CHAR) => { Some(ArgsType::Escaped) } @@ -299,22 +302,6 @@ mod link_tests { use std::path::PathBuf; use crate::links::{extract_args, extract_template_links, Args, ArgsType, Link, LinkType}; - use crate::replace_template; - - #[test] - fn test_escaped_template_link() { - let start = r" - Example Text - ```hbs - \{{#template template.md}} << an escaped link! - ```"; - let end = r" - Example Text - ```hbs - {{#template template.md}} << an escaped link! - ```"; - assert_eq!(replace_template(start, "", "", 0), end); - } #[test] fn test_extract_zero_template_links() { @@ -322,12 +309,6 @@ mod link_tests { assert_eq!(extract_template_links(s).collect::>(), vec![]) } - #[test] - fn test_extract_zero_template_links_without_args() { - let s = "{{#template templates/footer.md}}"; - assert_eq!(extract_template_links(s).collect::>(), vec![]) - } - #[test] fn test_extract_template_links_partial_match() { let s = "Some random text with {{#template..."; @@ -342,7 +323,7 @@ mod link_tests { #[test] fn test_extract_template_links_empty() { - let s = "Some random text with {{#template}} and {{#template }} {{}} {{#}}..."; + let s = "Some random text with {{}} {{#}}..."; assert_eq!(extract_template_links(s).collect::>(), vec![]); } @@ -352,6 +333,24 @@ mod link_tests { assert!(extract_template_links(s).collect::>() == vec![]); } + #[test] + fn test_extract_zero_template_links_without_args() { + let s = "{{#template templates/footer.md}}"; + + let res = extract_template_links(s).collect::>(); + + assert_eq!( + res, + vec![Link { + start_index: 0, + end_index: 33, + link_type: LinkType::Template(PathBuf::from("templates/footer.md")), + link_text: "{{#template templates/footer.md}}", + args: HashMap::new() + },] + ); + } + #[test] fn test_extract_template_links_simple() { let s = @@ -361,13 +360,22 @@ mod link_tests { assert_eq!( res, - vec![Link { - start_index: 48, - end_index: 79, - link_type: LinkType::Template(PathBuf::from("test.rs")), - link_text: "{{#template test.rs lang=rust}}", - args: HashMap::from([("lang", "rust")]) - },] + vec![ + Link { + start_index: 22, + end_index: 43, + link_type: LinkType::Template(PathBuf::from("file.rs")), + link_text: "{{#template file.rs}}", + args: HashMap::new() + }, + Link { + start_index: 48, + end_index: 79, + link_type: LinkType::Template(PathBuf::from("test.rs")), + link_text: "{{#template test.rs lang=rust}}", + args: HashMap::from([("lang", "rust")]) + }, + ] ); } @@ -489,6 +497,26 @@ year=2022 ); } + #[test] + fn test_extract_template_links_with_newlines_malformed() { + let s = "{{#template test.rs + lang=rust + year=2022}}"; + + let res = extract_template_links(s).collect::>(); + + assert_eq!( + res, + vec![Link { + start_index: 0, + end_index: 58, + link_type: LinkType::Template(PathBuf::from("test.rs")), + link_text: "{{#template test.rs \n lang=rust\n year=2022}}", + args: HashMap::from([("lang", "rust"), ("year", "2022")]), + },] + ); + } + #[test] fn test_extract_zero_args() { let s = "This is some text without any template links"; From d0dbd9b2d55857988edd087176c3b32e13755ecd Mon Sep 17 00:00:00 2001 From: sgoudham Date: Tue, 3 May 2022 00:07:32 +0100 Subject: [PATCH 05/18] [TEM #2] - Update default value syntax to `[[# .. ]]` --- src/lib.rs | 18 ++++++------ src/links.rs | 80 ++++++++++++++++++++++++++-------------------------- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 0cd59a6..07da766 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -166,7 +166,7 @@ mod lib_tests { let start_chapter_content = "{{#template footer.md authors=Goudham & Hazel}}"; let end_chapter_content = "Designed & Created With Love From - Goudham & Hazel"; let file_name = PathBuf::from("footer.md"); - let template_file_contents = "Designed & Created With Love From - {{$authors}}".to_string(); + let template_file_contents = "Designed & Created With Love From - [[#authors]]".to_string(); let map = HashMap::from([(file_name, template_file_contents)]); let file_reader = &TestFileReader::from(map); @@ -187,7 +187,7 @@ mod lib_tests { Designed & Created With Love From Goudham & Hazel"; let file_name = PathBuf::from("footer.md"); let template_file_contents = r"- - - - - Designed & Created With Love From {{$authors}}" + Designed & Created With Love From [[#authors]]" .to_string(); let map = HashMap::from([(file_name, template_file_contents)]); let file_reader = &TestFileReader::from(map); @@ -212,10 +212,10 @@ mod lib_tests { - - - - Designed & Created With Love From Goudham & Hazel"; let header_file_name = PathBuf::from("header.md"); - let header_contents = r"# {{$title}}".to_string(); + let header_contents = r"# [[#title]]".to_string(); let footer_file_name = PathBuf::from("footer.md"); let footer_contents = r"- - - - - Designed & Created With Love From {{$authors}}" + Designed & Created With Love From [[#authors]]" .to_string(); let map = HashMap::from([ (footer_file_name, footer_contents), @@ -234,7 +234,7 @@ mod lib_tests { let start_chapter_content = "{{#template footer.md}}"; let end_chapter_content = "Designed By - Goudham"; let file_name = PathBuf::from("footer.md"); - let template_file_contents = "Designed By - {{$authors Goudham}}".to_string(); + let template_file_contents = "Designed By - [[#authors Goudham]]".to_string(); let map = HashMap::from([(file_name, template_file_contents)]); let file_reader = &TestFileReader::from(map); @@ -249,7 +249,7 @@ mod lib_tests { let start_chapter_content = "{{#template footer.md authors=Hazel}}"; let end_chapter_content = "Designed By - Hazel"; let file_name = PathBuf::from("footer.md"); - let template_file_contents = "Designed By - {{$authors Goudham}}".to_string(); + let template_file_contents = "Designed By - [[#authors Goudham]]".to_string(); let map = HashMap::from([(file_name, template_file_contents)]); let file_reader = &TestFileReader::from(map); @@ -269,11 +269,11 @@ mod lib_tests { Example Title Some content..."; let header_file_name = PathBuf::from("header.md"); - let header_contents = r"# {{$title}} - {{#template image.md}}" + let header_contents = r"# [[#title]] + {{#template image.md title=[[#title]]}}" .to_string(); let image_file_name = PathBuf::from("image.md"); - let image_contents = r"Example Title".to_string(); + let image_contents = r"[[#title]]".to_string(); let map = HashMap::from([ (image_file_name, image_contents), (header_file_name, header_contents), diff --git a/src/links.rs b/src/links.rs index 996f6fe..88976ee 100644 --- a/src/links.rs +++ b/src/links.rs @@ -43,28 +43,28 @@ lazy_static! { ) .unwrap(); - // r"(?x)\\\{\{\#.*\}\}|\{\{\s*\#([\w'<>.:^\-\(\)\*\+\|\\\/\?]+)\s*\}\}|\{\{\s*\#([\w'<>.:^\-\(\)\*\+\|\\\/\?]+)\s+([^}]+)\}\}" + // r"(?x)\\\[\[.*\]\]|\[\[\s*\#([\S]+)\s*\]\]|\[\[\s*\#([\S]+)\s+([^]]+)\]\]" static ref ARGS: Regex = Regex::new( r"(?x) # enable insignificant whitespace mode - - \\\{\{ # escaped link opening parens - \$.* # match any character - \}\} # escaped link closing parens - + + \\\[\[ # escaped link opening square brackets + \#.* # match any character + \]\] # escaped link closing parens + | # or - - \{\{\s* # link opening parens and whitespace(s) - \$([\S]+) # arg name + + \[\[\s* # link opening parens and whitespace(s) + \#([\S]+) # arg name \s* # optional separating whitespace(s) - \}\} # link closing parens - + \]\] # link closing parens + | # or - - \{\{\s* # link opening parens and whitespace(s) - \$([\S]+) # arg name + + \[\[\s* # link opening parens and whitespace(s) + \#([\S]+) # arg name \s+ # optional separating whitespace(s) - ([^}]+) # match everything after space - \}\} # link closing parens" + ([^]]+) # match everything after space + \]\] # link closing parens" ) .unwrap(); } @@ -525,25 +525,25 @@ year=2022 #[test] fn test_extract_args_partial_match() { - let s = "Some random text with {{$height..."; + let s = "Some random text with [[#height..."; assert_eq!(extract_args(s).collect::>(), vec![]); - let s = "Some random text with {{$image ferris.png..."; + let s = "Some random text with [[#image ferris.png..."; assert_eq!(extract_args(s).collect::>(), vec![]); - let s = "Some random text with {{$width 550..."; + let s = "Some random text with [[#width 550..."; assert_eq!(extract_args(s).collect::>(), vec![]); - let s = "Some random text with \\{{$title..."; + let s = "Some random text with \\[[#title..."; assert_eq!(extract_args(s).collect::>(), vec![]); } #[test] fn test_extract_args_empty() { - let s = "Some random text with {{}} {{$}}..."; + let s = "Some random text with [[]] [[#]]..."; assert_eq!(extract_args(s).collect::>(), vec![]); } #[test] fn test_extract_args_simple() { - let s = "This is some random text with {{$path}} and then some more random text"; + let s = "This is some random text with [[#path]] and then some more random text"; let res = extract_args(s).collect::>(); @@ -553,7 +553,7 @@ year=2022 start_index: 30, end_index: 39, args_type: ArgsType::Plain("path"), - args_text: "{{$path}}" + args_text: "[[#path]]" }] ); } @@ -562,20 +562,20 @@ year=2022 fn test_extract_args_escaped() { let start = r" Example Text - \{{$height 200px}} << an escaped argument! + \[[#height 200px]] << an escaped argument! "; let end = r" Example Text - {{$height 200px}} << an escaped argument! + [[#height 200px]] << an escaped argument! "; assert_eq!(Args::replace(start, &HashMap::<&str, &str>::new()), end); } #[test] fn test_extract_args_with_spaces() { - let s1 = "This is some random text with {{ $path }}"; - let s2 = "This is some random text with {{$path }}"; - let s3 = "This is some random text with {{ $path}}"; + let s1 = "This is some random text with [[ #path ]]"; + let s2 = "This is some random text with [[#path ]]"; + let s3 = "This is some random text with [[ #path]]"; let res1 = extract_args(s1).collect::>(); let res2 = extract_args(s2).collect::>(); @@ -587,7 +587,7 @@ year=2022 start_index: 30, end_index: 51, args_type: ArgsType::Plain("path"), - args_text: "{{ $path }}" + args_text: "[[ #path ]]" }] ); @@ -597,7 +597,7 @@ year=2022 start_index: 30, end_index: 46, args_type: ArgsType::Plain("path"), - args_text: "{{$path }}" + args_text: "[[#path ]]" }] ); @@ -607,14 +607,14 @@ year=2022 start_index: 30, end_index: 44, args_type: ArgsType::Plain("path"), - args_text: "{{ $path}}" + args_text: "[[ #path]]" }] ); } #[test] fn test_extract_args_with_default_value() { - let s = "This is some random text with {{$path 200px}} and then some more random text"; + let s = "This is some random text with [[#path 200px]] and then some more random text"; let res = extract_args(s).collect::>(); @@ -624,7 +624,7 @@ year=2022 start_index: 30, end_index: 45, args_type: ArgsType::Default("path", "200px"), - args_text: "{{$path 200px}}" + args_text: "[[#path 200px]]" }] ); } @@ -632,7 +632,7 @@ year=2022 #[test] fn test_extract_args_with_default_value_and_spaces() { let s = - "This is some random text with {{ $path 400px }} and then some more random text"; + "This is some random text with [[ #path 400px ]] and then some more random text"; let res = extract_args(s).collect::>(); @@ -642,14 +642,14 @@ year=2022 start_index: 30, end_index: 52, args_type: ArgsType::Default("path", "400px "), - args_text: "{{ $path 400px }}" + args_text: "[[ #path 400px ]]" }] ); } #[test] fn test_extract_args_with_multiple_spaced_default_value() { - let s = "{{$title An Amazing Title}}"; + let s = "[[#title An Amazing Title]]"; let res = extract_args(s).collect::>(); @@ -659,7 +659,7 @@ year=2022 start_index: 0, end_index: 27, args_type: ArgsType::Default("title", "An Amazing Title"), - args_text: "{{$title An Amazing Title}}" + args_text: "[[#title An Amazing Title]]" }] ); } @@ -668,7 +668,7 @@ year=2022 fn test_replace_args_simple() { let start = r" Example Text - {{$height}} << an argument! + [[#height]] << an argument! "; let end = r" Example Text @@ -684,7 +684,7 @@ year=2022 fn test_replace_args_with_default() { let start = r" Example Text - {{$height 300px}} << an argument! + [[#height 300px]] << an argument! "; let end = r" Example Text @@ -697,7 +697,7 @@ year=2022 fn test_replace_args_overriding_default() { let start = r" Example Text - {{$height 300px}} << an argument! + [[#height 300px]] << an argument! "; let end = r" Example Text From a482d458f4fb34038d5dde5bd79dbaa387594b1f Mon Sep 17 00:00:00 2001 From: sgoudham Date: Tue, 3 May 2022 00:07:50 +0100 Subject: [PATCH 06/18] [TEM #2] - Add FileReader trait for testing --- src/utils.rs | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/utils.rs diff --git a/src/utils.rs b/src/utils.rs new file mode 100644 index 0000000..5b32eee --- /dev/null +++ b/src/utils.rs @@ -0,0 +1,50 @@ +use std::collections::HashMap; +use std::fs; +use std::path::{Path, PathBuf}; + +use anyhow::{Context, Error, Result}; + +pub(crate) trait FileReader { + fn read_to_string(&self, file_name: &Path, template_text: &str) -> Result; +} + +#[derive(PartialEq, Debug, Clone, Default)] +pub(crate) struct SystemFileReader; + +#[derive(PartialEq, Debug, Clone, Default)] +pub(crate) struct TestFileReader { + pub(crate) captured_contents: HashMap, +} + +impl FileReader for SystemFileReader { + fn read_to_string(&self, file_name: &Path, template_text: &str) -> Result { + fs::read_to_string(file_name).with_context(|| { + format!( + "Could not read template file {} ({})", + template_text, + file_name.display(), + ) + }) + } +} + +impl From> for TestFileReader { + fn from(map: HashMap) -> Self { + TestFileReader { + captured_contents: map, + } + } +} + +impl FileReader for TestFileReader { + fn read_to_string(&self, file_name: &Path, template_text: &str) -> Result { + match self.captured_contents.get(file_name) { + Some(file_contents) => Ok(file_contents.to_string()), + None => Err(Error::msg(format!( + "Could not read template file {} ({})", + template_text, + file_name.display(), + ))), + } + } +} \ No newline at end of file From 29037ac545e351790486825408b8eba2a33ac2dc Mon Sep 17 00:00:00 2001 From: sgoudham Date: Tue, 3 May 2022 00:12:31 +0100 Subject: [PATCH 07/18] [TEM #2] - Update README.md --- README.md | 66 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 399360f..0e59eb9 100644 --- a/README.md +++ b/README.md @@ -86,55 +86,61 @@ The format is as follows 3. Any arguments that should be substituted within the template file. Arguments should be seperated by whitespace and should be in the `key=value` format. -Arguments to be replaced within the template files should be wrapped in `{}` +### Arguments + +Arguments to be replaced within the template files should be wrapped in `{{$ ...}}` + +### Default Values + + ## Valid Configurations -```markdown -# Valid +### Template +```markdown {{#template file.txt path=../images author=Goudham}} +``` -# Valid - +```markdown {{#template file.txt path=../images author=Goudham }} +``` -# Valid - -// Not recommended but valid +```markdown +// _Not recommended but valid_ {{#template file.txt path=../images author=Goudham}} +``` -# Valid - -// Not recommended but valid +```markdown +// _Not recommended but valid_ {{#template file.txt path=../images author=Goudham }} +``` -# Invalid - -// Use {{#include}} for simply including files -{{#template file.txt}} +### Arguments -# Invalid +```markdown +\[[#escaped]] +``` -{{#template - file.txt - path=../images - author=Goudham}} +```markdown +[[#width]] +``` -# Invalid +```markdown +[[#width 200px]] +``` -{{#template file.txt - path=../images - author=Goudham -}} +```markdown +// _Not recommended but valid_ +[[ #width 400px ]] ``` ## Example @@ -161,9 +167,9 @@ and the following content `templates/footer.md` ```markdown --- Designed By {authors} -- -![ferris]({path}/ferris.png) -![corro]({path}/corro.png) +-- Designed By [[#authors]] -- +![ferris]([[#path]]/ferris.png) +![corro]([[#path]]/corro.png) ``` `rust.md` @@ -241,6 +247,10 @@ Some Content... Further examples are included within the [examples](/examples) directory which demonstrate a variety of usages. +## GitHub Actions + +TODO + ## License [MIT License](LICENSE) From 06a05457fe49ac20734070ebbf5c5279fd38feee Mon Sep 17 00:00:00 2001 From: sgoudham Date: Tue, 3 May 2022 00:20:18 +0100 Subject: [PATCH 08/18] [TEM #2] - Update README.md --- README.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0e59eb9..e477dff 100644 --- a/README.md +++ b/README.md @@ -81,18 +81,35 @@ The format is as follows {{#template }} ``` -1. The identifier that this text should be replaced +1. The identifier that tells `mdbook-template` that this text should be replaced by a template 2. The `relative path` to the template file 3. Any arguments that should be substituted within the template file. Arguments should be seperated by whitespace and should be in the `key=value` format. ### Arguments -Arguments to be replaced within the template files should be wrapped in `{{$ ...}}` +Arguments to be replaced within the template files should be wrapped in `[[# ...]]` +The format is as follows + +```text + 1 +[[#]] +``` + +1. The name of the argument ### Default Values +Default values can be set in case some files need dynamic arguments and other don't. +The format is as follows + +```text + 1 2 +[[# ]] +``` +1. The name of the argument +2. The value that this argument should have by default ## Valid Configurations From 816a888e7df3844b955d7d0807b166754f2f3004 Mon Sep 17 00:00:00 2001 From: sgoudham Date: Tue, 3 May 2022 00:21:44 +0100 Subject: [PATCH 09/18] [TEM #2] - Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e477dff..b845e4f 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,8 @@ Please view the given [example](#example) which demonstrates it in action. ## Format +### Template + The format is as follows ```text @@ -88,7 +90,7 @@ The format is as follows ### Arguments -Arguments to be replaced within the template files should be wrapped in `[[# ...]]` +Arguments to be replaced within the template files should be wrapped in `[[# ...]]` The format is as follows ```text @@ -100,7 +102,7 @@ The format is as follows ### Default Values -Default values can be set in case some files need dynamic arguments and other don't. +Default values can be set in case some files need dynamic arguments and other don't. The format is as follows ```text From a10fba96072d61a9d153a1d824f1af23faa9310c Mon Sep 17 00:00:00 2001 From: sgoudham Date: Tue, 3 May 2022 00:22:55 +0100 Subject: [PATCH 10/18] [TEM #2] - Update formatting in README.md --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b845e4f..af3225e 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,8 @@ $ cargo install mdbook-template [preprocessor.template] ``` -**You're good to go :D Continue building your mdbook normally!** +**You're good to go :D +Continue building your mdbook normally!** ```shell $ mdbook build @@ -130,12 +131,12 @@ The format is as follows ``` ```markdown -// _Not recommended but valid_ +// Not recommended but valid {{#template file.txt path=../images author=Goudham}} ``` ```markdown -// _Not recommended but valid_ +// Not recommended but valid {{#template file.txt path=../images @@ -158,7 +159,7 @@ file.txt ``` ```markdown -// _Not recommended but valid_ +// Not recommended but valid [[ #width 400px ]] ``` From 843021a0ca545aac0ff2b868427a946bc189ff38 Mon Sep 17 00:00:00 2001 From: sgoudham Date: Tue, 3 May 2022 00:24:17 +0100 Subject: [PATCH 11/18] [TEM #2] - Update Args::from_capture() comments --- src/links.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/links.rs b/src/links.rs index 88976ee..50d3821 100644 --- a/src/links.rs +++ b/src/links.rs @@ -244,15 +244,15 @@ impl<'a> Args<'a> { } fn from_capture(cap: Captures<'a>) -> Option> { - // https://regex101.com/r/lKSOOl/3 + // https://regex101.com/r/lKSOOl/4 let arg_type = match (cap.get(0), cap.get(1), cap.get(2), cap.get(3)) { - // This looks like {{$path}} + // This looks like [[#path]] (_, Some(argument), None, None) => Some(ArgsType::Plain(argument.as_str())), - // This looks like {{$path ../images}} + // This looks like [[#path ../images]] (_, _, Some(argument), Some(default_value)) => { Some(ArgsType::Default(argument.as_str(), default_value.as_str())) } - // This looks like \{{$any string}} + // This looks like \[[#any string]] (Some(mat), _, _, _) if mat.as_str().starts_with(ESCAPE_CHAR) => { Some(ArgsType::Escaped) } From 050bd07ed5b07d326a75cb03cd2be986e30b9b67 Mon Sep 17 00:00:00 2001 From: sgoudham Date: Tue, 3 May 2022 00:27:30 +0100 Subject: [PATCH 12/18] [TEM #2] - Update version to v1.0.0 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 48fa6fc..1190cc7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mdbook-template" -version = "0.1.0" +version = "1.0.0" edition = "2021" authors = ["Goudham Suresh "] description = "A mdbook preprocessor that allows the re-usability of template files with dynamic arguments" From 7951c02445263333803fedd977be1870633a02b2 Mon Sep 17 00:00:00 2001 From: sgoudham Date: Tue, 3 May 2022 00:32:36 +0100 Subject: [PATCH 13/18] [TEM #2] - Add sad path test --- src/lib.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 07da766..62a970e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -285,4 +285,14 @@ mod lib_tests { assert_eq!(actual_chapter_content, end_chapter_content); } + + #[test] + fn test_sad_path_invalid_file() { + let start_chapter_content = "{{#template footer.md}}"; + + let actual_chapter_content = + replace_template(start_chapter_content, &TestFileReader::default(), "", "", 0); + + assert_eq!(actual_chapter_content, start_chapter_content); + } } \ No newline at end of file From 1743f24bd57664a2f9c5c8b82e084cac7cfdb8e3 Mon Sep 17 00:00:00 2001 From: sgoudham Date: Tue, 3 May 2022 00:53:16 +0100 Subject: [PATCH 14/18] [TEM #2] - Update .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 9daf347..6996d41 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,9 @@ Cargo.lock # These are backup files generated by rustfmt **/*.rs.bk + +# Added Manually .idea examples/readme/book +examples/default-value/book target \ No newline at end of file From 197bbcba3bb861da77a75e17e55f4fefe75541fc Mon Sep 17 00:00:00 2001 From: sgoudham Date: Tue, 3 May 2022 00:54:02 +0100 Subject: [PATCH 15/18] [TEM #2] - Add default-value example book --- examples/default-value/book.toml | 9 +++++++++ examples/default-value/src/SUMMARY.md | 6 ++++++ examples/default-value/src/friends/hazel.md | 12 ++++++++++++ examples/default-value/src/go.md | 6 ++++++ examples/default-value/src/images/corro.png | Bin 0 -> 37456 bytes examples/default-value/src/images/ferris.png | Bin 0 -> 34971 bytes examples/default-value/src/rust.md | 6 ++++++ examples/default-value/src/templates/footer.md | 4 ++++ 8 files changed, 43 insertions(+) create mode 100644 examples/default-value/book.toml create mode 100644 examples/default-value/src/SUMMARY.md create mode 100644 examples/default-value/src/friends/hazel.md create mode 100644 examples/default-value/src/go.md create mode 100644 examples/default-value/src/images/corro.png create mode 100644 examples/default-value/src/images/ferris.png create mode 100644 examples/default-value/src/rust.md create mode 100644 examples/default-value/src/templates/footer.md diff --git a/examples/default-value/book.toml b/examples/default-value/book.toml new file mode 100644 index 0000000..76e9e11 --- /dev/null +++ b/examples/default-value/book.toml @@ -0,0 +1,9 @@ +[book] +authors = ["sgoudham"] +language = "en" +multilingual = false +src = "src" +title = "default-value" + +# Enables the `mdbook-template` preprocessor +[preprocessor.template] \ No newline at end of file diff --git a/examples/default-value/src/SUMMARY.md b/examples/default-value/src/SUMMARY.md new file mode 100644 index 0000000..aab98da --- /dev/null +++ b/examples/default-value/src/SUMMARY.md @@ -0,0 +1,6 @@ +# Summary + +- [Rust](rust.md) +- [Go](go.md) +- [Friends]() + - [Hazel](friends/hazel.md) \ No newline at end of file diff --git a/examples/default-value/src/friends/hazel.md b/examples/default-value/src/friends/hazel.md new file mode 100644 index 0000000..a01fc14 --- /dev/null +++ b/examples/default-value/src/friends/hazel.md @@ -0,0 +1,12 @@ +# Hazel +Some Content... + +Width and Height both overridden to 200x200 ! + +{{#template + ../templates/footer.md + path=../images + authors=Goudham, Hazel + width=200px + height=200px +}} \ No newline at end of file diff --git a/examples/default-value/src/go.md b/examples/default-value/src/go.md new file mode 100644 index 0000000..9215b56 --- /dev/null +++ b/examples/default-value/src/go.md @@ -0,0 +1,6 @@ +# Go +Some Content... + +Width overridden to 200px ! + +{{#template templates/footer.md path=images authors=Goudham, Hazel width=200px}} \ No newline at end of file diff --git a/examples/default-value/src/images/corro.png b/examples/default-value/src/images/corro.png new file mode 100644 index 0000000000000000000000000000000000000000..a63aa505e798ee9a8e64f9841cc025a40cdbb669 GIT binary patch literal 37456 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%0AwNv<>a@k?#Ry7=Q=Q`DUP=UPS_=0G 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 literal 0 HcmV?d00001 diff --git a/examples/default-value/src/images/ferris.png b/examples/default-value/src/images/ferris.png new file mode 100644 index 0000000000000000000000000000000000000000..cbcc88ae7f1c316ac9b550b5556eaff24dea70ab GIT binary patch literal 34971 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 literal 0 HcmV?d00001 diff --git a/examples/default-value/src/rust.md b/examples/default-value/src/rust.md new file mode 100644 index 0000000..b3b48ff --- /dev/null +++ b/examples/default-value/src/rust.md @@ -0,0 +1,6 @@ +# Rust +Some Content... + +Both images are defaulted to 400x400 ! + +{{#template templates/footer.md authors=Goudham, Hazel path=images}} \ No newline at end of file diff --git a/examples/default-value/src/templates/footer.md b/examples/default-value/src/templates/footer.md new file mode 100644 index 0000000..3571db8 --- /dev/null +++ b/examples/default-value/src/templates/footer.md @@ -0,0 +1,4 @@ +-- Designed By [[#authors]] -- + + + \ No newline at end of file From 1cb7e0373c54415bb9b1066169ac092d5f621e0e Mon Sep 17 00:00:00 2001 From: sgoudham Date: Tue, 3 May 2022 01:03:39 +0100 Subject: [PATCH 16/18] [TEM #2] - Add Github Actions --- README.md | 64 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index af3225e..7884a81 100644 --- a/README.md +++ b/README.md @@ -9,16 +9,21 @@ ## Table of Contents -- [mdbook-template](#mdbook-template) - * [Author Notes](#author-notes) - * [Installation](#installation) - * [About](#about) - * [Format](#format) - * [Valid Configurations](#valid-configurations) - * [Example](#example) - * [License](#license) - * [Contributing](#contributing) - * [Acknowledgement](#acknowledgement) +* [Author Notes](#author-notes) +* [Installation](#installation) +* [About](#about) +* [Format](#format) + + [Template](#template) + + [Arguments](#arguments) + + [Default Values](#default-values) +* [Valid Configurations](#valid-configurations) + + [Template](#template-1) + + [Arguments](#arguments-1) +* [Example](#example) +* [GitHub Actions](#github-actions) +* [License](#license) +* [Contributing](#contributing) +* [Acknowledgement](#acknowledgement) ## Author Notes @@ -104,14 +109,14 @@ The format is as follows ### Default Values Default values can be set in case some files need dynamic arguments and other don't. -The format is as follows +The format is as follows ```text 1 2 [[# ]] ``` -1. The name of the argument +1. The name of the argument 2. The value that this argument should have by default ## Valid Configurations @@ -123,25 +128,15 @@ The format is as follows ``` ```markdown -{{#template - file.txt - path=../images - author=Goudham -}} +{{#template file.txt path=../images author=Goudham }} ``` ```markdown -// Not recommended but valid -{{#template file.txt path=../images author=Goudham}} +// Not recommended but valid {{#template file.txt path=../images author=Goudham}} ``` ```markdown -// Not recommended but valid -{{#template -file.txt - path=../images - author=Goudham -}} +// Not recommended but valid {{#template file.txt path=../images author=Goudham }} ``` ### Arguments @@ -219,11 +214,7 @@ Some Content... Some Content... -{{#template - ../templates/footer.md - path=../images - authors=Goudham, Hazel -}} +{{#template ../templates/footer.md path=../images authors=Goudham, Hazel }} ``` After running `mdbook build` with the mdbook-template preprocessor enabled, the files will have dynamic paths to the @@ -269,7 +260,18 @@ Further examples are included within the [examples](/examples) directory which d ## GitHub Actions -TODO +Include the following within your `.yml` workflow files if you need `mdbook-template` as an executable to build your +book. + +```yaml +- name: Install mdbook-template + run: | + mkdir mdbook-template + curl -sSL https://github.com/sgoudham/mdbook-template/releases/latest/download/mdbook-template-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=./mdbook-template + echo `pwd`/mdbook-template >> $GITHUB_PATH +``` + +The above step will ensure the latest version of mdbook-template is retrieved and built. ## License From 6c0f46ed1d11816ecbfe2c18dea93bf1cda5dcf5 Mon Sep 17 00:00:00 2001 From: sgoudham Date: Tue, 3 May 2022 01:04:47 +0100 Subject: [PATCH 17/18] [TEM #2] - Fix links in TOC --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 7884a81..41484ae 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,8 @@ + [Arguments](#arguments) + [Default Values](#default-values) * [Valid Configurations](#valid-configurations) - + [Template](#template-1) - + [Arguments](#arguments-1) + + [Template](#template-config) + + [Arguments](#arguments-config) * [Example](#example) * [GitHub Actions](#github-actions) * [License](#license) @@ -121,7 +121,7 @@ The format is as follows ## Valid Configurations -### Template +### Template Config ```markdown {{#template file.txt path=../images author=Goudham}} @@ -139,7 +139,7 @@ The format is as follows // Not recommended but valid {{#template file.txt path=../images author=Goudham }} ``` -### Arguments +### Arguments Config ```markdown \[[#escaped]] From 82149826405443e007f044081aa7556932067870 Mon Sep 17 00:00:00 2001 From: sgoudham Date: Tue, 3 May 2022 01:07:25 +0100 Subject: [PATCH 18/18] [TEM #2] - Fix formatting --- README.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 41484ae..a03b3f1 100644 --- a/README.md +++ b/README.md @@ -128,15 +128,25 @@ The format is as follows ``` ```markdown -{{#template file.txt path=../images author=Goudham }} +{{#template + file.txt + path=../images + author=Goudham +}} ``` ```markdown -// Not recommended but valid {{#template file.txt path=../images author=Goudham}} +// Not recommended but valid +{{#template file.txt path=../images author=Goudham}} ``` ```markdown -// Not recommended but valid {{#template file.txt path=../images author=Goudham }} +// Not recommended but valid +{{#template +file.txt + path=../images + author=Goudham +}} ``` ### Arguments Config