ruby.js
module.exports = 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_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+))'
},
{
begin: '(' + hljs.RE_STARTERS_RE + ')\\s*',
contains: COMMENTS.concat([
{
className: 'regexp',
begin: '/', end: '/[a-z]*',
illegal: '\\n',
contains: [hljs.BACKSLASH_ESCAPE]
}
]),
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
};
};