UNPKG

ink-docstrap

Version:

[![NPM](https://nodei.co/npm/ink-docstrap.png?downloads=true)](https://nodei.co/npm/ink-docstrap/)

282 lines (225 loc) 8.02 kB
(function(sunlight, undefined){ if (sunlight === undefined || sunlight["registerLanguage"] === undefined) { throw "Include sunlight.js before including language files"; } sunlight.registerLanguage("actionscript", { keywords: [ "default xml namespace", "use namespace", "break", "case", "catch", "continue", "default", "do", "else", "finally", "for", "if", "in", "label", "return", "super", "switch", "throw", "try", "while", "with", "dynamic", "final", "internal", "native", "override", "private", "protected", "public", "static", "class", "const", "extends", "function", "get", "implements", "interface", "namespace", "package", "set", "var", "import", "include", "false", "null", "this", "true", "typeof", "void", "as", "instanceof", "is", "new" ], customTokens: { varArgs: { values: ["...rest"], boundary: "[\\W]" }, constant: { values: ["Infinity", "NaN", "undefined"], boundary: "\\b" }, globalObject: { values: [ "ArgumentError", "arguments", "Array", "Boolean", "Class", "Date", "DefinitionError", "Error", "EvalError", "Function", "int", "Math", "Namespace", "Number", "Object", "QName", "RangeError", "ReferenceError", "RegExp", "SecurityError", "String", "SyntaxError", "TypeError", "uint", "URIError", "Vector", "VerifyError", "XMLList", "XML" ], boundary: "\\b" } }, scopes: { string: [ ["\"", "\"", sunlight.util.escapeSequences.concat(["\\\""])], ["'", "'", sunlight.util.escapeSequences.concat(["\\\'", "\\\\"])] ], comment: [ ["//", "\n", null, true], ["/*", "*/"] ], xmlAttribute: [ ["@", "\\b"] ] }, customParseRules: [ //global functions: //http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/package-detail.html function() { var functions = sunlight.util.createHashMap([ "Array", "Boolean", "decodeURIComponent", "decodeURI", "encodeURIComponent", "encodeURI", "escape", "int", "isFinite", "isNaN", "isXMLName", "Number", "Object", "parseFloat", "parseInt", "String", "trace", "uint", "unescape", "Vector", "XML", "XMLList" ], "\\b", false); return function(context) { var prevToken, token, peek, count; if (!/[A-Za-z]/.test(context.reader.current())) { //short circuit return null; } //if it follows "new" or ":", then it's not a function prevToken = context.token(context.count() - 1); if (prevToken && ((prevToken.name === "keyword" && prevToken.value === "new") || (prevToken.name === "operator" && prevToken.value === ":"))) { return null; } token = sunlight.util.matchWord(context, functions, "globalFunction", true); if (!token) { return null; } //make sure that a "(" follows it count = token.value.length; while ((peek = context.reader.peek(count)) && peek.length === count) { if (!/\s$/.test(peek)) { if (sunlight.util.last(peek) === "(") { token.line = context.reader.getLine(); token.column = context.reader.getColumn(); context.reader.read(token.value.length - 1); return token; } break; } } return null; }; }(), //regex literal, stolen from javascript function(context) { var peek = context.reader.peek(), isValid, regexLiteral = "/", line = context.reader.getLine(), column = context.reader.getColumn(), 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; } regexLiteral += (next = context.reader.read()); if (next === "/") { 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: { custom: [ function(context) { //next token is not "." var nextToken = sunlight.util.getNextNonWsToken(context.tokens, context.index), token, index, previous; if (nextToken && nextToken.name === "operator" && nextToken.value === ".") { return false; } //go backward and make sure that there are only idents and dots before the new keyword index = context.index; previous = context.tokens[index]; while ((token = context.tokens[--index]) !== undefined) { if (token.name === "keyword" && sunlight.util.contains(["new", "is", "instanceof", "import"], token.value)) { return true; } if (token.name === "default") { continue; } if (token.name === "ident") { if (previous && previous.name === "ident") { return false; } previous = token; continue; } if (token.name === "operator" && token.value === ".") { if (previous && previous.name !== "ident") { return false; } previous = token; continue; } break; } return false; } ], follows: [ [{ token: "keyword", values: ["class", "extends"] }, { token: "default" }], [{ token: "operator", values: [":"] }, sunlight.util.whitespace] ], between: [ { opener: { token: "keyword", values: ["implements"] }, closer: { token: "punctuation", values: ["{"] } } ] }, operators: [ //arithmetic "++", "+=", "+", "--", "-=", "-", "*=", "*", "/=", "/", "%=", "%", //boolean "&&=", "&&", "||=", "||", //bitwise "|=", "|", "&=", "&", "^=", "^", ">>>=", ">>>", ">>=", ">>", "<<=", "<<", //inequality "<=", "<", ">=", ">", "===", "==", "!==", "!=", //unary "!", "~", //other "::", "?", ":", ".", "=" ] }); }(this["Sunlight"]));