livescript.ls
266 lines
| 6.0 KiB
| text/x-livescript
|
LiveScriptLexer
r4026 | /** | |||
* Link to the project's GitHub page: | ||||
* https://github.com/duralog/CodeMirror | ||||
*/ | ||||
CodeMirror.defineMode 'livescript', (conf) -> | ||||
tokenBase = (stream, state) -> | ||||
#indent = | ||||
if next_rule = state.next or \start | ||||
state.next = state.next | ||||
if Array.isArray nr = Rules[next_rule] | ||||
for r in nr | ||||
if r.regex and m = stream.match r.regex | ||||
state.next = r.next | ||||
return r.token | ||||
stream.next! | ||||
return \error | ||||
if stream.match r = Rules[next_rule] | ||||
if r.regex and stream.match r.regex | ||||
state.next = r.next | ||||
return r.token | ||||
else | ||||
stream.next! | ||||
return \error | ||||
stream.next! | ||||
return 'error' | ||||
external = { | ||||
startState: (basecolumn) -> | ||||
{ | ||||
next: \start | ||||
lastToken: null | ||||
} | ||||
token: (stream, state) -> | ||||
style = tokenBase stream, state #tokenLexer stream, state | ||||
state.lastToken = { | ||||
style: style | ||||
indent: stream.indentation! | ||||
content: stream.current! | ||||
} | ||||
style.replace /\./g, ' ' | ||||
indent: (state, textAfter) -> | ||||
# XXX this won't work with backcalls | ||||
indentation = state.lastToken.indent | ||||
if state.lastToken.content.match indenter then indentation += 2 | ||||
return indentation | ||||
} | ||||
external | ||||
### Highlight Rules | ||||
# taken from mode-ls.ls | ||||
indenter = // (? | ||||
: [({[=:] | ||||
| [-~]> | ||||
| \b (?: e(?:lse|xport) | d(?:o|efault) | t(?:ry|hen) | finally | | ||||
import (?:\s* all)? | const | var | | ||||
let | new | catch (?:\s* #identifier)? ) | ||||
) \s* $ // | ||||
identifier = /(?![\d\s])[$\w\xAA-\uFFDC](?:(?!\s)[$\w\xAA-\uFFDC]|-[A-Za-z])*/$ | ||||
keywordend = /(?![$\w]|-[A-Za-z]|\s*:(?![:=]))/$ | ||||
stringfill = token: \string, regex: '.+' | ||||
Rules = | ||||
start: | ||||
* token: \comment.doc | ||||
regex: '/\\*' | ||||
next : \comment | ||||
* token: \comment | ||||
regex: '#.*' | ||||
* token: \keyword | ||||
regex: //(? | ||||
:t(?:h(?:is|row|en)|ry|ypeof!?) | ||||
|c(?:on(?:tinue|st)|a(?:se|tch)|lass) | ||||
|i(?:n(?:stanceof)?|mp(?:ort(?:\s+all)?|lements)|[fs]) | ||||
|d(?:e(?:fault|lete|bugger)|o) | ||||
|f(?:or(?:\s+own)?|inally|unction) | ||||
|s(?:uper|witch) | ||||
|e(?:lse|x(?:tends|port)|val) | ||||
|a(?:nd|rguments) | ||||
|n(?:ew|ot) | ||||
|un(?:less|til) | ||||
|w(?:hile|ith) | ||||
|o[fr]|return|break|let|var|loop | ||||
)//$ + keywordend | ||||
* token: \constant.language | ||||
regex: '(?:true|false|yes|no|on|off|null|void|undefined)' + keywordend | ||||
* token: \invalid.illegal | ||||
regex: '(? | ||||
:p(?:ackage|r(?:ivate|otected)|ublic) | ||||
|i(?:mplements|nterface) | ||||
|enum|static|yield | ||||
)' + keywordend | ||||
* token: \language.support.class | ||||
regex: '(? | ||||
:R(?:e(?:gExp|ferenceError)|angeError) | ||||
|S(?:tring|yntaxError) | ||||
|E(?:rror|valError) | ||||
|Array|Boolean|Date|Function|Number|Object|TypeError|URIError | ||||
)' + keywordend | ||||
* token: \language.support.function | ||||
regex: '(? | ||||
:is(?:NaN|Finite) | ||||
|parse(?:Int|Float) | ||||
|Math|JSON | ||||
|(?:en|de)codeURI(?:Component)? | ||||
)' + keywordend | ||||
* token: \variable.language | ||||
regex: '(?:t(?:hat|il|o)|f(?:rom|allthrough)|it|by|e)' + keywordend | ||||
* token: \identifier | ||||
regex: identifier + /\s*:(?![:=])/$ | ||||
* token: \variable | ||||
regex: identifier | ||||
* token: \keyword.operator | ||||
regex: /(?:\.{3}|\s+\?)/$ | ||||
* token: \keyword.variable | ||||
regex: /(?:@+|::|\.\.)/$ | ||||
next : \key | ||||
* token: \keyword.operator | ||||
regex: /\.\s*/$ | ||||
next : \key | ||||
* token: \string | ||||
regex: /\\\S[^\s,;)}\]]*/$ | ||||
* token: \string.doc | ||||
regex: \''' | ||||
next : \qdoc | ||||
* token: \string.doc | ||||
regex: \""" | ||||
next : \qqdoc | ||||
* token: \string | ||||
regex: \' | ||||
next : \qstring | ||||
* token: \string | ||||
regex: \" | ||||
next : \qqstring | ||||
* token: \string | ||||
regex: \` | ||||
next : \js | ||||
* token: \string | ||||
regex: '<\\[' | ||||
next : \words | ||||
* token: \string.regex | ||||
regex: \// | ||||
next : \heregex | ||||
* token: \string.regex | ||||
regex: // | ||||
/(?: [^ [ / \n \\ ]* | ||||
(?: (?: \\. | ||||
| \[ [^\]\n\\]* (?:\\.[^\]\n\\]*)* \] | ||||
) [^ [ / \n \\ ]* | ||||
)* | ||||
)/ [gimy$]{0,4} | ||||
//$ | ||||
next : \key | ||||
* token: \constant.numeric | ||||
regex: '(?:0x[\\da-fA-F][\\da-fA-F_]* | ||||
|(?:[2-9]|[12]\\d|3[0-6])r[\\da-zA-Z][\\da-zA-Z_]* | ||||
|(?:\\d[\\d_]*(?:\\.\\d[\\d_]*)?|\\.\\d[\\d_]*) | ||||
(?:e[+-]?\\d[\\d_]*)?[\\w$]*)' | ||||
* token: \lparen | ||||
regex: '[({[]' | ||||
* token: \rparen | ||||
regex: '[)}\\]]' | ||||
next : \key | ||||
* token: \keyword.operator | ||||
regex: \\\S+ | ||||
* token: \text | ||||
regex: \\\s+ | ||||
heregex: | ||||
* token: \string.regex | ||||
regex: '.*?//[gimy$?]{0,4}' | ||||
next : \start | ||||
* token: \string.regex | ||||
regex: '\\s*#{' | ||||
* token: \comment.regex | ||||
regex: '\\s+(?:#.*)?' | ||||
* token: \string.regex | ||||
regex: '\\S+' | ||||
key: | ||||
* token: \keyword.operator | ||||
regex: '[.?@!]+' | ||||
* token: \identifier | ||||
regex: identifier | ||||
next : \start | ||||
* token: \text | ||||
regex: '.' | ||||
next : \start | ||||
comment: | ||||
* token: \comment.doc | ||||
regex: '.*?\\*/' | ||||
next : \start | ||||
* token: \comment.doc | ||||
regex: '.+' | ||||
qdoc: | ||||
token: \string | ||||
regex: ".*?'''" | ||||
next : \key | ||||
stringfill | ||||
qqdoc: | ||||
token: \string | ||||
regex: '.*?"""' | ||||
next : \key | ||||
stringfill | ||||
qstring: | ||||
token: \string | ||||
regex: /[^\\']*(?:\\.[^\\']*)*'/$ | ||||
next : \key | ||||
stringfill | ||||
qqstring: | ||||
token: \string | ||||
regex: /[^\\"]*(?:\\.[^\\"]*)*"/$ | ||||
next : \key | ||||
stringfill | ||||
js: | ||||
token: \string | ||||
regex: /[^\\`]*(?:\\.[^\\`]*)*`/$ | ||||
next : \key | ||||
stringfill | ||||
words: | ||||
token: \string | ||||
regex: '.*?\\]>' | ||||
next : \key | ||||
stringfill | ||||
# for optimization, precompile the regexps | ||||
for idx, r of Rules | ||||
if Array.isArray r | ||||
for rr, i in r | ||||
if rr.regex then Rules[idx][i].regex = new RegExp '^'+rr.regex | ||||
else if r.regex then Rules[idx].regex = new RegExp '^'+r.regex | ||||
CodeMirror.defineMIME 'text/x-livescript', 'livescript' | ||||