diff --git a/bun.lock b/bun.lock old mode 100755 new mode 100644 index 218ef8f..c05360f --- a/bun.lock +++ b/bun.lock @@ -1,10 +1,11 @@ { - "lockfileVersion": 0, + "lockfileVersion": 1, "workspaces": { "": { "dependencies": { "@twemoji/parser": "^15.1.1", "github-slugger": "^2.0.0", + "mdast-util-to-string": "^4.0.0", "rehype-external-links": "^3.0.0", "rehype-github-alert": "^1.0.0", "rehype-highlight": "^7.0.1", @@ -16,6 +17,7 @@ "remark-gfm": "^4.0.0", "remark-math": "^6.0.0", "remark-rehype": "^11.1.1", + "unist-util-visit-parents": "^6.0.1", "yaml": "^2.6.1", }, "devDependencies": { diff --git a/package.json b/package.json index a7f0976..bb2ae62 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "dependencies": { "@twemoji/parser": "^15.1.1", "github-slugger": "^2.0.0", + "mdast-util-to-string": "^4.0.0", "rehype-external-links": "^3.0.0", "rehype-github-alert": "^1.0.0", "rehype-highlight": "^7.0.1", @@ -34,6 +35,7 @@ "remark-gfm": "^4.0.0", "remark-math": "^6.0.0", "remark-rehype": "^11.1.1", + "unist-util-visit-parents": "^6.0.1", "yaml": "^2.6.1" }, "module": "index.ts" diff --git a/src/routes/(DefaultStyle)/post/[slug]/+page.server.ts b/src/routes/(DefaultStyle)/post/[slug]/+page.server.ts index f777b14..853ba8f 100644 --- a/src/routes/(DefaultStyle)/post/[slug]/+page.server.ts +++ b/src/routes/(DefaultStyle)/post/[slug]/+page.server.ts @@ -1,28 +1,39 @@ import Post from '$lib/server/LoadPost'; -import { remark } from 'remark' import Perser from '$lib/components/Markdown' +import { remark } from 'remark' +import { visitParents } from 'unist-util-visit-parents' +import { toString } from 'mdast-util-to-string' import GithubSlugger from 'github-slugger'; +export interface tocitem { + title: string, + id: string, + depth: 1 | 2 | 3 | 4 | 5 | 6 +} + export async function load({params}) { - - const md = await Post(params.slug); - + const md = await Post(params.slug) let persed = Perser(md.post) let mdast = remark().parse(md.post) - let headers = mdast.children.filter((i) => i.type=='heading' && i.depth<4).map((i)=>{ - let title = i.children[0].value - return {"depth": i.depth, "title": title} + + let headers: tocitem[] = [] + visitParents(mdast, 'heading', (node)=>{ + let slugs = new GithubSlugger() + + let title = toString(node) + let id = slugs.slug(title) + let depth = node.depth + + let toc: tocitem = { title, id, depth } + + headers.push(toc) }) - const slugs = new GithubSlugger() - - let slugged = headers.map((x)=>x.depth ?slugs.slug(x.title):'').filter((x)=>x!='') - return { id: params.slug, metadata: md.metadata, post: persed, - heading: slugged, + toc: headers, } } \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/post/[slug]/+page.svelte b/src/routes/(DefaultStyle)/post/[slug]/+page.svelte index e1a293b..01d9827 100644 --- a/src/routes/(DefaultStyle)/post/[slug]/+page.svelte +++ b/src/routes/(DefaultStyle)/post/[slug]/+page.svelte @@ -144,9 +144,9 @@
- {#if data.heading.length!=0} + {#if data.toc.length}
- +
{/if}
diff --git a/src/routes/(DefaultStyle)/post/[slug]/toc.svelte b/src/routes/(DefaultStyle)/post/[slug]/toc.svelte index 037ae15..784c033 100644 --- a/src/routes/(DefaultStyle)/post/[slug]/toc.svelte +++ b/src/routes/(DefaultStyle)/post/[slug]/toc.svelte @@ -1,5 +1,6 @@ @@ -7,7 +8,7 @@
目次