syntax styling utilities and components for TypeScript, Svelte, SvelteKit 🎨
fuz_code is a rework of Prism (prismjs.com). The main changes:
Like Prism, there are zero dependencies (unless you count Prism's @types/prismjs
),
but there are two optional dependencies:
prism-svelte
and a Svelte component for convenient usage.color-scheme
preference.
Non-Moss users should import theme_variables.css
or otherwise define those variables.Compared to Shiki,
this library is much lighter
(with its faster shiki/engine/javascript
, 503kB minified to 16kB, 63kb gzipped to 5.6kB),
and vastly faster
for runtime usage because it uses JS regexps instead of
the Onigurama regexp engine
used by TextMate grammars.
Shiki also has 38 dependencies instead of 0.
However this is not a fair comparison because
Prism grammars are much simpler and less powerful than TextMate's,
and Shiki is designed mainly for buildtime usage.
npm i -D @ryanatkn/fuz_code
<script lang="ts">
import Code from '$lib/Code.svelte';
</script>
<!-- auto-detects and uses CSS Highlight API when available, defaults to Svelte -->
<Code content={svelte_code} />
<!-- select a lang -->
<Code content={ts_code} lang="ts" />
<!-- force specific rendering mode -->
<Code content={code} mode="html" />
<Code content={code} mode="ranges" />
import {syntax_styler_global} from '$lib/syntax_styler_global.js';
// Direct usage
const html = syntax_styler_global.stylize(code, 'ts');
// Get raw tokens
import {tokenize_syntax} from '$lib/tokenize_syntax.js';
const tokens = tokenize_syntax(code, syntax_styler_global.get_lang('ts'));
By default the Code
component automatically uses the
CSS Custom Highlight API
when available for improved performance,
falling back to HTML generation for non-browser runtimes and older browsers.
Themes are just CSS files, so they work with any JS framework.
With SvelteKit:
// +layout.svelte
import '@ryanatkn/fuz_code/theme.css';
The primary themes (currently just one) have a dependency on my CSS library Moss for color-scheme awareness. See the Moss docs for its usage.
If you're not using Moss, import theme_variables.css
alongside theme.css
:
// Without Moss:
import '@ryanatkn/fuz_code/theme.css';
import '@ryanatkn/fuz_code/theme_variables.css';
Highlight
and Range
APIs
as a faster alternative to generating spans with classesI encourage you to poke around src/lib
if you're interested in using fuz_code.
Enabled by default in syntax_styler_global
:
Docs are a work in progress:
Please open issues if you need any help.
markdown
and regexp
Code.svelte
the Svelte grammar
is based on prism-svelte
by @pngwn