svelte_preprocess_mdz #
svelte_preprocess_mdz is a Svelte preprocessor that compiles static mdz content to Svelte markup at build time. Instead of parsing mdz at runtime and rendering dynamically, the preprocessor replaces the Mdz component with MdzPrecompiled containing pre-rendered children.
Setup #
Add the preprocessor, svelte_preprocess_mdz.ts, to svelte.config.js:
import {svelte_preprocess_mdz} from '@fuzdev/fuz_ui/svelte_preprocess_mdz.js';
export default {
preprocess: [
svelte_preprocess_mdz({
components: {Alert: '$lib/Alert.svelte'},
elements: ['aside', 'details'],
}),
// ...other preprocessors
],
}; The preprocessor should run before other preprocessors like vitePreprocess() so it can parse the original Svelte source. The input to svelte_preprocess_mdz is SveltePreprocessMdzOptions.
How it works #
The preprocessor transforms static content at build time:
<!-- Before -->
<Mdz content="**bold** and `some_fn`" />
<!-- After -->
<MdzPrecompiled><p><strong>bold</strong> and <DocsLink reference={'some_fn'} /></p></MdzPrecompiled> For ternary expressions with static branches, it generates Svelte control flow:
<!-- Before -->
<Mdz content={show ? '**a**' : '**b**'} />
<!-- After -->
<MdzPrecompiled>{#if show}<p><strong>a</strong></p>{:else}<p><strong>b</strong></p>{/if}</MdzPrecompiled> The preprocessor also manages imports automatically:
What gets transformed #
The preprocessor handles these static content patterns:
- string attributes:
content="**bold**" - JS string expressions:
content={'**bold**'} - template literals without interpolation:
content={`**bold**`} - const variable references:
const msg = '**bold**';content={msg} - ternary chains:
content={show ? '**a**' : '**b**'} - nested ternaries:
content={a ? 'x' : b ? 'y' : 'z'}
Relative paths and the base attribute #
Content with relative auto-links (./grammar, ../spec) needs to know
its base path to resolve those at compile time. Add a static base attribute to
the Mdz tag:
<Mdz base="/docs/mdz/" content="see ./grammar and ../spec" /> The preprocessor reads base, resolves relative paths to absolute via resolve_relative_path(), and emits the resolved href values. base must be a static string literal — dynamic expressions cause the call to fall back
to runtime rendering.
Without base, relative paths are kept as raw hrefs and the browser resolves them
against the current URL at click time. This is a preprocessor-only attribute; at runtime Mdz accepts a base prop with the same meaning.
Skip conditions #
The preprocessor falls back to runtime rendering when:
- the file is excluded via
exclude - no matching import source is found for Mdz
- the import is
import type(not a runtime import) - MdzPrecompiled is already imported from a different source
- the
contentprop is dynamic (variable, function call,$state,$derived) - spread attributes are present (
{...props}) - content references unconfigured components or elements
- a ternary branch has dynamic content or unconfigured tags