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:
parent
62badb6ba6
commit
c5145d2206
@ -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 {
|
||||
|
@ -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);
|
||||
|
@ -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()
|
||||
|
Loading…
Reference in New Issue
Block a user