mirror of
https://github.com/photonstorm/phaser
synced 2024-12-26 21:13:41 +00:00
183 lines
4.8 KiB
JavaScript
183 lines
4.8 KiB
JavaScript
|
(function(sunlight, undefined){
|
||
|
|
||
|
if (sunlight === undefined || sunlight["registerLanguage"] === undefined) {
|
||
|
throw "Include sunlight.js before including language files";
|
||
|
}
|
||
|
|
||
|
sunlight.registerLanguage("javascript", {
|
||
|
keywords: [
|
||
|
//keywords
|
||
|
"break", "case", "catch", "continue", "default", "delete", "do",
|
||
|
"else", "finally", "for", "function", "if", "in", "instanceof",
|
||
|
"new", "return", "switch", "this", "throw", "try", "typeof",
|
||
|
"var", "void", "while", "with",
|
||
|
|
||
|
//literals
|
||
|
"true", "false", "null"
|
||
|
],
|
||
|
|
||
|
customTokens: {
|
||
|
reservedWord: {
|
||
|
values: [
|
||
|
"abstract", "boolean", "byte", "char", "class", "const", "debugger", "double",
|
||
|
"enum", "export", "extends", "final", "float", "goto", "implements", "import",
|
||
|
"int", "interface", "long", "native", "package", "private", "protected", "public",
|
||
|
"short", "static", "super", "synchronized", "throws", "transient", "volatile"
|
||
|
],
|
||
|
boundary: "\\b"
|
||
|
},
|
||
|
|
||
|
globalVariable: {
|
||
|
values: ["NaN", "Infinity", "undefined"],
|
||
|
boundary: "\\b"
|
||
|
},
|
||
|
|
||
|
globalFunction: {
|
||
|
values: ["encodeURI", "encodeURIComponent", "decodeURI", "decodeURIComponent", "parseInt", "parseFloat", "isNaN", "isFinite", "eval"],
|
||
|
boundary: "\\b"
|
||
|
},
|
||
|
|
||
|
globalObject: {
|
||
|
values: [
|
||
|
"Math", "JSON",
|
||
|
"XMLHttpRequest", "XDomainRequest", "ActiveXObject",
|
||
|
"Boolean", "Date", "Array", "Image", "Function", "Object", "Number", "RegExp", "String"
|
||
|
],
|
||
|
boundary: "\\b"
|
||
|
}
|
||
|
},
|
||
|
|
||
|
scopes: {
|
||
|
string: [ ["\"", "\"", sunlight.util.escapeSequences.concat(["\\\""])], ["'", "'", sunlight.util.escapeSequences.concat(["\\\'", "\\\\"])] ],
|
||
|
comment: [ ["//", "\n", null, true], ["/*", "*/"] ]
|
||
|
},
|
||
|
|
||
|
customParseRules: [
|
||
|
//regex literal
|
||
|
function(context) {
|
||
|
var peek = context.reader.peek(),
|
||
|
isValid,
|
||
|
regexLiteral = "/",
|
||
|
line = context.reader.getLine(),
|
||
|
column = context.reader.getColumn(),
|
||
|
charClass = false,
|
||
|
peek2,
|
||
|
next;
|
||
|
|
||
|
if (context.reader.current() !== "/" || peek === "/" || peek === "*") {
|
||
|
//doesn't start with a / or starts with // (comment) or /* (multi line comment)
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
isValid = function() {
|
||
|
var previousNonWsToken = context.token(context.count() - 1),
|
||
|
previousToken = null;
|
||
|
if (context.defaultData.text !== "") {
|
||
|
previousToken = context.createToken("default", context.defaultData.text);
|
||
|
}
|
||
|
|
||
|
if (!previousToken) {
|
||
|
previousToken = previousNonWsToken;
|
||
|
}
|
||
|
|
||
|
//first token of the string
|
||
|
if (previousToken === undefined) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
//since JavaScript doesn't require statement terminators, if the previous token was whitespace and contained a newline, then we're good
|
||
|
if (previousToken.name === "default" && previousToken.value.indexOf("\n") > -1) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
if (sunlight.util.contains(["keyword", "ident", "number"], previousNonWsToken.name)) {
|
||
|
return false;
|
||
|
}
|
||
|
if (previousNonWsToken.name === "punctuation" && !sunlight.util.contains(["(", "{", "[", ",", ";"], previousNonWsToken.value)) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}();
|
||
|
|
||
|
if (!isValid) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
//read the regex literal
|
||
|
while (context.reader.peek() !== context.reader.EOF) {
|
||
|
peek2 = context.reader.peek(2);
|
||
|
if (peek2 === "\\/" || peek2 === "\\\\") {
|
||
|
//escaped backslash or escaped forward slash
|
||
|
regexLiteral += context.reader.read(2);
|
||
|
continue;
|
||
|
}
|
||
|
if (peek2 === "\\[" || peek2 === "\\]") {
|
||
|
regexLiteral += context.reader.read(2);
|
||
|
continue;
|
||
|
} else if (next === "[") {
|
||
|
charClass = true;
|
||
|
} else if (next === "]") {
|
||
|
charClass = false;
|
||
|
}
|
||
|
|
||
|
regexLiteral += (next = context.reader.read());
|
||
|
if (next === "/" && !charClass) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//read the regex modifiers
|
||
|
//only "g", "i" and "m" are allowed, but for the sake of simplicity we'll just say any alphabetical character is valid
|
||
|
while (context.reader.peek() !== context.reader.EOF) {
|
||
|
if (!/[A-Za-z]/.test(context.reader.peek())) {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
regexLiteral += context.reader.read();
|
||
|
}
|
||
|
|
||
|
return context.createToken("regexLiteral", regexLiteral, line, column);
|
||
|
}
|
||
|
],
|
||
|
|
||
|
identFirstLetter: /[$A-Za-z_]/,
|
||
|
identAfterFirstLetter: /[\w\$]/,
|
||
|
|
||
|
namedIdentRules: {
|
||
|
follows: [
|
||
|
[{ token: "keyword", values: ["function"] }, sunlight.util.whitespace]
|
||
|
]
|
||
|
},
|
||
|
|
||
|
operators: [
|
||
|
//arithmetic
|
||
|
"++", "+=", "+",
|
||
|
"--", "-=", "-",
|
||
|
"*=", "*",
|
||
|
"/=", "/",
|
||
|
"%=", "%",
|
||
|
|
||
|
//boolean
|
||
|
"&&", "||",
|
||
|
|
||
|
//bitwise
|
||
|
"|=", "|",
|
||
|
"&=", "&",
|
||
|
"^=", "^",
|
||
|
">>>=", ">>>", ">>=", ">>",
|
||
|
"<<=", "<<",
|
||
|
|
||
|
//inequality
|
||
|
"<=", "<",
|
||
|
">=", ">",
|
||
|
"===", "==", "!==", "!=",
|
||
|
|
||
|
//unary
|
||
|
"!", "~",
|
||
|
|
||
|
//other
|
||
|
"?", ":", ".", "="
|
||
|
]
|
||
|
});
|
||
|
}(this["Sunlight"]));
|