feat: OnThisPage blog (#9216)

* feat: OnThisPage blog

### Before submitting the PR, please make sure you do the following

- [ ] It's really useful if your PR references an issue where it is discussed ahead of time. In many cases, features are absent for a reason. For large changes, please create an RFC: https://github.com/sveltejs/rfcs
- [ ] Prefix your PR title with `feat:`, `fix:`, `chore:`, or `docs:`.
- [ ] This message body should clearly illustrate what problems it solves.
- [ ] Ideally, include a test that fails without this PR but passes with it.

### Tests and linting

- [ ] Run the tests with `pnpm test` and lint the project with `pnpm lint`

* Bump site-kit

* Add content
pull/9222/head
Puru Vijay 2 years ago committed by GitHub
parent 8e85b3fa9e
commit 408ab77420
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -188,8 +188,8 @@ importers:
specifier: ^1.24.1 specifier: ^1.24.1
version: 1.25.0(svelte@packages+svelte)(vite@4.4.9) version: 1.25.0(svelte@packages+svelte)(vite@4.4.9)
'@sveltejs/site-kit': '@sveltejs/site-kit':
specifier: 6.0.0-next.45 specifier: 6.0.0-next.46
version: 6.0.0-next.45(@sveltejs/kit@1.25.0)(svelte@packages+svelte) version: 6.0.0-next.46(@sveltejs/kit@1.25.0)(svelte@packages+svelte)
'@sveltejs/vite-plugin-svelte': '@sveltejs/vite-plugin-svelte':
specifier: ^2.4.6 specifier: ^2.4.6
version: 2.4.6(svelte@packages+svelte)(vite@4.4.9) version: 2.4.6(svelte@packages+svelte)(vite@4.4.9)
@ -2398,8 +2398,8 @@ packages:
svelte-local-storage-store: 0.4.0(svelte@packages+svelte) svelte-local-storage-store: 0.4.0(svelte@packages+svelte)
dev: false dev: false
/@sveltejs/site-kit@6.0.0-next.45(@sveltejs/kit@1.25.0)(svelte@packages+svelte): /@sveltejs/site-kit@6.0.0-next.46(@sveltejs/kit@1.25.0)(svelte@packages+svelte):
resolution: {integrity: sha512-C7C9pXaOB/hLfsOw+7rOYBR+smZ9Rx47/qwZ1fJwXYjSC7Sc1zGX3dj1PXHj+EqbGWI8Fsj8upM05MC5ya/aIw==} resolution: {integrity: sha512-VgFKJ6G3gXqlbnjVeZTD6MPWidhZuu93D2WdfsOd4DLL6eFKaCbF60qZXtmWF2hLj7+WDk8+NAwj3V+UZ84k8A==}
peerDependencies: peerDependencies:
'@sveltejs/kit': ^1.20.0 '@sveltejs/kit': ^1.20.0
svelte: ^4.0.0 svelte: ^4.0.0

@ -30,7 +30,7 @@
"@resvg/resvg-js": "^2.4.1", "@resvg/resvg-js": "^2.4.1",
"@sveltejs/adapter-vercel": "^3.0.3", "@sveltejs/adapter-vercel": "^3.0.3",
"@sveltejs/kit": "^1.24.1", "@sveltejs/kit": "^1.24.1",
"@sveltejs/site-kit": "6.0.0-next.45", "@sveltejs/site-kit": "6.0.0-next.46",
"@sveltejs/vite-plugin-svelte": "^2.4.6", "@sveltejs/vite-plugin-svelte": "^2.4.6",
"@types/cookie": "^0.5.2", "@types/cookie": "^0.5.2",
"@types/node": "^20.5.9", "@types/node": "^20.5.9",

@ -2,6 +2,7 @@
import { extractFrontmatter } from '@sveltejs/site-kit/markdown'; import { extractFrontmatter } from '@sveltejs/site-kit/markdown';
import { CONTENT_BASE_PATHS } from '../../../constants.js'; import { CONTENT_BASE_PATHS } from '../../../constants.js';
import { render_content } from '../renderer.js'; import { render_content } from '../renderer.js';
import { get_sections } from '../docs/index.js';
/** /**
* @param {import('./types').BlogData} blog_data * @param {import('./types').BlogData} blog_data
@ -47,7 +48,8 @@ export async function get_blog_data(base = CONTENT_BASE_PATHS.BLOG) {
author: { author: {
name: metadata.author, name: metadata.author,
url: metadata.authorURL url: metadata.authorURL
} },
sections: await get_sections(body)
}); });
} }

@ -1,3 +1,5 @@
import type { Section } from '../docs/types';
export interface BlogPost { export interface BlogPost {
title: string; title: string;
description: string; description: string;
@ -11,6 +13,7 @@ export interface BlogPost {
}; };
draft: boolean; draft: boolean;
content: string; content: string;
sections: Section[];
} }
export type BlogData = BlogPost[]; export type BlogData = BlogPost[];

@ -107,11 +107,12 @@ const titled = async (str) =>
.replace(/"/g, '"') .replace(/"/g, '"')
.replace(/&lt;/g, '<') .replace(/&lt;/g, '<')
.replace(/&gt;/g, '>') .replace(/&gt;/g, '>')
.replace(/&amp;/, '&')
.replace(/<(\/)?(em|b|strong|code)>/g, '') .replace(/<(\/)?(em|b|strong|code)>/g, '')
); );
/** @param {string} markdown */ /** @param {string} markdown */
async function get_sections(markdown) { export async function get_sections(markdown) {
const lines = markdown.split('\n'); const lines = markdown.split('\n');
const root = /** @type {import('./types').Section} */ ({ const root = /** @type {import('./types').Section} */ ({
title: 'Root', title: 'Root',

@ -1,7 +1,7 @@
<script> <script>
import { page } from '$app/stores'; import { page } from '$app/stores';
import { copy_code_descendants } from '@sveltejs/site-kit/actions'; import { copy_code_descendants } from '@sveltejs/site-kit/actions';
import { setupDocsHovers } from '@sveltejs/site-kit/docs'; import { DocsOnThisPage, setupDocsHovers } from '@sveltejs/site-kit/docs';
export let data; export let data;
@ -20,7 +20,8 @@
<meta name="og:image" content="https://svelte.dev/blog/{$page.params.slug}/card.png" /> <meta name="og:image" content="https://svelte.dev/blog/{$page.params.slug}/card.png" />
</svelte:head> </svelte:head>
<article class="post listify text" use:copy_code_descendants> <div class="content">
<article class="post listify text" use:copy_code_descendants>
<h1>{data.post.title}</h1> <h1>{data.post.title}</h1>
<p class="standfirst">{data.post.description}</p> <p class="standfirst">{data.post.description}</p>
@ -29,8 +30,21 @@
<time datetime={data.post.date}>{data.post.date_formatted}</time> <time datetime={data.post.date}>{data.post.date_formatted}</time>
</p> </p>
<DocsOnThisPage
details={{
content: '',
file: '',
path: `/blog/${data.post.slug}`,
sections: data.post.sections,
slug: data.post.slug,
title: data.post.title
}}
orientation="inline"
/>
{@html data.post.content} {@html data.post.content}
</article> </article>
</div>
<!-- the crawler doesn't understand twitter:image etc, so we have to add this hack. TODO fix in sveltekit --> <!-- the crawler doesn't understand twitter:image etc, so we have to add this hack. TODO fix in sveltekit -->
<img hidden src="/blog/{$page.params.slug}/card.png" alt="Social card for {data.post.title}" /> <img hidden src="/blog/{$page.params.slug}/card.png" alt="Social card for {data.post.title}" />
@ -54,7 +68,7 @@
} }
.byline { .byline {
margin: 0 0 6rem 0; margin: 0 0 1rem 0;
padding: 1.6rem 0 0 0; padding: 1.6rem 0 0 0;
border-top: var(--sk-thick-border-width) solid #6767785b; border-top: var(--sk-thick-border-width) solid #6767785b;
font-size: var(--sk-text-xs); font-size: var(--sk-text-xs);

Loading…
Cancel
Save