This is a SvelteKit preprocessor that allows you to write and include markdown files in your SvelteKit project using Stripe's Markdoc library.
npm install --save-dev svelte-scribe
In your svelte.config.js
file, add the following:
import scribe from 'svelte-scribe';
import path from 'path';
const __dirname = path.resolve();
/** @type {import('@sveltejs/kit').Config} */
const config = {
kit: {
adapter: adapter()
},
extensions: ['.svelte', '.markdoc', '.md', '.ts'],
preprocess: [
scribe({
schema: './src/markdoc/schema', // or any other path to your schema. This is optional.
components: path.resolve(__dirname, 'src/markdoc/components'), // or any other path to your components. This is optional.
extensions: ['.markdoc', '.md']
}),
vitePreprocess()
]
};
export default config;
If your project is using typescript, you will need to add the following to your vit.config.ts
file:
import { tscPlugin } from 'svelte-scribe';
const __dirname = path.resolve();
export default defineConfig({
plugins: [tscPlugin(path.resolve(__dirname, 'src/markdoc/schema')), sveltekit()]
});
This is necessary because we run before any vite/rollup magic hence we need to have all .ts
schema files transpiled to .js
before we can successfully import them.
+page.md
---
title: Svelte Scribe
description: This is a SvelteKit preprocessor that allows you to write and include markdown files in your SvelteKit project using Stripe's Markdoc library.
---
# {% $markdoc.frontmatter.title %}
# {% $markdoc.frontmatter.description %}
schema/tags.ts
const tags = {
card: {
render: 'Card',
description: 'A card component',
children: ['paragraph', 'tag', 'list'],
attributes: {
text: {
type: String,
default: 'THis is a card'
}
}
}
};
components/Card.svelte
<script lang="ts">
export let text: string;
</script>
<div class="card">
<p>{text}</p>
</div>
<slot />
+page.md
---
title: Svelte Scribe
description: This is a SvelteKit preprocessor that allows you to write and include markdown files in your SvelteKit project using Stripe's Markdoc library.
---
# {% $markdoc.frontmatter.title %}
# {% $markdoc.frontmatter.description %}
{% card text="This is a card" %}
{% paragraph text="This is a paragraph" %}
{% endcard %}
- Add an example project.
- Add support for sveltekit-like layouts using a similar +layout.md file.