aboutsummaryrefslogtreecommitdiffstats
path: root/public/prism/prism-perl.js
diff options
context:
space:
mode:
Diffstat (limited to 'public/prism/prism-perl.js')
-rw-r--r--public/prism/prism-perl.js162
1 files changed, 162 insertions, 0 deletions
diff --git a/public/prism/prism-perl.js b/public/prism/prism-perl.js
new file mode 100644
index 0000000..1c18933
--- /dev/null
+++ b/public/prism/prism-perl.js
@@ -0,0 +1,162 @@
+(function (Prism) {
+ var brackets =
+ /(?:\((?:[^()\\]|\\[\s\S])*\)|\{(?:[^{}\\]|\\[\s\S])*\}|\[(?:[^[\]\\]|\\[\s\S])*\]|<(?:[^<>\\]|\\[\s\S])*>)/
+ .source;
+
+ Prism.languages.perl = {
+ comment: [
+ {
+ // POD
+ pattern: /(^\s*)=\w[\s\S]*?=cut.*/m,
+ lookbehind: true,
+ greedy: true,
+ },
+ {
+ pattern: /(^|[^\\$])#.*/,
+ lookbehind: true,
+ greedy: true,
+ },
+ ],
+ // TODO Could be nice to handle Heredoc too.
+ string: [
+ {
+ pattern: RegExp(
+ /\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\s*/.source +
+ '(?:' +
+ [
+ // q/.../
+ /([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,
+
+ // q a...a
+ // eslint-disable-next-line regexp/strict
+ /([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,
+
+ // q(...)
+ // q{...}
+ // q[...]
+ // q<...>
+ brackets,
+ ].join('|') +
+ ')'
+ ),
+ greedy: true,
+ },
+
+ // "...", `...`
+ {
+ pattern: /("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,
+ greedy: true,
+ },
+
+ // '...'
+ // FIXME Multi-line single-quoted strings are not supported as they would break variables containing '
+ {
+ pattern: /'(?:[^'\\\r\n]|\\.)*'/,
+ greedy: true,
+ },
+ ],
+ regex: [
+ {
+ pattern: RegExp(
+ /\b(?:m|qr)(?![a-zA-Z0-9])\s*/.source +
+ '(?:' +
+ [
+ // m/.../
+ /([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,
+
+ // m a...a
+ // eslint-disable-next-line regexp/strict
+ /([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,
+
+ // m(...)
+ // m{...}
+ // m[...]
+ // m<...>
+ brackets,
+ ].join('|') +
+ ')' +
+ /[msixpodualngc]*/.source
+ ),
+ greedy: true,
+ },
+
+ // The lookbehinds prevent -s from breaking
+ {
+ pattern: RegExp(
+ /(^|[^-])\b(?:s|tr|y)(?![a-zA-Z0-9])\s*/.source +
+ '(?:' +
+ [
+ // s/.../.../
+ // eslint-disable-next-line regexp/strict
+ /([^a-zA-Z0-9\s{(\[<])(?:(?!\2)[^\\]|\\[\s\S])*\2(?:(?!\2)[^\\]|\\[\s\S])*\2/
+ .source,
+
+ // s a...a...a
+ // eslint-disable-next-line regexp/strict
+ /([a-zA-Z0-9])(?:(?!\3)[^\\]|\\[\s\S])*\3(?:(?!\3)[^\\]|\\[\s\S])*\3/
+ .source,
+
+ // s(...)(...)
+ // s{...}{...}
+ // s[...][...]
+ // s<...><...>
+ // s(...)[...]
+ brackets + /\s*/.source + brackets,
+ ].join('|') +
+ ')' +
+ /[msixpodualngcer]*/.source
+ ),
+ lookbehind: true,
+ greedy: true,
+ },
+
+ // /.../
+ // The look-ahead tries to prevent two divisions on
+ // the same line from being highlighted as regex.
+ // This does not support multi-line regex.
+ {
+ pattern:
+ /\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,
+ greedy: true,
+ },
+ ],
+
+ // FIXME Not sure about the handling of ::, ', and #
+ variable: [
+ // ${^POSTMATCH}
+ /[&*$@%]\{\^[A-Z]+\}/,
+ // $^V
+ /[&*$@%]\^[A-Z_]/,
+ // ${...}
+ /[&*$@%]#?(?=\{)/,
+ // $foo
+ /[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,
+ // $1
+ /[&*$@%]\d+/,
+ // $_, @_, %!
+ // The negative lookahead prevents from breaking the %= operator
+ /(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/,
+ ],
+ filehandle: {
+ // <>, <FOO>, _
+ pattern: /<(?![<=])\S*?>|\b_\b/,
+ alias: 'symbol',
+ },
+ 'v-string': {
+ // v1.2, 1.2.3
+ pattern: /v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,
+ alias: 'string',
+ },
+ function: {
+ pattern: /(\bsub[ \t]+)\w+/,
+ lookbehind: true,
+ },
+ 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/,
+ number:
+ /\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,
+ operator:
+ /-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,
+ punctuation: /[{}[\];(),:]/,
+ };
+})(Prism);