move a few things away in to-be-integrated/
[myslice.git] / to-be-integrated / third-party / codemirror-3.15 / mode / livescript / livescript.ls
diff --git a/to-be-integrated/third-party/codemirror-3.15/mode/livescript/livescript.ls b/to-be-integrated/third-party/codemirror-3.15/mode/livescript/livescript.ls
new file mode 100644 (file)
index 0000000..0652423
--- /dev/null
@@ -0,0 +1,266 @@
+/**
+ * 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'