Skip to content

Commit

Permalink
Make link to first chapter active in index page
Browse files Browse the repository at this point in the history
Makes both pages more consistent, and also the previous test pass

Co-authored-by: Eric Huss <eric@huss.org>
  • Loading branch information
ISSOtm and ehuss committed Jun 29, 2022
1 parent a91e888 commit fa5f32c
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 20 deletions.
2 changes: 1 addition & 1 deletion src/renderer/html_handlebars/hbs_renderer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ impl HtmlHandlebars {
if ctx.is_index {
ctx.data.insert("path".to_owned(), json!("index.md"));
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 =
self.post_process(rendered_index, &ctx.html_config.playground, ctx.edition);
Expand Down
8 changes: 7 additions & 1 deletion src/renderer/html_handlebars/helpers/toc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,11 @@ impl HelperDef for RenderToc {
out.write("<ol class=\"chapter\">")?;

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 {
// Spacer
Expand Down Expand Up @@ -130,7 +135,8 @@ impl HelperDef for RenderToc {
out.write(&tmp)?;
out.write("\"")?;

if path == &current_path {
if path == &current_path || is_first_chapter {
is_first_chapter = false;
out.write(" class=\"active\"")?;
}

Expand Down
23 changes: 5 additions & 18 deletions tests/rendered_output.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ use select::predicate::{Class, Name, Predicate};
use std::collections::HashMap;
use std::ffi::OsStr;
use std::fs;
use std::io::{Read, Write};
use std::io::Write;
use std::path::{Component, Path, PathBuf};
use std::str::FromStr;
use tempfile::Builder as TempFileBuilder;
Expand Down Expand Up @@ -476,23 +476,10 @@ fn first_chapter_is_copied_as_index_even_if_not_first_elem() {
let md = MDBook::load_with_config(temp.path(), cfg).unwrap();
md.build().unwrap();

// In theory, just reading the entire files into memory and comparing is sufficient for *testing*,
// but since the files are temporary and get deleted when the test completes, we'll want to print
// the differences on failure.
// We could invoke `diff` on the files on failure, but that may not be portable (hi, Windows...)
// so we'll do the job ourselves—potentially a bit sloppily, but that can always be piped into
// `diff` manually afterwards.
let book_path = temp.path().join("book");
let read_file = |path: &str| {
let mut buf = String::new();
fs::File::open(book_path.join(path))
.with_context(|| format!("Failed to read {}", path))
.unwrap()
.read_to_string(&mut buf)
.unwrap();
buf
};
pretty_assertions::assert_eq!(read_file("chapter_1.html"), read_file("index.html"));
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]
Expand Down

0 comments on commit fa5f32c

Please sign in to comment.