Code View

@ffs/highlightjs-fson

A highlight.js language definition for FSON — the hand-editable configuration notation used by the FFS project. FSON is a pragmatic superset of JSON5 that adds nested block comments, a narrower bare-key grammar, -- disabled members, %include directives, and |-block multi-line strings.

It colorizes fson ` fenced code blocks on the web and anywhere highlight.js runs.

Install

npm install @ffs/highlightjs-fson highlight.js

Register and use

import hljs from 'highlight.js';
import fson from '@ffs/highlightjs-fson';

hljs.registerLanguage('fson', fson);

const html = hljs.highlight(source, { language: 'fson' }).value;
// or, for all <pre><code class="language-fson"> blocks on a page:
hljs.highlightAll();

CommonJS builds can reach the definition through the default export:

const hljs = require('highlight.js');
hljs.registerLanguage('fson', require('@ffs/highlightjs-fson').default);

CDN (browser)

<link rel="stylesheet"
      href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/default.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js"></script>
<script type="module">
  import fson from 'https://cdn.jsdelivr.net/npm/@ffs/highlightjs-fson/src/fson.js';
  hljs.registerLanguage('fson', fson);
  hljs.highlightAll();
</script>

Self-registering bundle

scripts/build-browser.sh produces dist/fson.min.js — a minified IIFE that calls hljs.registerLanguage('fson', …) itself. Drop it in after highlight.js and nothing else is needed:

<script src="/highlight.min.js"></script>
<script src="/fson.min.js"></script>   <!-- registers 'fson' on load -->

This is what <https://fson.fedem.eu> loads to colour fson ` blocks.

What it highlights

FSON constructhighlight.js scope
// and nested /* … */ commentscomment
bare and quoted keysattr
string values, `\`-block stringsstring
escape sequences (\n, \xHH, \uHHHH, …)char.escape
numbers, hex (0xFF), Infinity, NaN, .5, 5.number
true / false / nullliteral
%include, askeyword
-- disabled members / directives / `\`-linesdeletion

The bare-key grammar deliberately follows FSON's narrower name production, not JSON5's IdentifierName, so keys like $foo, _x, name_, or a__b are treated as ordinary text (they must be quoted to be keys in FSON). The exact production is:

name = [A-Za-z] ( _? [A-Za-z0-9] )*

Scope note

An FSON |-block is highlighted as a single string. Markdown embedded inside such a block is not separately highlighted — this is an intentional scope decision, not a limitation.

Test

npm install
npm test    # runs the highlight.js markup fixtures under test/markup/

The grammar is validated against the real FSON files in the project's corpus/fson/ directory.

License

MIT