perl.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /*
  2. Language: Perl
  3. Author: Peter Leonov <[email protected]>
  4. Category: common
  5. */
  6. function(hljs) {
  7. var PERL_KEYWORDS = 'getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ' +
  8. 'ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime ' +
  9. 'readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq' +
  10. 'fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent ' +
  11. 'shutdown dump chomp connect getsockname die socketpair close flock exists index shmget' +
  12. 'sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr ' +
  13. 'unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 ' +
  14. 'getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline ' +
  15. 'endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand ' +
  16. 'mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink ' +
  17. 'getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr ' +
  18. 'untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link ' +
  19. 'getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller ' +
  20. 'lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and ' +
  21. 'sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 ' +
  22. 'chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach ' +
  23. 'tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir' +
  24. 'ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe ' +
  25. 'atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when';
  26. var SUBST = {
  27. className: 'subst',
  28. begin: '[$@]\\{', end: '\\}',
  29. keywords: PERL_KEYWORDS
  30. };
  31. var METHOD = {
  32. begin: '->{', end: '}'
  33. // contains defined later
  34. };
  35. var VAR = {
  36. variants: [
  37. {begin: /\$\d/},
  38. {begin: /[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},
  39. {begin: /[\$%@][^\s\w{]/, relevance: 0}
  40. ]
  41. };
  42. var STRING_CONTAINS = [hljs.BACKSLASH_ESCAPE, SUBST, VAR];
  43. var PERL_DEFAULT_CONTAINS = [
  44. VAR,
  45. hljs.HASH_COMMENT_MODE,
  46. hljs.COMMENT(
  47. '^\\=\\w',
  48. '\\=cut',
  49. {
  50. endsWithParent: true
  51. }
  52. ),
  53. METHOD,
  54. {
  55. className: 'string',
  56. contains: STRING_CONTAINS,
  57. variants: [
  58. {
  59. begin: 'q[qwxr]?\\s*\\(', end: '\\)',
  60. relevance: 5
  61. },
  62. {
  63. begin: 'q[qwxr]?\\s*\\[', end: '\\]',
  64. relevance: 5
  65. },
  66. {
  67. begin: 'q[qwxr]?\\s*\\{', end: '\\}',
  68. relevance: 5
  69. },
  70. {
  71. begin: 'q[qwxr]?\\s*\\|', end: '\\|',
  72. relevance: 5
  73. },
  74. {
  75. begin: 'q[qwxr]?\\s*\\<', end: '\\>',
  76. relevance: 5
  77. },
  78. {
  79. begin: 'qw\\s+q', end: 'q',
  80. relevance: 5
  81. },
  82. {
  83. begin: '\'', end: '\'',
  84. contains: [hljs.BACKSLASH_ESCAPE]
  85. },
  86. {
  87. begin: '"', end: '"'
  88. },
  89. {
  90. begin: '`', end: '`',
  91. contains: [hljs.BACKSLASH_ESCAPE]
  92. },
  93. {
  94. begin: '{\\w+}',
  95. contains: [],
  96. relevance: 0
  97. },
  98. {
  99. begin: '\-?\\w+\\s*\\=\\>',
  100. contains: [],
  101. relevance: 0
  102. }
  103. ]
  104. },
  105. {
  106. className: 'number',
  107. begin: '(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b',
  108. relevance: 0
  109. },
  110. { // regexp container
  111. begin: '(\\/\\/|' + hljs.RE_STARTERS_RE + '|\\b(split|return|print|reverse|grep)\\b)\\s*',
  112. keywords: 'split return print reverse grep',
  113. relevance: 0,
  114. contains: [
  115. hljs.HASH_COMMENT_MODE,
  116. {
  117. className: 'regexp',
  118. begin: '(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*',
  119. relevance: 10
  120. },
  121. {
  122. className: 'regexp',
  123. begin: '(m|qr)?/', end: '/[a-z]*',
  124. contains: [hljs.BACKSLASH_ESCAPE],
  125. relevance: 0 // allows empty "//" which is a common comment delimiter in other languages
  126. }
  127. ]
  128. },
  129. {
  130. className: 'function',
  131. beginKeywords: 'sub', end: '(\\s*\\(.*?\\))?[;{]', excludeEnd: true,
  132. relevance: 5,
  133. contains: [hljs.TITLE_MODE]
  134. },
  135. {
  136. begin: '-\\w\\b',
  137. relevance: 0
  138. },
  139. {
  140. begin: "^__DATA__$",
  141. end: "^__END__$",
  142. subLanguage: 'mojolicious',
  143. contains: [
  144. {
  145. begin: "^@@.*",
  146. end: "$",
  147. className: "comment"
  148. }
  149. ]
  150. }
  151. ];
  152. SUBST.contains = PERL_DEFAULT_CONTAINS;
  153. METHOD.contains = PERL_DEFAULT_CONTAINS;
  154. return {
  155. aliases: ['pl', 'pm'],
  156. lexemes: /[\w\.]+/,
  157. keywords: PERL_KEYWORDS,
  158. contains: PERL_DEFAULT_CONTAINS
  159. };
  160. }