From 38b2dee17e89eb3784c48fea3408a0d55844cc31 Mon Sep 17 00:00:00 2001 From: Mathieu David Date: Thu, 31 Dec 2015 14:04:11 +0100 Subject: [PATCH] Continue #29 Check that the rust file exists and read to string --- src/renderer/html_handlebars/hbs_renderer.rs | 6 ++- .../html_handlebars/helpers/playpen.rs | 51 ++++++++++++------- 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/renderer/html_handlebars/hbs_renderer.rs b/src/renderer/html_handlebars/hbs_renderer.rs index acd06ef0..9f9e8f57 100644 --- a/src/renderer/html_handlebars/hbs_renderer.rs +++ b/src/renderer/html_handlebars/hbs_renderer.rs @@ -71,8 +71,12 @@ impl Renderer for HtmlHandlebars { debug!("[*]: Reading file"); try!(f.read_to_string(&mut content)); + // Parse for playpen links + if let Some(p) = path.parent() { + helpers::playpen::render_playpen(&mut content, p); + } + // Render markdown using the pulldown-cmark crate - helpers::playpen::render_playpen(&mut content); content = utils::render_markdown(&content); print_content.push_str(&content); diff --git a/src/renderer/html_handlebars/helpers/playpen.rs b/src/renderer/html_handlebars/helpers/playpen.rs index 115c3884..7d25a3db 100644 --- a/src/renderer/html_handlebars/helpers/playpen.rs +++ b/src/renderer/html_handlebars/helpers/playpen.rs @@ -1,9 +1,26 @@ use std::path::{Path, PathBuf}; +use std::fs::File; +use std::io::Read; -pub fn render_playpen(s: &mut str) { +pub fn render_playpen(s: &mut str, path: &Path) { + // When replacing one thing in a string by something with a different length, the indices + // after that will not correspond, we therefore have to store the difference to correct this + let difference_index = 0; - for playpen in find_playpens(s) { - println!("Playpen{{ {}, {}, {:?}, {} }}", playpen.start_index, playpen.end_index, playpen.rust_file, playpen.editable); + for playpen in find_playpens(s, path) { + + // 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()); + continue + } + + // Open file & read file + let mut file = if let Ok(f) = File::open(&playpen.rust_file) { f } else { continue }; + let mut file_content = String::new(); + if let Err(_) = file.read_to_string(&mut file_content) { continue }; + + //println!("Playpen{{ {}, {}, {:?}, {} }}", playpen.start_index, playpen.end_index, playpen.rust_file, playpen.editable); } } @@ -16,21 +33,21 @@ struct Playpen{ editable: bool } -fn find_playpens(s: &str) -> Vec { +fn find_playpens(s: &str, base_path: &Path) -> Vec { let mut playpens = vec![]; for (i, _) in s.match_indices("{{#playpen") { - println!("[*]: find_playpen"); + debug!("[*]: find_playpen"); // 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; - println!("s[{}..{}] = {}", i, end_i, s[i..end_i].to_string()); + debug!("s[{}..{}] = {}", i, end_i, s[i..end_i].to_string()); // If there is nothing between "{{#playpen" and "}}" skip if end_i-2 - (i+10) < 1 { continue } if s[i+10..end_i-2].trim().len() == 0 { continue } - println!("{}", s[i+10..end_i-2].to_string()); + debug!("{}", s[i+10..end_i-2].to_string()); // Split on whitespaces let params: Vec<&str> = s[i+10..end_i-2].split_whitespace().collect(); @@ -44,7 +61,7 @@ fn find_playpens(s: &str) -> Vec { Playpen{ start_index: i as u32, end_index: end_i as u32, - rust_file: PathBuf::from(params[0]), + rust_file: base_path.join(PathBuf::from(params[0])), editable: editable, } ) @@ -64,28 +81,28 @@ fn find_playpens(s: &str) -> Vec { #[test] fn test_find_playpens_no_playpen() { let s = "Some random text without playpen..."; - assert!(find_playpens(s) == vec![]); + assert!(find_playpens(s, Path::new("")) == vec![]); } #[test] fn test_find_playpens_partial_playpen() { let s = "Some random text with {{#playpen..."; - assert!(find_playpens(s) == vec![]); + assert!(find_playpens(s, Path::new("")) == vec![]); } #[test] fn test_find_playpens_empty_playpen() { let s = "Some random text with {{#playpen}} and {{#playpen }}..."; - assert!(find_playpens(s) == vec![]); + assert!(find_playpens(s, Path::new("")) == vec![]); } #[test] fn test_find_playpens_simple_playpen() { let s = "Some random text with {{#playpen file.rs}} and {{#playpen test.rs }}..."; - println!("\nOUTPUT: {:?}\n", find_playpens(s)); + println!("\nOUTPUT: {:?}\n", find_playpens(s, Path::new(""))); - assert!(find_playpens(s) == vec![ + 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} ]); @@ -95,10 +112,10 @@ fn test_find_playpens_simple_playpen() { fn test_find_playpens_complex_playpen() { let s = "Some random text with {{#playpen file.rs editable}} and {{#playpen test.rs editable }}..."; - println!("\nOUTPUT: {:?}\n", find_playpens(s)); + println!("\nOUTPUT: {:?}\n", find_playpens(s, Path::new("dir"))); - assert!(find_playpens(s) == vec![ - Playpen{start_index: 22, end_index: 51, rust_file: PathBuf::from("file.rs"), editable: true}, - Playpen{start_index: 56, end_index: 86, rust_file: PathBuf::from("test.rs"), editable: true} + 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} ]); }