Skip to content

Commit 8bdd4cd

Browse files
authored
render empty toc if needed (#331)
1 parent debb232 commit 8bdd4cd

File tree

19 files changed

+82
-7
lines changed

19 files changed

+82
-7
lines changed

src/render.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ type RenderInternalOptions =
5454
async function render(parseResult: ParseResult, options: RenderOptions & RenderInternalOptions): Promise<string> {
5555
const {root, path, pages, title, preview} = options;
5656
const toc = mergeToc(parseResult.data?.toc, options.toc);
57-
const headers = toc.show ? findHeaders(parseResult) : [];
5857
return String(html`<!DOCTYPE html>
5958
<meta charset="utf-8">${path === "/404" ? html`\n<base href="/">` : ""}
6059
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
@@ -85,7 +84,7 @@ ${
8584
preview ? `\nopen({hash: ${JSON.stringify(parseResult.hash)}, eval: (body) => (0, eval)(body)});\n` : ""
8685
}${parseResult.cells.map((cell) => `\n${renderDefineCell(cell)}`).join("")}`)}
8786
</script>${pages.length > 0 ? html`\n${await renderSidebar(title, pages, path)}` : ""}${
88-
headers.length > 0 ? html`\n${renderToc(headers, toc.label)}` : ""
87+
toc.show ? html`\n${renderToc(findHeaders(parseResult), toc.label)}` : ""
8988
}
9089
<div id="observablehq-center">
9190
<main id="observablehq-main" class="observablehq">
@@ -139,16 +138,20 @@ function findHeaders(parseResult: ParseResult): Header[] {
139138
.filter((d): d is Header => !!d.label && !!d.href);
140139
}
141140

142-
function renderToc(headers: Header[], label = "Contents"): Html {
141+
function renderToc(headers: Header[], label: string): Html {
143142
return html`<aside id="observablehq-toc" data-selector="${tocSelector
144143
.map((selector) => `#observablehq-main ${selector}`)
145144
.join(", ")}">
146-
<nav>
145+
<nav>${
146+
headers.length > 0
147+
? html`
147148
<div>${label}</div>
148149
<ol>${headers.map(
149-
({label, href}) => html`\n<li class="observablehq-secondary-link"><a href="${href}">${label}</a></li>`
150-
)}
151-
</ol>
150+
({label, href}) => html`\n<li class="observablehq-secondary-link"><a href="${href}">${label}</a></li>`
151+
)}
152+
</ol>`
153+
: ""
154+
}
152155
</nav>
153156
</aside>`;
154157
}

test/output/build/404/404.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
import "./_observablehq/client.js";
2525

2626
</script>
27+
<aside id="observablehq-toc" data-selector="#observablehq-main h1:not(:first-of-type), #observablehq-main h2:not(h1 + h2)">
28+
<nav>
29+
</nav>
30+
</aside>
2731
<div id="observablehq-center">
2832
<main id="observablehq-main" class="observablehq">
2933
<h1 id="page-not-found" tabindex="-1"><a class="observablehq-header-anchor" href="#page-not-found">Page not found</a></h1>

test/output/build/archives/tar.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@
6969
</ol>
7070
</nav>
7171
<script>{/* redacted init script */}</script>
72+
<aside id="observablehq-toc" data-selector="#observablehq-main h1:not(:first-of-type), #observablehq-main h2:not(h1 + h2)">
73+
<nav>
74+
</nav>
75+
</aside>
7276
<div id="observablehq-center">
7377
<main id="observablehq-main" class="observablehq">
7478
<h1 id="tar" tabindex="-1"><a class="observablehq-header-anchor" href="#tar">Tar</a></h1>

test/output/build/archives/zip.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@
5555
</ol>
5656
</nav>
5757
<script>{/* redacted init script */}</script>
58+
<aside id="observablehq-toc" data-selector="#observablehq-main h1:not(:first-of-type), #observablehq-main h2:not(h1 + h2)">
59+
<nav>
60+
</nav>
61+
</aside>
5862
<div id="observablehq-center">
5963
<main id="observablehq-main" class="observablehq">
6064
<h1 id="zip" tabindex="-1"><a class="observablehq-header-anchor" href="#zip">Zip</a></h1>

test/output/build/config/closed/page.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
</ol>
3535
</nav>
3636
<script>{/* redacted init script */}</script>
37+
<aside id="observablehq-toc" data-selector="#observablehq-main h1:not(:first-of-type), #observablehq-main h2:not(h1 + h2)">
38+
<nav>
39+
</nav>
40+
</aside>
3741
<div id="observablehq-center">
3842
<main id="observablehq-main" class="observablehq">
3943
<h1 id="a-page%E2%80%A6" tabindex="-1"><a class="observablehq-header-anchor" href="#a-page%E2%80%A6">A page…</a></h1>

test/output/build/config/index.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
</ol>
3535
</nav>
3636
<script>{/* redacted init script */}</script>
37+
<aside id="observablehq-toc" data-selector="#observablehq-main h1:not(:first-of-type), #observablehq-main h2:not(h1 + h2)">
38+
<nav>
39+
</nav>
40+
</aside>
3741
<div id="observablehq-center">
3842
<main id="observablehq-main" class="observablehq">
3943
<h1 id="index" tabindex="-1"><a class="observablehq-header-anchor" href="#index">Index</a></h1>

test/output/build/config/one.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
</ol>
3535
</nav>
3636
<script>{/* redacted init script */}</script>
37+
<aside id="observablehq-toc" data-selector="#observablehq-main h1:not(:first-of-type), #observablehq-main h2:not(h1 + h2)">
38+
<nav>
39+
</nav>
40+
</aside>
3741
<div id="observablehq-center">
3842
<main id="observablehq-main" class="observablehq">
3943
<h1 id="one" tabindex="-1"><a class="observablehq-header-anchor" href="#one">One</a></h1>

test/output/build/config/sub/two.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
</ol>
3535
</nav>
3636
<script>{/* redacted init script */}</script>
37+
<aside id="observablehq-toc" data-selector="#observablehq-main h1:not(:first-of-type), #observablehq-main h2:not(h1 + h2)">
38+
<nav>
39+
</nav>
40+
</aside>
3741
<div id="observablehq-center">
3842
<main id="observablehq-main" class="observablehq">
3943
<h1 id="two" tabindex="-1"><a class="observablehq-header-anchor" href="#two">Two</a></h1>

test/output/build/fetches/foo.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@
3636
</ol>
3737
</nav>
3838
<script>{/* redacted init script */}</script>
39+
<aside id="observablehq-toc" data-selector="#observablehq-main h1:not(:first-of-type), #observablehq-main h2:not(h1 + h2)">
40+
<nav>
41+
</nav>
42+
</aside>
3943
<div id="observablehq-center">
4044
<main id="observablehq-main" class="observablehq">
4145
<h1 id="top" tabindex="-1"><a class="observablehq-header-anchor" href="#top">Top</a></h1>

test/output/build/fetches/top.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@
3939
</ol>
4040
</nav>
4141
<script>{/* redacted init script */}</script>
42+
<aside id="observablehq-toc" data-selector="#observablehq-main h1:not(:first-of-type), #observablehq-main h2:not(h1 + h2)">
43+
<nav>
44+
</nav>
45+
</aside>
4246
<div id="observablehq-center">
4347
<main id="observablehq-main" class="observablehq">
4448
<h1 id="top" tabindex="-1"><a class="observablehq-header-anchor" href="#top">Top</a></h1>

test/output/build/files/files.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@
5050
</ol>
5151
</nav>
5252
<script>{/* redacted init script */}</script>
53+
<aside id="observablehq-toc" data-selector="#observablehq-main h1:not(:first-of-type), #observablehq-main h2:not(h1 + h2)">
54+
<nav>
55+
</nav>
56+
</aside>
5357
<div id="observablehq-center">
5458
<main id="observablehq-main" class="observablehq">
5559
<span><link rel="stylesheet" href="./_file/custom-styles.css">

test/output/build/files/subsection/subfiles.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@
5050
</ol>
5151
</nav>
5252
<script>{/* redacted init script */}</script>
53+
<aside id="observablehq-toc" data-selector="#observablehq-main h1:not(:first-of-type), #observablehq-main h2:not(h1 + h2)">
54+
<nav>
55+
</nav>
56+
</aside>
5357
<div id="observablehq-center">
5458
<main id="observablehq-main" class="observablehq">
5559
<span><link rel="stylesheet" href="../_file/custom-styles.css">

test/output/build/imports/foo/foo.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@
4242
</ol>
4343
</nav>
4444
<script>{/* redacted init script */}</script>
45+
<aside id="observablehq-toc" data-selector="#observablehq-main h1:not(:first-of-type), #observablehq-main h2:not(h1 + h2)">
46+
<nav>
47+
</nav>
48+
</aside>
4549
<div id="observablehq-center">
4650
<main id="observablehq-main" class="observablehq">
4751
<h1 id="foo" tabindex="-1"><a class="observablehq-header-anchor" href="#foo">Foo</a></h1>

test/output/build/missing-file/index.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@
3232
</ol>
3333
</nav>
3434
<script>{/* redacted init script */}</script>
35+
<aside id="observablehq-toc" data-selector="#observablehq-main h1:not(:first-of-type), #observablehq-main h2:not(h1 + h2)">
36+
<nav>
37+
</nav>
38+
</aside>
3539
<div id="observablehq-center">
3640
<main id="observablehq-main" class="observablehq">
3741
<h1 id="build-test-case" tabindex="-1"><a class="observablehq-header-anchor" href="#build-test-case">Build test case</a></h1>

test/output/build/missing-import/index.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@
3333
</ol>
3434
</nav>
3535
<script>{/* redacted init script */}</script>
36+
<aside id="observablehq-toc" data-selector="#observablehq-main h1:not(:first-of-type), #observablehq-main h2:not(h1 + h2)">
37+
<nav>
38+
</nav>
39+
</aside>
3640
<div id="observablehq-center">
3741
<main id="observablehq-main" class="observablehq">
3842
<h1 id="build-test-case" tabindex="-1"><a class="observablehq-header-anchor" href="#build-test-case">Build test case</a></h1>

test/output/build/multi/index.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@
4343
</ol>
4444
</nav>
4545
<script>{/* redacted init script */}</script>
46+
<aside id="observablehq-toc" data-selector="#observablehq-main h1:not(:first-of-type), #observablehq-main h2:not(h1 + h2)">
47+
<nav>
48+
</nav>
49+
</aside>
4650
<div id="observablehq-center">
4751
<main id="observablehq-main" class="observablehq">
4852
<h1 id="multi-test" tabindex="-1"><a class="observablehq-header-anchor" href="#multi-test">Multi test</a></h1>

test/output/build/multi/subsection/index.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@
2727
</ol>
2828
</nav>
2929
<script>{/* redacted init script */}</script>
30+
<aside id="observablehq-toc" data-selector="#observablehq-main h1:not(:first-of-type), #observablehq-main h2:not(h1 + h2)">
31+
<nav>
32+
</nav>
33+
</aside>
3034
<div id="observablehq-center">
3135
<main id="observablehq-main" class="observablehq">
3236
<h1 id="sub-section" tabindex="-1"><a class="observablehq-header-anchor" href="#sub-section">Sub-Section</a></h1>

test/output/build/simple-public/index.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@
2626
</ol>
2727
</nav>
2828
<script>{/* redacted init script */}</script>
29+
<aside id="observablehq-toc" data-selector="#observablehq-main h1:not(:first-of-type), #observablehq-main h2:not(h1 + h2)">
30+
<nav>
31+
</nav>
32+
</aside>
2933
<div id="observablehq-center">
3034
<main id="observablehq-main" class="observablehq">
3135
<h1 id="build-test-case" tabindex="-1"><a class="observablehq-header-anchor" href="#build-test-case">Build test case</a></h1>

test/output/build/simple/simple.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@
3535
</ol>
3636
</nav>
3737
<script>{/* redacted init script */}</script>
38+
<aside id="observablehq-toc" data-selector="#observablehq-main h1:not(:first-of-type), #observablehq-main h2:not(h1 + h2)">
39+
<nav>
40+
</nav>
41+
</aside>
3842
<div id="observablehq-center">
3943
<main id="observablehq-main" class="observablehq">
4044
<h1 id="build-test-case" tabindex="-1"><a class="observablehq-header-anchor" href="#build-test-case">Build test case</a></h1>

0 commit comments

Comments
 (0)