| Index: lib/src/prism/components/prism-perl.js
|
| diff --git a/lib/src/prism/components/prism-perl.js b/lib/src/prism/components/prism-perl.js
|
| index d435e800e2dd773bfa032927c58d83a51fdf0c95..0f3d2ba355ec15f946d85e39311ac6fea98fea48 100644
|
| --- a/lib/src/prism/components/prism-perl.js
|
| +++ b/lib/src/prism/components/prism-perl.js
|
| @@ -2,96 +2,124 @@ Prism.languages.perl = {
|
| 'comment': [
|
| {
|
| // POD
|
| - pattern: /((?:^|\n)\s*)=\w+[\s\S]*?=cut.*/,
|
| + pattern: /(^\s*)=\w+[\s\S]*?=cut.*/m,
|
| lookbehind: true
|
| },
|
| {
|
| - pattern: /(^|[^\\$])#.*?(\r?\n|$)/,
|
| + pattern: /(^|[^\\$])#.*/,
|
| lookbehind: true
|
| }
|
| ],
|
| // TODO Could be nice to handle Heredoc too.
|
| 'string': [
|
| // q/.../
|
| - /\b(?:q|qq|qx|qw)\s*([^a-zA-Z0-9\s\{\(\[<])(\\?.)*?\s*\1/,
|
| + /\b(?:q|qq|qx|qw)\s*([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1/,
|
|
|
| // q a...a
|
| - /\b(?:q|qq|qx|qw)\s+([a-zA-Z0-9])(\\?.)*?\s*\1/,
|
| + /\b(?:q|qq|qx|qw)\s+([a-zA-Z0-9])(?:[^\\]|\\[\s\S])*?\1/,
|
|
|
| // q(...)
|
| - /\b(?:q|qq|qx|qw)\s*\(([^()]|\\.)*\s*\)/,
|
| + /\b(?:q|qq|qx|qw)\s*\((?:[^()\\]|\\[\s\S])*\)/,
|
|
|
| // q{...}
|
| - /\b(?:q|qq|qx|qw)\s*\{([^{}]|\\.)*\s*\}/,
|
| + /\b(?:q|qq|qx|qw)\s*\{(?:[^{}\\]|\\[\s\S])*\}/,
|
|
|
| // q[...]
|
| - /\b(?:q|qq|qx|qw)\s*\[([^[\]]|\\.)*\s*\]/,
|
| + /\b(?:q|qq|qx|qw)\s*\[(?:[^[\]\\]|\\[\s\S])*\]/,
|
|
|
| // q<...>
|
| - /\b(?:q|qq|qx|qw)\s*<([^<>]|\\.)*\s*>/,
|
| + /\b(?:q|qq|qx|qw)\s*<(?:[^<>\\]|\\[\s\S])*>/,
|
|
|
| - // "...", '...', `...`
|
| - /("|'|`)(\\?.)*?\1/
|
| + // "...", `...`
|
| + /("|`)(?:[^\\]|\\[\s\S])*?\1/,
|
| +
|
| + // '...'
|
| + // FIXME Multi-line single-quoted strings are not supported as they would break variables containing '
|
| + /'(?:[^'\\\r\n]|\\.)*'/
|
| ],
|
| 'regex': [
|
| // m/.../
|
| - /\b(?:m|qr)\s*([^a-zA-Z0-9\s\{\(\[<])(\\?.)*?\s*\1[msixpodualgc]*/,
|
| + /\b(?:m|qr)\s*([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1[msixpodualngc]*/,
|
|
|
| // m a...a
|
| - /\b(?:m|qr)\s+([a-zA-Z0-9])(\\?.)*?\s*\1[msixpodualgc]*/,
|
| + /\b(?:m|qr)\s+([a-zA-Z0-9])(?:[^\\]|\\.)*?\1[msixpodualngc]*/,
|
|
|
| // m(...)
|
| - /\b(?:m|qr)\s*\(([^()]|\\.)*\s*\)[msixpodualgc]*/,
|
| + /\b(?:m|qr)\s*\((?:[^()\\]|\\[\s\S])*\)[msixpodualngc]*/,
|
|
|
| // m{...}
|
| - /\b(?:m|qr)\s*\{([^{}]|\\.)*\s*\}[msixpodualgc]*/,
|
| + /\b(?:m|qr)\s*\{(?:[^{}\\]|\\[\s\S])*\}[msixpodualngc]*/,
|
|
|
| // m[...]
|
| - /\b(?:m|qr)\s*\[([^[\]]|\\.)*\s*\][msixpodualgc]*/,
|
| + /\b(?:m|qr)\s*\[(?:[^[\]\\]|\\[\s\S])*\][msixpodualngc]*/,
|
|
|
| // m<...>
|
| - /\b(?:m|qr)\s*<([^<>]|\\.)*\s*>[msixpodualgc]*/,
|
| -
|
| + /\b(?:m|qr)\s*<(?:[^<>\\]|\\[\s\S])*>[msixpodualngc]*/,
|
| +
|
| + // The lookbehinds prevent -s from breaking
|
| + // FIXME We don't handle change of separator like s(...)[...]
|
| // s/.../.../
|
| - /\b(?:s|tr|y)\s*([^a-zA-Z0-9\s\{\(\[<])(\\?.)*?\s*\1\s*((?!\1).|\\.)*\s*\1[msixpodualgcer]*/,
|
| + {
|
| + pattern: /(^|[^-]\b)(?:s|tr|y)\s*([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\2(?:[^\\]|\\[\s\S])*?\2[msixpodualngcer]*/,
|
| + lookbehind: true
|
| + },
|
|
|
| // s a...a...a
|
| - /\b(?:s|tr|y)\s+([a-zA-Z0-9])(\\?.)*?\s*\1\s*((?!\1).|\\.)*\s*\1[msixpodualgcer]*/,
|
| + {
|
| + pattern: /(^|[^-]\b)(?:s|tr|y)\s+([a-zA-Z0-9])(?:[^\\]|\\[\s\S])*?\2(?:[^\\]|\\[\s\S])*?\2[msixpodualngcer]*/,
|
| + lookbehind: true
|
| + },
|
|
|
| // s(...)(...)
|
| - /\b(?:s|tr|y)\s*\(([^()]|\\.)*\s*\)\s*\(\s*([^()]|\\.)*\s*\)[msixpodualgcer]*/,
|
| + {
|
| + pattern: /(^|[^-]\b)(?:s|tr|y)\s*\((?:[^()\\]|\\[\s\S])*\)\s*\((?:[^()\\]|\\[\s\S])*\)[msixpodualngcer]*/,
|
| + lookbehind: true
|
| + },
|
|
|
| // s{...}{...}
|
| - /\b(?:s|tr|y)\s*\{([^{}]|\\.)*\s*\}\s*\{\s*([^{}]|\\.)*\s*\}[msixpodualgcer]*/,
|
| + {
|
| + pattern: /(^|[^-]\b)(?:s|tr|y)\s*\{(?:[^{}\\]|\\[\s\S])*\}\s*\{(?:[^{}\\]|\\[\s\S])*\}[msixpodualngcer]*/,
|
| + lookbehind: true
|
| + },
|
|
|
| // s[...][...]
|
| - /\b(?:s|tr|y)\s*\[([^[\]]|\\.)*\s*\]\s*\[\s*([^[\]]|\\.)*\s*\][msixpodualgcer]*/,
|
| + {
|
| + pattern: /(^|[^-]\b)(?:s|tr|y)\s*\[(?:[^[\]\\]|\\[\s\S])*\]\s*\[(?:[^[\]\\]|\\[\s\S])*\][msixpodualngcer]*/,
|
| + lookbehind: true
|
| + },
|
|
|
| // s<...><...>
|
| - /\b(?:s|tr|y)\s*<([^<>]|\\.)*\s*>\s*<\s*([^<>]|\\.)*\s*>[msixpodualgcer]*/,
|
| + {
|
| + pattern: /(^|[^-]\b)(?:s|tr|y)\s*<(?:[^<>\\]|\\[\s\S])*>\s*<(?:[^<>\\]|\\[\s\S])*>[msixpodualngcer]*/,
|
| + lookbehind: true
|
| + },
|
|
|
| // /.../
|
| - /\/(\[.+?]|\\.|[^\/\r\n])*\/[msixpodualgc]*(?=\s*($|[\r\n,.;})&|\-+*=~<>!?^]|(lt|gt|le|ge|eq|ne|cmp|not|and|or|xor|x)\b))/
|
| + // The look-ahead tries to prevent two divisions on
|
| + // the same line from being highlighted as regex.
|
| + // This does not support multi-line regex.
|
| + /\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(lt|gt|le|ge|eq|ne|cmp|not|and|or|xor|x)\b))/
|
| ],
|
|
|
| // FIXME Not sure about the handling of ::, ', and #
|
| 'variable': [
|
| // ${^POSTMATCH}
|
| - /[&*\$@%]\{\^[A-Z]+\}/,
|
| + /[&*$@%]\{\^[A-Z]+\}/,
|
| // $^V
|
| - /[&*\$@%]\^[A-Z_]/,
|
| + /[&*$@%]\^[A-Z_]/,
|
| // ${...}
|
| - /[&*\$@%]#?(?=\{)/,
|
| + /[&*$@%]#?(?=\{)/,
|
| // $foo
|
| - /[&*\$@%]#?((::)*'?(?!\d)[\w$]+)+(::)*/i,
|
| + /[&*$@%]#?((::)*'?(?!\d)[\w$]+)+(::)*/i,
|
| // $1
|
| - /[&*\$@%]\d+/,
|
| + /[&*$@%]\d+/,
|
| // $_, @_, %!
|
| - /[\$@%][!"#\$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/
|
| + // The negative lookahead prevents from breaking the %= operator
|
| + /(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/
|
| ],
|
| 'filehandle': {
|
| // <>, <FOO>, _
|
| - pattern: /<(?!=).*>|\b_\b/,
|
| + pattern: /<(?![<=])\S*>|\b_\b/,
|
| alias: 'symbol'
|
| },
|
| 'vstring': {
|
| @@ -106,7 +134,7 @@ Prism.languages.perl = {
|
| }
|
| },
|
| '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|say|state|sub|switch|undef|unless|until|use|when|while)\b/,
|
| - 'number': /(\n|\b)-?(0x[\dA-Fa-f](_?[\dA-Fa-f])*|0b[01](_?[01])*|(\d(_?\d)*)?\.?\d(_?\d)*([Ee]-?\d+)?)\b/,
|
| - 'operator': /-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|[-+*=~\/|&]{1,2}|<=?|>=?|\.{1,3}|[!?\\^]|\b(lt|gt|le|ge|eq|ne|cmp|not|and|or|xor|x)\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(lt|gt|le|ge|eq|ne|cmp|not|and|or|xor)\b/,
|
| 'punctuation': /[{}[\];(),:]/
|
| };
|
|
|