Merge pull request #1829 from ISSOtm/index

Fix up "index page" functionality
This commit is contained in:
Eric Huss 2022-06-29 17:55:11 -07:00 committed by GitHub
commit a10a57e67d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 37 additions and 3 deletions

View File

@ -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

View File

@ -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 == &current_path { if path == &current_path || is_first_chapter {
is_first_chapter = false;
out.write(" class=\"active\"")?; out.write(" class=\"active\"")?;
} }

View File

@ -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]()

View File

@ -0,0 +1 @@
# Chapter 1

View File

@ -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();