From 34ed98bcf2d1cd99428cd83d74c08e48e2859619 Mon Sep 17 00:00:00 2001 From: Ning Sun Date: Sun, 5 Aug 2018 15:08:47 +0800 Subject: [PATCH] (feat) update to handlebars 1.0 --- Cargo.lock | 7 ++- Cargo.toml | 2 +- .../html_handlebars/helpers/navigation.rs | 29 +++++---- src/renderer/html_handlebars/helpers/toc.rs | 61 +++++++++---------- 4 files changed, 51 insertions(+), 48 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 407139106f..efd7226286 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -279,7 +279,7 @@ dependencies = [ [[package]] name = "handlebars" -version = "0.32.4" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -290,6 +290,7 @@ dependencies = [ "regex 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", + "walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -511,7 +512,7 @@ dependencies = [ "elasticlunr-rs 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "handlebars 0.32.4 (registry+https://github.com/rust-lang/crates.io-index)", + "handlebars 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "iron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1435,7 +1436,7 @@ dependencies = [ "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum futf 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7c9c1ce3fa9336301af935ab852c437817d14cd33690446569392e65170aac3b" "checksum getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "0a7292d30132fb5424b354f5dc02512a86e4c516fe544bb7a25e7f266951b797" -"checksum handlebars 0.32.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d89ec99d1594f285d4590fc32bac5f75cdab383f1123d504d27862c644a807dd" +"checksum handlebars 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df2594295f9b79788875e0102718eb2eeea55f26ee18bee134c22db5c80e9d3e" "checksum html5ever 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a49d5001dd1bddf042ea41ed4e0a671d50b1bf187e66b349d7ec613bdce4ad90" "checksum html5ever 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b04478cf718862650a0bf66acaf8f2f8c906fbc703f35c916c1f4211b069a364" "checksum httparse 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7b6288d7db100340ca12873fd4d08ad1b8f206a9457798dfb17c018a33fee540" diff --git a/Cargo.toml b/Cargo.toml index a38f0c4253..19f152371a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ exclude = ["book-example/*"] [dependencies] clap = "2.24" chrono = "0.4" -handlebars = "0.32" +handlebars = "1.0" serde = "1.0" serde_derive = "1.0" error-chain = "0.12" diff --git a/src/renderer/html_handlebars/helpers/navigation.rs b/src/renderer/html_handlebars/helpers/navigation.rs index 2e3fd40a8c..77d3b01b56 100644 --- a/src/renderer/html_handlebars/helpers/navigation.rs +++ b/src/renderer/html_handlebars/helpers/navigation.rs @@ -1,7 +1,7 @@ use std::collections::BTreeMap; use std::path::Path; -use handlebars::{Context, Handlebars, Helper, RenderContext, RenderError, Renderable}; +use handlebars::{Context, Handlebars, Helper, Output, RenderContext, RenderError, Renderable}; use serde_json; use utils; @@ -45,16 +45,16 @@ impl Target { } } -fn find_chapter(rc: &mut RenderContext, target: Target) -> Result, RenderError> { +fn find_chapter(ctx: &Context, rc: &mut RenderContext, target: Target) -> Result, RenderError> { debug!("Get data from context"); - let chapters = rc.evaluate_absolute("chapters", true).and_then(|c| { + let chapters = rc.evaluate_absolute(ctx, "chapters", true).and_then(|c| { serde_json::value::from_value::>(c.clone()) .map_err(|_| RenderError::new("Could not decode the JSON data")) })?; let base_path = rc - .evaluate_absolute("path", true)? + .evaluate_absolute(ctx, "path", true)? .as_str() .ok_or_else(|| RenderError::new("Type error for `path`, string expected"))? .replace("\"", ""); @@ -84,14 +84,16 @@ fn find_chapter(rc: &mut RenderContext, target: Target) -> Result Result<(), RenderError> { trace!("Creating BTreeMap to inject in context"); let mut context = BTreeMap::new(); let base_path = rc - .evaluate_absolute("path", false)? + .evaluate_absolute(ctx, "path", false)? .as_str() .ok_or_else(|| RenderError::new("Type error for `path`, string expected"))? .replace("\"", ""); @@ -122,28 +124,29 @@ fn render( _h.template() .ok_or_else(|| RenderError::new("Error with the handlebars template")) .and_then(|t| { - let mut local_rc = rc.with_context(Context::wraps(&context)?); - t.render(r, &mut local_rc) + let mut local_rc = rc.new_for_block(); + let local_ctx = Context::wraps(&context)?; + t.render(r, &local_ctx, &mut local_rc, out) })?; Ok(()) } -pub fn previous(_h: &Helper, r: &Handlebars, rc: &mut RenderContext) -> Result<(), RenderError> { +pub fn previous(_h: &Helper, r: &Handlebars, ctx: &Context, rc: &mut RenderContext, out: &mut Output) -> Result<(), RenderError> { trace!("previous (handlebars helper)"); - if let Some(previous) = find_chapter(rc, Target::Previous)? { - render(_h, r, rc, &previous)?; + if let Some(previous) = find_chapter(ctx, rc, Target::Previous)? { + render(_h, r, ctx, rc, out, &previous)?; } Ok(()) } -pub fn next(_h: &Helper, r: &Handlebars, rc: &mut RenderContext) -> Result<(), RenderError> { +pub fn next(_h: &Helper, r: &Handlebars, ctx: &Context, rc: &mut RenderContext, out: &mut Output) -> Result<(), RenderError> { trace!("next (handlebars helper)"); - if let Some(next) = find_chapter(rc, Target::Next)? { - render(_h, r, rc, &next)?; + if let Some(next) = find_chapter(ctx, rc, Target::Next)? { + render(_h, r, ctx, rc, out, &next)?; } Ok(()) diff --git a/src/renderer/html_handlebars/helpers/toc.rs b/src/renderer/html_handlebars/helpers/toc.rs index 1e38f56b2e..fdec1fe8b1 100644 --- a/src/renderer/html_handlebars/helpers/toc.rs +++ b/src/renderer/html_handlebars/helpers/toc.rs @@ -3,7 +3,7 @@ use std::path::Path; use utils; -use handlebars::{Handlebars, Helper, HelperDef, RenderContext, RenderError}; +use handlebars::{Context, Handlebars, Helper, HelperDef, Output, RenderContext, RenderError}; use pulldown_cmark::{html, Event, Parser, Tag}; use serde_json; @@ -14,28 +14,28 @@ pub struct RenderToc { } impl HelperDef for RenderToc { - fn call(&self, _h: &Helper, _: &Handlebars, rc: &mut RenderContext) -> Result<(), RenderError> { + fn call<'reg:'rc, 'rc>(&self, _h: &Helper, _: &Handlebars, ctx: &Context, rc: &mut RenderContext, out: &mut Output) -> Result<(), RenderError> { // 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 = rc.evaluate_absolute("chapters", true).and_then(|c| { + let chapters = rc.evaluate_absolute(ctx, "chapters", true).and_then(|c| { serde_json::value::from_value::>>(c.clone()) .map_err(|_| RenderError::new("Could not decode the JSON data")) })?; let current = rc - .evaluate_absolute("path", true)? + .evaluate_absolute(ctx, "path", true)? .as_str() .ok_or_else(|| RenderError::new("Type error for `path`, string expected"))? .replace("\"", ""); - rc.writer.write_all(b"
    ")?; + out.write("
      ")?; let mut current_level = 1; for item in chapters { // Spacer if item.get("spacer").is_some() { - rc.writer.write_all(b"
    1. ")?; + out.write("
    2. ")?; continue; } @@ -47,30 +47,30 @@ impl HelperDef for RenderToc { if level > current_level { while level > current_level { - rc.writer.write_all(b"
    3. ")?; - rc.writer.write_all(b"
        ")?; + out.write("
      1. ")?; + out.write("
          ")?; current_level += 1; } - rc.writer.write_all(b"
        1. ")?; + out.write("
        2. ")?; } else if level < current_level { while level < current_level { - rc.writer.write_all(b"
        ")?; - rc.writer.write_all(b"
      2. ")?; + out.write("
      ")?; + out.write("
    4. ")?; current_level -= 1; } - rc.writer.write_all(b"
    5. ")?; + out.write("
    6. ")?; } else { - rc.writer.write_all(b"")?; + out.write(">")?; } // Link let path_exists = if let Some(path) = item.get("path") { if !path.is_empty() { - rc.writer.write_all(b"")?; + out.write(">")?; true } else { false @@ -101,9 +100,9 @@ impl HelperDef for RenderToc { if !self.no_section_label { // Section does not necessarily exist if let Some(section) = item.get("section") { - rc.writer.write_all(b"")?; - rc.writer.write_all(section.as_bytes())?; - rc.writer.write_all(b" ")?; + out.write("")?; + out.write(§ion)?; + out.write(" ")?; } } @@ -124,22 +123,22 @@ impl HelperDef for RenderToc { html::push_html(&mut markdown_parsed_name, parser); // write to the handlebars template - rc.writer.write_all(markdown_parsed_name.as_bytes())?; + out.write(&markdown_parsed_name)?; } if path_exists { - rc.writer.write_all(b"")?; + out.write("")?; } - rc.writer.write_all(b"
    7. ")?; + out.write("")?; } while current_level > 1 { - rc.writer.write_all(b"
    ")?; - rc.writer.write_all(b"")?; + out.write("
")?; + out.write("")?; current_level -= 1; } - rc.writer.write_all(b"")?; + out.write("")?; Ok(()) } }