manifold/docs2/src/pages/_app.jsx
2022-06-25 15:07:11 -05:00

132 lines
3.5 KiB
JavaScript

import Head from 'next/head'
import { slugifyWithCounter } from '@sindresorhus/slugify'
import { Layout } from '@/components/Layout'
import 'focus-visible'
import '@/styles/tailwind.css'
const navigation = [
{
title: 'Introduction',
links: [
{ title: 'Getting started', href: '/' },
{ title: 'Installation', href: '/docs/installation' },
],
},
{
title: 'Core concepts',
links: [
{ title: 'Understanding caching', href: '/docs/understanding-caching' },
{
title: 'Predicting user behavior',
href: '/docs/predicting-user-behavior',
},
{ title: 'Basics of time-travel', href: '/docs/basics-of-time-travel' },
{
title: 'Introduction to string theory',
href: '/docs/introduction-to-string-theory',
},
{ title: 'The buttery effect', href: '/docs/the-butterfly-effect' },
],
},
{
title: 'Advanced guides',
links: [
{ title: 'Writing plugins', href: '/docs/writing-plugins' },
{ title: 'Neuralink integration', href: '/docs/neuralink-integration' },
{ title: 'Temporal paradoxes', href: '/docs/temporal-paradoxes' },
{ title: 'Testing', href: '/docs/testing' },
{ title: 'Compile-time caching', href: '/docs/compile-time-caching' },
{
title: 'Predictive data generation',
href: '/docs/predictive-data-generation',
},
],
},
{
title: 'API reference',
links: [
{ title: 'CacheAdvance.predict()', href: '/docs/cacheadvance-predict' },
{ title: 'CacheAdvance.flush()', href: '/docs/cacheadvance-flush' },
{ title: 'CacheAdvance.revert()', href: '/docs/cacheadvance-revert' },
{ title: 'CacheAdvance.regret()', href: '/docs/cacheadvance-regret' },
],
},
{
title: 'Contributing',
links: [
{ title: 'How to contribute', href: '/docs/how-to-contribute' },
{ title: 'Architecture guide', href: '/docs/architecture-guide' },
{ title: 'Design principles', href: '/docs/design-principles' },
],
},
]
function getNodeText(node) {
let text = ''
for (let child of node.children ?? []) {
if (typeof child === 'string') {
text += child
}
text += getNodeText(child)
}
return text
}
function collectHeadings(nodes, slugify = slugifyWithCounter()) {
let sections = []
for (let node of nodes) {
if (/^h[23]$/.test(node.name)) {
let title = getNodeText(node)
if (title) {
let id = slugify(title)
node.attributes.id = id
if (node.name === 'h3') {
sections[sections.length - 1].children.push({
...node.attributes,
title,
})
} else {
sections.push({ ...node.attributes, title, children: [] })
}
}
}
sections.push(...collectHeadings(node.children ?? [], slugify))
}
return sections
}
export default function App({ Component, pageProps }) {
let title = pageProps.markdoc?.frontmatter.title
let pageTitle =
pageProps.markdoc?.frontmatter.pageTitle ||
`${pageProps.markdoc?.frontmatter.title} - Docs`
let description = pageProps.markdoc?.frontmatter.description
let tableOfContents = pageProps.markdoc?.content
? collectHeadings(pageProps.markdoc.content)
: []
return (
<>
<Head>
<title>{pageTitle}</title>
{description && <meta name="description" content={description} />}
</Head>
<Layout
navigation={navigation}
title={title}
tableOfContents={tableOfContents}
>
<Component {...pageProps} />
</Layout>
</>
)
}