/* Language: CoffeeScript Author: Dmytrii Nagirniak Contributors: Oleg Efimov , Cédric Néhémie Description: CoffeeScript is a programming language that transcompiles to JavaScript. For info about language see http://coffeescript.org/ */ function(hljs) { var KEYWORDS = { keyword: // JS keywords 'in if for while finally new do return else break catch instanceof throw try this ' + 'switch continue typeof delete debugger super ' + // Coffee keywords 'then unless until loop of by when and or is isnt not', literal: // JS literals 'true false null undefined ' + // Coffee literals 'yes no on off', reserved: 'case default function var void with const let enum export import native ' + '__hasProp __extends __slice __bind __indexOf', built_in: 'npm require console print module global window document' }; var JS_IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*'; var TITLE = hljs.inherit(hljs.TITLE_MODE, {begin: JS_IDENT_RE}); var SUBST = { className: 'subst', begin: /#\{/, end: /}/, keywords: KEYWORDS }; var EXPRESSIONS = [ hljs.BINARY_NUMBER_MODE, hljs.inherit(hljs.C_NUMBER_MODE, {starts: {end: '(\\s*/)?', relevance: 0}}), // a number tries to eat the following slash to prevent treating it as a regexp { className: 'string', variants: [ { begin: /'''/, end: /'''/, contains: [hljs.BACKSLASH_ESCAPE] }, { begin: /'/, end: /'/, contains: [hljs.BACKSLASH_ESCAPE] }, { begin: /"""/, end: /"""/, contains: [hljs.BACKSLASH_ESCAPE, SUBST] }, { begin: /"/, end: /"/, contains: [hljs.BACKSLASH_ESCAPE, SUBST] } ] }, { className: 'regexp', variants: [ { begin: '///', end: '///', contains: [SUBST, hljs.HASH_COMMENT_MODE] }, { begin: '//[gim]*', relevance: 0 }, { begin: '/\\S(\\\\.|[^\\n])*?/[gim]*(?=\\s|\\W|$)' // \S is required to parse x / 2 / 3 as two divisions } ] }, { className: 'property', begin: '@' + JS_IDENT_RE }, { begin: '`', end: '`', excludeBegin: true, excludeEnd: true, subLanguage: 'javascript' } ]; SUBST.contains = EXPRESSIONS; return { aliases: ['coffee', 'cson', 'iced'], keywords: KEYWORDS, contains: EXPRESSIONS.concat([ { className: 'comment', begin: '###', end: '###' }, hljs.HASH_COMMENT_MODE, { className: 'function', begin: '(' + JS_IDENT_RE + '\\s*=\\s*)?(\\(.*\\))?\\s*\\B[-=]>', end: '[-=]>', returnBegin: true, contains: [ TITLE, { className: 'params', begin: '\\(', returnBegin: true, /* We need another contained nameless mode to not have every nested pair of parens to be called "params" */ contains: [{ begin: /\(/, end: /\)/, keywords: KEYWORDS, contains: ['self'].concat(EXPRESSIONS) }] } ] }, { className: 'class', beginKeywords: 'class', end: '$', illegal: /[:="\[\]]/, contains: [ { beginKeywords: 'extends', endsWithParent: true, illegal: /[:="\[\]]/, contains: [TITLE] }, TITLE ] }, { className: 'attribute', begin: JS_IDENT_RE + ':', end: ':', returnBegin: true, excludeEnd: true, relevance: 0 } ]) }; }