This is a syntax highlighter for Common Lisp written in Javascript. It is completely themable via CSS (themes included).
The purpose of this is to make it really easy to embed beautiful Common Lisp code into a website with minimal effort.
Usage is simple. You include highlight-lisp.js
, link to one of the CSS themes,
and call one of highlight-lisp's highlighting functions:
<!-- Put these in your document somewhere, probably in the head, although the <script>
tag can probably go anywhere -->
<script type="text/javascript" src="/js/highlight-lisp/highlight-lisp.js"></script>
<link rel="stylesheet" href="/js/highlight-lisp/themes/github.css">
...
<!-- By default, the highlighter looks for code blocks with class="lisp" -->
<pre><code class="lisp">(defun test-syntax-highlighter ()
"Docstring explaining what this function does."
(let ((hash (make-hash-table :test #'equal)))
...))</code></pre>
Once the HTML is set up, there are a few ways to initialize highlighting:
// automatically highlight all <code class="lisp">...</code> blocks
HighlightLisp.highlight_auto();
// specify a custom class name (instead of "lisp"):
HighlightLisp.highlight_auto({className: 'common-lisp'});
// highlight *every* code block
HighlightLisp.highlight_auto({className: null});
// manually highlight a code block
var code = document.getElementById('my-code-element');
HighlightLisp.highlight_element(code);
You can now enable paren matching (on mouse hover):
HighlightLisp.paren_match();
This will go through all highlighted blocks of code and add mouseover/mouseout event listeners to all ('s and )'s that highlight the matching paren on hover.
- Functions
CSS classfunction
Anything starting with(
:(my-function ...)
- Known functions
CSS classfunction known
Any function known by the highlighter: things likemake-hash-table
,when
,format
, etc - Special functions
CSS classfunction known special
Mainlylet
,let\*
,lambda
. - Symbol functions
CSS classfunction symbol
Example:#'my-function
- Known symbol functions
CSS classfunction symbol known
Examples:#'equalp
,#'format
- Known functions
- Keywords
CSS classkeyword
Anything starting with:
like:this-is-a-keyword
- Known keywords
CSS classkeyword known
Known keywords are things like:hash-keys
,:supersede
, etc.
- Known keywords
- Symbols
CSS classsymbol
Anything starting with'
:'my-symbol
- Lambda-list operators
CSS classlambda-list
Things like&key
,&body
, etc. - Numbers
CSS classnumber
Any numbers:69
,-82.4
,#xF047
,#b11010
- Integers
CSS classnumber integer
Simple numbers:42
,867
, etc. (no decimals) - Ratios
CSS classnumber ratio
Examples:80/9
,23/4
- Floats
CSS classnumber float
Numbers with a decimal:+47.82112
,32.9
3.
.009
- Hex
CSS classnumber hex
Hex numbers:#x8090
,#xc001
- Binary
CSS classnumber binary
Example:#b01101
- Integers
- Variables
By themselves, variables remain unhighlighted- Known variables
CSS classvariable known
Examples:*package*
,*standard-output*
, etc - Global variables
CSS classvariable global
Any symbol surrounded by\*
:*main-datastore*
,*my-thread-local*
, etc - Constants
CSS classvariable constant
Any symbol surrounded by+
:+dt+
,+contant-time+
, etc
- Known variables
- nil/t
CSS classnil
Any standalonenil
ort
will get this class - Comments
CSS classcomment
Example:; this is a comment
- Strings
CSS classstring
Anthing inside"
:"This is a string."
- Parens
CSS classlist
May be overkill, but any(
or)
characters are classified.
On that note, things that don't get highlighted/aren't properly highlighted:
- Variables...things like
let
bindings or other symols within code that would be interpreted as variables. Highlighting these would most likely be prohibitive in terms of time (not the mention the return on investment). Feel free to patch! - Some number notations. For instance
0.44d0
. - Multi-line comments
#| ... |#
are unsupported - Many constants (such as
pi
,internal-time-units-per-second
) are classified as functions, not known variables. This is because I pulled the list out of my vim highlight script, and couldn't find a list of "Common Lisp standard variables" to cross reference with. I pulled out the ones I know of and put them into the known variables list, but there are no doubt more. If you see something that is a known variable but gets treated as a known function, please open a github issue.
Aren't there a bunch of Javascript syntax highlighters out there already?
Yes, but truth be told, most ignore lisp. You can write custom parsers for some of them, but the APIs they provide didn't work well enough for me. highlight.js has a very nice lisp highlighting mode, along with really nice themes, but I wanted more control over the process.
For instance, highlight-lisp
started as a SyntaxHighlighter
brush, but I quickly realized that because of the limitations of Javascript not
allowing real lookbehind regular expressions,
I needed more direct control over the search/replace process.
What I discovered was that given the proper tools, parsing lisp is easy (in fact, a cake walk after just releasing markdown.cl) and there's no need for a big highlighting framework. You plug in some regexes, slap some tags around certain things, and call it a day.
As always, MIT.