perl.js 5.0 KB

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