@novacbn/svelte-codejar
Version:
Svelte Binding for the embeddable code editor CodeJar
171 lines (120 loc) • 6.54 kB
Markdown
# `svelte-codejar`
## Description
Svelte Binding for the embeddable code editor CodeJar
## Demo
See a demo at [novacbn.github.io/svelte-codejar/demo](https://novacbn.github.io/svelte-codejar/demo)
## Sample
```html
<script>
import {CodeJar} from "@novacbn/svelte-codejar";
let value = `console.log("Hello World!");`;
</script>
<!--
`CodeJar` options with their defaults
See more information at: https://github.com/antonmedv/codejar#getting-started
-->
<!--
**NOTE**: Syntax highlighting is optional and must be provided by you. See the
sample below on how to use it
**NOTE2**: When setting `CodeJar.tab`, if you're using escape characters such
as `\t`, you need encapsulate it as a raw string (see below). Otherwise the Svelte
compiler will escape the value when it parses your code
-->
<CodeJar addClosing={true} indentOn={/{$/} spellcheck={false} tab={"\t"} bind:value />
```
## Syntax Highlighting
### highlight.js
> **NOTE**: The sample below uses [highlight.js](https://highlightjs.org/), see the link for more information.
```html
<script context="module">
// We need to configure highlight.js for Javascript, and then alias the
// exports to match the function signatures that `CodeJar` Component expects
import hljs from "highlight.js/lib/core";
import javascript from "highlight.js/lib/languages/javascript";
hljs.registerLanguage("javascript", javascript);
// `highlight` takes the input code and returns the highlighted HTML markup
const highlight = (code, syntax) =>
hljs.highlight(code, {
language: syntax,
}).value;
</script>
<script>
import {CodeJar} from "@novacbn/svelte-codejar";
let value = `console.log("Hello World!");`;
</script>
<!--
Now we pass `CodeJar` our syntax highlighting functions along with the
language syntax used for highlighting
We also need to pass the `hljs` class so highlight.js knows which element
to style
-->
<CodeJar class="hljs" syntax="javascript" {highlight} {value} />
```
### PrismJS
> **NOTE**: The code is the same as above, but with [PrismJS](https://prismjs.com/) calls instead of highlight.js
```html
<script context="module">
import Prism from "prismjs";
const highlight = (code, syntax) => Prism.highlight(code, Prism.languages[syntax], syntax);
</script>
<script>
import {CodeJar} from "@novacbn/svelte-codejar";
let value = `console.log("Hello World!");`;
</script>
<CodeJar syntax="javascript" {highlight} {value} />
```
## FAQ
### SvelteKit — `ReferenceError: window is not defined`
When using the library with [SvelteKit](https://kit.svelte.dev) with SSR (serverside rendering) enabled you might get this error:
```
[vite] Error when evaluating SSR module /node_modules/codejar/codejar.js?v=4f67a3d5:
ReferenceError: window is not defined
```
Nothing much can do about that, CodeJar [makes a `window` assignment](https://github.com/antonmedv/codejar/blob/b037e29b6565269a2f797e62f51966d77cdf3978/codejar.ts#L1) in its module scope. However you can do a workaround via [`onMount`](https://svelte.dev/docs#onMount) or other similar workflows:
```html
<script>
import {onMount} from "@novacbn/svelte-codejar";
export let value = "";
// **NOTE:** Since `onMount` is only called on the client, we can just
// make our import there. And assign to our Component's scope
let CodeJar;
onMount(async () => {
({CodeJar} = await import("@novacbn/svelte-codejar"));
});
</script>
{#if CodeJar}
<CodeJar bind:value />
{:else}
<!--
**NOTE:** Normally the `CodeJar` Svelte handles fall through for us, and
renders / syntax highlights without an editor during SSR / non-JS enabled clients
-->
<pre><code>{value}</code></pre>
{/if}
```
Only downside being you have to manually syntax highlight your code in the `{:else}` block for SSR / non-JS enabled clients.
## Developer
### Installation
Open your terminal and install via `npm`:
```bash
npm install @novacbn/svelte-codejar
```
### Properties
| Name | Typing | Default | Description |
| ---------- | ------------------------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------- |
| addClosing | `boolean` | `true` | Sets whether the Editor automatically adds closing delimiters, like brackets, quotes, etc... |
| indentOn | `RegExp` | `/{$/` | Represents what expression is used to detect when the Editor needs to auto indent with the configured tab characters |
| spellcheck | `boolean` | `false` | Sets whether to enable the Browser's spellcheck or not |
| tab | `string` | `\t` | Sets the characters inserted whenever the end-user pressed the tab key |
| highlight | `(code: string, syntax?: string) => string` | `null` | Callback is called to highlight the current code and return the rendered HTML markup |
| syntax | `string` | `undefined` | Sets the current language mode of the Editor |
| value | `string` | `""` | Sets the current text of the Editor |
| class | `string` | `""` | Applies `class=""` to the `<pre>` container element |
| style | `string` | `undefined` | Applies `style=""` to the `<pre>` container element |
### Events
| Name | Typing | Description |
| -------- | ------------------------------ | --------------------------------------------- |
| `change` | `CustomEvent<{value: string}>` | Fires whenever the end-user changes the input |
### API
- Components
- `CodeJar`