UNPKG

dragonbones-runtime

Version:

the tools to build dragonbones file for diffrent framework

504 lines (475 loc) 16.3 kB
/** * Copyright (c) 2014,egret.com * 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 the egret.com 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 EGRET-LABS.ORG 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 EGRET-LABS.ORG AND CONTRIBUTORS 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. */ /** * 判断一个字符串是否为合法变量名,第一个字符为字母,下划线或$开头,第二个字符开始为字母,下划线,数字或$ */ export function isVariableWord(word) { if (!word) return false; var char = word.charAt(0); if (!isVariableFirstChar(char)) { return false; } var length = word.length; for (var i = 1; i < length; i++) { char = word.charAt(i); if (!isVariableChar(char)) { return false; } } return true; } /** * 是否为合法变量字符,字符为字母,下划线,数字或$ */ export function isVariableChar(char) { return (char <= "Z" && char >= "A" || char <= "z" && char >= "a" || char <= "9" && char >= "0" || char == "_" || char == "$"); } /** * 是否为合法变量字符串的第一个字符,字符为字母,下划线或$ */ export function isVariableFirstChar(char) { return (char <= "Z" && char >= "A" || char <= "z" && char >= "a" || char == "_" || char == "$"); } /** * 判断一段代码中是否含有某个变量字符串,且该字符串的前后都不是变量字符。 */ export function containsVariable(key, codeText) { var contains = false; while (codeText.length > 0) { var index = codeText.indexOf(key); if (index == -1) break; var lastChar = codeText.charAt(index + key.length); var firstChar = codeText.charAt(index - 1); if (!isVariableChar(firstChar) && !isVariableChar(lastChar)) { contains = true; break; } else { codeText = codeText.substring(index + key.length); } } return contains; } /** * 获取第一个含有key关键字的起始索引,且该关键字的前后都不是变量字符。 */ export function getFirstVariableIndex(key, codeText) { var subLength = 0; while (codeText.length) { var index = codeText.indexOf(key); if (index == -1) { break; } var lastChar = codeText.charAt(index + key.length); var firstChar = codeText.charAt(index - 1); if (!isVariableChar(firstChar) && !isVariableChar(lastChar)) { return subLength + index; } else { subLength += index + key.length; codeText = codeText.substring(index + key.length); } } return -1; } /** * 获取最后一个含有key关键字的起始索引,且该关键字的前后都不是变量字符。 */ export function getLastVariableIndex(key, codeText) { while (codeText.length) { var index = codeText.lastIndexOf(key); if (index == -1) { break; } var lastChar = codeText.charAt(index + key.length); var firstChar = codeText.charAt(index - 1); if (!isVariableChar(firstChar) && !isVariableChar(lastChar)) { return index; } else { codeText = codeText.substring(0, index); } } return -1; } /** * 获取第一个词,遇到空白字符或 \n \r \t 后停止。 */ export function getFirstWord(str) { str = str.trim(); var index = str.indexOf(" "); if (index == -1) index = Number.MAX_VALUE; var rIndex = str.indexOf("\r"); if (rIndex == -1) rIndex = Number.MAX_VALUE; var nIndex = str.indexOf("\n"); if (nIndex == -1) nIndex = Number.MAX_VALUE; var tIndex = str.indexOf("\t"); if (tIndex == -1) tIndex = Number.MAX_VALUE; index = Math.min(index, rIndex, nIndex, tIndex); str = str.substr(0, index); return str.trim(); } /** * 移除第一个词 * @param str 要处理的字符串 * @param word 要移除的词,若不传入则自动获取。 */ export function removeFirstWord(str, word="") { if (!word) { word = getFirstWord(str); } var index = str.indexOf(word); if (index == -1) return str; return str.substring(index + word.length); } /** * 获取最后一个词,遇到空白字符或 \n \r \t 后停止。 */ export function getLastWord(str) { str = str.trim(); var index = str.lastIndexOf(" "); var rIndex = str.lastIndexOf("\r"); var nIndex = str.lastIndexOf("\n"); var tIndex = str.indexOf("\t"); index = Math.max(index, rIndex, nIndex, tIndex); str = str.substring(index + 1); return str.trim(); } /** * 移除最后一个词 * @param str 要处理的字符串 * @param word 要移除的词,若不传入则自动获取。 */ export function removeLastWord(str, word) { if (typeof word === "undefined") { word = ""; } if (!word) { word = getLastWord(str); } var index = str.lastIndexOf(word); if (index == -1) return str; return str.substring(0, index); } /** * 获取字符串起始的第一个变量,返回的字符串两端均没有空白。若第一个非空白字符就不是合法变量字符,则返回空字符串。 */ export function getFirstVariable(str) { str = str.trim(); var word = ""; var length = str.length; for (var i = 0; i < length; i++) { var char = str.charAt(i); if (isVariableChar(char)) { word += char; } else { break; } } return word.trim(); } /** * 移除第一个变量 * @param str 要处理的字符串 * @param word 要移除的变量,若不传入则自动获取。 */ export function removeFirstVariable(str, word="") { if (!word) { word = getFirstVariable(str); } var index = str.indexOf(word); if (index == -1) return str; return str.substring(index + word.length); } /** * 获取字符串末尾的最后一个变量,返回的字符串两端均没有空白。若最后一个非空白字符就不是合法变量字符,则返回空字符串。 */ export function getLastVariable(str) { str = str.trim(); var word = ""; for (var i = str.length - 1; i >= 0; i--) { var char = str.charAt(i); if (isVariableChar(char)) { word = char + word; } else { break; } } return word.trim(); } /** * 移除最后一个变量 * @param str 要处理的字符串 * @param word 要移除的变量,若不传入则自动获取。 */ export function removeLastVariable(str, word) { if (typeof word === "undefined") { word = ""; } if (!word) { word = getLastVariable(str); } var index = str.lastIndexOf(word); if (index == -1) return str; return str.substring(0, index); } /** * 获取一对括号的结束点,例如"class A{ function B(){} } class",返回24,若查找失败,返回-1。 */ export function getBracketEndIndex(codeText, left='{', right='}') { var indent = 0; var text = ""; while (codeText.length > 0) { var index = codeText.indexOf(left); if (index == -1) index = Number.MAX_VALUE; var endIndex = codeText.indexOf(right); if (endIndex == -1) endIndex = Number.MAX_VALUE; index = Math.min(index, endIndex); if (index == Number.MAX_VALUE) { return -1; } text += codeText.substring(0, index + 1); codeText = codeText.substring(index + 1); if (index == endIndex) indent--; else indent++; if (indent == 0) { break; } if (codeText.length == 0) return -1; } return text.length - 1; } /** * 从后往前搜索,获取一对括号的起始点,例如"class A{ function B(){} } class",返回7,若查找失败,返回-1。 */ export function getBracketStartIndex(codeText, left, right) { if (typeof left === "undefined") { left = "{"; } if (typeof right === "undefined") { right = "}"; } var indent = 0; while (codeText.length > 0) { var index = codeText.lastIndexOf(left); var endIndex = codeText.lastIndexOf(right); index = Math.max(index, endIndex); if (index == -1) { return -1; } codeText = codeText.substring(0, index); if (index == endIndex) indent++; else indent--; if (indent == 0) { break; } if (codeText.length == 0) return -1; } return codeText.length; } /** * 去掉字符串两端所有连续的非变量字符。 * @param str 要格式化的字符串 */ export function trimVariable(str) { return trimVariableLeft(trimVariableRight(str)); } /** * 去除字符串左边所有连续的非变量字符。 * @param str 要格式化的字符串 */ export function trimVariableLeft(str) { if (!str) return ""; var char = str.charAt(0); while (str.length > 0 && !isVariableFirstChar(char)) { str = str.substr(1); char = str.charAt(0); } return str; } /** * 去除字符串右边所有连续的非变量字符。 * @param str 要格式化的字符串 */ export function trimVariableRight(str) { if (!str) return ""; var char = str.charAt(str.length - 1); while (str.length > 0 && !isVariableChar(char)) { str = str.substr(0, str.length - 1); char = str.charAt(str.length - 1); } return str; } var removeCommentCache = {}; /** * 移除代码注释和字符串常量 */ export function removeComment(codeText,path) { if(path&&removeCommentCache[path]){ return removeCommentCache[path]; } //performance optimize // var result = codeText.replace(/(?:^|\n|\r)\s*\/\*[\s\S]*?\*\/\s*(?:\r|\n|$)/g, '\n').replace(/(?:^|\n|\r)\s*\/\/.*(?:\r|\n|$)/g, '\n'); // return result; var NBSP = ""; var trimText = ""; codeText = codeText.split("\\\\").join("\v0\v"); codeText = codeText.split("\\\"").join("\v1\v"); codeText = codeText.split("\\\'").join("\v2\v"); codeText = codeText.split("\r\n").join("\n").split("\r").join("\n"); while (codeText.length > 0) { var quoteIndex = codeText.indexOf("\""); if (quoteIndex == -1) quoteIndex = Number.MAX_VALUE; var squoteIndex = codeText.indexOf("'"); if (squoteIndex == -1) squoteIndex = Number.MAX_VALUE; var commentIndex = codeText.indexOf("/*"); if (commentIndex == -1) commentIndex = Number.MAX_VALUE; var lineCommonentIndex = codeText.indexOf("//"); if (lineCommonentIndex == -1) lineCommonentIndex = Number.MAX_VALUE; var index = Math.min(quoteIndex, squoteIndex, commentIndex, lineCommonentIndex); if (index == Number.MAX_VALUE) { trimText += codeText; break; } trimText += codeText.substring(0, index) + NBSP; codeText = codeText.substring(index); switch (index) { case quoteIndex: codeText = codeText.substring(1); index = codeText.indexOf("\""); if (index == -1) index = codeText.length - 1; codeText = codeText.substring(index + 1); break; case squoteIndex: codeText = codeText.substring(1); index = codeText.indexOf("'"); if (index == -1) index = codeText.length - 1; codeText = codeText.substring(index + 1); break; case commentIndex: index = codeText.indexOf("*/"); if (index == -1) index = codeText.length - 1; codeText = codeText.substring(index + 2); break; case lineCommonentIndex: index = codeText.indexOf("\n"); if (index == -1) index = codeText.length - 1; codeText = codeText.substring(index); break; } } codeText = trimText.split("\v0\v").join("\\\\"); codeText = codeText.split("\v1\v").join("\\\""); codeText = codeText.split("\v2\v").join("\\\'"); if(path){ removeCommentCache[path] = codeText; } return codeText; } /** * 移除代码注释不移除字符串常量 */ export function removeCommentExceptQuote(codeText) { var NBSP = ""; var trimText = ""; codeText = codeText.split("\\\\").join("\v0\v"); codeText = codeText.split("\\\"").join("\v1\v"); codeText = codeText.split("\\\'").join("\v2\v"); codeText = codeText.split("\r\n").join("\n").split("\r").join("\n"); while (codeText.length > 0) { var quoteIndex = codeText.indexOf("\""); if (quoteIndex == -1) quoteIndex = Number.MAX_VALUE; var squoteIndex = codeText.indexOf("'"); if (squoteIndex == -1) squoteIndex = Number.MAX_VALUE; var commentIndex = codeText.indexOf("/*"); if (commentIndex == -1) commentIndex = Number.MAX_VALUE; var lineCommonentIndex = codeText.indexOf("//"); if (lineCommonentIndex == -1) lineCommonentIndex = Number.MAX_VALUE; var index = Math.min(quoteIndex, squoteIndex, commentIndex, lineCommonentIndex); if (index == Number.MAX_VALUE) { trimText += codeText; break; } trimText += codeText.substring(0, index) + NBSP; codeText = codeText.substring(index); switch (index) { case quoteIndex: codeText = codeText.substring(1); index = codeText.indexOf("\""); if (index == -1) index = codeText.length - 1; trimText += codeText.substring(0,index + 1) codeText = codeText.substring(index + 1); break; case squoteIndex: codeText = codeText.substring(1); index = codeText.indexOf("'"); if (index == -1) index = codeText.length - 1; trimText += codeText.substring(0,index + 1) codeText = codeText.substring(index + 1); break; case commentIndex: index = codeText.indexOf("*/"); if (index == -1) index = codeText.length - 1; codeText = codeText.substring(index + 2); break; case lineCommonentIndex: index = codeText.indexOf("\n"); if (index == -1) index = codeText.length - 1; codeText = codeText.substring(index); break; } } codeText = trimText.split("\v0\v").join("\\\\"); codeText = codeText.split("\v1\v").join("\\\""); codeText = codeText.split("\v2\v").join("\\\'"); return codeText; }