diff options
| author | Armand Philippot <git@armandphilippot.com> | 2021-12-30 19:47:21 +0100 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2021-12-30 19:47:21 +0100 |
| commit | a98b5ea6fe8e8cc98a55e0fd793e6e8660ea31c1 (patch) | |
| tree | 542810ab5aef99150db228bb54fd58303dcb31c7 /public/prism/prism-lisp.js | |
| parent | ab355897a12b7bda1089a44de326d41455a0f7a3 (diff) | |
chore: add prismjs for syntax highlighting
Diffstat (limited to 'public/prism/prism-lisp.js')
| -rw-r--r-- | public/prism/prism-lisp.js | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/public/prism/prism-lisp.js b/public/prism/prism-lisp.js new file mode 100644 index 0000000..8febdfd --- /dev/null +++ b/public/prism/prism-lisp.js @@ -0,0 +1,217 @@ +(function (Prism) { + /** + * Functions to construct regular expressions + * e.g. (interactive ... or (interactive) + * + * @param {string} name + * @returns {RegExp} + */ + function simple_form(name) { + return RegExp(/(\()/.source + '(?:' + name + ')' + /(?=[\s\)])/.source); + } + /** + * booleans and numbers + * + * @param {string} pattern + * @returns {RegExp} + */ + function primitive(pattern) { + return RegExp( + /([\s([])/.source + '(?:' + pattern + ')' + /(?=[\s)])/.source + ); + } + + // Patterns in regular expressions + + // Symbol name. See https://www.gnu.org/software/emacs/manual/html_node/elisp/Symbol-Type.html + // & and : are excluded as they are usually used for special purposes + var symbol = /(?!\d)[-+*/~!@$%^=<>{}\w]+/.source; + // symbol starting with & used in function arguments + var marker = '&' + symbol; + // Open parenthesis for look-behind + var par = '(\\()'; + var endpar = '(?=\\))'; + // End the pattern with look-ahead space + var space = '(?=\\s)'; + var nestedPar = + /(?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\))*\))*\))*/ + .source; + + var language = { + // Three or four semicolons are considered a heading. + // See https://www.gnu.org/software/emacs/manual/html_node/elisp/Comment-Tips.html + heading: { + pattern: /;;;.*/, + alias: ['comment', 'title'], + }, + comment: /;.*/, + string: { + pattern: /"(?:[^"\\]|\\.)*"/, + greedy: true, + inside: { + argument: /[-A-Z]+(?=[.,\s])/, + symbol: RegExp('`' + symbol + "'"), + }, + }, + 'quoted-symbol': { + pattern: RegExp("#?'" + symbol), + alias: ['variable', 'symbol'], + }, + 'lisp-property': { + pattern: RegExp(':' + symbol), + alias: 'property', + }, + splice: { + pattern: RegExp(',@?' + symbol), + alias: ['symbol', 'variable'], + }, + keyword: [ + { + pattern: RegExp( + par + + '(?:and|(?:cl-)?letf|cl-loop|cond|cons|error|if|(?:lexical-)?let\\*?|message|not|null|or|provide|require|setq|unless|use-package|when|while)' + + space + ), + lookbehind: true, + }, + { + pattern: RegExp( + par + '(?:append|by|collect|concat|do|finally|for|in|return)' + space + ), + lookbehind: true, + }, + ], + declare: { + pattern: simple_form(/declare/.source), + lookbehind: true, + alias: 'keyword', + }, + interactive: { + pattern: simple_form(/interactive/.source), + lookbehind: true, + alias: 'keyword', + }, + boolean: { + pattern: primitive(/nil|t/.source), + lookbehind: true, + }, + number: { + pattern: primitive(/[-+]?\d+(?:\.\d*)?/.source), + lookbehind: true, + }, + defvar: { + pattern: RegExp(par + 'def(?:const|custom|group|var)\\s+' + symbol), + lookbehind: true, + inside: { + keyword: /^def[a-z]+/, + variable: RegExp(symbol), + }, + }, + defun: { + pattern: RegExp( + par + + /(?:cl-)?(?:defmacro|defun\*?)\s+/.source + + symbol + + /\s+\(/.source + + nestedPar + + /\)/.source + ), + lookbehind: true, + greedy: true, + inside: { + keyword: /^(?:cl-)?def\S+/, + // See below, this property needs to be defined later so that it can + // reference the language object. + arguments: null, + function: { + pattern: RegExp('(^\\s)' + symbol), + lookbehind: true, + }, + punctuation: /[()]/, + }, + }, + lambda: { + pattern: RegExp( + par + + 'lambda\\s+\\(\\s*(?:&?' + + symbol + + '(?:\\s+&?' + + symbol + + ')*\\s*)?\\)' + ), + lookbehind: true, + greedy: true, + inside: { + keyword: /^lambda/, + // See below, this property needs to be defined later so that it can + // reference the language object. + arguments: null, + punctuation: /[()]/, + }, + }, + car: { + pattern: RegExp(par + symbol), + lookbehind: true, + }, + punctuation: [ + // open paren, brackets, and close paren + /(?:['`,]?\(|[)\[\]])/, + // cons + { + pattern: /(\s)\.(?=\s)/, + lookbehind: true, + }, + ], + }; + + var arg = { + 'lisp-marker': RegExp(marker), + varform: { + pattern: RegExp( + /\(/.source + symbol + /\s+(?=\S)/.source + nestedPar + /\)/.source + ), + inside: language, + }, + argument: { + pattern: RegExp(/(^|[\s(])/.source + symbol), + lookbehind: true, + alias: 'variable', + }, + rest: language, + }; + + var forms = '\\S+(?:\\s+\\S+)*'; + + var arglist = { + pattern: RegExp(par + nestedPar + endpar), + lookbehind: true, + inside: { + 'rest-vars': { + pattern: RegExp('&(?:body|rest)\\s+' + forms), + inside: arg, + }, + 'other-marker-vars': { + pattern: RegExp('&(?:aux|optional)\\s+' + forms), + inside: arg, + }, + keys: { + pattern: RegExp('&key\\s+' + forms + '(?:\\s+&allow-other-keys)?'), + inside: arg, + }, + argument: { + pattern: RegExp(symbol), + alias: 'variable', + }, + punctuation: /[()]/, + }, + }; + + language['lambda'].inside.arguments = arglist; + language['defun'].inside.arguments = Prism.util.clone(arglist); + language['defun'].inside.arguments.inside.sublist = arglist; + + Prism.languages.lisp = language; + Prism.languages.elisp = language; + Prism.languages.emacs = language; + Prism.languages['emacs-lisp'] = language; +})(Prism); |
