ruby.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /*
  2. Language: Ruby
  3. Author: Anton Kovalyov <[email protected]>
  4. Contributors: Peter Leonov <[email protected]>, Vasily Polovnyov <[email protected]>, Loren Segal <[email protected]>, Pascal Hurni <[email protected]>, Cedric Sohrauer <[email protected]>
  5. Category: common
  6. */
  7. function(hljs) {
  8. var RUBY_METHOD_RE = '[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?';
  9. var RUBY_KEYWORDS = {
  10. keyword:
  11. 'and then defined module in return redo if BEGIN retry end for self when ' +
  12. 'next until do begin unless END rescue else break undef not super class case ' +
  13. 'require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor',
  14. literal:
  15. 'true false nil'
  16. };
  17. var YARDOCTAG = {
  18. className: 'doctag',
  19. begin: '@[A-Za-z]+'
  20. };
  21. var IRB_OBJECT = {
  22. begin: '#<', end: '>'
  23. };
  24. var COMMENT_MODES = [
  25. hljs.COMMENT(
  26. '#',
  27. '$',
  28. {
  29. contains: [YARDOCTAG]
  30. }
  31. ),
  32. hljs.COMMENT(
  33. '^\\=begin',
  34. '^\\=end',
  35. {
  36. contains: [YARDOCTAG],
  37. relevance: 10
  38. }
  39. ),
  40. hljs.COMMENT('^__END__', '\\n$')
  41. ];
  42. var SUBST = {
  43. className: 'subst',
  44. begin: '#\\{', end: '}',
  45. keywords: RUBY_KEYWORDS
  46. };
  47. var STRING = {
  48. className: 'string',
  49. contains: [hljs.BACKSLASH_ESCAPE, SUBST],
  50. variants: [
  51. {begin: /'/, end: /'/},
  52. {begin: /"/, end: /"/},
  53. {begin: /`/, end: /`/},
  54. {begin: '%[qQwWx]?\\(', end: '\\)'},
  55. {begin: '%[qQwWx]?\\[', end: '\\]'},
  56. {begin: '%[qQwWx]?{', end: '}'},
  57. {begin: '%[qQwWx]?<', end: '>'},
  58. {begin: '%[qQwWx]?/', end: '/'},
  59. {begin: '%[qQwWx]?%', end: '%'},
  60. {begin: '%[qQwWx]?-', end: '-'},
  61. {begin: '%[qQwWx]?\\|', end: '\\|'},
  62. {
  63. // \B in the beginning suppresses recognition of ?-sequences where ?
  64. // is the last character of a preceding identifier, as in: `func?4`
  65. begin: /\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/
  66. },
  67. {
  68. begin: /<<(-?)\w+$/, end: /^\s*\w+$/,
  69. }
  70. ]
  71. };
  72. var PARAMS = {
  73. className: 'params',
  74. begin: '\\(', end: '\\)', endsParent: true,
  75. keywords: RUBY_KEYWORDS
  76. };
  77. var RUBY_DEFAULT_CONTAINS = [
  78. STRING,
  79. IRB_OBJECT,
  80. {
  81. className: 'class',
  82. beginKeywords: 'class module', end: '$|;',
  83. illegal: /=/,
  84. contains: [
  85. hljs.inherit(hljs.TITLE_MODE, {begin: '[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?'}),
  86. {
  87. begin: '<\\s*',
  88. contains: [{
  89. begin: '(' + hljs.IDENT_RE + '::)?' + hljs.IDENT_RE
  90. }]
  91. }
  92. ].concat(COMMENT_MODES)
  93. },
  94. {
  95. className: 'function',
  96. beginKeywords: 'def', end: '$|;',
  97. contains: [
  98. hljs.inherit(hljs.TITLE_MODE, {begin: RUBY_METHOD_RE}),
  99. PARAMS
  100. ].concat(COMMENT_MODES)
  101. },
  102. {
  103. // swallow namespace qualifiers before symbols
  104. begin: hljs.IDENT_RE + '::'
  105. },
  106. {
  107. className: 'symbol',
  108. begin: hljs.UNDERSCORE_IDENT_RE + '(\\!|\\?)?:',
  109. relevance: 0
  110. },
  111. {
  112. className: 'symbol',
  113. begin: ':(?!\\s)',
  114. contains: [STRING, {begin: RUBY_METHOD_RE}],
  115. relevance: 0
  116. },
  117. {
  118. className: 'number',
  119. begin: '(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b',
  120. relevance: 0
  121. },
  122. {
  123. begin: '(\\$\\W)|((\\$|\\@\\@?)(\\w+))' // variables
  124. },
  125. {
  126. className: 'params',
  127. begin: /\|/, end: /\|/,
  128. keywords: RUBY_KEYWORDS
  129. },
  130. { // regexp container
  131. begin: '(' + hljs.RE_STARTERS_RE + ')\\s*',
  132. contains: [
  133. IRB_OBJECT,
  134. {
  135. className: 'regexp',
  136. contains: [hljs.BACKSLASH_ESCAPE, SUBST],
  137. illegal: /\n/,
  138. variants: [
  139. {begin: '/', end: '/[a-z]*'},
  140. {begin: '%r{', end: '}[a-z]*'},
  141. {begin: '%r\\(', end: '\\)[a-z]*'},
  142. {begin: '%r!', end: '![a-z]*'},
  143. {begin: '%r\\[', end: '\\][a-z]*'}
  144. ]
  145. }
  146. ].concat(COMMENT_MODES),
  147. relevance: 0
  148. }
  149. ].concat(COMMENT_MODES);
  150. SUBST.contains = RUBY_DEFAULT_CONTAINS;
  151. PARAMS.contains = RUBY_DEFAULT_CONTAINS;
  152. var SIMPLE_PROMPT = "[>?]>";
  153. var DEFAULT_PROMPT = "[\\w#]+\\(\\w+\\):\\d+:\\d+>";
  154. var RVM_PROMPT = "(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>";
  155. var IRB_DEFAULT = [
  156. {
  157. begin: /^\s*=>/,
  158. starts: {
  159. end: '$', contains: RUBY_DEFAULT_CONTAINS
  160. }
  161. },
  162. {
  163. className: 'meta',
  164. begin: '^('+SIMPLE_PROMPT+"|"+DEFAULT_PROMPT+'|'+RVM_PROMPT+')',
  165. starts: {
  166. end: '$', contains: RUBY_DEFAULT_CONTAINS
  167. }
  168. }
  169. ];
  170. return {
  171. aliases: ['rb', 'gemspec', 'podspec', 'thor', 'irb'],
  172. keywords: RUBY_KEYWORDS,
  173. illegal: /\/\*/,
  174. contains: COMMENT_MODES.concat(IRB_DEFAULT).concat(RUBY_DEFAULT_CONTAINS)
  175. };
  176. }