123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- /**
- * 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'
|