start work on table of contents
This commit is contained in:
parent
b1dc3ae0ea
commit
33d6838dc4
@ -3,6 +3,7 @@
|
|||||||
import { formatDate } from './datefmt.js';
|
import { formatDate } from './datefmt.js';
|
||||||
import { makeSlug } from '$lib/utils.js';
|
import { makeSlug } from '$lib/utils.js';
|
||||||
|
|
||||||
|
import Toc from './Toc.svelte';
|
||||||
import Link from './Link.svelte';
|
import Link from './Link.svelte';
|
||||||
export { Link as a };
|
export { Link as a };
|
||||||
</script>
|
</script>
|
||||||
@ -11,6 +12,7 @@
|
|||||||
export let title, date;
|
export let title, date;
|
||||||
export const description = '';
|
export const description = '';
|
||||||
export const draft = false;
|
export const draft = false;
|
||||||
|
export let toc = null;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
@ -29,5 +31,6 @@
|
|||||||
<div id="post">
|
<div id="post">
|
||||||
<h1 id="{makeSlug(title)}">{title}</h1>
|
<h1 id="{makeSlug(title)}">{title}</h1>
|
||||||
<p class="subtitle">{formatDate(date)}</p>
|
<p class="subtitle">{formatDate(date)}</p>
|
||||||
|
<Toc items={toc} />
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
</div>
|
</div>
|
||||||
|
67
src/lib/Toc.svelte
Normal file
67
src/lib/Toc.svelte
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
<script>
|
||||||
|
import { makeSlug } from '$lib/utils.js';
|
||||||
|
|
||||||
|
export let items;
|
||||||
|
|
||||||
|
console.log(items);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
/* move everything out to the left and center it vertically */
|
||||||
|
#toc {
|
||||||
|
position: fixed;
|
||||||
|
left: 1rem;
|
||||||
|
/* setting top at 50vh sticks it halfway down the viewport,
|
||||||
|
then translating back up by 50% gets it vertically centered
|
||||||
|
even with a dynamic width */
|
||||||
|
top: 50vh;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
color: var(--content-color-faded);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* margin-left is to match the list items; this allows the accent bar
|
||||||
|
for the current item to appear to float out in space */
|
||||||
|
h5 {
|
||||||
|
margin-left: 0.5rem;
|
||||||
|
padding-bottom: 0.25em;
|
||||||
|
margin-bottom: 0.25em;
|
||||||
|
border-bottom: 0.1em solid currentcolor;
|
||||||
|
font-variant: petite-caps;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
margin-left: var(--indent, 0);
|
||||||
|
padding-left: 0.5rem;
|
||||||
|
margin-bottom: 0.15rem;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
li.current {
|
||||||
|
border-left: 0.1rem solid var(--accent-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="toc">
|
||||||
|
<h5>Table of Contents</h5>
|
||||||
|
<ul>
|
||||||
|
{#each items as item}
|
||||||
|
<li style:--indent="{(item.depth - 2) * 0.75}em">
|
||||||
|
<a href="#{makeSlug(item.text)}">{item.text}</a>
|
||||||
|
</li>
|
||||||
|
{/each}
|
||||||
|
</ul>
|
||||||
|
</div>
|
@ -4,7 +4,7 @@ import { toText } from 'hast-util-to-text';
|
|||||||
import { makeSlug } from '../lib/utils.js';
|
import { makeSlug } from '../lib/utils.js';
|
||||||
|
|
||||||
|
|
||||||
export function localPlugins() {
|
export function localRehype() {
|
||||||
let printed = false;
|
let printed = false;
|
||||||
|
|
||||||
return (tree, vfile) => {
|
return (tree, vfile) => {
|
||||||
|
19
src/plugins/remark.js
Normal file
19
src/plugins/remark.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import { visit } from 'unist-util-visit';
|
||||||
|
import { toString } from 'mdast-util-to-string';
|
||||||
|
|
||||||
|
|
||||||
|
// build table of contents and inject into frontmatter
|
||||||
|
export function localRemark() {
|
||||||
|
return (tree, vfile) => {
|
||||||
|
let toc = [];
|
||||||
|
|
||||||
|
visit(tree, 'heading', node => {
|
||||||
|
toc.push({
|
||||||
|
text: toString(node),
|
||||||
|
depth: node.depth,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
vfile.data.fm.toc = toc;
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user