Merge pull request #1829 from ISSOtm/index
Fix up "index page" functionality
This commit is contained in:
commit
a10a57e67d
|
@ -116,7 +116,7 @@ impl HtmlHandlebars {
|
||||||
if ctx.is_index {
|
if ctx.is_index {
|
||||||
ctx.data.insert("path".to_owned(), json!("index.md"));
|
ctx.data.insert("path".to_owned(), json!("index.md"));
|
||||||
ctx.data.insert("path_to_root".to_owned(), json!(""));
|
ctx.data.insert("path_to_root".to_owned(), json!(""));
|
||||||
ctx.data.insert("is_index".to_owned(), json!("true"));
|
ctx.data.insert("is_index".to_owned(), json!(true));
|
||||||
let rendered_index = ctx.handlebars.render("index", &ctx.data)?;
|
let rendered_index = ctx.handlebars.render("index", &ctx.data)?;
|
||||||
let rendered_index =
|
let rendered_index =
|
||||||
self.post_process(rendered_index, &ctx.html_config.playground, ctx.edition);
|
self.post_process(rendered_index, &ctx.html_config.playground, ctx.edition);
|
||||||
|
@ -540,7 +540,8 @@ impl Renderer for HtmlHandlebars {
|
||||||
chapter_titles: &ctx.chapter_titles,
|
chapter_titles: &ctx.chapter_titles,
|
||||||
};
|
};
|
||||||
self.render_item(item, ctx, &mut print_content)?;
|
self.render_item(item, ctx, &mut print_content)?;
|
||||||
is_index = false;
|
// Only the first non-draft chapter item should be treated as the "index"
|
||||||
|
is_index &= !matches!(item, BookItem::Chapter(ch) if !ch.is_draft_chapter());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Render 404 page
|
// Render 404 page
|
||||||
|
|
|
@ -57,6 +57,11 @@ impl HelperDef for RenderToc {
|
||||||
out.write("<ol class=\"chapter\">")?;
|
out.write("<ol class=\"chapter\">")?;
|
||||||
|
|
||||||
let mut current_level = 1;
|
let mut current_level = 1;
|
||||||
|
// The "index" page, which has this attribute set, is supposed to alias the first chapter in
|
||||||
|
// the book, i.e. the first link. There seems to be no easy way to determine which chapter
|
||||||
|
// the "index" is aliasing from within the renderer, so this is used instead to force the
|
||||||
|
// first link to be active. See further below.
|
||||||
|
let mut is_first_chapter = ctx.data().get("is_index").is_some();
|
||||||
|
|
||||||
for item in chapters {
|
for item in chapters {
|
||||||
// Spacer
|
// Spacer
|
||||||
|
@ -130,7 +135,8 @@ impl HelperDef for RenderToc {
|
||||||
out.write(&tmp)?;
|
out.write(&tmp)?;
|
||||||
out.write("\"")?;
|
out.write("\"")?;
|
||||||
|
|
||||||
if path == ¤t_path {
|
if path == ¤t_path || is_first_chapter {
|
||||||
|
is_first_chapter = false;
|
||||||
out.write(" class=\"active\"")?;
|
out.write(" class=\"active\"")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
# Summary
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
- [None of these should be treated as the "index chapter"]()
|
||||||
|
|
||||||
|
# Part 1
|
||||||
|
|
||||||
|
- [Not this either]()
|
||||||
|
- [Chapter 1](./chapter_1.md)
|
||||||
|
- [And not this]()
|
|
@ -0,0 +1 @@
|
||||||
|
# Chapter 1
|
|
@ -467,6 +467,21 @@ fn by_default_mdbook_use_index_preprocessor_to_convert_readme_to_index() {
|
||||||
assert_doesnt_contain_strings(&second_index, &unexpected_strings);
|
assert_doesnt_contain_strings(&second_index, &unexpected_strings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn first_chapter_is_copied_as_index_even_if_not_first_elem() {
|
||||||
|
let temp = DummyBook::new().build().unwrap();
|
||||||
|
let mut cfg = Config::default();
|
||||||
|
cfg.set("book.src", "index_html_test")
|
||||||
|
.expect("Couldn't set config.book.src to \"index_html_test\"");
|
||||||
|
let md = MDBook::load_with_config(temp.path(), cfg).unwrap();
|
||||||
|
md.build().unwrap();
|
||||||
|
|
||||||
|
let root = temp.path().join("book");
|
||||||
|
let chapter = fs::read_to_string(root.join("chapter_1.html")).expect("read chapter 1");
|
||||||
|
let index = fs::read_to_string(root.join("index.html")).expect("read index");
|
||||||
|
pretty_assertions::assert_eq!(chapter, index);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn theme_dir_overrides_work_correctly() {
|
fn theme_dir_overrides_work_correctly() {
|
||||||
let book_dir = dummy_book::new_copy_of_example_book().unwrap();
|
let book_dir = dummy_book::new_copy_of_example_book().unwrap();
|
||||||
|
|
Loading…
Reference in New Issue