UNPKG

4.62 kBJavaScriptView Raw
1Prism.languages.perl = {
2 'comment': [
3 {
4 // POD
5 pattern: /(^\s*)=\w[\s\S]*?=cut.*/m,
6 lookbehind: true
7 },
8 {
9 pattern: /(^|[^\\$])#.*/,
10 lookbehind: true
11 }
12 ],
13 // TODO Could be nice to handle Heredoc too.
14 'string': [
15 // q/.../
16 {
17 pattern: /\b(?:q|qq|qx|qw)\s*([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/,
18 greedy: true
19 },
20
21 // q a...a
22 {
23 pattern: /\b(?:q|qq|qx|qw)\s+([a-zA-Z0-9])(?:(?!\1)[^\\]|\\[\s\S])*\1/,
24 greedy: true
25 },
26
27 // q(...)
28 {
29 pattern: /\b(?:q|qq|qx|qw)\s*\((?:[^()\\]|\\[\s\S])*\)/,
30 greedy: true
31 },
32
33 // q{...}
34 {
35 pattern: /\b(?:q|qq|qx|qw)\s*\{(?:[^{}\\]|\\[\s\S])*\}/,
36 greedy: true
37 },
38
39 // q[...]
40 {
41 pattern: /\b(?:q|qq|qx|qw)\s*\[(?:[^[\]\\]|\\[\s\S])*\]/,
42 greedy: true
43 },
44
45 // q<...>
46 {
47 pattern: /\b(?:q|qq|qx|qw)\s*<(?:[^<>\\]|\\[\s\S])*>/,
48 greedy: true
49 },
50
51 // "...", `...`
52 {
53 pattern: /("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,
54 greedy: true
55 },
56
57 // '...'
58 // FIXME Multi-line single-quoted strings are not supported as they would break variables containing '
59 {
60 pattern: /'(?:[^'\\\r\n]|\\.)*'/,
61 greedy: true
62 }
63 ],
64 'regex': [
65 // m/.../
66 {
67 pattern: /\b(?:m|qr)\s*([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[msixpodualngc]*/,
68 greedy: true
69 },
70
71 // m a...a
72 {
73 pattern: /\b(?:m|qr)\s+([a-zA-Z0-9])(?:(?!\1)[^\\]|\\[\s\S])*\1[msixpodualngc]*/,
74 greedy: true
75 },
76
77 // m(...)
78 {
79 pattern: /\b(?:m|qr)\s*\((?:[^()\\]|\\[\s\S])*\)[msixpodualngc]*/,
80 greedy: true
81 },
82
83 // m{...}
84 {
85 pattern: /\b(?:m|qr)\s*\{(?:[^{}\\]|\\[\s\S])*\}[msixpodualngc]*/,
86 greedy: true
87 },
88
89 // m[...]
90 {
91 pattern: /\b(?:m|qr)\s*\[(?:[^[\]\\]|\\[\s\S])*\][msixpodualngc]*/,
92 greedy: true
93 },
94
95 // m<...>
96 {
97 pattern: /\b(?:m|qr)\s*<(?:[^<>\\]|\\[\s\S])*>[msixpodualngc]*/,
98 greedy: true
99 },
100
101 // The lookbehinds prevent -s from breaking
102 // FIXME We don't handle change of separator like s(...)[...]
103 // s/.../.../
104 {
105 pattern: /(^|[^-]\b)(?:s|tr|y)\s*([^a-zA-Z0-9\s{(\[<])(?:(?!\2)[^\\]|\\[\s\S])*\2(?:(?!\2)[^\\]|\\[\s\S])*\2[msixpodualngcer]*/,
106 lookbehind: true,
107 greedy: true
108 },
109
110 // s a...a...a
111 {
112 pattern: /(^|[^-]\b)(?:s|tr|y)\s+([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2(?:(?!\2)[^\\]|\\[\s\S])*\2[msixpodualngcer]*/,
113 lookbehind: true,
114 greedy: true
115 },
116
117 // s(...)(...)
118 {
119 pattern: /(^|[^-]\b)(?:s|tr|y)\s*\((?:[^()\\]|\\[\s\S])*\)\s*\((?:[^()\\]|\\[\s\S])*\)[msixpodualngcer]*/,
120 lookbehind: true,
121 greedy: true
122 },
123
124 // s{...}{...}
125 {
126 pattern: /(^|[^-]\b)(?:s|tr|y)\s*\{(?:[^{}\\]|\\[\s\S])*\}\s*\{(?:[^{}\\]|\\[\s\S])*\}[msixpodualngcer]*/,
127 lookbehind: true,
128 greedy: true
129 },
130
131 // s[...][...]
132 {
133 pattern: /(^|[^-]\b)(?:s|tr|y)\s*\[(?:[^[\]\\]|\\[\s\S])*\]\s*\[(?:[^[\]\\]|\\[\s\S])*\][msixpodualngcer]*/,
134 lookbehind: true,
135 greedy: true
136 },
137
138 // s<...><...>
139 {
140 pattern: /(^|[^-]\b)(?:s|tr|y)\s*<(?:[^<>\\]|\\[\s\S])*>\s*<(?:[^<>\\]|\\[\s\S])*>[msixpodualngcer]*/,
141 lookbehind: true,
142 greedy: true
143 },
144
145 // /.../
146 // The look-ahead tries to prevent two divisions on
147 // the same line from being highlighted as regex.
148 // This does not support multi-line regex.
149 {
150 pattern: /\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:lt|gt|le|ge|eq|ne|cmp|not|and|or|xor|x)\b))/,
151 greedy: true
152 }
153 ],
154
155 // FIXME Not sure about the handling of ::, ', and #
156 'variable': [
157 // ${^POSTMATCH}
158 /[&*$@%]\{\^[A-Z]+\}/,
159 // $^V
160 /[&*$@%]\^[A-Z_]/,
161 // ${...}
162 /[&*$@%]#?(?=\{)/,
163 // $foo
164 /[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+)+(?:::)*/i,
165 // $1
166 /[&*$@%]\d+/,
167 // $_, @_, %!
168 // The negative lookahead prevents from breaking the %= operator
169 /(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/
170 ],
171 'filehandle': {
172 // <>, <FOO>, _
173 pattern: /<(?![<=])\S*>|\b_\b/,
174 alias: 'symbol'
175 },
176 'vstring': {
177 // v1.2, 1.2.3
178 pattern: /v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,
179 alias: 'string'
180 },
181 'function': {
182 pattern: /sub [a-z0-9_]+/i,
183 inside: {
184 keyword: /sub/
185 }
186 },
187 'keyword': /\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,
188 'number': /\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,
189 'operator': /-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:lt|gt|le|ge|eq|ne|cmp|not|and|or|xor)\b/,
190 'punctuation': /[{}[\];(),:]/
191};