267 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			267 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /**
 | |
|  * 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'
 | 
