
A highlight.js language definition for FFS-MD — the FFS in-house Markdown dialect. FFS-MD is a CommonMark-ish base plus FFS additions: a top-of-file front-matter block, the [IMAGE:…] / [VIDEO: …] / [SVG: …] / [LIST:…] block directives, Confluence-style status marks, :emoji: shortcodes, and footnotes / reference links.
It colorizes ffsmd fenced code blocks and FFS content .md` files.
npm install @ffs/highlightjs-ffsmd highlight.js
# optional — enables real FSON highlighting inside ```fson fences:
npm install @ffs/highlightjs-fson
import hljs from 'highlight.js';
import ffsmd from '@ffs/highlightjs-ffsmd';
// optional: register FSON first so ```fson fenced blocks are highlighted
import fson from '@ffs/highlightjs-fson';
hljs.registerLanguage('fson', fson);
hljs.registerLanguage('ffsmd', ffsmd);
const html = hljs.highlight(source, { language: 'ffsmd' }).value;
// or, for all <pre><code class="language-ffsmd"> blocks:
hljs.highlightAll();
CommonJS builds reach the definition through the default export:
const hljs = require('highlight.js');
hljs.registerLanguage('ffsmd', require('@ffs/highlightjs-ffsmd').default);
Standard Markdown (headings, emphasis, lists, task lists, blockquotes, GFM tables, fenced code, horizontal rules) is handled by delegating to highlight.js's built-in markdown grammar. On top of that, FFS-MD adds:
| FFS construct | scope | |
|---|---|---|
top-of-file front-matter --- block | meta | |
| front-matter keys | attr | |
| front-matter values (dates, arrays, booleans, strings) | number / string / literal | |
[IMAGE:…] [VIDEO: …] [SVG: …] [LIST:…] directives | meta (path string, `\ | /, punctuation, keywords keyword`) |
status marks (/) (x) (!) (?) (y) (n) (on) (off) | symbol | |
emoji shortcodes :name: (curated + ISO country flags) | symbol | |
footnote ref [^label] and def [^label]: | symbol | |
fenced-code info-string ( fson , cpp , …) | attr |
The directive prefixes are matched exactly, matching the renderer: [IMAGE: has no space, while [VIDEO: has a trailing space. Status marks match only the closed literal set — an arbitrary (word) is left as plain text.
A fson block delegates to the FSON grammar (when @ffs/highlightjs-fson is registered) and a cpp block delegates to highlight.js's C++ grammar. Other tagged fences keep their info-string visible as attr. If the FSON grammar is not registered, a fson ` block simply renders as plain text — no error.
Note: MD→FSON embedding (Markdown highlighted inside an FSON
\|-blockstring) is intentionally out of scope; that boundary lives on the FSON
side.
npm install
npm test # runs the highlight.js markup fixtures under test/markup/
The grammar is validated against the real FFS content files in the project's corpus/ffsmd/ directory — including a German-language post with many [IMAGE:…] directives that exercise empty (||) and multi-field forms.
MIT