README
lowlight
Virtual syntax highlighting for virtual DOMs and non-HTML things.
Contents
- What is this?
- When should I use this?
- Install
- Use
- API
- Examples
- Types
- Data
- CSS
- Compatibility
- Security
- Related
- Projects
- Contribute
- License
What is this?
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— 191 languages
Bundled, minified, and gzipped, those are roughly 9.7 kB, 47 kB, and 290 kB.
When should I use this?
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.
Install
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>
Use
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: ';'}
]
}
API
This package exports the following identifier: lowlight.
There is no default export.
lowlight.highlight(language, value[, options])
Highlight value (code) as language (name).
Parameters
language(string) — programming language namevalue(string) — code to highlightoptions.prefix(string?, default:'hljs-') — class prefix
Returns
A 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 name
Example
import {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.
Parameters
value(string) — code to highlightoptions.prefix(string?, default:'hljs-') — class prefixoptions.subset(Array<string>, default: all registered language names) — list of allowed languages
Returns
The same result as lowlight.highlight is returned.
Example
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.
Parameters
language(string) — programming language namesyntax(HighlightSyntax) —highlight.jssyntax
Note
highlight.js operates as a singleton: once you register a language in one
place, it’ll be available everywhere.
Example
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.
Signatures
registerAlias(language, alias|list)registerAlias(aliases)
Parameters
language(string) — programming language namealias(string) — new aliases for the programming languagelist(Array<string>) — list of aliasesaliases(Record<language, alias|list>) — map oflanguages toaliases orlists
Example
import {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.
Parameters
aliasOrlanguage(string) — name of a registered language or alias
Returns
Whether aliasOrlanguage is registered (boolean).
Example
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.
Returns
Names of registered language (Array<string>).
Example
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']
Examples
Example: serializing hast as html
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>;
Example: turning hast into react nodes
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: {}
}
Types
This package is fully typed with TypeScript.
It exports additional Root, Options, and AutoOptions types that models
their respective interfaces.
Data
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— Gradlegroovy— 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) — Zephir
CSS
lowlight 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">
Compatibility
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.
Security
This package is safe.
Related
wooorm/refractor— the same as lowlight but with Prism
Projects
emphasize— 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 Pug
Contribute
Yes please! See How to Contribute to Open Source.