prism-perl.js 4.5 KB

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