From b84f470ea25d3ba3de046a8a844afaa3b91ed1d6 Mon Sep 17 00:00:00 2001 From: Elisabeth Henry Date: Thu, 22 Sep 2016 15:27:26 +0200 Subject: [PATCH] Make rendering.inline_toc.name a template that can use {{{loc_toc}}} --- lang/en.yaml | 1 + lang/fr.yaml | 1 + src/lib/bookoptions.rs | 2 +- src/lib/html.rs | 12 ++++++++++++ src/lib/html_dir.rs | 14 ++++++++++++++ src/lib/html_single.rs | 7 ++++--- 6 files changed, 33 insertions(+), 4 deletions(-) diff --git a/lang/en.yaml b/lang/en.yaml index 29f665e..6a1cfe7 100644 --- a/lang/en.yaml +++ b/lang/en.yaml @@ -1,4 +1,5 @@ menu: Table of contents +toc: Table of contents chapter: Chapter display_all: Display all chapters diff --git a/lang/fr.yaml b/lang/fr.yaml index 2545950..825226d 100644 --- a/lang/fr.yaml +++ b/lang/fr.yaml @@ -1,4 +1,5 @@ menu: Table des matières +toc: Table des matières chapter: Chapitre display_all: Afficher tous les chapitres diff --git a/src/lib/bookoptions.rs b/src/lib/bookoptions.rs index 1b63b01..9ed18cf 100644 --- a/src/lib/bookoptions.rs +++ b/src/lib/bookoptions.rs @@ -38,7 +38,7 @@ input.yaml_blocks:bool:false # Enable inline YAML blocks to override optio # Rendering options rendering.initials:bool:false # Use initals ('lettrines') for first letter of a chapter (experimental) rendering.inline_toc:bool:false # Display a table of content in the document -rendering.inline_toc.name:str:Table of contents # Name of the table of contents if it is displayed in document +rendering.inline_toc.name:str:\"{{{loc_toc}}}\" # Name of the table of contents if it is displayed in document rendering.num_depth:int:1 # The maximum heading levels that should be numbered (0: no numbering, 1: only chapters, ..., 6: all) rendering.chapter_template:str:\"{{{number}}}. {{{chapter_title}}}\" # Format of numbered titles diff --git a/src/lib/html.rs b/src/lib/html.rs index 425ccd4..8c83051 100644 --- a/src/lib/html.rs +++ b/src/lib/html.rs @@ -420,6 +420,18 @@ impl<'a> HtmlRenderer<'a> { template.render_data(&mut res, &data); Ok(String::from_utf8_lossy(&res).into_owned()) } + + /// Renders the toc name + #[doc(hidden)] + pub fn get_toc_name(&mut self) -> Result { + let data = try!(self.book.get_metadata(|s| self.render_vec(&try!(Parser::new().parse_inline(s))))) + .build(); + let template = self.book.options.get_str("rendering.inline_toc.name").unwrap(); + let template = try!(compile_str(template, &self.book.source, "could not compile template 'rendering.inline_toc'")); + let mut res = vec!(); + template.render_data(&mut res, &data); + Ok(String::from_utf8_lossy(&res).into_owned()) + } /// Renders a footer, which can include a "Generated by Crowboook" link diff --git a/src/lib/html_dir.rs b/src/lib/html_dir.rs index df95979..006d70d 100644 --- a/src/lib/html_dir.rs +++ b/src/lib/html_dir.rs @@ -227,6 +227,20 @@ impl<'a> HtmlDirRenderer<'a> { } else { String::new() }; + + // Insert toc inline if option is set + if self.html.book.options.get_bool("rendering.inline_toc").unwrap() { + + content.push_str(&format!( + "

{}

+
+{} +
+", + try!(self.html.get_toc_name()), + &toc)); + } + if titles.len() > 1 { content.push_str(&format!("

diff --git a/src/lib/html_single.rs b/src/lib/html_single.rs index a5815a2..4e406a3 100644 --- a/src/lib/html_single.rs +++ b/src/lib/html_single.rs @@ -140,18 +140,19 @@ impl<'a> HtmlSingleRenderer<'a> { titles[i + 1])); } } - - let toc = self.html.toc.render(); + let toc = self.html.toc.render(); // If display_toc, display the toc inline + println!("inline_toc: {}",self.html.book.options.get_bool("rendering.inline_toc").unwrap()); if self.html.book.options.get_bool("rendering.inline_toc").unwrap() { + content = format!( "

{}

{}
{}", - self.html.book.options.get_str("rendering.inline_toc.name").unwrap(), + try!(self.html.get_toc_name()), &toc, content); }