From 842196b91cdbaefbb0439decbba073574d8e4c21 Mon Sep 17 00:00:00 2001 From: Mathieu David Date: Tue, 4 Aug 2015 12:51:07 +0200 Subject: [PATCH] Cleaned up the handlebars helpers, it's a lot more customizable because the user can put whatever template he wants inside and I just expose link and name of previous / next chapter. JavaScript part is removed. #26 --- book-example/book/README.html | 2 + book-example/book/book.js | 9 -- book-example/book/cli/build.html | 6 +- book-example/book/cli/cli-tool.html | 6 +- book-example/book/cli/init.html | 6 +- book-example/book/format/config.html | 8 +- book-example/book/index.html | 2 + .../html_handlebars/hbs_navigation_helper.rs | 87 ++++++++++++++----- src/theme/book.js | 9 -- src/theme/index.hbs | 4 +- 10 files changed, 88 insertions(+), 51 deletions(-) diff --git a/book-example/book/README.html b/book-example/book/README.html index 1d370558..c9ff38be 100644 --- a/book-example/book/README.html +++ b/book-example/book/README.html @@ -46,9 +46,11 @@ Issues and feature requests can be posted on the + diff --git a/book-example/book/book.js b/book-example/book/book.js index d3cff82f..643755e5 100644 --- a/book-example/book/book.js +++ b/book-example/book/book.js @@ -14,13 +14,4 @@ $( document ).ready(function() { } }); - - // Hide navigation icons when there is no next or previous link - // JavaScript Solution until I find a way to do this in the template - $(".nav-chapters").each(function(){ - if(!$(this).attr('href')){ - this.remove(); - } - }); - }); diff --git a/book-example/book/cli/build.html b/book-example/book/cli/build.html index 35cd3293..93b623c4 100644 --- a/book-example/book/cli/build.html +++ b/book-example/book/cli/build.html @@ -50,16 +50,18 @@ current working directory.

alternative until I find a way to do it in the template --> - + + diff --git a/book-example/book/cli/cli-tool.html b/book-example/book/cli/cli-tool.html index ffb7adae..353fe924 100644 --- a/book-example/book/cli/cli-tool.html +++ b/book-example/book/cli/cli-tool.html @@ -38,16 +38,18 @@ Let's focus on the command line tool capabilities first.

alternative until I find a way to do it in the template --> - + + diff --git a/book-example/book/cli/init.html b/book-example/book/cli/init.html index e6e7c6e4..2044d848 100644 --- a/book-example/book/cli/init.html +++ b/book-example/book/cli/init.html @@ -67,16 +67,18 @@ not create the corresponding files, init command should create the files for him alternative until I find a way to do it in the template --> - + + diff --git a/book-example/book/format/config.html b/book-example/book/format/config.html index 95c4cdf2..f37a6042 100644 --- a/book-example/book/format/config.html +++ b/book-example/book/format/config.html @@ -49,16 +49,14 @@ alternative until I find a way to do it in the template --> - - + diff --git a/book-example/book/index.html b/book-example/book/index.html index 1d370558..c9ff38be 100644 --- a/book-example/book/index.html +++ b/book-example/book/index.html @@ -46,9 +46,11 @@ Issues and feature requests can be posted on the + diff --git a/src/renderer/html_handlebars/hbs_navigation_helper.rs b/src/renderer/html_handlebars/hbs_navigation_helper.rs index 817d37e5..cb8209e4 100644 --- a/src/renderer/html_handlebars/hbs_navigation_helper.rs +++ b/src/renderer/html_handlebars/hbs_navigation_helper.rs @@ -56,7 +56,7 @@ pub fn previous(c: &Context, _h: &Helper, r: &Handlebars, rc: &mut RenderContext Path::new(previous.get("path").unwrap()) .with_extension("html") ).to_str().unwrap()); - + previous_chapter.insert( "link".to_string(), path_to_root.join( @@ -67,11 +67,11 @@ pub fn previous(c: &Context, _h: &Helper, r: &Handlebars, rc: &mut RenderContext debug!("[*]: Inject in context"); // Inject in current context - c.extend(&previous_chapter); + let updated_context = c.extend(&previous_chapter); debug!("[*]: Render template"); // Render template - _h.template().unwrap().render(c, r, rc).unwrap(); + _h.template().unwrap().render(&updated_context, r, rc).unwrap(); } break; @@ -88,36 +88,81 @@ pub fn previous(c: &Context, _h: &Helper, r: &Handlebars, rc: &mut RenderContext -pub fn next(c: &Context, _h: &Helper, _: &Handlebars, rc: &mut RenderContext) -> Result<(), RenderError> { +pub fn next(c: &Context, _h: &Helper, r: &Handlebars, rc: &mut RenderContext) -> Result<(), RenderError> { + debug!("[fn]: next (handlebars helper)"); + + debug!("[*]: Get data from context"); // get value from context data // rc.get_path() is current json parent path, you should always use it like this // param is the key of value you want to display let chapters = c.navigate(rc.get_path(), "chapters"); - let current = c.navigate(rc.get_path(), "path").to_string().replace("\"", ""); - let path_to_root = c.navigate(rc.get_path(), "path_to_root").to_string().replace("\"", ""); + let current = c.navigate(rc.get_path(), "path") + .to_string() + .replace("\"", ""); + + let path_to_root = PathBuf::from( + c.navigate(rc.get_path(), "path_to_root") + .to_string() + .replace("\"", "") + ); + + debug!("[*]: Decode chapters from JSON"); // Decode json format - let decoded: Vec> = json::decode(&chapters.to_string()).unwrap(); - - let mut is_current = false; + let decoded: Vec> = json::decode(&chapters.to_string()).unwrap(); + let mut previous: Option> = None; + debug!("[*]: Search for current Chapter"); + // Search for current chapter and return previous entry for item in decoded { - if let Some(path) = item.get("path") { - if path.len() > 0 { - if is_current { - let mut next = PathBuf::from(path); - next.set_extension("html"); - try!(rc.writer.write(path_to_root.as_bytes())); - try!(rc.writer.write(next.to_str().unwrap().as_bytes())); - break; - } else if path == ¤t { - is_current = true; + match item.get("path") { + + Some(path) if path.len() > 0 => { + + if let Some(previous) = previous { + if previous.get("path").unwrap() == ¤t { + + debug!("[*]: Found current chapter"); + debug!("[*]: Creating BTreeMap to inject in context"); + // Create new BTreeMap to extend the context: 'title' and 'link' + let mut next_chapter = BTreeMap::new(); + + debug!("[*]: Inserting title: {}", item.get("name").unwrap()); + next_chapter.insert("title".to_string(), item.get("name").unwrap().to_json()); + + debug!("[*]: Inserting link: {}", + path_to_root.join( + Path::new(item.get("path").unwrap()) + .with_extension("html") + ).to_str().unwrap()); + + next_chapter.insert( + "link".to_string(), + path_to_root.join( + Path::new(item.get("path").unwrap()) + .with_extension("html") + ).to_str().unwrap().to_json() + ); + + debug!("[*]: Inject in context"); + // Inject in current context + let updated_context = c.extend(&next_chapter); + + debug!("[*]: Render template"); + // Render template + _h.template().unwrap().render(&updated_context, r, rc).unwrap(); + + break + } } - } + + previous = Some(item.clone()); + }, + + _ => continue, } } - Ok(()) } diff --git a/src/theme/book.js b/src/theme/book.js index d3cff82f..643755e5 100644 --- a/src/theme/book.js +++ b/src/theme/book.js @@ -14,13 +14,4 @@ $( document ).ready(function() { } }); - - // Hide navigation icons when there is no next or previous link - // JavaScript Solution until I find a way to do this in the template - $(".nav-chapters").each(function(){ - if(!$(this).attr('href')){ - this.remove(); - } - }); - }); diff --git a/src/theme/index.hbs b/src/theme/index.hbs index 5f8839b5..217e1455 100644 --- a/src/theme/index.hbs +++ b/src/theme/index.hbs @@ -42,9 +42,11 @@ - + {{/next}}