aboutsummaryrefslogtreecommitdiffstats
path: root/public/prism/prism-lisp.js
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2021-12-30 19:47:21 +0100
committerArmand Philippot <git@armandphilippot.com>2021-12-30 19:47:21 +0100
commita98b5ea6fe8e8cc98a55e0fd793e6e8660ea31c1 (patch)
tree542810ab5aef99150db228bb54fd58303dcb31c7 /public/prism/prism-lisp.js
parentab355897a12b7bda1089a44de326d41455a0f7a3 (diff)
chore: add prismjs for syntax highlighting
Diffstat (limited to 'public/prism/prism-lisp.js')
-rw-r--r--public/prism/prism-lisp.js217
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);