UNPKG

9.84 kBJavaScriptView Raw
1(function (Prism) {
2
3 var stringPattern = /(?:"(?:""|[^"])*"(?!")|'(?:''|[^'])*'(?!'))/.source;
4
5 var number = /\b(?:\d[\da-f]*x|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i;
6 var numericConstant = {
7 pattern: RegExp(stringPattern + '[bx]'),
8 alias: 'number'
9 };
10
11 var step = {
12 pattern: /(^|\s+)(?:proc\s+\w+|quit|run|data(?!\=))\b/i,
13 alias: 'keyword',
14 lookbehind: true
15 };
16
17 var comment = [
18 /\/\*[\s\S]*?\*\//,
19 {
20 pattern: /(^\s*|;\s*)\*[^;]*;/m,
21 lookbehind: true
22 }
23 ];
24
25 var string = {
26 pattern: RegExp(stringPattern),
27 greedy: true
28 };
29
30 var punctuation = /[$%@.(){}\[\];,\\]/;
31
32 var func = {
33 pattern: /%?\w+(?=\()/,
34 alias: 'keyword'
35 };
36
37 var args = {
38 'function': func,
39 'arg-value': {
40 pattern: /(\s*=\s*)[A-Z\.]+/i,
41 lookbehind: true
42 },
43 'operator': /=/,
44 'macro-variable': {
45 pattern: /&[^\.]*\./i,
46 alias: 'string'
47 },
48 'arg': {
49 pattern: /[A-Z]+/i,
50 alias: 'keyword'
51 },
52 'number': number,
53 'numeric-constant': numericConstant,
54 'punctuation': punctuation,
55 'string': string
56 };
57
58 var format = {
59 pattern: /\b(?:format|put)\b=?[\w'$.]+/im,
60 inside: {
61 'keyword': /^(?:format|put)(?=\=)/i,
62 'equals': /=/,
63 'format': {
64 pattern: /(?:\w|\$\d)+\.\d?/i,
65 alias: 'number'
66 }
67 }
68 };
69
70 var altformat = {
71 pattern: /\b(?:format|put)\s+[\w']+(?:\s+[$.\w]+)+(?=;)/i,
72 inside: {
73 'keyword': /^(?:format|put)/i,
74 'format': {
75 pattern: /[\w$]+\.\d?/,
76 alias: 'number'
77 }
78 }
79 };
80
81 var globalStatements = {
82 pattern: /((?:^|[\s])=?)(?:catname|checkpoint execute_always|dm|endsas|filename|footnote|%include|libname|%list|lock|missing|options|page|resetline|%run|sasfile|skip|sysecho|title\d?)\b/i,
83 lookbehind: true,
84 alias: 'keyword'
85 };
86
87 var submitStatement = {
88 pattern: /(^|\s)(?:submit(?:\s+(?:load|parseonly|norun))?|endsubmit)\b/i,
89 lookbehind: true,
90 alias: 'keyword'
91 };
92
93 var actionSets = /accessControl|cdm|aggregation|aStore|ruleMining|audio|autotune|bayesianNetClassifier|bioMedImage|boolRule|builtins|cardinality|sccasl|clustering|copula|countreg|dataDiscovery|dataPreprocess|dataSciencePilot|dataStep|decisionTree|deepLearn|deepNeural|varReduce|simSystem|ds2|deduplication|ecm|entityRes|espCluster|explainModel|factmac|fastKnn|fcmpact|fedSql|freqTab|gam|gleam|graphSemiSupLearn|gVarCluster|hiddenMarkovModel|hyperGroup|image|iml|ica|kernalPca|langModel|ldaTopic|sparseML|mlTools|mixed|modelPublishing|mbc|network|optNetwork|neuralNet|nonlinear|nmf|nonParametricBayes|optimization|panel|pls|percentile|pca|phreg|qkb|qlim|quantreg|recommend|tsReconcile|deepRnn|regression|reinforcementLearn|robustPca|sampling|sparkEmbeddedProcess|search(?:Analytics)?|sentimentAnalysis|sequence|configuration|session(?:Prop)?|severity|simple|smartData|sandwich|spatialreg|stabilityMonitoring|spc|loadStreams|svDataDescription|svm|table|conditionalRandomFields|text(?:Rule(?:Develop|Score)|Mining|Parse|Topic|Util|Filters|Frequency)|tsInfo|timeData|transpose|uniTimeSeries/.source;
94
95 var casActions = {
96 pattern: RegExp(/(^|\s)(?:action\s+)?(?:<act>)\.[a-z]+\b[^;]+/.source.replace(/<act>/g, function () { return actionSets; }), 'i'),
97 lookbehind: true,
98 inside: {
99 'keyword': RegExp(/(?:<act>)\.[a-z]+\b/.source.replace(/<act>/g, function () { return actionSets; }), 'i'),
100 'action': {
101 pattern: /(?:action)/i,
102 alias: 'keyword'
103 },
104 'function': func,
105 'arg-value': args['arg-value'],
106 'operator': args.operator,
107 'comment': comment,
108 'argument': args.arg,
109 'number': number,
110 'numeric-constant': numericConstant,
111 'punctuation': punctuation,
112 'string': string
113 }
114 };
115
116 var keywords = {
117 pattern: /((?:^|\s)=?)(?:after|analysis|and|array|barchart|barwidth|begingraph|by|call|cas|cbarline|cfill|class(?:lev)?|close|column|computed?|contains|continue|data(?=\=)|define|delete|describe|document|do\s+over|do|dol|drop|dul|end(?:source|comp)?|entryTitle|else|eval(?:uate)?|exec(?:ute)?|exit|fill(?:attrs)?|file(?:name)?|flist|fnc|function(?:list)?|goto|global|group(?:by)?|headline|headskip|histogram|if|infile|keep|keylabel|keyword|label|layout|leave|legendlabel|length|libname|loadactionset|merge|midpoints|name|noobs|nowd|_?null_|ods|options|or|otherwise|out(?:put)?|over(?:lay)?|plot|put|print|raise|ranexp|rannor|rbreak|retain|return|select|set|session|sessref|source|statgraph|sum|summarize|table|temp|terminate|then\s+do|then|title\d?|to|var|when|where|xaxisopts|yaxisopts|y2axisopts)\b/i,
118 lookbehind: true,
119 };
120
121 Prism.languages.sas = {
122 'datalines': {
123 pattern: /^(\s*)(?:(?:data)?lines|cards);[\s\S]+?^\s*;/im,
124 lookbehind: true,
125 alias: 'string',
126 inside: {
127 'keyword': {
128 pattern: /^(?:(?:data)?lines|cards)/i
129 },
130 'punctuation': /;/
131 }
132 },
133
134 'proc-sql': {
135 pattern: /(^proc\s+(?:fed)?sql(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|run|data);|(?![\s\S]))/im,
136 lookbehind: true,
137 inside: {
138 'sql': {
139 pattern: RegExp(/^[ \t]*(?:select|alter\s+table|(?:create|describe|drop)\s+(?:index|table(?:\s+constraints)?|view)|create\s+unique\s+index|insert\s+into|update)(?:<str>|[^;"'])+;/.source.replace(/<str>/g, function () { return stringPattern; }), 'im'),
140 alias: 'language-sql',
141 inside: Prism.languages.sql
142 },
143 'global-statements': globalStatements,
144 'sql-statements': {
145 pattern: /(^|\s)(?:disconnect\s+from|exec(?:ute)?|begin|commit|rollback|reset|validate)\b/i,
146 lookbehind: true,
147 alias: 'keyword'
148 },
149 'number': number,
150 'numeric-constant': numericConstant,
151 'punctuation': punctuation,
152 'string': string
153 }
154 },
155
156 'proc-groovy': {
157 pattern: /(^proc\s+groovy(?:\s+[\w|=]+)?;)(?:\s*submit)[\s\S]+?(?=^(?:proc\s+\w+|quit|run|data);|(?![\s\S]))/im,
158 lookbehind: true,
159 inside: {
160 'groovy': {
161 pattern: RegExp(/(^[ \t]*submit(?:\s+(?:load|parseonly|norun))?)(?:<str>|[^"'])+?(?=endsubmit;)/.source.replace(/<str>/g, function () { return stringPattern; }), 'im'),
162 lookbehind: true,
163 alias: 'language-groovy',
164 inside: Prism.languages.groovy
165 },
166 'submit-statement': submitStatement,
167 'global-statements': globalStatements,
168 'number': number,
169 'numeric-constant': numericConstant,
170 'punctuation': punctuation,
171 'string': string
172 }
173 },
174
175 'proc-lua': {
176 pattern: /(^proc\s+lua(?:\s+[\w|=]+)?;)(?:\s*submit)[\s\S]+?(?=^(?:proc\s+\w+|quit|run|data);|(?![\s\S]))/im,
177 lookbehind: true,
178 inside: {
179 'lua': {
180 pattern: RegExp(/(^[ \t]*submit(?:\s+(?:load|parseonly|norun))?)(?:<str>|[^"'])+?(?=endsubmit;)/.source.replace(/<str>/g, function () { return stringPattern; }), 'im'),
181 lookbehind: true,
182 alias: 'language-lua',
183 inside: Prism.languages.lua
184 },
185 'submit-statement': submitStatement,
186 'global-statements': globalStatements,
187 'number': number,
188 'numeric-constant': numericConstant,
189 'punctuation': punctuation,
190 'string': string
191 }
192 },
193
194 'proc-cas': {
195 pattern: /(^proc\s+cas(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|data);|(?![\s\S]))/im,
196 lookbehind: true,
197 inside: {
198 'statement-var': {
199 pattern: /((?:^|\s)=?)saveresult\s+[^;]+/im,
200 lookbehind: true,
201 inside: {
202 'statement': {
203 pattern: /^saveresult\s+\S+/i,
204 inside: {
205 keyword: /^(?:saveresult)/i
206 }
207 },
208 rest: args
209 }
210 },
211 'cas-actions': casActions,
212 'statement': {
213 pattern: /((?:^|\s)=?)(?:default|(?:un)?set|on|output|upload)[^;]+/im,
214 lookbehind: true,
215 inside: args
216 },
217 'step': step,
218 'keyword': keywords,
219 'function': func,
220 'comment': comment,
221 'format': format,
222 'altformat': altformat,
223 'global-statements': globalStatements,
224 'number': number,
225 'numeric-constant': numericConstant,
226 'punctuation': punctuation,
227 'string': string
228 }
229 },
230
231 'proc-args': {
232 pattern: RegExp(/(^proc\s+\w+\s+)(?!\s)(?:[^;"']|<str>)+;/.source.replace(/<str>/g, function () { return stringPattern; }), 'im'),
233 lookbehind: true,
234 inside: args
235 },
236
237 /*Special keywords within macros*/
238 'macro-keyword': {
239 pattern: /((?:^|\s)=?)%(?:ABORT|BQUOTE|BY|CMS|COPY|DISPLAY|DO|ELSE|END|EVAL|GLOBAL|GO|GOTO|IF|INC|INCLUDE|INDEX|INPUT|KTRIM|LENGTH|LET|LIST|LOCAL|NRBQUOTE|NRQUOTE|NRSTR|PUT|QKTRIM|QSCAN|QSUBSTR|QSYSFUNC|QUOTE|QUPCASE|RETURN|RUN|SCAN|STR|SUBSTR|SUPERQ|SYMDEL|SYMGLOBL|SYMLOCAL|SYMEXIST|SYSCALL|SYSEVALF|SYSEXEC|SYSFUNC|SYSGET|SYSRPUT|THEN|TO|TSO|UNQUOTE|UNTIL|UPCASE|WHILE|WINDOW)\b/i,
240 lookbehind: true,
241 alias: 'keyword'
242 },
243 'macro-declaration': {
244 pattern: /^%macro[^;]+(?=;)/im,
245 inside: {
246 'keyword': /%macro/i,
247 }
248 },
249 'macro-end': {
250 pattern: /^%mend[^;]+(?=;)/im,
251 inside: {
252 'keyword': /%mend/i,
253 }
254 },
255 /*%_zscore(headcir, _lhc, _mhc, _shc, headcz, headcpct, _Fheadcz); */
256 'macro': {
257 pattern: /%_\w+(?=\()/,
258 alias: 'keyword'
259 },
260 'input': {
261 pattern: /\binput\s+[-\w\s/*.$&]+;/i,
262 inside: {
263 'input': {
264 alias: 'keyword',
265 pattern: /^input/i,
266 },
267 'comment': comment,
268 'number': number,
269 'numeric-constant': numericConstant
270 }
271 },
272 'options-args': {
273 pattern: /(^options)[-'"|/\\<>*+=:()\w\s]*(?=;)/im,
274 lookbehind: true,
275 inside: args
276 },
277 'cas-actions': casActions,
278 'comment': comment,
279 'function': func,
280 'format': format,
281 'altformat': altformat,
282 'numeric-constant': numericConstant,
283 'datetime': {
284 // '1jan2013'd, '9:25:19pm't, '18jan2003:9:27:05am'dt
285 pattern: RegExp(stringPattern + '(?:dt?|t)'),
286 alias: 'number'
287 },
288 'string': string,
289 'step': step,
290 'keyword': keywords,
291 // In SAS Studio syntax highlighting, these operators are styled like keywords
292 'operator-keyword': {
293 pattern: /\b(?:eq|ne|gt|lt|ge|le|in|not)\b/i,
294 alias: 'operator'
295 },
296 // Decimal (1.2e23), hexadecimal (0c1x)
297 'number': number,
298 'operator': /\*\*?|\|\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\/=&]|[~¬^]=?/i,
299 'punctuation': punctuation
300 };
301
302}(Prism));