Merge the updated handlebars helpers in master. Closes #26
This commit is contained in:
commit
16318273f3
|
@ -24,7 +24,7 @@
|
||||||
<i id="sidebar-toggle" class="fa fa-bars left"></i>
|
<i id="sidebar-toggle" class="fa fa-bars left"></i>
|
||||||
<h1 class="menu-title">mdBook Documentation</h1>
|
<h1 class="menu-title">mdBook Documentation</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="content" class="content">
|
<div id="content" class="content">
|
||||||
<h1>mdBook</h1>
|
<h1>mdBook</h1>
|
||||||
<p><strong>mdBook</strong> is a command line tool and Rust library to create books using Markdown.
|
<p><strong>mdBook</strong> is a command line tool and Rust library to create books using Markdown.
|
||||||
|
@ -42,15 +42,15 @@ Issues and feature requests can be posted on the <a href="https://github.com/aze
|
||||||
Doesn't seem to work: using JavaScript
|
Doesn't seem to work: using JavaScript
|
||||||
alternative until I find a way to do it in the template
|
alternative until I find a way to do it in the template
|
||||||
-->
|
-->
|
||||||
<a href="" class="nav-chapters previous">
|
|
||||||
<i class="fa fa-angle-left"></i>
|
|
||||||
</a>
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|
||||||
<a href="cli/cli-tool.html" class="nav-chapters next">
|
<a href="cli/cli-tool.html" class="nav-chapters next">
|
||||||
<i class="fa fa-angle-right"></i>
|
<i class="fa fa-angle-right"></i>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
<i id="sidebar-toggle" class="fa fa-bars left"></i>
|
<i id="sidebar-toggle" class="fa fa-bars left"></i>
|
||||||
<h1 class="menu-title">mdBook Documentation</h1>
|
<h1 class="menu-title">mdBook Documentation</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="content" class="content">
|
<div id="content" class="content">
|
||||||
<h1>The build command</h1>
|
<h1>The build command</h1>
|
||||||
<p>The build command is used to render your book:</p>
|
<p>The build command is used to render your book:</p>
|
||||||
|
@ -49,15 +49,19 @@ current working directory.</p>
|
||||||
Doesn't seem to work: using JavaScript
|
Doesn't seem to work: using JavaScript
|
||||||
alternative until I find a way to do it in the template
|
alternative until I find a way to do it in the template
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<a href="../cli/init.html" class="nav-chapters previous">
|
<a href="../cli/init.html" class="nav-chapters previous">
|
||||||
<i class="fa fa-angle-left"></i>
|
<i class="fa fa-angle-left"></i>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|
||||||
<a href="../format/config.html" class="nav-chapters next">
|
<a href="../format/config.html" class="nav-chapters next">
|
||||||
<i class="fa fa-angle-right"></i>
|
<i class="fa fa-angle-right"></i>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
<i id="sidebar-toggle" class="fa fa-bars left"></i>
|
<i id="sidebar-toggle" class="fa fa-bars left"></i>
|
||||||
<h1 class="menu-title">mdBook Documentation</h1>
|
<h1 class="menu-title">mdBook Documentation</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="content" class="content">
|
<div id="content" class="content">
|
||||||
<h1>Command Line Tool</h1>
|
<h1>Command Line Tool</h1>
|
||||||
<p>mdBook can be used either as a command line tool or a Rust library.
|
<p>mdBook can be used either as a command line tool or a Rust library.
|
||||||
|
@ -37,15 +37,19 @@ Let's focus on the command line tool capabilities first.</p>
|
||||||
Doesn't seem to work: using JavaScript
|
Doesn't seem to work: using JavaScript
|
||||||
alternative until I find a way to do it in the template
|
alternative until I find a way to do it in the template
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<a href="../README.html" class="nav-chapters previous">
|
<a href="../README.html" class="nav-chapters previous">
|
||||||
<i class="fa fa-angle-left"></i>
|
<i class="fa fa-angle-left"></i>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|
||||||
<a href="../cli/init.html" class="nav-chapters next">
|
<a href="../cli/init.html" class="nav-chapters next">
|
||||||
<i class="fa fa-angle-right"></i>
|
<i class="fa fa-angle-right"></i>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
<i id="sidebar-toggle" class="fa fa-bars left"></i>
|
<i id="sidebar-toggle" class="fa fa-bars left"></i>
|
||||||
<h1 class="menu-title">mdBook Documentation</h1>
|
<h1 class="menu-title">mdBook Documentation</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="content" class="content">
|
<div id="content" class="content">
|
||||||
<h1>The init command</h1>
|
<h1>The init command</h1>
|
||||||
<p>The init command, used like this:</p>
|
<p>The init command, used like this:</p>
|
||||||
|
@ -66,15 +66,19 @@ not create the corresponding files, init command should create the files for him
|
||||||
Doesn't seem to work: using JavaScript
|
Doesn't seem to work: using JavaScript
|
||||||
alternative until I find a way to do it in the template
|
alternative until I find a way to do it in the template
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<a href="../cli/cli-tool.html" class="nav-chapters previous">
|
<a href="../cli/cli-tool.html" class="nav-chapters previous">
|
||||||
<i class="fa fa-angle-left"></i>
|
<i class="fa fa-angle-left"></i>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|
||||||
<a href="../cli/build.html" class="nav-chapters next">
|
<a href="../cli/build.html" class="nav-chapters next">
|
||||||
<i class="fa fa-angle-right"></i>
|
<i class="fa fa-angle-right"></i>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
<i id="sidebar-toggle" class="fa fa-bars left"></i>
|
<i id="sidebar-toggle" class="fa fa-bars left"></i>
|
||||||
<h1 class="menu-title">mdBook Documentation</h1>
|
<h1 class="menu-title">mdBook Documentation</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="content" class="content">
|
<div id="content" class="content">
|
||||||
<h1>Configuration</h1>
|
<h1>Configuration</h1>
|
||||||
<p>You can configure the parameters for your book in the <code>book.json</code> file.</p>
|
<p>You can configure the parameters for your book in the <code>book.json</code> file.</p>
|
||||||
|
@ -48,15 +48,15 @@
|
||||||
Doesn't seem to work: using JavaScript
|
Doesn't seem to work: using JavaScript
|
||||||
alternative until I find a way to do it in the template
|
alternative until I find a way to do it in the template
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<a href="../cli/build.html" class="nav-chapters previous">
|
<a href="../cli/build.html" class="nav-chapters previous">
|
||||||
<i class="fa fa-angle-left"></i>
|
<i class="fa fa-angle-left"></i>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<a href="" class="nav-chapters next">
|
|
||||||
<i class="fa fa-angle-right"></i>
|
|
||||||
</a>
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
<i id="sidebar-toggle" class="fa fa-bars left"></i>
|
<i id="sidebar-toggle" class="fa fa-bars left"></i>
|
||||||
<h1 class="menu-title">mdBook Documentation</h1>
|
<h1 class="menu-title">mdBook Documentation</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="content" class="content">
|
<div id="content" class="content">
|
||||||
<h1>mdBook</h1>
|
<h1>mdBook</h1>
|
||||||
<p><strong>mdBook</strong> is a command line tool and Rust library to create books using Markdown.
|
<p><strong>mdBook</strong> is a command line tool and Rust library to create books using Markdown.
|
||||||
|
@ -42,15 +42,15 @@ Issues and feature requests can be posted on the <a href="https://github.com/aze
|
||||||
Doesn't seem to work: using JavaScript
|
Doesn't seem to work: using JavaScript
|
||||||
alternative until I find a way to do it in the template
|
alternative until I find a way to do it in the template
|
||||||
-->
|
-->
|
||||||
<a href="" class="nav-chapters previous">
|
|
||||||
<i class="fa fa-angle-left"></i>
|
|
||||||
</a>
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|
||||||
<a href="cli/cli-tool.html" class="nav-chapters next">
|
<a href="cli/cli-tool.html" class="nav-chapters next">
|
||||||
<i class="fa fa-angle-right"></i>
|
<i class="fa fa-angle-right"></i>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,82 +1,168 @@
|
||||||
extern crate handlebars;
|
extern crate handlebars;
|
||||||
extern crate rustc_serialize;
|
extern crate rustc_serialize;
|
||||||
|
|
||||||
use std::path::{PathBuf};
|
use std::path::{PathBuf, Path};
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
|
|
||||||
use self::rustc_serialize::json;
|
use self::rustc_serialize::json::{self, ToJson};
|
||||||
use self::handlebars::{Handlebars, RenderError, RenderContext, Helper, Context};
|
use self::handlebars::{Handlebars, RenderError, RenderContext, Helper, Context, Renderable};
|
||||||
|
|
||||||
// Handlebars helper for navigation
|
// Handlebars helper for navigation
|
||||||
|
|
||||||
pub fn previous(c: &Context, _h: &Helper, _: &Handlebars, rc: &mut RenderContext) -> Result<(), RenderError> {
|
pub fn previous(c: &Context, _h: &Helper, r: &Handlebars, rc: &mut RenderContext) -> Result<(), RenderError> {
|
||||||
|
debug!("[fn]: previous (handlebars helper)");
|
||||||
|
|
||||||
|
debug!("[*]: Get data from context");
|
||||||
// get value from context data
|
// get value from context data
|
||||||
// rc.get_path() is current json parent path, you should always use it like this
|
// 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
|
// param is the key of value you want to display
|
||||||
let chapters = c.navigate(rc.get_path(), "chapters");
|
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("\"", "");
|
|
||||||
|
|
||||||
try!(rc.writer.write(path_to_root.as_bytes()));
|
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
|
// Decode json format
|
||||||
let decoded: Vec<BTreeMap<String,String>> = json::decode(&chapters.to_string()).unwrap();
|
let decoded: Vec<BTreeMap<String, String>> = json::decode(&chapters.to_string()).unwrap();
|
||||||
|
let mut previous: Option<BTreeMap<String, String>> = None;
|
||||||
let mut previous = PathBuf::from("");
|
|
||||||
|
|
||||||
|
debug!("[*]: Search for current Chapter");
|
||||||
|
// Search for current chapter and return previous entry
|
||||||
for item in decoded {
|
for item in decoded {
|
||||||
|
|
||||||
if let Some(path) = item.get("path") {
|
match item.get("path") {
|
||||||
previous = if path.len() > 0 {
|
Some(path) if path.len() > 0 => {
|
||||||
|
|
||||||
if path == ¤t {
|
if path == ¤t {
|
||||||
previous.set_extension("html");
|
|
||||||
try!(rc.writer.write(previous.to_str().unwrap().as_bytes()));
|
debug!("[*]: Found current chapter");
|
||||||
|
if let Some(previous) = previous{
|
||||||
|
|
||||||
|
debug!("[*]: Creating BTreeMap to inject in context");
|
||||||
|
// Create new BTreeMap to extend the context: 'title' and 'link'
|
||||||
|
let mut previous_chapter = BTreeMap::new();
|
||||||
|
|
||||||
|
debug!("[*]: Inserting title: {}", previous.get("name").unwrap());
|
||||||
|
previous_chapter.insert("title".to_string(), previous.get("name").unwrap().to_json());
|
||||||
|
|
||||||
|
debug!("[*]: Inserting link: {}",
|
||||||
|
path_to_root.join(
|
||||||
|
Path::new(previous.get("path").unwrap())
|
||||||
|
.with_extension("html")
|
||||||
|
).to_str().unwrap());
|
||||||
|
|
||||||
|
previous_chapter.insert(
|
||||||
|
"link".to_string(),
|
||||||
|
path_to_root.join(
|
||||||
|
Path::new(previous.get("path").unwrap())
|
||||||
|
.with_extension("html")
|
||||||
|
).to_str().unwrap().to_json()
|
||||||
|
);
|
||||||
|
|
||||||
|
debug!("[*]: Inject in context");
|
||||||
|
// Inject in current context
|
||||||
|
let updated_context = c.extend(&previous_chapter);
|
||||||
|
|
||||||
|
debug!("[*]: Render template");
|
||||||
|
// Render template
|
||||||
|
_h.template().unwrap().render(&updated_context, r, rc).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
PathBuf::from(path)
|
previous = Some(item.clone());
|
||||||
|
}
|
||||||
} else { previous }
|
},
|
||||||
|
_ => continue,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
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
|
// get value from context data
|
||||||
// rc.get_path() is current json parent path, you should always use it like this
|
// 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
|
// param is the key of value you want to display
|
||||||
let chapters = c.navigate(rc.get_path(), "chapters");
|
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
|
// Decode json format
|
||||||
let decoded: Vec<BTreeMap<String,String>> = json::decode(&chapters.to_string()).unwrap();
|
let decoded: Vec<BTreeMap<String, String>> = json::decode(&chapters.to_string()).unwrap();
|
||||||
|
let mut previous: Option<BTreeMap<String, String>> = None;
|
||||||
let mut is_current = false;
|
|
||||||
|
|
||||||
|
debug!("[*]: Search for current Chapter");
|
||||||
|
// Search for current chapter and return previous entry
|
||||||
for item in decoded {
|
for item in decoded {
|
||||||
|
|
||||||
if let Some(path) = item.get("path") {
|
match item.get("path") {
|
||||||
if path.len() > 0 {
|
|
||||||
if is_current {
|
Some(path) if path.len() > 0 => {
|
||||||
let mut next = PathBuf::from(path);
|
|
||||||
next.set_extension("html");
|
if let Some(previous) = previous {
|
||||||
try!(rc.writer.write(path_to_root.as_bytes()));
|
if previous.get("path").unwrap() == ¤t {
|
||||||
try!(rc.writer.write(next.to_str().unwrap().as_bytes()));
|
|
||||||
break;
|
debug!("[*]: Found current chapter");
|
||||||
} else if path == ¤t {
|
debug!("[*]: Creating BTreeMap to inject in context");
|
||||||
is_current = true;
|
// 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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
<i id="sidebar-toggle" class="fa fa-bars left"></i>
|
<i id="sidebar-toggle" class="fa fa-bars left"></i>
|
||||||
<h1 class="menu-title">{{ title }}</h1>
|
<h1 class="menu-title">{{ title }}</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="content" class="content">
|
<div id="content" class="content">
|
||||||
{{{ content }}}
|
{{{ content }}}
|
||||||
</div>
|
</div>
|
||||||
|
@ -34,15 +34,19 @@
|
||||||
Doesn't seem to work: {{!#if (previous)}} using JavaScript
|
Doesn't seem to work: {{!#if (previous)}} using JavaScript
|
||||||
alternative until I find a way to do it in the template
|
alternative until I find a way to do it in the template
|
||||||
-->
|
-->
|
||||||
<a href="{{#previous}}{{/previous}}" class="nav-chapters previous">
|
{{#previous}}
|
||||||
|
<a href="{{link}}" class="nav-chapters previous">
|
||||||
<i class="fa fa-angle-left"></i>
|
<i class="fa fa-angle-left"></i>
|
||||||
</a>
|
</a>
|
||||||
|
{{/previous}}
|
||||||
<!-- {{!/if}} -->
|
<!-- {{!/if}} -->
|
||||||
|
|
||||||
<!-- {{!#if (next "")}} -->
|
<!-- {{!#if (next "")}} -->
|
||||||
<a href="{{#next}}{{/next}}" class="nav-chapters next">
|
{{#next}}
|
||||||
|
<a href="{{link}}" class="nav-chapters next">
|
||||||
<i class="fa fa-angle-right"></i>
|
<i class="fa fa-angle-right"></i>
|
||||||
</a>
|
</a>
|
||||||
|
{{/next}}
|
||||||
<!-- {{!/if}} -->
|
<!-- {{!/if}} -->
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue