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