link in custom.css if the user has it
This commit is contained in:
parent
4fe0e8d2a4
commit
ca718b3d78
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
<link rel="stylesheet" href="css/book.css">
|
<link rel="stylesheet" href="css/book.css">
|
||||||
<link rel="stylesheet" href="css/font-awesome.min.css">
|
<link rel="stylesheet" href="css/font-awesome.min.css">
|
||||||
|
{{#customcss}}{{/customcss}}
|
||||||
|
|
||||||
<script src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
<script src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||||
<script src="js/jquery-2.1.4.min.js"></script>
|
<script src="js/jquery-2.1.4.min.js"></script>
|
||||||
|
|
|
@ -136,29 +136,27 @@ impl Renderer for HtmlHandlebars {
|
||||||
|
|
||||||
let translation_indexes = book_project.translation_index_links();
|
let translation_indexes = book_project.translation_index_links();
|
||||||
|
|
||||||
// Render the chapters of each book
|
let first_path_that_exists = |paths: &Vec<PathBuf>| -> Option<PathBuf> {
|
||||||
for (key, book) in &book_project.translations {
|
for p in paths.iter() {
|
||||||
|
if p.exists() {
|
||||||
|
return Some(PathBuf::from(p));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
};
|
||||||
|
|
||||||
|
{
|
||||||
// Look for the page template in these paths
|
// Look for the page template in these paths
|
||||||
let mut tmpl_paths: Vec<PathBuf> = vec![];
|
let mut search_paths: Vec<PathBuf> = vec![];
|
||||||
|
|
||||||
// default scheme: assets/_html-template/_layouts/page.hbs
|
// default scheme: assets/_html-template/_layouts/page.hbs
|
||||||
tmpl_paths.push(book_project.get_template_dir().join("_layouts").join("page.hbs"));
|
search_paths.push(book_project.get_template_dir().join("_layouts").join("page.hbs"));
|
||||||
// maybe the user doesn't use _layouts folder: assets/_html-template/page.hbs
|
// maybe the user doesn't use _layouts folder: assets/_html-template/page.hbs
|
||||||
tmpl_paths.push(book_project.get_template_dir().join("page.hbs"));
|
search_paths.push(book_project.get_template_dir().join("page.hbs"));
|
||||||
// also look for index.hbs which was the template name in v0.0.15
|
// also look for index.hbs which was the template name in v0.0.15
|
||||||
tmpl_paths.push(book_project.get_template_dir().join("index.hbs"));
|
search_paths.push(book_project.get_template_dir().join("index.hbs"));
|
||||||
|
|
||||||
let first_path_that_exists = |paths: &Vec<PathBuf>| -> Option<PathBuf> {
|
let s = if let Some(p) = first_path_that_exists(&search_paths) {
|
||||||
for p in paths.iter() {
|
|
||||||
if p.exists() {
|
|
||||||
return Some(PathBuf::from(p));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None
|
|
||||||
};
|
|
||||||
|
|
||||||
let s = if let Some(p) = first_path_that_exists(&tmpl_paths) {
|
|
||||||
try!(utils::fs::file_to_string(&p))
|
try!(utils::fs::file_to_string(&p))
|
||||||
} else {
|
} else {
|
||||||
try!(utils::fs::get_data_file("data/_html-template/_layouts/page.hbs"))
|
try!(utils::fs::get_data_file("data/_html-template/_layouts/page.hbs"))
|
||||||
|
@ -167,14 +165,36 @@ impl Renderer for HtmlHandlebars {
|
||||||
// Register template
|
// Register template
|
||||||
debug!("[*]: Register handlebars template");
|
debug!("[*]: Register handlebars template");
|
||||||
try!(handlebars.register_template_string("page", s));
|
try!(handlebars.register_template_string("page", s));
|
||||||
|
}
|
||||||
|
|
||||||
// Register helpers
|
// Register helpers
|
||||||
debug!("[*]: Register handlebars helpers");
|
debug!("[*]: Register handlebars helpers");
|
||||||
handlebars.register_helper("toc", Box::new(helpers::toc::RenderToc));
|
handlebars.register_helper("toc", Box::new(helpers::toc::RenderToc));
|
||||||
handlebars.register_helper("previous", Box::new(helpers::navigation::previous));
|
handlebars.register_helper("previous", Box::new(helpers::navigation::previous));
|
||||||
handlebars.register_helper("next", Box::new(helpers::navigation::next));
|
handlebars.register_helper("next", Box::new(helpers::navigation::next));
|
||||||
handlebars.register_helper("translation-links", Box::new(helpers::translations::TranslationLinksHelper));
|
handlebars.register_helper("translation-links", Box::new(helpers::translations::TranslationLinksHelper));
|
||||||
handlebars.register_helper("translation-indexes", Box::new(helpers::translations::TranslationIndexesHelper));
|
handlebars.register_helper("translation-indexes", Box::new(helpers::translations::TranslationIndexesHelper));
|
||||||
|
handlebars.register_helper("customcss", Box::new(helpers::customcss::CustomCssHelper));
|
||||||
|
|
||||||
|
let mut custom_css_path: Option<PathBuf> = None;
|
||||||
|
{
|
||||||
|
// See if the user has a custom.css
|
||||||
|
let mut search_paths: Vec<PathBuf> = vec![];
|
||||||
|
|
||||||
|
search_paths.push(book_project.get_project_root().join("assets").join("css").join("custom.css"));
|
||||||
|
search_paths.push(book_project.get_project_root().join("assets").join("stylesheets").join("custom.css"));
|
||||||
|
search_paths.push(book_project.get_project_root().join("assets").join("custom.css"));
|
||||||
|
|
||||||
|
if let Some(p) = first_path_that_exists(&search_paths) {
|
||||||
|
match p.strip_prefix(&book_project.get_project_root().join("assets")) {
|
||||||
|
Ok(x) => { custom_css_path = Some(PathBuf::from(x)); },
|
||||||
|
Err(_) => {},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Render the chapters of each book
|
||||||
|
for (key, book) in &book_project.translations {
|
||||||
|
|
||||||
// Check if book's dest directory exists
|
// Check if book's dest directory exists
|
||||||
|
|
||||||
|
@ -206,7 +226,7 @@ impl Renderer for HtmlHandlebars {
|
||||||
// almost the same as process_chapter(), but we have to
|
// almost the same as process_chapter(), but we have to
|
||||||
// manipulate path_to_root in data and rendered_path
|
// manipulate path_to_root in data and rendered_path
|
||||||
|
|
||||||
let mut data = try!(make_data(&book, &chapter, &translation_indexes, &book_project.livereload_script));
|
let mut data = try!(make_data(&book, &chapter, &translation_indexes, &book_project.livereload_script, &custom_css_path));
|
||||||
|
|
||||||
data.remove("path_to_root");
|
data.remove("path_to_root");
|
||||||
data.insert("path_to_root".to_owned(), "".to_json());
|
data.insert("path_to_root".to_owned(), "".to_json());
|
||||||
|
@ -231,7 +251,7 @@ impl Renderer for HtmlHandlebars {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Render a file for every entry in the book
|
// Render a file for every entry in the book
|
||||||
try!(self.process_items(&book.toc, &book, &translation_indexes, &book_project.livereload_script, &handlebars));
|
try!(self.process_items(&book.toc, &book, &translation_indexes, &book_project.livereload_script, &custom_css_path, &handlebars));
|
||||||
|
|
||||||
// Write print.html
|
// Write print.html
|
||||||
if let Some(content) = self.collect_print_content_markdown(&book.toc, &book) {
|
if let Some(content) = self.collect_print_content_markdown(&book.toc, &book) {
|
||||||
|
@ -241,7 +261,7 @@ impl Renderer for HtmlHandlebars {
|
||||||
chapter.set_dest_path(PathBuf::from("print.html"));
|
chapter.set_dest_path(PathBuf::from("print.html"));
|
||||||
chapter.content = Some(content);
|
chapter.content = Some(content);
|
||||||
|
|
||||||
try!(self.process_chapter(&chapter, &book, &None, &None, &handlebars));
|
try!(self.process_chapter(&chapter, &book, &None, &None, &custom_css_path, &handlebars));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -256,6 +276,7 @@ impl HtmlHandlebars {
|
||||||
book: &Book,
|
book: &Book,
|
||||||
translation_indexes: &Option<Vec<TranslationLink>>,
|
translation_indexes: &Option<Vec<TranslationLink>>,
|
||||||
livereload_script: &Option<String>,
|
livereload_script: &Option<String>,
|
||||||
|
custom_css_path: &Option<PathBuf>,
|
||||||
handlebars: &Handlebars)
|
handlebars: &Handlebars)
|
||||||
-> Result<(), Box<Error>> {
|
-> Result<(), Box<Error>> {
|
||||||
|
|
||||||
|
@ -265,11 +286,11 @@ impl HtmlHandlebars {
|
||||||
TocItem::Unnumbered(ref i) |
|
TocItem::Unnumbered(ref i) |
|
||||||
TocItem::Unlisted(ref i) => {
|
TocItem::Unlisted(ref i) => {
|
||||||
if let Some(_) = i.chapter.get_dest_path() {
|
if let Some(_) = i.chapter.get_dest_path() {
|
||||||
try!(self.process_chapter(&i.chapter, book, translation_indexes, livereload_script, handlebars));
|
try!(self.process_chapter(&i.chapter, book, translation_indexes, livereload_script, custom_css_path, handlebars));
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(ref subs) = i.sub_items {
|
if let Some(ref subs) = i.sub_items {
|
||||||
try!(self.process_items(&subs, book, translation_indexes, livereload_script, handlebars));
|
try!(self.process_items(&subs, book, translation_indexes, livereload_script, custom_css_path, handlebars));
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
|
@ -316,10 +337,11 @@ impl HtmlHandlebars {
|
||||||
book: &Book,
|
book: &Book,
|
||||||
translation_indexes: &Option<Vec<TranslationLink>>,
|
translation_indexes: &Option<Vec<TranslationLink>>,
|
||||||
livereload_script: &Option<String>,
|
livereload_script: &Option<String>,
|
||||||
|
custom_css_path: &Option<PathBuf>,
|
||||||
handlebars: &Handlebars)
|
handlebars: &Handlebars)
|
||||||
-> Result<(), Box<Error>> {
|
-> Result<(), Box<Error>> {
|
||||||
|
|
||||||
let data = try!(make_data(book, chapter, translation_indexes, livereload_script));
|
let data = try!(make_data(book, chapter, translation_indexes, livereload_script, custom_css_path));
|
||||||
|
|
||||||
// Render the handlebars template with the data
|
// Render the handlebars template with the data
|
||||||
debug!("[*]: Render template");
|
debug!("[*]: Render template");
|
||||||
|
@ -352,7 +374,8 @@ impl HtmlHandlebars {
|
||||||
fn make_data(book: &Book,
|
fn make_data(book: &Book,
|
||||||
chapter: &Chapter,
|
chapter: &Chapter,
|
||||||
translation_indexes: &Option<Vec<TranslationLink>>,
|
translation_indexes: &Option<Vec<TranslationLink>>,
|
||||||
livereload_script: &Option<String>)
|
livereload_script: &Option<String>,
|
||||||
|
custom_css_path: &Option<PathBuf>)
|
||||||
-> Result<serde_json::Map<String, serde_json::Value>, Box<Error>> {
|
-> Result<serde_json::Map<String, serde_json::Value>, Box<Error>> {
|
||||||
|
|
||||||
debug!("[fn]: make_data");
|
debug!("[fn]: make_data");
|
||||||
|
@ -365,6 +388,7 @@ fn make_data(book: &Book,
|
||||||
data.insert("page-title".to_owned(), format!("{} - {}", chapter.title, book.config.title).to_json());
|
data.insert("page-title".to_owned(), format!("{} - {}", chapter.title, book.config.title).to_json());
|
||||||
data.insert("chapter-title".to_owned(), chapter.title.to_json());
|
data.insert("chapter-title".to_owned(), chapter.title.to_json());
|
||||||
data.insert("description".to_owned(), book.config.description.to_json());
|
data.insert("description".to_owned(), book.config.description.to_json());
|
||||||
|
data.insert("custom-css-path".to_owned(), custom_css_path.to_json());
|
||||||
|
|
||||||
if let Some(ref x) = *livereload_script {
|
if let Some(ref x) = *livereload_script {
|
||||||
data.insert("livereload".to_owned(), x.to_json());
|
data.insert("livereload".to_owned(), x.to_json());
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
use std::path::Path;
|
||||||
|
use std::collections::{VecDeque, BTreeMap};
|
||||||
|
|
||||||
|
use serde_json;
|
||||||
|
use handlebars::{Handlebars, HelperDef, RenderError, RenderContext, Helper, Context};
|
||||||
|
|
||||||
|
#[derive(Clone, Copy)]
|
||||||
|
pub struct CustomCssHelper;
|
||||||
|
|
||||||
|
impl HelperDef for CustomCssHelper {
|
||||||
|
fn call(&self, c: &Context, _h: &Helper, _: &Handlebars, rc: &mut RenderContext) -> Result<(), RenderError> {
|
||||||
|
|
||||||
|
let data = c.navigate(rc.get_path(), &VecDeque::new(), "custom-css-path");
|
||||||
|
if let Ok(custom_css_path) = serde_json::from_str::<String>(&data.to_string()) {
|
||||||
|
if custom_css_path.len() == 0 {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
let p = custom_css_path.replace("\"", "");
|
||||||
|
try!(rc.writer.write(format!("<link rel=\"stylesheet\" href=\"{}\">", p).as_bytes()));
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,3 +2,4 @@ pub mod navigation;
|
||||||
pub mod toc;
|
pub mod toc;
|
||||||
pub mod playpen;
|
pub mod playpen;
|
||||||
pub mod translations;
|
pub mod translations;
|
||||||
|
pub mod customcss;
|
||||||
|
|
Loading…
Reference in New Issue