source: node_modules/refractor/lang/lisp.js@ d24f17c

main
Last change on this file since d24f17c was d24f17c, checked in by Aleksandar Panovski <apano77@…>, 15 months ago

Initial commit

  • Property mode set to 100644
File size: 5.9 KB
Line 
1'use strict'
2
3module.exports = lisp
4lisp.displayName = 'lisp'
5lisp.aliases = []
6function lisp(Prism) {
7 ;(function (Prism) {
8 /**
9 * Functions to construct regular expressions
10 * e.g. (interactive ... or (interactive)
11 *
12 * @param {string} name
13 * @returns {RegExp}
14 */
15 function simple_form(name) {
16 return RegExp(/(\()/.source + '(?:' + name + ')' + /(?=[\s\)])/.source)
17 }
18 /**
19 * booleans and numbers
20 *
21 * @param {string} pattern
22 * @returns {RegExp}
23 */
24 function primitive(pattern) {
25 return RegExp(
26 /([\s([])/.source + '(?:' + pattern + ')' + /(?=[\s)])/.source
27 )
28 } // Patterns in regular expressions
29 // Symbol name. See https://www.gnu.org/software/emacs/manual/html_node/elisp/Symbol-Type.html
30 // & and : are excluded as they are usually used for special purposes
31 var symbol = /(?!\d)[-+*/~!@$%^=<>{}\w]+/.source // symbol starting with & used in function arguments
32 var marker = '&' + symbol // Open parenthesis for look-behind
33 var par = '(\\()'
34 var endpar = '(?=\\))' // End the pattern with look-ahead space
35 var space = '(?=\\s)'
36 var nestedPar =
37 /(?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\))*\))*\))*/
38 .source
39 var language = {
40 // Three or four semicolons are considered a heading.
41 // See https://www.gnu.org/software/emacs/manual/html_node/elisp/Comment-Tips.html
42 heading: {
43 pattern: /;;;.*/,
44 alias: ['comment', 'title']
45 },
46 comment: /;.*/,
47 string: {
48 pattern: /"(?:[^"\\]|\\.)*"/,
49 greedy: true,
50 inside: {
51 argument: /[-A-Z]+(?=[.,\s])/,
52 symbol: RegExp('`' + symbol + "'")
53 }
54 },
55 'quoted-symbol': {
56 pattern: RegExp("#?'" + symbol),
57 alias: ['variable', 'symbol']
58 },
59 'lisp-property': {
60 pattern: RegExp(':' + symbol),
61 alias: 'property'
62 },
63 splice: {
64 pattern: RegExp(',@?' + symbol),
65 alias: ['symbol', 'variable']
66 },
67 keyword: [
68 {
69 pattern: RegExp(
70 par +
71 '(?:and|(?:cl-)?letf|cl-loop|cond|cons|error|if|(?:lexical-)?let\\*?|message|not|null|or|provide|require|setq|unless|use-package|when|while)' +
72 space
73 ),
74 lookbehind: true
75 },
76 {
77 pattern: RegExp(
78 par +
79 '(?:append|by|collect|concat|do|finally|for|in|return)' +
80 space
81 ),
82 lookbehind: true
83 }
84 ],
85 declare: {
86 pattern: simple_form(/declare/.source),
87 lookbehind: true,
88 alias: 'keyword'
89 },
90 interactive: {
91 pattern: simple_form(/interactive/.source),
92 lookbehind: true,
93 alias: 'keyword'
94 },
95 boolean: {
96 pattern: primitive(/nil|t/.source),
97 lookbehind: true
98 },
99 number: {
100 pattern: primitive(/[-+]?\d+(?:\.\d*)?/.source),
101 lookbehind: true
102 },
103 defvar: {
104 pattern: RegExp(par + 'def(?:const|custom|group|var)\\s+' + symbol),
105 lookbehind: true,
106 inside: {
107 keyword: /^def[a-z]+/,
108 variable: RegExp(symbol)
109 }
110 },
111 defun: {
112 pattern: RegExp(
113 par +
114 /(?:cl-)?(?:defmacro|defun\*?)\s+/.source +
115 symbol +
116 /\s+\(/.source +
117 nestedPar +
118 /\)/.source
119 ),
120 lookbehind: true,
121 greedy: true,
122 inside: {
123 keyword: /^(?:cl-)?def\S+/,
124 // See below, this property needs to be defined later so that it can
125 // reference the language object.
126 arguments: null,
127 function: {
128 pattern: RegExp('(^\\s)' + symbol),
129 lookbehind: true
130 },
131 punctuation: /[()]/
132 }
133 },
134 lambda: {
135 pattern: RegExp(
136 par +
137 'lambda\\s+\\(\\s*(?:&?' +
138 symbol +
139 '(?:\\s+&?' +
140 symbol +
141 ')*\\s*)?\\)'
142 ),
143 lookbehind: true,
144 greedy: true,
145 inside: {
146 keyword: /^lambda/,
147 // See below, this property needs to be defined later so that it can
148 // reference the language object.
149 arguments: null,
150 punctuation: /[()]/
151 }
152 },
153 car: {
154 pattern: RegExp(par + symbol),
155 lookbehind: true
156 },
157 punctuation: [
158 // open paren, brackets, and close paren
159 /(?:['`,]?\(|[)\[\]])/, // cons
160 {
161 pattern: /(\s)\.(?=\s)/,
162 lookbehind: true
163 }
164 ]
165 }
166 var arg = {
167 'lisp-marker': RegExp(marker),
168 varform: {
169 pattern: RegExp(
170 /\(/.source + symbol + /\s+(?=\S)/.source + nestedPar + /\)/.source
171 ),
172 inside: language
173 },
174 argument: {
175 pattern: RegExp(/(^|[\s(])/.source + symbol),
176 lookbehind: true,
177 alias: 'variable'
178 },
179 rest: language
180 }
181 var forms = '\\S+(?:\\s+\\S+)*'
182 var arglist = {
183 pattern: RegExp(par + nestedPar + endpar),
184 lookbehind: true,
185 inside: {
186 'rest-vars': {
187 pattern: RegExp('&(?:body|rest)\\s+' + forms),
188 inside: arg
189 },
190 'other-marker-vars': {
191 pattern: RegExp('&(?:aux|optional)\\s+' + forms),
192 inside: arg
193 },
194 keys: {
195 pattern: RegExp('&key\\s+' + forms + '(?:\\s+&allow-other-keys)?'),
196 inside: arg
197 },
198 argument: {
199 pattern: RegExp(symbol),
200 alias: 'variable'
201 },
202 punctuation: /[()]/
203 }
204 }
205 language['lambda'].inside.arguments = arglist
206 language['defun'].inside.arguments = Prism.util.clone(arglist)
207 language['defun'].inside.arguments.inside.sublist = arglist
208 Prism.languages.lisp = language
209 Prism.languages.elisp = language
210 Prism.languages.emacs = language
211 Prism.languages['emacs-lisp'] = language
212 })(Prism)
213}
Note: See TracBrowser for help on using the repository browser.