livescript.ls 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. # Defines an editing mode for [Ace](http://ace.ajax.org).
  2. #
  3. # Open [test/ace.html](../test/ace.html) to test.
  4. require, exports, module <-! define \ace/mode/ls
  5. identifier = /(?![\d\s])[$\w\xAA-\uFFDC](?:(?!\s)[$\w\xAA-\uFFDC]|-[A-Za-z])*/$
  6. exports.Mode = class LiveScriptMode extends require(\ace/mode/text)Mode
  7. ->
  8. @$tokenizer =
  9. new (require \ace/tokenizer)Tokenizer LiveScriptMode.Rules
  10. if require \ace/mode/matching_brace_outdent
  11. @$outdent = new that.MatchingBraceOutdent
  12. indenter = // (?
  13. : [({[=:]
  14. | [-~]>
  15. | \b (?: e(?:lse|xport) | d(?:o|efault) | t(?:ry|hen) | finally |
  16. import (?:\s* all)? | const | var |
  17. let | new | catch (?:\s* #identifier)? )
  18. ) \s* $ //
  19. getNextLineIndent: (state, line, tab) ->
  20. indent = @$getIndent line
  21. {tokens} = @$tokenizer.getLineTokens line, state
  22. unless tokens.length and tokens[*-1]type is \comment
  23. indent += tab if state is \start and indenter.test line
  24. indent
  25. toggleCommentLines: (state, doc, startRow, endRow) ->
  26. comment = /^(\s*)#/; range = new (require \ace/range)Range 0 0 0 0
  27. for i from startRow to endRow
  28. if out = comment.test line = doc.getLine i
  29. then line.=replace comment, \$1
  30. else line.=replace /^\s*/ \$&#
  31. range.end.row = range.start.row = i
  32. range.end.column = line.length + 1
  33. doc.replace range, line
  34. 1 - out * 2
  35. checkOutdent: (state, line, input) -> @$outdent?checkOutdent line, input
  36. autoOutdent: (state, doc, row) -> @$outdent?autoOutdent doc, row
  37. ### Highlight Rules
  38. keywordend = /(?![$\w]|-[A-Za-z]|\s*:(?![:=]))/$
  39. stringfill = token: \string, regex: '.+'
  40. LiveScriptMode.Rules =
  41. start:
  42. * token: \keyword
  43. regex: //(?
  44. :t(?:h(?:is|row|en)|ry|ypeof!?)
  45. |c(?:on(?:tinue|st)|a(?:se|tch)|lass)
  46. |i(?:n(?:stanceof)?|mp(?:ort(?:\s+all)?|lements)|[fs])
  47. |d(?:e(?:fault|lete|bugger)|o)
  48. |f(?:or(?:\s+own)?|inally|unction)
  49. |s(?:uper|witch)
  50. |e(?:lse|x(?:tends|port)|val)
  51. |a(?:nd|rguments)
  52. |n(?:ew|ot)
  53. |un(?:less|til)
  54. |w(?:hile|ith)
  55. |o[fr]|return|break|let|var|loop
  56. )//$ + keywordend
  57. * token: \constant.language
  58. regex: '(?:true|false|yes|no|on|off|null|void|undefined)' + keywordend
  59. * token: \invalid.illegal
  60. regex: '(?
  61. :p(?:ackage|r(?:ivate|otected)|ublic)
  62. |i(?:mplements|nterface)
  63. |enum|static|yield
  64. )' + keywordend
  65. * token: \language.support.class
  66. regex: '(?
  67. :R(?:e(?:gExp|ferenceError)|angeError)
  68. |S(?:tring|yntaxError)
  69. |E(?:rror|valError)
  70. |Array|Boolean|Date|Function|Number|Object|TypeError|URIError
  71. )' + keywordend
  72. * token: \language.support.function
  73. regex: '(?
  74. :is(?:NaN|Finite)
  75. |parse(?:Int|Float)
  76. |Math|JSON
  77. |(?:en|de)codeURI(?:Component)?
  78. )' + keywordend
  79. * token: \variable.language
  80. regex: '(?:t(?:hat|il|o)|f(?:rom|allthrough)|it|by|e)' + keywordend
  81. * token: \identifier
  82. regex: identifier + /\s*:(?![:=])/$
  83. * token: \variable
  84. regex: identifier
  85. * token: \keyword.operator
  86. regex: /(?:\.{3}|\s+\?)/$
  87. * token: \keyword.variable
  88. regex: /(?:@+|::|\.\.)/$
  89. next : \key
  90. * token: \keyword.operator
  91. regex: /\.\s*/$
  92. next : \key
  93. * token: \string
  94. regex: /\\\S[^\s,;)}\]]*/$
  95. * token: \string.doc
  96. regex: \'''
  97. next : \qdoc
  98. * token: \string.doc
  99. regex: \"""
  100. next : \qqdoc
  101. * token: \string
  102. regex: \'
  103. next : \qstring
  104. * token: \string
  105. regex: \"
  106. next : \qqstring
  107. * token: \string
  108. regex: \`
  109. next : \js
  110. * token: \string
  111. regex: '<\\['
  112. next : \words
  113. * token: \string.regex
  114. regex: \//
  115. next : \heregex
  116. * token: \comment.doc
  117. regex: '/\\*'
  118. next : \comment
  119. * token: \comment
  120. regex: '#.*'
  121. * token: \string.regex
  122. regex: //
  123. /(?: [^ [ / \n \\ ]*
  124. (?: (?: \\.
  125. | \[ [^\]\n\\]* (?:\\.[^\]\n\\]*)* \]
  126. ) [^ [ / \n \\ ]*
  127. )*
  128. )/ [gimy$]{0,4}
  129. //$
  130. next : \key
  131. * token: \constant.numeric
  132. regex: '(?:0x[\\da-fA-F][\\da-fA-F_]*
  133. |(?:[2-9]|[12]\\d|3[0-6])r[\\da-zA-Z][\\da-zA-Z_]*
  134. |(?:\\d[\\d_]*(?:\\.\\d[\\d_]*)?|\\.\\d[\\d_]*)
  135. (?:e[+-]?\\d[\\d_]*)?[\\w$]*)'
  136. * token: \lparen
  137. regex: '[({[]'
  138. * token: \rparen
  139. regex: '[)}\\]]'
  140. next : \key
  141. * token: \keyword.operator
  142. regex: \\\S+
  143. * token: \text
  144. regex: \\\s+
  145. heregex:
  146. * token: \string.regex
  147. regex: '.*?//[gimy$?]{0,4}'
  148. next : \start
  149. * token: \string.regex
  150. regex: '\\s*#{'
  151. * token: \comment.regex
  152. regex: '\\s+(?:#.*)?'
  153. * token: \string.regex
  154. regex: '\\S+'
  155. key:
  156. * token: \keyword.operator
  157. regex: '[.?@!]+'
  158. * token: \identifier
  159. regex: identifier
  160. next : \start
  161. * token: \text
  162. regex: '.'
  163. next : \start
  164. comment:
  165. * token: \comment.doc
  166. regex: '.*?\\*/'
  167. next : \start
  168. * token: \comment.doc
  169. regex: '.+'
  170. qdoc:
  171. token: \string
  172. regex: ".*?'''"
  173. next : \key
  174. stringfill
  175. qqdoc:
  176. token: \string
  177. regex: '.*?"""'
  178. next : \key
  179. stringfill
  180. qstring:
  181. token: \string
  182. regex: /[^\\']*(?:\\.[^\\']*)*'/$
  183. next : \key
  184. stringfill
  185. qqstring:
  186. token: \string
  187. regex: /[^\\"]*(?:\\.[^\\"]*)*"/$
  188. next : \key
  189. stringfill
  190. js:
  191. token: \string
  192. regex: /[^\\`]*(?:\\.[^\\`]*)*`/$
  193. next : \key
  194. stringfill
  195. words:
  196. token: \string
  197. regex: '.*?\\]>'
  198. next : \key
  199. stringfill