Skip to content

Commit 59d3717

Browse files
authored
Merge pull request #2283 from sunng87/feature/hbd-5
feat: upgrade handlebars to 5.0
2 parents 11f839b + a42eafc commit 59d3717

File tree

5 files changed

+63
-31
lines changed

5 files changed

+63
-31
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ clap = { version = "4.3.12", features = ["cargo", "wrap_help"] }
2323
clap_complete = "4.3.2"
2424
once_cell = "1.17.1"
2525
env_logger = "0.10.0"
26-
handlebars = "4.3.7"
26+
handlebars = "5.0"
2727
log = "0.4.17"
2828
memchr = "2.5.0"
2929
opener = "0.6.1"

src/renderer/html_handlebars/helpers/navigation.rs

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
use std::collections::BTreeMap;
22
use std::path::Path;
33

4-
use handlebars::{Context, Handlebars, Helper, Output, RenderContext, RenderError, Renderable};
4+
use handlebars::{
5+
Context, Handlebars, Helper, Output, RenderContext, RenderError, RenderErrorReason, Renderable,
6+
};
57

68
use crate::utils;
79
use log::{debug, trace};
@@ -26,9 +28,9 @@ impl Target {
2628
) -> Result<Option<StringMap>, RenderError> {
2729
match *self {
2830
Target::Next => {
29-
let previous_path = previous_item
30-
.get("path")
31-
.ok_or_else(|| RenderError::new("No path found for chapter in JSON data"))?;
31+
let previous_path = previous_item.get("path").ok_or_else(|| {
32+
RenderErrorReason::Other("No path found for chapter in JSON data".to_owned())
33+
})?;
3234

3335
if previous_path == base_path {
3436
return Ok(Some(current_item.clone()));
@@ -54,15 +56,18 @@ fn find_chapter(
5456
debug!("Get data from context");
5557

5658
let chapters = rc.evaluate(ctx, "@root/chapters").and_then(|c| {
57-
serde_json::value::from_value::<Vec<StringMap>>(c.as_json().clone())
58-
.map_err(|_| RenderError::new("Could not decode the JSON data"))
59+
serde_json::value::from_value::<Vec<StringMap>>(c.as_json().clone()).map_err(|_| {
60+
RenderErrorReason::Other("Could not decode the JSON data".to_owned()).into()
61+
})
5962
})?;
6063

6164
let base_path = rc
6265
.evaluate(ctx, "@root/path")?
6366
.as_json()
6467
.as_str()
65-
.ok_or_else(|| RenderError::new("Type error for `path`, string expected"))?
68+
.ok_or_else(|| {
69+
RenderErrorReason::Other("Type error for `path`, string expected".to_owned())
70+
})?
6671
.replace('\"', "");
6772

6873
if !rc.evaluate(ctx, "@root/is_index")?.is_missing() {
@@ -108,7 +113,7 @@ fn find_chapter(
108113
}
109114

110115
fn render(
111-
_h: &Helper<'_, '_>,
116+
_h: &Helper<'_>,
112117
r: &Handlebars<'_>,
113118
ctx: &Context,
114119
rc: &mut RenderContext<'_, '_>,
@@ -122,7 +127,9 @@ fn render(
122127
.evaluate(ctx, "@root/path")?
123128
.as_json()
124129
.as_str()
125-
.ok_or_else(|| RenderError::new("Type error for `path`, string expected"))?
130+
.ok_or_else(|| {
131+
RenderErrorReason::Other("Type error for `path`, string expected".to_owned())
132+
})?
126133
.replace('\"', "");
127134

128135
context.insert(
@@ -132,32 +139,38 @@ fn render(
132139

133140
chapter
134141
.get("name")
135-
.ok_or_else(|| RenderError::new("No title found for chapter in JSON data"))
142+
.ok_or_else(|| {
143+
RenderErrorReason::Other("No title found for chapter in JSON data".to_owned())
144+
})
136145
.map(|name| context.insert("title".to_owned(), json!(name)))?;
137146

138147
chapter
139148
.get("path")
140-
.ok_or_else(|| RenderError::new("No path found for chapter in JSON data"))
149+
.ok_or_else(|| {
150+
RenderErrorReason::Other("No path found for chapter in JSON data".to_owned())
151+
})
141152
.and_then(|p| {
142153
Path::new(p)
143154
.with_extension("html")
144155
.to_str()
145-
.ok_or_else(|| RenderError::new("Link could not be converted to str"))
156+
.ok_or_else(|| {
157+
RenderErrorReason::Other("Link could not be converted to str".to_owned())
158+
})
146159
.map(|p| context.insert("link".to_owned(), json!(p.replace('\\', "/"))))
147160
})?;
148161

149162
trace!("Render template");
150163

151164
let t = _h
152165
.template()
153-
.ok_or_else(|| RenderError::new("Error with the handlebars template"))?;
166+
.ok_or_else(|| RenderErrorReason::Other("Error with the handlebars template".to_owned()))?;
154167
let local_ctx = Context::wraps(&context)?;
155168
let mut local_rc = rc.clone();
156169
t.render(r, &local_ctx, &mut local_rc, out)
157170
}
158171

159172
pub fn previous(
160-
_h: &Helper<'_, '_>,
173+
_h: &Helper<'_>,
161174
r: &Handlebars<'_>,
162175
ctx: &Context,
163176
rc: &mut RenderContext<'_, '_>,
@@ -173,7 +186,7 @@ pub fn previous(
173186
}
174187

175188
pub fn next(
176-
_h: &Helper<'_, '_>,
189+
_h: &Helper<'_>,
177190
r: &Handlebars<'_>,
178191
ctx: &Context,
179192
rc: &mut RenderContext<'_, '_>,

src/renderer/html_handlebars/helpers/theme.rs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
use handlebars::{Context, Handlebars, Helper, Output, RenderContext, RenderError};
1+
use handlebars::{
2+
Context, Handlebars, Helper, Output, RenderContext, RenderError, RenderErrorReason,
3+
};
24
use log::trace;
35

46
pub fn theme_option(
5-
h: &Helper<'_, '_>,
7+
h: &Helper<'_>,
68
_r: &Handlebars<'_>,
79
ctx: &Context,
810
rc: &mut RenderContext<'_, '_>,
@@ -11,14 +13,21 @@ pub fn theme_option(
1113
trace!("theme_option (handlebars helper)");
1214

1315
let param = h.param(0).and_then(|v| v.value().as_str()).ok_or_else(|| {
14-
RenderError::new("Param 0 with String type is required for theme_option helper.")
16+
RenderErrorReason::ParamTypeMismatchForName(
17+
"theme_option",
18+
"0".to_owned(),
19+
"string".to_owned(),
20+
)
1521
})?;
1622

1723
let default_theme = rc.evaluate(ctx, "@root/default_theme")?;
18-
let default_theme_name = default_theme
19-
.as_json()
20-
.as_str()
21-
.ok_or_else(|| RenderError::new("Type error for `default_theme`, string expected"))?;
24+
let default_theme_name = default_theme.as_json().as_str().ok_or_else(|| {
25+
RenderErrorReason::ParamTypeMismatchForName(
26+
"theme_option",
27+
"default_theme".to_owned(),
28+
"string".to_owned(),
29+
)
30+
})?;
2231

2332
out.write(param)?;
2433
if param.to_lowercase() == default_theme_name.to_lowercase() {

src/renderer/html_handlebars/helpers/toc.rs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ use std::{cmp::Ordering, collections::BTreeMap};
44
use crate::utils;
55
use crate::utils::bracket_escape;
66

7-
use handlebars::{Context, Handlebars, Helper, HelperDef, Output, RenderContext, RenderError};
7+
use handlebars::{
8+
Context, Handlebars, Helper, HelperDef, Output, RenderContext, RenderError, RenderErrorReason,
9+
};
810

911
// Handlebars helper to construct TOC
1012
#[derive(Clone, Copy)]
@@ -15,7 +17,7 @@ pub struct RenderToc {
1517
impl HelperDef for RenderToc {
1618
fn call<'reg: 'rc, 'rc>(
1719
&self,
18-
_h: &Helper<'reg, 'rc>,
20+
_h: &Helper<'rc>,
1921
_r: &'reg Handlebars<'_>,
2022
ctx: &'rc Context,
2123
rc: &mut RenderContext<'reg, 'rc>,
@@ -26,13 +28,17 @@ impl HelperDef for RenderToc {
2628
// param is the key of value you want to display
2729
let chapters = rc.evaluate(ctx, "@root/chapters").and_then(|c| {
2830
serde_json::value::from_value::<Vec<BTreeMap<String, String>>>(c.as_json().clone())
29-
.map_err(|_| RenderError::new("Could not decode the JSON data"))
31+
.map_err(|_| {
32+
RenderErrorReason::Other("Could not decode the JSON data".to_owned()).into()
33+
})
3034
})?;
3135
let current_path = rc
3236
.evaluate(ctx, "@root/path")?
3337
.as_json()
3438
.as_str()
35-
.ok_or_else(|| RenderError::new("Type error for `path`, string expected"))?
39+
.ok_or_else(|| {
40+
RenderErrorReason::Other("Type error for `path`, string expected".to_owned())
41+
})?
3642
.replace('\"', "");
3743

3844
let current_section = rc
@@ -46,13 +52,17 @@ impl HelperDef for RenderToc {
4652
.evaluate(ctx, "@root/fold_enable")?
4753
.as_json()
4854
.as_bool()
49-
.ok_or_else(|| RenderError::new("Type error for `fold_enable`, bool expected"))?;
55+
.ok_or_else(|| {
56+
RenderErrorReason::Other("Type error for `fold_enable`, bool expected".to_owned())
57+
})?;
5058

5159
let fold_level = rc
5260
.evaluate(ctx, "@root/fold_level")?
5361
.as_json()
5462
.as_u64()
55-
.ok_or_else(|| RenderError::new("Type error for `fold_level`, u64 expected"))?;
63+
.ok_or_else(|| {
64+
RenderErrorReason::Other("Type error for `fold_level`, u64 expected".to_owned())
65+
})?;
5666

5767
out.write("<ol class=\"chapter\">")?;
5868

0 commit comments

Comments
 (0)