$ cnpm install lowlight
Virtual syntax highlighting for virtual DOMs and non-HTML things.
This package wraps highlight.js to output objects (ASTs) instead of a string of HTML.
highlight.js, through lowlight, supports 190+ programming languages.
Supporting all of them requires a lot of code.
That’s why there are three entry points for lowlight:
lib/core.js — 0 languageslib/common.js (default) — 35 languageslib/all.js — 192 languagesBundled, minified, and gzipped, those are roughly 9.7 kB, 47 kB, and 290 kB.
This package is useful when you want to perform syntax highlighting in a place where serialized HTML wouldn’t work or wouldn’t work well. For example, you can use lowlight when you want to show code in a CLI by rendering to ANSI sequences, when you’re using virtual DOM frameworks (such as React or Preact) so that diffing can be performant, or when you’re working with ASTs (rehype).
A different package, refractor, does the same as lowlight but
uses Prism instead.
This package is ESM only. In Node.js (version 12.20+, 14.14+, or 16.0+), install with npm:
npm install lowlight
In Deno with Skypack:
import {lowlight} from 'https://cdn.skypack.dev/lowlight@2?dts'
In browsers with Skypack:
<script type="module">
import {lowlight} from 'https://cdn.skypack.dev/lowlight@2?min'
</script>
import {lowlight} from 'lowlight'
const tree = lowlight.highlight('js', '"use strict";')
console.dir(tree, {depth: null})
Yields:
{
type: 'root',
data: {language: 'js', relevance: 10},
children: [
{
type: 'element',
tagName: 'span',
properties: {className: ['hljs-meta']},
children: [{type: 'text', value: '"use strict"'}]
},
{type: 'text', value: ';'}
]
}
This package exports the following identifier: lowlight.
There is no default export.
lowlight.highlight(language, value[, options])Highlight value (code) as language (name).
language (string)
— programming language namevalue (string)
— code to highlightoptions.prefix (string?, default: 'hljs-')
— class prefixA hast Root node with the following data fields:
relevance (number)
— how sure lowlight is that the given code is in the languagelanguage (string)
— detected programming language nameimport {lowlight} from 'lowlight'
console.log(lowlight.highlight('css', 'em { color: red }'))
Yields:
{type: 'root', data: {language: 'css', relevance: 3}, children: [Array]}
lowlight.highlightAuto(value[, options])Highlight value (code) and guess its programming language.
value (string)
— code to highlightoptions.prefix (string?, default: 'hljs-')
— class prefixoptions.subset (Array<string>, default: all registered language names)
— list of allowed languagesThe same result as lowlight.highlight is returned.
import {lowlight} from 'lowlight'
console.log(lowlight.highlightAuto('"hello, " + name + "!"'))
Yields:
{type: 'root', data: {language: 'applescript', relevance: 3}, children: [Array]}
lowlight.registerLanguage(language, syntax)Register a language.
language (string)
— programming language namesyntax (HighlightSyntax)
— highlight.js syntaxhighlight.js operates as a singleton: once you register a language in one
place, it’ll be available everywhere.
import {lowlight} from 'lowlight/lib/core.js'
import xml from 'highlight.js/lib/languages/xml.js'
lowlight.registerLanguage('xml', xml)
console.log(lowlight.highlight('html', '<em>Emphasis</em>'))
Yields:
{type: 'root', data: {language: 'html', relevance: 2}, children: [Array]}
lowlight.registerAlias(language, alias)Register aliases for already registered languages.
registerAlias(language, alias|list)registerAlias(aliases)language (string)
— programming language namealias (string)
— new aliases for the programming languagelist (Array<string>)
— list of aliasesaliases (Record<language, alias|list>)
— map of languages to aliases or listsimport {lowlight} from 'lowlight/lib/core.js'
import md from 'highlight.js/lib/languages/markdown.js'
lowlight.registerLanguage('markdown', md)
// lowlight.highlight('mdown', '<em>Emphasis</em>')
// ^ would throw: Error: Unknown language: `mdown` is not registered
lowlight.registerAlias({markdown: ['mdown', 'mkdn', 'mdwn', 'ron']})
lowlight.highlight('mdown', '<em>Emphasis</em>')
// ^ Works!
lowlight.registered(aliasOrlanguage)Check whether an alias or language is registered.
aliasOrlanguage (string)
— name of a registered language or aliasWhether aliasOrlanguage is registered (boolean).
import {lowlight} from 'lowlight/lib/core.js'
import javascript from 'highlight.js/lib/languages/javascript.js'
lowlight.registerLanguage('javascript', javascript)
lowlight.registered('js') // return false
lowlight.registerAlias('javascript', 'js')
lowlight.registered('js') // return true
lowlight.listLanguages()List registered languages.
Names of registered language (Array<string>).
import {lowlight} from 'lowlight/lib/core.js'
import md from 'highlight.js/lib/languages/markdown.js'
console.log(lowlight.listLanguages()) // => []
lowlight.registerLanguage('markdown', md)
console.log(lowlight.listLanguages()) // => ['markdown']
hast trees as returned by lowlight can be serialized with
hast-util-to-html:
import {lowlight} from 'lowlight'
import {toHtml} from 'hast-util-to-html'
const tree = lowlight.highlight('js', '"use strict";')
console.log(toHtml(tree))
Yields:
<span class="hljs-meta">"use strict"</span>;
hast trees as returned by lowlight can be turned into React (or Preact) with
hast-to-hyperscript:
import {lowlight} from 'lowlight'
import {toH} from 'hast-to-hyperscript'
import React from 'react'
const tree = lowlight.highlight('js', '"use strict";')
const react = toH(React.createElement, tree)
console.log(react)
Yields:
{
'$$typeof': Symbol(react.element),
type: 'div',
key: 'h-1',
ref: null,
props: { children: [ [Object], ';' ] },
_owner: null,
_store: {}
}
This package is fully typed with TypeScript.
It exports additional Root, Options, and AutoOptions types that models
their respective interfaces.
If you’re using lowlight/lib/core.js, no syntaxes are included.
Checked syntaxes are included if you import lowlight (or explicitly
lowlight/lib/common.js).
Unchecked syntaxes are available through lowlight/lib/all.js.
You can import core or common and manually add more languages as you please.
highlight.js operates as a singleton: once you register a language in one
place, it’ll be available everywhere.
1c — 1C:Enterpriseabnf — Augmented Backus-Naur Formaccesslog — Apache Access Logactionscript (as) — ActionScriptada — Adaangelscript (asc) — AngelScriptapache (apacheconf) — Apache configapplescript (osascript) — AppleScriptarcade — ArcGIS Arcadearduino (ino) — Arduinoarmasm (arm) — ARM Assemblyasciidoc (adoc) — AsciiDocaspectj — AspectJautohotkey (ahk) — AutoHotkeyautoit — AutoItavrasm — AVR Assemblyawk — Awkaxapta (x++) — X++bash (sh) — Bashbasic — BASICbnf — Backus–Naur Formbrainfuck (bf) — Brainfuckc (h) — Ccal — C/ALcapnproto (capnp) — Cap’n Protoceylon — Ceylonclean (icl, dcl) — Cleanclojure (clj, edn) — Clojureclojure-repl — Clojure REPLcmake (cmake.in) — CMakecoffeescript (coffee, cson, iced) — CoffeeScriptcoq — Coqcos (cls) — Caché Object Scriptcpp (cc, c++, h++, hpp, hh, hxx, cxx) — C++crmsh (crm, pcmk) — crmshcrystal (cr) — Crystalcsharp (cs, c#) — C#csp — CSPcss — CSSd — Ddart — Dartdelphi (dpr, dfm, pas, pascal) — Delphidiff (patch) — Diffdjango (jinja) — Djangodns (bind, zone) — DNS Zonedockerfile (docker) — Dockerfiledos (bat, cmd) — Batch file (DOS)dsconfig — undefineddts — Device Treedust (dst) — Dustebnf — Extended Backus-Naur Formelixir (ex, exs) — Elixirelm — Elmerb — ERBerlang (erl) — Erlangerlang-repl — Erlang REPLexcel (xlsx, xls) — Excel formulaefix — FIXflix — Flixfortran (f90, f95) — Fortranfsharp (fs, f#) — F#gams (gms) — GAMSgauss (gss) — GAUSSgcode (nc) — G-code (ISO 6983)gherkin (feature) — Gherkinglsl — GLSLgml — GMLgo (golang) — Gogolo — Gologradle — Gradlegraphql (gql) — GraphQLgroovy — Groovyhaml — HAMLhandlebars (hbs, html.hbs, html.handlebars, htmlbars) — Handlebarshaskell (hs) — Haskellhaxe (hx) — Haxehsp — HSPhttp (https) — HTTPhy (hylang) — Hyinform7 (i7) — Inform 7ini (toml) — TOML, also INIirpf90 — IRPF90isbl — ISBLjava (jsp) — Javajavascript (js, jsx, mjs, cjs) — Javascriptjboss-cli (wildfly-cli) — JBoss CLIjson — JSONjulia — Juliajulia-repl (jldoctest) — Julia REPLkotlin (kt, kts) — Kotlinlasso (ls, lassoscript) — Lassolatex (tex) — LaTeXldif — LDIFleaf — Leafless — Lesslisp — Lisplivecodeserver — LiveCodelivescript (ls) — LiveScriptllvm — LLVM IRlsl — LSL (Linden Scripting Language)lua — Luamakefile (mk, mak, make) — Makefilemarkdown (md, mkdown, mkd) — Markdownmathematica (mma, wl) — Mathematicamatlab — Matlabmaxima — Maximamel — MELmercury (m, moo) — Mercurymipsasm (mips) — MIPS Assemblymizar — Mizarmojolicious — Mojoliciousmonkey — Monkeymoonscript (moon) — MoonScriptn1ql — N1QLnestedtext (nt) — Nested Textnginx (nginxconf) — Nginx confignim — Nimnix (nixos) — Nixnode-repl — Node REPLnsis — NSISobjectivec (mm, objc, obj-c, obj-c++, objective-c++) — Objective-Cocaml (ml) — OCamlopenscad (scad) — OpenSCADoxygene — Oxygeneparser3 — Parser3perl (pl, pm) — Perlpf (pf.conf) — Packet Filter configpgsql (postgres, postgresql) — PostgreSQLphp — undefinedphp-template — PHP templateplaintext (text, txt) — Plain textpony — Ponypowershell (pwsh, ps, ps1) — PowerShellprocessing (pde) — Processingprofile — Python profilerprolog — Prologproperties — .propertiesprotobuf — Protocol Bufferspuppet (pp) — Puppetpurebasic (pb, pbi) — PureBASICpython (py, gyp, ipython) — Pythonpython-repl (pycon) — undefinedq (k, kdb) — Qqml (qt) — QMLr — Rreasonml (re) — ReasonMLrib — RenderMan RIBroboconf (graph, instances) — Roboconfrouteros (mikrotik) — Microtik RouterOS scriptrsl — RenderMan RSLruby (rb, gemspec, podspec, thor, irb) — Rubyruleslanguage — Oracle Rules Languagerust (rs) — Rustsas — SASscala — Scalascheme — Schemescilab (sci) — Scilabscss — SCSSshell (console, shellsession) — Shell Sessionsmali — Smalismalltalk (st) — Smalltalksml (ml) — SML (Standard ML)sqf — SQFsql — SQLstan (stanfuncs) — Stanstata (do, ado) — Statastep21 (p21, step, stp) — STEP Part 21stylus (styl) — Stylussubunit — SubUnitswift — Swifttaggerscript — Tagger Scripttap — Test Anything Protocoltcl (tk) — Tclthrift — Thrifttp — TPtwig (craftcms) — Twigtypescript (ts, tsx) — TypeScriptvala — Valavbnet (vb) — Visual Basic .NETvbscript (vbs) — VBScriptvbscript-html — VBScript in HTMLverilog (v, sv, svh) — Verilogvhdl — VHDLvim — Vim Scriptwasm — WebAssemblywren — Wrenx86asm — Intel x86 Assemblyxl (tao) — XLxml (html, xhtml, rss, atom, xjb, xsd, xsl, plist, wsf, svg) — HTML, XMLxquery (xpath, xq) — XQueryyaml (yml) — YAMLzephir (zep) — Zephirlowlight does not inject CSS for the syntax highlighted code (because well,
lowlight doesn’t have to be turned into HTML and might not run in a browser!).
If you are in a browser, you can use any highlight.js theme.
For example, to get GitHub Dark from cdnjs:
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.2.0/styles/github-dark.min.css">
This package is at least compatible with all maintained versions of Node.js. As of now, that is Node.js 12.20+, 14.14+, and 16.0+. It also works in Deno and modern browsers.
This package is safe.
wooorm/refractor
— the same as lowlight but with Prismemphasize
— syntax highlighting in ANSI (for the terminal)react-lowlight
— syntax highlighter for Reactreact-syntax-highlighter
— React component for syntax highlightingrehype-highlight
— rehype plugin to highlight code
blocksjstransformer-lowlight
— syntax highlighting for JSTransformers
and PugYes please! See How to Contribute to Open Source.
Copyright 2013 - present © cnpmjs.org