/* Language: Ruby Author: Anton Kovalyov Contributors: Peter Leonov , Vasily Polovnyov , Loren Segal */ hljs.LANGUAGES['ruby'] = function(hljs) { var RUBY_IDENT_RE = '[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?'; var RUBY_METHOD_RE = '[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?'; var RUBY_KEYWORDS = { keyword: 'and false then defined module in return redo if BEGIN retry end for true self when ' + 'next until do begin unless END rescue nil else break undef not super class case ' + 'require yield alias while ensure elsif or include' }; var YARDOCTAG = { className: 'yardoctag', begin: '@[A-Za-z]+' }; var COMMENTS = [ { className: 'comment', begin: '#', end: '$', contains: [YARDOCTAG] }, { className: 'comment', begin: '^\\=begin', end: '^\\=end', contains: [YARDOCTAG], relevance: 10 }, { className: 'comment', begin: '^__END__', end: '\\n$' } ]; var SUBST = { className: 'subst', begin: '#\\{', end: '}', lexems: RUBY_IDENT_RE, keywords: RUBY_KEYWORDS }; var STR_CONTAINS = [hljs.BACKSLASH_ESCAPE, SUBST]; var STRINGS = [ { className: 'string', begin: '\'', end: '\'', contains: STR_CONTAINS, relevance: 0 }, { className: 'string', begin: '"', end: '"', contains: STR_CONTAINS, relevance: 0 }, { className: 'string', begin: '%[qw]?\\(', end: '\\)', contains: STR_CONTAINS }, { className: 'string', begin: '%[qw]?\\[', end: '\\]', contains: STR_CONTAINS }, { className: 'string', begin: '%[qw]?{', end: '}', contains: STR_CONTAINS }, { className: 'string', begin: '%[qw]?<', end: '>', contains: STR_CONTAINS, relevance: 10 }, { className: 'string', begin: '%[qw]?/', end: '/', contains: STR_CONTAINS, relevance: 10 }, { className: 'string', begin: '%[qw]?%', end: '%', contains: STR_CONTAINS, relevance: 10 }, { className: 'string', begin: '%[qw]?-', end: '-', contains: STR_CONTAINS, relevance: 10 }, { className: 'string', begin: '%[qw]?\\|', end: '\\|', contains: STR_CONTAINS, relevance: 10 } ]; var FUNCTION = { className: 'function', beginWithKeyword: true, end: ' |$|;', keywords: 'def', contains: [ { className: 'title', begin: RUBY_METHOD_RE, lexems: RUBY_IDENT_RE, keywords: RUBY_KEYWORDS }, { className: 'params', begin: '\\(', end: '\\)', lexems: RUBY_IDENT_RE, keywords: RUBY_KEYWORDS } ].concat(COMMENTS) }; var RUBY_DEFAULT_CONTAINS = COMMENTS.concat(STRINGS.concat([ { className: 'class', beginWithKeyword: true, end: '$|;', keywords: 'class module', contains: [ { className: 'title', begin: '[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?', relevance: 0 }, { className: 'inheritance', begin: '<\\s*', contains: [{ className: 'parent', begin: '(' + hljs.IDENT_RE + '::)?' + hljs.IDENT_RE }] } ].concat(COMMENTS) }, FUNCTION, { className: 'constant', begin: '(::)?(\\b[A-Z]\\w*(::)?)+', relevance: 0 }, { className: 'symbol', begin: ':', contains: STRINGS.concat([{begin: RUBY_METHOD_RE}]), relevance: 0 }, { className: 'symbol', begin: RUBY_IDENT_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 }, { className: 'number', begin: '\\?\\w' }, { className: 'variable', begin: '(\\$\\W)|((\\$|\\@\\@?)(\\w+))' }, { // regexp container begin: '(' + hljs.RE_STARTERS_RE + ')\\s*', contains: COMMENTS.concat([ { className: 'regexp', begin: '/', end: '/[a-z]*', illegal: '\\n', contains: [hljs.BACKSLASH_ESCAPE, SUBST] } ]), relevance: 0 } ])); SUBST.contains = RUBY_DEFAULT_CONTAINS; FUNCTION.contains[1].contains = RUBY_DEFAULT_CONTAINS; return { lexems: RUBY_IDENT_RE, keywords: RUBY_KEYWORDS, contains: RUBY_DEFAULT_CONTAINS }; }(hljs);