All examples

Code blocks reject hostile input

Markup in code stays text, and bidi overrides, injected language tokens or foreign block types show a notice.

Code blocks reject hostile input

blocks-code-hostile · blocks/CodeBlockView

blocks code
Props
  • block
  • oninvalid

Live example loads in an isolated same-origin preview frame.

Source (blocks-code/CodeBlocksHostileDemo.svelte)
<script lang="ts">
import type { FieldIssue } from '@texuli/blocks';
import { CodeBlockView } from '@texuli/blocks/code/renderers';
import { CODE_HOSTILE } from './samples.ts';

/** Hostile block data: inert text or a rejection notice, never markup. */
let rejected = $state<Record<number, string>>({});
const report = (index: number) => (issues: FieldIssue[]) => {
  rejected[index] = issues.map((issue) => issue.message).join('; ');
};
</script>

<article class="demo" data-example="blocks-code-hostile" aria-labelledby="code-hostile-title">
  <h2 id="code-hostile-title">Hostile code input</h2>
  {#each CODE_HOSTILE as sample, i (sample.label)}
    <section class="case" aria-label={sample.label}>
      <h3>{sample.label}</h3>
      <CodeBlockView block={sample.block} oninvalid={report(i)} />
      {#if rejected[i]}<p class="issue" data-rejected>Rejected: {rejected[i]}</p>{/if}
    </section>
  {/each}
</article>

<style>
  .demo {
    display: grid;
    gap: 1.25rem;
    max-inline-size: 42rem;
    padding: 1.5rem;
  }
  .case {
    display: grid;
    gap: 0.5rem;
  }
  .case h3,
  .demo h2 {
    margin: 0;
  }
  .issue {
    margin: 0;
    font-size: 0.875rem;
  }
</style>