1
0
mirror of https://github.com/lise-henry/crowbook synced 2024-09-25 03:48:16 +02:00

Use markdown in html.footer and html.header and render it

This commit is contained in:
Elisabeth Henry 2016-09-22 16:23:30 +02:00
parent 62badb6ba6
commit c5145d2206
3 changed files with 39 additions and 33 deletions

View File

@ -135,7 +135,7 @@ impl<'a> HtmlRenderer<'a> {
/// Renders a chapter to HTML
pub fn render_html<T>(this: &mut T, tokens: &[Token])-> Result<String>
where T: AsMut<HtmlRenderer<'a>>+AsRef<HtmlRenderer<'a>> + Renderer {
where T: AsMut<HtmlRenderer<'a>>+AsRef<HtmlRenderer<'a>> + Renderer {
let mut res = String::new();
for token in tokens {
res.push_str(&try!(this.render_token(token)));
@ -147,7 +147,7 @@ impl<'a> HtmlRenderer<'a> {
/// Renders a title (without `<h1>` tags), increasing header number beforehand
#[doc(hidden)]
pub fn render_title(&mut self, n: i32, vec: &[Token]) -> Result<String> {
pub fn render_title(&mut self, n: i32, vec: &[Token]) -> Result<String> {
self.inc_header(n);
let s = if n == 1 && self.current_numbering >= 1 {
let chapter = self.current_chapter[0];
@ -244,7 +244,7 @@ impl<'a> HtmlRenderer<'a> {
/// See http://lise-henry.github.io/articles/rust_inheritance.html
#[doc(hidden)]
pub fn static_render_token<T>(this: &mut T, token: &Token) -> Result<String>
where T: AsMut<HtmlRenderer<'a>>+AsRef<HtmlRenderer<'a>> + Renderer {
where T: AsMut<HtmlRenderer<'a>>+AsRef<HtmlRenderer<'a>> + Renderer {
match *token {
Token::Str(ref text) => {
let content = if this.as_ref().verbatim {
@ -258,8 +258,8 @@ impl<'a> HtmlRenderer<'a> {
// Use initial
let mut chars = content.chars();
let initial = try!(chars.next()
.ok_or(Error::parser(&this.as_ref().book.source,
"empty str token, could not find initial")));
.ok_or(Error::parser(&this.as_ref().book.source,
"empty str token, could not find initial")));
let mut new_content = if initial.is_alphanumeric() {
format!("<span class = \"initial\">{}</span>", initial)
} else {
@ -327,12 +327,12 @@ impl<'a> HtmlRenderer<'a> {
Token::HardBreak => Ok(String::from("<br />\n")),
Token::List(ref vec) => Ok(format!("<ul>\n{}</ul>\n", try!(this.render_vec(vec)))),
Token::OrderedList(n, ref vec) => Ok(format!("<ol{}>\n{}</ol>\n",
if n == 1 {
String::new()
} else {
format!(" start = \"{}\"", n)
},
try!(this.render_vec(vec)))),
if n == 1 {
String::new()
} else {
format!(" start = \"{}\"", n)
},
try!(this.render_vec(vec)))),
Token::Item(ref vec) => Ok(format!("<li>{}</li>\n", try!(this.render_vec(vec)))),
Token::Link(ref url, ref title, ref vec) => {
let url = escape_html(url.as_ref());
@ -359,16 +359,16 @@ impl<'a> HtmlRenderer<'a> {
if token.is_image() {
Ok(format!("<img src = \"{}\" title = \"{}\" alt = \"{}\" />",
url,
title,
content))
url,
title,
content))
} else {
Ok(format!("<div class = \"image\">
<img src = \"{}\" title = \"{}\" alt = \"{}\" />
</div>",
url,
title,
content))
url,
title,
content))
}
},
Token::Table(_, ref vec) => Ok(format!("<div class = \"table\">
@ -437,12 +437,13 @@ impl<'a> HtmlRenderer<'a> {
/// Renders a footer, which can include a "Generated by Crowboook" link
/// or a customized text
#[doc(hidden)]
pub fn get_footer(&mut self) -> Result<String> {
pub fn get_footer<T>(this: &mut T) -> Result<String>
where T: AsMut<HtmlRenderer<'a>>+AsRef<HtmlRenderer<'a>> + Renderer {
let content =
if let Ok(footer) = self.book.options.get_str("html.footer") {
match self.templatize(footer) {
if let Ok(footer) = this.as_ref().book.options.get_str("html.footer") {
match this.as_mut().templatize(footer) {
Ok(content) => content,
Err(err) => return Err(Error::render(&self.book.source,
Err(err) => return Err(Error::render(&this.as_ref().book.source,
format!("rendering 'html.footer' template:\n{}", err))),
}
} else {
@ -451,17 +452,22 @@ impl<'a> HtmlRenderer<'a> {
if content.is_empty() {
Ok(content)
} else {
Ok(format!("<footer id = \"footer\"><p>{}</p></footer>", content))
let tokens = try!(Parser::new().parse(&content));
let content = try!(this.render_vec(&tokens));
Ok(format!("<footer id = \"footer\">{}</footer>",
content))
}
}
/// Renders a header
#[doc(hidden)]
pub fn get_header(&mut self) -> Result<String> {
if let Ok(top) = self.book.options.get_str("html.header") {
match self.templatize(top) {
Ok(content) => Ok(format!("<div id = \"top\"><p>{}</p></div>", content)),
Err(err) => Err(Error::render(&self.book.source,
pub fn get_header<T>(this: &mut T) -> Result<String>
where T: AsMut<HtmlRenderer<'a>>+AsRef<HtmlRenderer<'a>> + Renderer {
if let Ok(top) = this.as_ref().book.options.get_str("html.header") {
match this.as_mut().templatize(top) {
Ok(content) => Ok(format!("<div id = \"top\">{}</div>",
try!(this.render_vec(&try!(Parser::new().parse(&content)))))),
Err(err) => Err(Error::render(&this.as_ref().book.source,
(format!("rendering 'html.header' template:\n{}", err)))),
}
} else {

View File

@ -193,8 +193,8 @@ impl<'a> HtmlDirRenderer<'a> {
.insert_str("toc", toc.clone())
.insert_str("prev_chapter", prev_chapter)
.insert_str("next_chapter", next_chapter)
.insert_str("footer", try!(self.html.get_footer()))
.insert_str("header", try!(self.html.get_header()))
.insert_str("footer", try!(HtmlRenderer::get_footer(self)))
.insert_str("header", try!(HtmlRenderer::get_header(self)))
.insert_str("script", self.html.book.get_template("html.js").unwrap())
.insert_bool(self.html.book.options.get_str("lang").unwrap(), true);
@ -253,8 +253,8 @@ impl<'a> HtmlDirRenderer<'a> {
// Render index.html and write it too
let mut mapbuilder = try!(self.html.book.get_metadata(|s| self.render_vec(&try!(Parser::new().parse_inline(s)))))
.insert_str("content", content)
.insert_str("header", try!(self.html.get_header()))
.insert_str("footer", try!(self.html.get_footer()))
.insert_str("header", try!(HtmlRenderer::get_header(self)))
.insert_str("footer", try!(HtmlRenderer::get_footer(self)))
.insert_str("toc", toc.clone())
.insert_str("script", self.html.book.get_template("html.js").unwrap())
.insert_bool(self.html.book.options.get_str("lang").unwrap(), true);

View File

@ -193,8 +193,8 @@ impl<'a> HtmlSingleRenderer<'a> {
.insert_str("menu_svg", menu_svg)
.insert_str("book_svg", book_svg)
.insert_str("pages_svg", pages_svg)
.insert_str("footer", try!(self.html.get_footer()))
.insert_str("header", try!(self.html.get_header()));
.insert_str("footer", try!(HtmlRenderer::get_footer(self)))
.insert_str("header", try!(HtmlRenderer::get_header(self)));
if self.html.book.options.get_bool("html.highlight_code") == Ok(true) {
let highlight_js = try!(self.html.book.get_template("html.highlight.js"))
.as_bytes()