Compare commits

...

16 Commits

Author SHA1 Message Date
Eric Huss
7b29f8a717 Merge pull request #2985 from ehuss/bump-version
Update to 0.5.2
2025-12-11 19:47:18 +00:00
Eric Huss
94569a42da Update to 0.5.2 2025-12-11 11:40:27 -08:00
Eric Huss
97747621aa Merge pull request #2983 from ehuss/serve-bad-html-config
serve: Fix repeated error message when HTML config is invalid
2025-12-11 19:39:16 +00:00
Eric Huss
723d9df6c7 serve: Fix repeated error message when HTML config is invalid
This fixes an issue where `mdbook serve` would repeatedly show an error
message every second if the `output.html` config had a problem. The
issue is that `set_roots` was doing more work than I realized. It is not
necessary to call it every time in the main polling loop, since the
roots only change when the book configuration changes.

The solution is to just reset the roots whenever the book config
changes.

Fixes https://github.com/rust-lang/mdBook/issues/2946
2025-12-11 11:22:16 -08:00
Eric Huss
45e2158e84 Merge pull request #2982 from ehuss/fix-sidebar-scroll
Fix sidebar scroll position when heading nav is involved
2025-12-11 19:21:21 +00:00
Eric Huss
59017ea918 Fix sidebar scroll position when heading nav is involved
This fixes an issue where the sidebar was scrolling incorrectly when
clicking on chapters when a heading nav is currently in view. The
problem was that it was storing the scrollTop of the sidebar, but it was
not considering that when navigating to another chapter that the heading
nav of the previous chapter would disappear.

The solution is to keep of an offset instead so that it can make sure
that the vertical position of the clicked chapter stays in the same
relative position when the new page loads.

Fixes https://github.com/rust-lang/mdBook/issues/2967
2025-12-11 11:13:47 -08:00
Eric Huss
f857ab294c Merge pull request #2981 from ehuss/fix-rustdoc-color
Fix color for rustdoc error messages
2025-12-10 22:08:16 +00:00
Eric Huss
938a9126b0 Merge pull request #2980 from ehuss/fix-test-preprocessor
Don't rebuild preprocessor map during test
2025-12-10 22:03:08 +00:00
Eric Huss
23724b0a6b Fix color for rustdoc error messages
Due to a change in tracing-subscriber where it escapes ANSI codes, the
output from rustdoc was changed to be escaped instead of colored. This
fixes the issue by just printing to the console directly.

This does not have a test because it is difficult to emulate a terminal
in the testsuite, and I don't feel like adding color overrides at the
moment.

Ref:
- https://github.com/rust-lang/mdBook/pull/2829 -- Switched to tracing
- https://github.com/advisories/GHSA-xwfj-jgwm-7wp5 -- CVE-2025-58160
- https://github.com/tokio-rs/tracing/issues/3378 -- Discussion of
  supporting color codes.

Eventually mdbook's primary output should migrate away from using log
messages, and instead use a structured console system. However, that's a
ways off.
2025-12-10 14:01:50 -08:00
Eric Huss
7bdea7c085 Don't rebuild preprocessor map during test
This fixes a problem where custom preprocessors were not being
registered when running tests. This was caused by the test function
rebuilding the preprocessor map.

This removes the code that was rebuilding the preprocessors and removing
the IndexPreprocessor when running tests. Skipping IndexPreprocessor was
added back in https://github.com/rust-lang/mdBook/pull/741 to fix
https://github.com/rust-lang/mdBook/issues/724 which was caused by
https://github.com/rust-lang/mdBook/pull/685 which added the
IndexPreprocessor.

Additionally, https://github.com/rust-lang/mdBook/pull/1986 added
running *all* preprocessors.

The IndexPreprocessor was removed because in the past the code was
testing against the source directly, and the path from `chapter.path` is
the converted `index.md` file, and that filename does not exist in the
source. This isn't a problem anymore because due to
https://github.com/rust-lang/mdBook/pull/891 it is not reading from the
`src` directory.

Note that this results in a minor change where the chapter path changes
from `README.md` to `index.md` in the output and the `--chapter` option.
I think I'm ok with that change, though it would be easy to switch it
back if that's an issue.
2025-12-10 13:42:15 -08:00
Eric Huss
2bcae6b0a9 Add a test with a custom preprocessor
This test illustrates that the test function is not working correctly
when there is a custom preprocessor.
2025-12-10 12:51:19 -08:00
Eric Huss
6457b381d8 Merge pull request #2973 from LucasPickering/patch-1
Fix link for parse_input() in preprocessors.md
2025-12-02 00:15:15 +00:00
Lucas Pickering
9eb6fe0483 Fix link for parse_input() in preprocessors.md
This doc still referenced `CmdPreprocessor::parse_input`, which was removed in 0.5. Now it's just `mdbook_preprocessor::parse_input`.
2025-12-01 18:40:55 -05:00
Eric Huss
674733864f Merge pull request #2970 from rust-lang/renovate/html5ever-0.x
Update Rust crate html5ever to 0.36.0
2025-12-01 18:37:46 +00:00
renovate[bot]
3d39bf4adb Update Rust crate html5ever to 0.36.0 2025-12-01 18:31:50 +00:00
Eric Huss
55830b9fca Merge pull request #2969 from rust-lang/update-dependencies
Update cargo dependencies
2025-12-01 18:23:44 +00:00
118 changed files with 470 additions and 73 deletions

View File

@@ -1,5 +1,26 @@
# Changelog
## mdBook 0.5.2
[v0.5.1...v0.5.2](https://github.com/rust-lang/mdBook/compare/v0.5.1...v0.5.2)
### Changed
- Updated Rust crate html5ever to 0.36.0.
[#2970](https://github.com/rust-lang/mdBook/pull/2970)
- Updated cargo dependencies.
[#2969](https://github.com/rust-lang/mdBook/pull/2969)
### Fixed
- Fixed repeated error message when HTML config is invalid in `mdbook serve`.
[#2983](https://github.com/rust-lang/mdBook/pull/2983)
- Fixed sidebar scroll position when heading nav is involved.
[#2982](https://github.com/rust-lang/mdBook/pull/2982)
- Fixed color for rustdoc error messages.
[#2981](https://github.com/rust-lang/mdBook/pull/2981)
- Fixed usage of custom preprocessors with `MDBook::test`.
[#2980](https://github.com/rust-lang/mdBook/pull/2980)
## mdBook 0.5.1
[v0.5.0...v0.5.1](https://github.com/rust-lang/mdBook/compare/v0.5.0...v0.5.1)

115
Cargo.lock generated
View File

@@ -659,13 +659,12 @@ dependencies = [
[[package]]
name = "html5ever"
version = "0.35.0"
version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "55d958c2f74b664487a2035fe1dadb032c48718a03b63f3ab0b8537db8549ed4"
checksum = "6452c4751a24e1b99c3260d505eaeee76a050573e61f30ac2c924ddc7236f01e"
dependencies = [
"log",
"markup5ever 0.35.0",
"match_token",
"markup5ever 0.36.1",
]
[[package]]
@@ -899,16 +898,16 @@ dependencies = [
"log",
"phf 0.10.1",
"phf_codegen 0.10.0",
"string_cache",
"string_cache_codegen",
"string_cache 0.8.9",
"string_cache_codegen 0.5.4",
"tendril",
]
[[package]]
name = "markup5ever"
version = "0.35.0"
version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "311fe69c934650f8f19652b3946075f0fc41ad8757dbb68f1ca14e7900ecc1c3"
checksum = "6c3294c4d74d0742910f8c7b466f44dda9eb2d5742c1e430138df290a1e8451c"
dependencies = [
"log",
"tendril",
@@ -927,17 +926,6 @@ dependencies = [
"xml5ever",
]
[[package]]
name = "match_token"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac84fd3f360fcc43dc5f5d186f02a94192761a080e8bc58621ad4d12296a58cf"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.111",
]
[[package]]
name = "matchers"
version = "0.2.0"
@@ -955,7 +943,7 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
[[package]]
name = "mdbook"
version = "0.5.1"
version = "0.5.2"
dependencies = [
"anyhow",
"axum",
@@ -995,7 +983,7 @@ version = "0.0.0"
[[package]]
name = "mdbook-core"
version = "0.5.1"
version = "0.5.2"
dependencies = [
"anyhow",
"regex",
@@ -1008,7 +996,7 @@ dependencies = [
[[package]]
name = "mdbook-driver"
version = "0.5.1"
version = "0.5.2"
dependencies = [
"anyhow",
"indexmap",
@@ -1030,7 +1018,7 @@ dependencies = [
[[package]]
name = "mdbook-html"
version = "0.5.1"
version = "0.5.2"
dependencies = [
"anyhow",
"ego-tree",
@@ -1038,7 +1026,7 @@ dependencies = [
"font-awesome-as-a-crate",
"handlebars",
"hex",
"html5ever 0.35.0",
"html5ever 0.36.1",
"indexmap",
"mdbook-core",
"mdbook-markdown",
@@ -1055,7 +1043,7 @@ dependencies = [
[[package]]
name = "mdbook-markdown"
version = "0.5.1"
version = "0.5.2"
dependencies = [
"pulldown-cmark",
"regex",
@@ -1064,7 +1052,7 @@ dependencies = [
[[package]]
name = "mdbook-preprocessor"
version = "0.5.1"
version = "0.5.2"
dependencies = [
"anyhow",
"mdbook-core",
@@ -1084,7 +1072,7 @@ dependencies = [
[[package]]
name = "mdbook-renderer"
version = "0.5.1"
version = "0.5.2"
dependencies = [
"anyhow",
"mdbook-core",
@@ -1094,7 +1082,7 @@ dependencies = [
[[package]]
name = "mdbook-summary"
version = "0.5.1"
version = "0.5.2"
dependencies = [
"anyhow",
"mdbook-core",
@@ -1331,11 +1319,12 @@ dependencies = [
[[package]]
name = "phf"
version = "0.11.3"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078"
checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf"
dependencies = [
"phf_shared 0.11.3",
"phf_shared 0.13.1",
"serde",
]
[[package]]
@@ -1350,12 +1339,12 @@ dependencies = [
[[package]]
name = "phf_codegen"
version = "0.11.3"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a"
checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1"
dependencies = [
"phf_generator 0.11.3",
"phf_shared 0.11.3",
"phf_generator 0.13.1",
"phf_shared 0.13.1",
]
[[package]]
@@ -1378,6 +1367,16 @@ dependencies = [
"rand 0.8.5",
]
[[package]]
name = "phf_generator"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737"
dependencies = [
"fastrand",
"phf_shared 0.13.1",
]
[[package]]
name = "phf_shared"
version = "0.10.0"
@@ -1396,6 +1395,15 @@ dependencies = [
"siphasher 1.0.1",
]
[[package]]
name = "phf_shared"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266"
dependencies = [
"siphasher 1.0.1",
]
[[package]]
name = "pin-project-lite"
version = "0.2.16"
@@ -1818,6 +1826,19 @@ dependencies = [
"serde",
]
[[package]]
name = "string_cache"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901"
dependencies = [
"new_debug_unreachable",
"parking_lot",
"phf_shared 0.13.1",
"precomputed-hash",
"serde",
]
[[package]]
name = "string_cache_codegen"
version = "0.5.4"
@@ -1830,6 +1851,18 @@ dependencies = [
"quote",
]
[[package]]
name = "string_cache_codegen"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69"
dependencies = [
"phf_generator 0.13.1",
"phf_shared 0.13.1",
"proc-macro2",
"quote",
]
[[package]]
name = "strsim"
version = "0.11.1"
@@ -2243,14 +2276,14 @@ dependencies = [
[[package]]
name = "web_atoms"
version = "0.1.3"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57ffde1dc01240bdf9992e3205668b235e59421fd085e8a317ed98da0178d414"
checksum = "acd0c322f146d0f8aad130ce6c187953889359584497dac6561204c8e17bb43d"
dependencies = [
"phf 0.11.3",
"phf_codegen 0.11.3",
"string_cache",
"string_cache_codegen",
"phf 0.13.1",
"phf_codegen 0.13.1",
"string_cache 0.9.0",
"string_cache_codegen 0.6.1",
]
[[package]]

View File

@@ -36,16 +36,16 @@ futures-util = "0.3.31"
glob = "0.3.3"
handlebars = "6.3.2"
hex = "0.4.3"
html5ever = "0.35.0"
html5ever = "0.36.0"
indexmap = "2.12.1"
ignore = "0.4.25"
mdbook-core = { path = "crates/mdbook-core", version = "0.5.1" }
mdbook-driver = { path = "crates/mdbook-driver", version = "0.5.1" }
mdbook-html = { path = "crates/mdbook-html", version = "0.5.1" }
mdbook-markdown = { path = "crates/mdbook-markdown", version = "0.5.1" }
mdbook-preprocessor = { path = "crates/mdbook-preprocessor", version = "0.5.1" }
mdbook-renderer = { path = "crates/mdbook-renderer", version = "0.5.1" }
mdbook-summary = { path = "crates/mdbook-summary", version = "0.5.1" }
mdbook-core = { path = "crates/mdbook-core", version = "0.5.2" }
mdbook-driver = { path = "crates/mdbook-driver", version = "0.5.2" }
mdbook-html = { path = "crates/mdbook-html", version = "0.5.2" }
mdbook-markdown = { path = "crates/mdbook-markdown", version = "0.5.2" }
mdbook-preprocessor = { path = "crates/mdbook-preprocessor", version = "0.5.2" }
mdbook-renderer = { path = "crates/mdbook-renderer", version = "0.5.2" }
mdbook-summary = { path = "crates/mdbook-summary", version = "0.5.2" }
memchr = "2.7.6"
notify = "8.2.0"
notify-debouncer-mini = "0.7.0"
@@ -71,7 +71,7 @@ walkdir = "2.5.0"
[package]
name = "mdbook"
version = "0.5.1"
version = "0.5.2"
authors = [
"Mathieu David <mathieudavid@mathieudavid.org>",
"Michael-F-Bryan <michaelfbryan@gmail.com>",

View File

@@ -1,6 +1,6 @@
[package]
name = "mdbook-core"
version = "0.5.1"
version = "0.5.2"
description = "The base support library for mdbook, intended for internal use only"
edition.workspace = true
license.workspace = true

View File

@@ -1,6 +1,6 @@
[package]
name = "mdbook-driver"
version = "0.5.1"
version = "0.5.2"
description = "High-level library for running mdBook"
edition.workspace = true
license.workspace = true

View File

@@ -20,7 +20,7 @@ use std::path::{Path, PathBuf};
use std::process::Command;
use tempfile::Builder as TempFileBuilder;
use topological_sort::TopologicalSort;
use tracing::{debug, error, info, trace, warn};
use tracing::{debug, info, trace, warn};
#[cfg(test)]
mod tests;
@@ -263,11 +263,6 @@ impl MDBook {
}
}
// Index Preprocessor is disabled so that chapter paths
// continue to point to the actual markdown files.
self.preprocessors = determine_preprocessors(&self.config, &self.root)?;
self.preprocessors
.shift_remove_entry(IndexPreprocessor::NAME);
let (book, _) = self.preprocess_book(&TestRenderer)?;
let color_output = std::io::stderr().is_terminal();
@@ -329,8 +324,8 @@ impl MDBook {
if !output.status.success() {
failed = true;
error!(
"rustdoc returned an error:\n\
eprintln!(
"ERROR rustdoc returned an error:\n\
\n--- stdout\n{}\n--- stderr\n{}",
String::from_utf8_lossy(&output.stdout),
String::from_utf8_lossy(&output.stderr)

View File

@@ -1,6 +1,6 @@
[package]
name = "mdbook-html"
version = "0.5.1"
version = "0.5.2"
description = "mdBook HTML renderer"
edition.workspace = true
license.workspace = true

View File

@@ -40,14 +40,22 @@ class MDBookSidebarScrollbox extends HTMLElement {
// Track and set sidebar scroll position
this.addEventListener('click', e => {
if (e.target.tagName === 'A') {
sessionStorage.setItem('sidebar-scroll', this.scrollTop);
const clientRect = e.target.getBoundingClientRect();
const sidebarRect = this.getBoundingClientRect();
sessionStorage.setItem('sidebar-scroll-offset', clientRect.top - sidebarRect.top);
}
}, { passive: true });
const sidebarScrollTop = sessionStorage.getItem('sidebar-scroll');
sessionStorage.removeItem('sidebar-scroll');
if (sidebarScrollTop) {
const sidebarScrollOffset = sessionStorage.getItem('sidebar-scroll-offset');
sessionStorage.removeItem('sidebar-scroll-offset');
if (sidebarScrollOffset !== null) {
// preserve sidebar scroll position when navigating via links within sidebar
this.scrollTop = sidebarScrollTop;
const activeSection = this.querySelector('.active');
if (activeSection) {
const clientRect = activeSection.getBoundingClientRect();
const sidebarRect = this.getBoundingClientRect();
const currentOffset = clientRect.top - sidebarRect.top;
this.scrollTop += currentOffset - parseFloat(sidebarScrollOffset);
}
} else {
// scroll sidebar to current active section when navigating via
// 'next/previous chapter' buttons

View File

@@ -1,6 +1,6 @@
[package]
name = "mdbook-markdown"
version = "0.5.1"
version = "0.5.2"
description = "Markdown processing used in mdBook"
edition.workspace = true
license.workspace = true

View File

@@ -1,6 +1,6 @@
[package]
name = "mdbook-preprocessor"
version = "0.5.1"
version = "0.5.2"
description = "Library to assist implementing an mdBook preprocessor"
edition.workspace = true
license.workspace = true

View File

@@ -1,6 +1,6 @@
[package]
name = "mdbook-renderer"
version = "0.5.1"
version = "0.5.2"
description = "Library to assist implementing an mdBook renderer"
edition.workspace = true
license.workspace = true

View File

@@ -1,6 +1,6 @@
[package]
name = "mdbook-summary"
version = "0.5.1"
version = "0.5.2"
description = "Summary parser for mdBook"
edition.workspace = true
license.workspace = true

View File

@@ -49,7 +49,7 @@ By pulling in `mdbook-preprocessor` as a library, preprocessors can have access
existing infrastructure for dealing with books.
For example, a custom preprocessor could use the
[`CmdPreprocessor::parse_input()`] function to deserialize the JSON written to
[`parse_input()`] function to deserialize the JSON written to
`stdin`. Then each chapter of the `Book` can be mutated in-place via
[`Book::for_each_mut()`], and then written to `stdout` with the `serde_json`
crate.
@@ -101,7 +101,7 @@ if __name__ == '__main__':
[pc]: https://crates.io/crates/pulldown-cmark
[pctc]: https://crates.io/crates/pulldown-cmark-to-cmark
[an example no-op preprocessor]: https://github.com/rust-lang/mdBook/blob/master/examples/nop-preprocessor.rs
[`CmdPreprocessor::parse_input()`]: https://docs.rs/mdbook-preprocessor/latest/mdbook_preprocessor/trait.Preprocessor.html#method.parse_input
[`parse_input()`]: https://docs.rs/mdbook-preprocessor/latest/mdbook_preprocessor/fn.parse_input.html
[`Book::for_each_mut()`]: https://docs.rs/mdbook-preprocessor/latest/mdbook_preprocessor/book/struct.Book.html#method.for_each_mut
[`PreprocessorContext`]: https://docs.rs/mdbook-preprocessor/latest/mdbook_preprocessor/struct.PreprocessorContext.html
[`Book`]: https://docs.rs/mdbook-preprocessor/latest/mdbook_preprocessor/book/struct.Book.html

View File

@@ -41,7 +41,6 @@ pub fn rebuild_on_change(
loop {
std::thread::sleep(Duration::new(1, 0));
watcher.set_roots(&book);
let start = Instant::now();
let paths = watcher.scan();
let elapsed = start.elapsed().as_secs_f64();
@@ -67,6 +66,7 @@ pub fn rebuild_on_change(
post_build();
}
book = b;
watcher.set_roots(&book);
}
Err(e) => error!("failed to load book config: {e:?}"),
}

View File

@@ -0,0 +1,3 @@
[book]
title = "sidebar-scroll"
language = "en"

View File

@@ -0,0 +1,102 @@
# Summary
- [Chapter 1](./chapter_1.md)
- [Chapter 2](./chapter_2.md)
- [Chapter 3](./chapter_3.md)
- [Chapter 4](./chapter_4.md)
- [Chapter 5](./chapter_5.md)
- [Chapter 6](./chapter_6.md)
- [Chapter 7](./chapter_7.md)
- [Chapter 8](./chapter_8.md)
- [Chapter 9](./chapter_9.md)
- [Chapter 10](./chapter_10.md)
- [Chapter 11](./chapter_11.md)
- [Chapter 12](./chapter_12.md)
- [Chapter 13](./chapter_13.md)
- [Chapter 14](./chapter_14.md)
- [Chapter 15](./chapter_15.md)
- [Chapter 16](./chapter_16.md)
- [Chapter 17](./chapter_17.md)
- [Chapter 18](./chapter_18.md)
- [Chapter 19](./chapter_19.md)
- [Chapter 20](./chapter_20.md)
- [Chapter 21](./chapter_21.md)
- [Chapter 22](./chapter_22.md)
- [Chapter 23](./chapter_23.md)
- [Chapter 24](./chapter_24.md)
- [Chapter 25](./chapter_25.md)
- [Chapter 26](./chapter_26.md)
- [Chapter 27](./chapter_27.md)
- [Chapter 28](./chapter_28.md)
- [Chapter 29](./chapter_29.md)
- [Chapter 30](./chapter_30.md)
- [Chapter 31](./chapter_31.md)
- [Chapter 32](./chapter_32.md)
- [Chapter 33](./chapter_33.md)
- [Chapter 34](./chapter_34.md)
- [Chapter 35](./chapter_35.md)
- [Chapter 36](./chapter_36.md)
- [Chapter 37](./chapter_37.md)
- [Chapter 38](./chapter_38.md)
- [Chapter 39](./chapter_39.md)
- [Chapter 40](./chapter_40.md)
- [Chapter 41](./chapter_41.md)
- [Chapter 42](./chapter_42.md)
- [Chapter 43](./chapter_43.md)
- [Chapter 44](./chapter_44.md)
- [Chapter 45](./chapter_45.md)
- [Chapter 46](./chapter_46.md)
- [Chapter 47](./chapter_47.md)
- [Chapter 48](./chapter_48.md)
- [Chapter 49](./chapter_49.md)
- [Chapter 50](./chapter_50.md)
- [Chapter 51](./chapter_51.md)
- [Chapter 52](./chapter_52.md)
- [Chapter 53](./chapter_53.md)
- [Chapter 54](./chapter_54.md)
- [Chapter 55](./chapter_55.md)
- [Chapter 56](./chapter_56.md)
- [Chapter 57](./chapter_57.md)
- [Chapter 58](./chapter_58.md)
- [Chapter 59](./chapter_59.md)
- [Chapter 60](./chapter_60.md)
- [Chapter 61](./chapter_61.md)
- [Chapter 62](./chapter_62.md)
- [Chapter 63](./chapter_63.md)
- [Chapter 64](./chapter_64.md)
- [Chapter 65](./chapter_65.md)
- [Chapter 66](./chapter_66.md)
- [Chapter 67](./chapter_67.md)
- [Chapter 68](./chapter_68.md)
- [Chapter 69](./chapter_69.md)
- [Chapter 70](./chapter_70.md)
- [Chapter 71](./chapter_71.md)
- [Chapter 72](./chapter_72.md)
- [Chapter 73](./chapter_73.md)
- [Chapter 74](./chapter_74.md)
- [Chapter 75](./chapter_75.md)
- [Chapter 76](./chapter_76.md)
- [Chapter 77](./chapter_77.md)
- [Chapter 78](./chapter_78.md)
- [Chapter 79](./chapter_79.md)
- [Chapter 80](./chapter_80.md)
- [Chapter 81](./chapter_81.md)
- [Chapter 82](./chapter_82.md)
- [Chapter 83](./chapter_83.md)
- [Chapter 84](./chapter_84.md)
- [Chapter 85](./chapter_85.md)
- [Chapter 86](./chapter_86.md)
- [Chapter 87](./chapter_87.md)
- [Chapter 88](./chapter_88.md)
- [Chapter 89](./chapter_89.md)
- [Chapter 90](./chapter_90.md)
- [Chapter 91](./chapter_91.md)
- [Chapter 92](./chapter_92.md)
- [Chapter 93](./chapter_93.md)
- [Chapter 94](./chapter_94.md)
- [Chapter 95](./chapter_95.md)
- [Chapter 96](./chapter_96.md)
- [Chapter 97](./chapter_97.md)
- [Chapter 98](./chapter_98.md)
- [Chapter 99](./chapter_99.md)
- [Chapter 100](./chapter_100.md)

View File

@@ -0,0 +1,3 @@
# Chapter 1
## This has a single heading

View File

@@ -0,0 +1,28 @@
# Chapter 10
## Heading A
## Heading B
## Heading C
## Heading D
## Heading E
## Heading F
## Heading G
## Heading H
## Heading I
## Heading J
## Heading K
## Heading L
## Heading M
## Heading N
## Heading O
## Heading P
## Heading Q
## Heading R
## Heading S
## Heading T
## Heading U
## Heading V
## Heading W
## Heading X
## Heading Y
## Heading Z

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,28 @@
# Chapter 35
## Heading A
## Heading B
## Heading C
## Heading D
## Heading E
## Heading F
## Heading G
## Heading H
## Heading I
## Heading J
## Heading K
## Heading L
## Heading M
## Heading N
## Heading O
## Heading P
## Heading Q
## Heading R
## Heading S
## Heading T
## Heading U
## Heading V
## Heading W
## Heading X
## Heading Y
## Heading Z

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

Some files were not shown because too many files have changed in this diff Show More