diff --git a/src/renderer/html_handlebars/helpers/playpen.rs b/src/renderer/html_handlebars/helpers/playpen.rs
index 9b499903..0dbe86bf 100644
--- a/src/renderer/html_handlebars/helpers/playpen.rs
+++ b/src/renderer/html_handlebars/helpers/playpen.rs
@@ -13,6 +13,13 @@ pub fn render_playpen(s: &str, path: &Path) -> String {
for playpen in find_playpens(s, path) {
+ if playpen.escaped {
+ replaced.push_str(&s[previous_end_index..playpen.start_index-1]);
+ replaced.push_str(&s[playpen.start_index..playpen.end_index]);
+ previous_end_index = playpen.end_index;
+ continue
+ }
+
// Check if the file exists
if !playpen.rust_file.exists() || !playpen.rust_file.is_file() {
output!("[-] No file exists for {{{{#playpen }}}}\n {}", playpen.rust_file.to_str().unwrap());
@@ -42,7 +49,8 @@ struct Playpen{
start_index: usize,
end_index: usize,
rust_file: PathBuf,
- editable: bool
+ editable: bool,
+ escaped: bool,
}
fn find_playpens(s: &str, base_path: &Path) -> Vec {
@@ -50,6 +58,13 @@ fn find_playpens(s: &str, base_path: &Path) -> Vec {
for (i, _) in s.match_indices("{{#playpen") {
debug!("[*]: find_playpen");
+ let mut escaped = false;
+
+ if i > 0 {
+ if let Some(c) = s[i-1..].chars().nth(0) {
+ if c == '\\' { escaped = true }
+ }
+ }
// DON'T forget the "+ i" else you have an index out of bounds error !!
let end_i = if let Some(n) = s[i..].find("}}") { n } else { continue } + i + 2;
@@ -75,6 +90,7 @@ fn find_playpens(s: &str, base_path: &Path) -> Vec {
end_index: end_i,
rust_file: base_path.join(PathBuf::from(params[0])),
editable: editable,
+ escaped: escaped
}
)
}
@@ -115,8 +131,8 @@ fn test_find_playpens_simple_playpen() {
println!("\nOUTPUT: {:?}\n", find_playpens(s, Path::new("")));
assert!(find_playpens(s, Path::new("")) == vec![
- Playpen{start_index: 22, end_index: 42, rust_file: PathBuf::from("file.rs"), editable: false},
- Playpen{start_index: 47, end_index: 68, rust_file: PathBuf::from("test.rs"), editable: false}
+ Playpen{start_index: 22, end_index: 42, rust_file: PathBuf::from("file.rs"), editable: false, escaped: false},
+ Playpen{start_index: 47, end_index: 68, rust_file: PathBuf::from("test.rs"), editable: false, escaped: false}
]);
}
@@ -127,7 +143,18 @@ fn test_find_playpens_complex_playpen() {
println!("\nOUTPUT: {:?}\n", find_playpens(s, Path::new("dir")));
assert!(find_playpens(s, Path::new("dir")) == vec![
- Playpen{start_index: 22, end_index: 51, rust_file: PathBuf::from("dir/file.rs"), editable: true},
- Playpen{start_index: 56, end_index: 86, rust_file: PathBuf::from("dir/test.rs"), editable: true}
+ Playpen{start_index: 22, end_index: 51, rust_file: PathBuf::from("dir/file.rs"), editable: true, escaped: false},
+ Playpen{start_index: 56, end_index: 86, rust_file: PathBuf::from("dir/test.rs"), editable: true, escaped: false}
+ ]);
+}
+
+#[test]
+fn test_find_playpens_escaped_playpen() {
+ let s = "Some random text with escaped playpen \\{{#playpen file.rs editable}} ...";
+
+ println!("\nOUTPUT: {:?}\n", find_playpens(s, Path::new("")));
+
+ assert!(find_playpens(s, Path::new("")) == vec![
+ Playpen{start_index: 39, end_index: 68, rust_file: PathBuf::from("file.rs"), editable: true, escaped: true},
]);
}