| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- /* ***** BEGIN LICENSE BLOCK *****
- * Distributed under the BSD license:
- *
- * Copyright (c) 2010, Ajax.org B.V.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of Ajax.org B.V. nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * ***** END LICENSE BLOCK ***** */
- define(function(require, exports, module) {
- "use strict";
- var oop = require("../lib/oop");
- var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
- oop.inherits(CoffeeHighlightRules, TextHighlightRules);
- function CoffeeHighlightRules() {
- var identifier = "[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*";
- var keywords = (
- "this|throw|then|try|typeof|super|switch|return|break|by|continue|" +
- "catch|class|in|instanceof|is|isnt|if|else|extends|for|own|" +
- "finally|function|while|when|new|no|not|delete|debugger|do|loop|of|off|" +
- "or|on|unless|until|and|yes"
- );
- var langConstant = (
- "true|false|null|undefined|NaN|Infinity"
- );
- var illegal = (
- "case|const|default|function|var|void|with|enum|export|implements|" +
- "interface|let|package|private|protected|public|static|yield|" +
- "__hasProp|slice|bind|indexOf"
- );
- var supportClass = (
- "Array|Boolean|Date|Function|Number|Object|RegExp|ReferenceError|String|" +
- "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" +
- "SyntaxError|TypeError|URIError|" +
- "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" +
- "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray"
- );
- var supportFunction = (
- "Math|JSON|isNaN|isFinite|parseInt|parseFloat|encodeURI|" +
- "encodeURIComponent|decodeURI|decodeURIComponent|String|"
- );
- var variableLanguage = (
- "window|arguments|prototype|document"
- );
- var keywordMapper = this.createKeywordMapper({
- "keyword": keywords,
- "constant.language": langConstant,
- "invalid.illegal": illegal,
- "language.support.class": supportClass,
- "language.support.function": supportFunction,
- "variable.language": variableLanguage
- }, "identifier");
- var functionRule = {
- token: ["paren.lparen", "variable.parameter", "paren.rparen", "text", "storage.type"],
- regex: /(?:(\()((?:"[^")]*?"|'[^')]*?'|\/[^\/)]*?\/|[^()\"'\/])*?)(\))(\s*))?([\-=]>)/.source
- };
- var stringEscape = /\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)/;
- this.$rules = {
- start : [
- {
- token : "constant.numeric",
- regex : "(?:0x[\\da-fA-F]+|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?)"
- }, {
- stateName: "qdoc",
- token : "string", regex : "'''", next : [
- {token : "string", regex : "'''", next : "start"},
- {token : "constant.language.escape", regex : stringEscape},
- {defaultToken: "string"}
- ]
- }, {
- stateName: "qqdoc",
- token : "string",
- regex : '"""',
- next : [
- {token : "string", regex : '"""', next : "start"},
- {token : "paren.string", regex : '#{', push : "start"},
- {token : "constant.language.escape", regex : stringEscape},
- {defaultToken: "string"}
- ]
- }, {
- stateName: "qstring",
- token : "string", regex : "'", next : [
- {token : "string", regex : "'", next : "start"},
- {token : "constant.language.escape", regex : stringEscape},
- {defaultToken: "string"}
- ]
- }, {
- stateName: "qqstring",
- token : "string.start", regex : '"', next : [
- {token : "string.end", regex : '"', next : "start"},
- {token : "paren.string", regex : '#{', push : "start"},
- {token : "constant.language.escape", regex : stringEscape},
- {defaultToken: "string"}
- ]
- }, {
- stateName: "js",
- token : "string", regex : "`", next : [
- {token : "string", regex : "`", next : "start"},
- {token : "constant.language.escape", regex : stringEscape},
- {defaultToken: "string"}
- ]
- }, {
- regex: "[{}]", onMatch: function(val, state, stack) {
- this.next = "";
- if (val == "{" && stack.length) {
- stack.unshift("start", state);
- return "paren";
- }
- if (val == "}" && stack.length) {
- stack.shift();
- this.next = stack.shift() || "";
- if (this.next.indexOf("string") != -1)
- return "paren.string";
- }
- return "paren";
- }
- }, {
- token : "string.regex",
- regex : "///",
- next : "heregex"
- }, {
- token : "string.regex",
- regex : /(?:\/(?![\s=])[^[\/\n\\]*(?:(?:\\[\s\S]|\[[^\]\n\\]*(?:\\[\s\S][^\]\n\\]*)*])[^[\/\n\\]*)*\/)(?:[imgy]{0,4})(?!\w)/
- }, {
- token : "comment",
- regex : "###(?!#)",
- next : "comment"
- }, {
- token : "comment",
- regex : "#.*"
- }, {
- token : ["punctuation.operator", "text", "identifier"],
- regex : "(\\.)(\\s*)(" + illegal + ")"
- }, {
- token : "punctuation.operator",
- regex : "\\.{1,3}"
- }, {
- //class A extends B
- token : ["keyword", "text", "language.support.class",
- "text", "keyword", "text", "language.support.class"],
- regex : "(class)(\\s+)(" + identifier + ")(?:(\\s+)(extends)(\\s+)(" + identifier + "))?"
- }, {
- //play = (...) ->
- token : ["entity.name.function", "text", "keyword.operator", "text"].concat(functionRule.token),
- regex : "(" + identifier + ")(\\s*)([=:])(\\s*)" + functionRule.regex
- },
- functionRule,
- {
- token : "variable",
- regex : "@(?:" + identifier + ")?"
- }, {
- token: keywordMapper,
- regex : identifier
- }, {
- token : "punctuation.operator",
- regex : "\\,|\\."
- }, {
- token : "storage.type",
- regex : "[\\-=]>"
- }, {
- token : "keyword.operator",
- regex : "(?:[-+*/%<>&|^!?=]=|>>>=?|\\-\\-|\\+\\+|::|&&=|\\|\\|=|<<=|>>=|\\?\\.|\\.{2,3}|[!*+-=><])"
- }, {
- token : "paren.lparen",
- regex : "[({[]"
- }, {
- token : "paren.rparen",
- regex : "[\\]})]"
- }, {
- token : "text",
- regex : "\\s+"
- }],
- heregex : [{
- token : "string.regex",
- regex : '.*?///[imgy]{0,4}',
- next : "start"
- }, {
- token : "comment.regex",
- regex : "\\s+(?:#.*)?"
- }, {
- token : "string.regex",
- regex : "\\S+"
- }],
- comment : [{
- token : "comment",
- regex : '###',
- next : "start"
- }, {
- defaultToken : "comment"
- }]
- };
- this.normalizeRules();
- }
- exports.CoffeeHighlightRules = CoffeeHighlightRules;
- });
|