| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 | /*Language: RubyAuthor: Anton Kovalyov <[email protected]>Contributors: Peter Leonov <[email protected]>, Vasily Polovnyov <[email protected]>, Loren Segal <[email protected]>, Pascal Hurni <[email protected]>, Cedric Sohrauer <[email protected]>Category: common*/function(hljs) {  var RUBY_METHOD_RE = '[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?';  var RUBY_KEYWORDS = {    keyword:      'and then defined module in return redo if BEGIN retry end for self when ' +      'next until do begin unless END rescue else break undef not super class case ' +      'require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor',    literal:      'true false nil'  };  var YARDOCTAG = {    className: 'doctag',    begin: '@[A-Za-z]+'  };  var IRB_OBJECT = {    begin: '#<', end: '>'  };  var COMMENT_MODES = [    hljs.COMMENT(      '#',      '$',      {        contains: [YARDOCTAG]      }    ),    hljs.COMMENT(      '^\\=begin',      '^\\=end',      {        contains: [YARDOCTAG],        relevance: 10      }    ),    hljs.COMMENT('^__END__', '\\n$')  ];  var SUBST = {    className: 'subst',    begin: '#\\{', end: '}',    keywords: RUBY_KEYWORDS  };  var STRING = {    className: 'string',    contains: [hljs.BACKSLASH_ESCAPE, SUBST],    variants: [      {begin: /'/, end: /'/},      {begin: /"/, end: /"/},      {begin: /`/, end: /`/},      {begin: '%[qQwWx]?\\(', end: '\\)'},      {begin: '%[qQwWx]?\\[', end: '\\]'},      {begin: '%[qQwWx]?{', end: '}'},      {begin: '%[qQwWx]?<', end: '>'},      {begin: '%[qQwWx]?/', end: '/'},      {begin: '%[qQwWx]?%', end: '%'},      {begin: '%[qQwWx]?-', end: '-'},      {begin: '%[qQwWx]?\\|', end: '\\|'},      {        // \B in the beginning suppresses recognition of ?-sequences where ?        // is the last character of a preceding identifier, as in: `func?4`        begin: /\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/      },      {        begin: /<<(-?)\w+$/, end: /^\s*\w+$/,      }    ]  };  var PARAMS = {    className: 'params',    begin: '\\(', end: '\\)', endsParent: true,    keywords: RUBY_KEYWORDS  };  var RUBY_DEFAULT_CONTAINS = [    STRING,    IRB_OBJECT,    {      className: 'class',      beginKeywords: 'class module', end: '$|;',      illegal: /=/,      contains: [        hljs.inherit(hljs.TITLE_MODE, {begin: '[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?'}),        {          begin: '<\\s*',          contains: [{            begin: '(' + hljs.IDENT_RE + '::)?' + hljs.IDENT_RE          }]        }      ].concat(COMMENT_MODES)    },    {      className: 'function',      beginKeywords: 'def', end: '$|;',      contains: [        hljs.inherit(hljs.TITLE_MODE, {begin: RUBY_METHOD_RE}),        PARAMS      ].concat(COMMENT_MODES)    },    {      // swallow namespace qualifiers before symbols      begin: hljs.IDENT_RE + '::'    },    {      className: 'symbol',      begin: hljs.UNDERSCORE_IDENT_RE + '(\\!|\\?)?:',      relevance: 0    },    {      className: 'symbol',      begin: ':(?!\\s)',      contains: [STRING, {begin: RUBY_METHOD_RE}],      relevance: 0    },    {      className: 'number',      begin: '(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b',      relevance: 0    },    {      begin: '(\\$\\W)|((\\$|\\@\\@?)(\\w+))' // variables    },    {      className: 'params',      begin: /\|/, end: /\|/,      keywords: RUBY_KEYWORDS    },    { // regexp container      begin: '(' + hljs.RE_STARTERS_RE + ')\\s*',      contains: [        IRB_OBJECT,        {          className: 'regexp',          contains: [hljs.BACKSLASH_ESCAPE, SUBST],          illegal: /\n/,          variants: [            {begin: '/', end: '/[a-z]*'},            {begin: '%r{', end: '}[a-z]*'},            {begin: '%r\\(', end: '\\)[a-z]*'},            {begin: '%r!', end: '![a-z]*'},            {begin: '%r\\[', end: '\\][a-z]*'}          ]        }      ].concat(COMMENT_MODES),      relevance: 0    }  ].concat(COMMENT_MODES);  SUBST.contains = RUBY_DEFAULT_CONTAINS;  PARAMS.contains = RUBY_DEFAULT_CONTAINS;  var SIMPLE_PROMPT = "[>?]>";  var DEFAULT_PROMPT = "[\\w#]+\\(\\w+\\):\\d+:\\d+>";  var RVM_PROMPT = "(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>";  var IRB_DEFAULT = [    {      begin: /^\s*=>/,      starts: {        end: '$', contains: RUBY_DEFAULT_CONTAINS      }    },    {      className: 'meta',      begin: '^('+SIMPLE_PROMPT+"|"+DEFAULT_PROMPT+'|'+RVM_PROMPT+')',      starts: {        end: '$', contains: RUBY_DEFAULT_CONTAINS      }    }  ];  return {    aliases: ['rb', 'gemspec', 'podspec', 'thor', 'irb'],    keywords: RUBY_KEYWORDS,    illegal: /\/\*/,    contains: COMMENT_MODES.concat(IRB_DEFAULT).concat(RUBY_DEFAULT_CONTAINS)  };}
 |