193 lines
4.5 KiB
JavaScript
193 lines
4.5 KiB
JavaScript
/*
|
|
Language: Ruby
|
|
Author: Anton Kovalyov <anton@kovalyov.net>
|
|
Contributors: Peter Leonov <gojpeg@yandex.ru>, Vasily Polovnyov <vast@whiteants.net>, Loren Segal <lsegal@soen.ca>
|
|
*/
|
|
|
|
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_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]
|
|
}
|
|
]),
|
|
relevance: 0
|
|
}
|
|
]));
|
|
SUBST.contains = RUBY_DEFAULT_CONTAINS;
|
|
FUNCTION.contains[1].contains = RUBY_DEFAULT_CONTAINS;
|
|
|
|
return {
|
|
defaultMode: {
|
|
lexems: RUBY_IDENT_RE,
|
|
keywords: RUBY_KEYWORDS,
|
|
contains: RUBY_DEFAULT_CONTAINS
|
|
}
|
|
};
|
|
}(hljs);
|