tools.js
来自「《JavaScript王者归来》examples.rar」· JavaScript 代码 · 共 649 行 · 第 1/2 页
JS
649 行
ss = ds;
ds = ss.replace(/\n\n/g, '\n')
.replace(/\n(\s)+/g, '\n')
.replace(/(\s)+\n/g, '\n')
.replace(/(\n)*\{(\n)*/g, '{')
.replace(/(\n)*\}/g, '}')
.replace(/(\n)*\((\n)*/g, '(')
.replace(/(\n)*\)/g, ')')
.replace(/\{\n\{/g, '{{')
.replace(/\}\n\}/g, '}}')
.replace(/\)\n\)/g, '))')
.replace(/\(\n\(/g, '((')
.replace(/(\n)else/g, 'else')
.replace(/(\n)catch/g, 'catch')
.replace(/(\n)finally/g, 'finally')
.replace(/\n(\+|\-|\*|\&|\||=|\.|\?|:|\,|;|>|<)/g, '$1')
.replace(/(\+|\-|\*|\&|\||=|\.|\?|:|\,|;|>|<)\n/g, '$1')
.replace(/\n&&/g, '&&')
.replace(/&&\n/g, '&&')
.replace(/\n\|\|/g, '||')
.replace(/\|\|\n/g, '||')
.replace(/\n>=/g, '>=')
.replace(/>=\n/g, '>=')
.replace(/\n<=/g, '<=')
.replace(/<=\n/g, '<=')
.replace(/\n\!=/g, '!=')
.replace(/\!=\n/g, '!=')
.replace(/(;|\{)(\}+)\n+\]/g, '$1$2]')
.replace(/(;|\{)(\}+)(\n+)([^\]])/g, '$1$2;$4');
}
// restore regexp expression.
for (var i = constRegExps.length - 1; i >= 0; i--) {
ds = ds.replace(getConstantString("R", i, rnd), constRegExps[i]);
}
// restore string expression.
for (var i = constStrs.length - 1; i >= 0; i--) {
ds = ds.replace(getConstantString("S", i, rnd), constStrs[i]);
}
ds = ds.replace(/(^\s+)|\s+$/g, "");
return ds;
}
var convertToStringPart = function (s0, c) {
var s = s0.replace(/\\/g, "\\\\");
s = (c == "'") ? s.replace(/'/g, "\\'") : s.replace(/"/g, "\\\"");
return s.replace(/\t/g, "\\t").replace(/\r/g, "\\r")
.replace(/\n/g, "\\n");
}
/**
* Converts a string variable to a string expression
*/
var convertToStringExpression = function (s, c) {
var bc = c || "\"";
return bc + convertToStringPart(s, c) + bc;
}
/**
* document event listener
*/
var listener = function (evt) {
if (evt.keyCode == 120 && evt.ctrlKey) {
jsvm.tools.JSArchivePackager.packJSArchive();
}
}
/**
* Starts listening hotkey
*/
jsvm.tools.JSArchivePackager.startListenHotkey = function () {
Class.forName("js.dom.EventManager").addEventListener(document, "keydown", listener);
}
/**
* Stops listening hotkey
*/
jsvm.tools.JSArchivePackager.stopListenHotkey = function () {
Class.forName("js.dom.EventManager").removeEventListener(document, "keydown", listener);
}
jsvm.tools.JSArchivePackager.startListenHotkey();
// add listener.
Class.forName("js.lang.System").addVMDestroyListener(function (){
jsvm.tools.JSArchivePackager.stopListenHotkey();
});
var selectorHDL = null;
var getSelectorWindow = function () {
if (selectorHDL != null) {
return selectorHDL;
}
selectorHDL = Class.forName("js.dom.Window").newInstance(
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"
+ "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"
+ "<title>JSVM JavaScript Archive Packager V0.1</title>"
+ "<style>"
+ "body {padding:0px;background-color:white;color:black;font-family:MS Sans Serif;font-size:12px;}\r\n"
+ ".panel {border:2px inset;width:440px;height:320px;overflow:auto;padding:5px}\r\n"
+ ".button {margin-top:2px}\r\n"
+ "</style>"
+ "<script>"
+ "opener._JSVM_Namespace.apply(window);$import('js.lang.System');"
+ "var fso=null;var getFileSystemObject=function(){if(fso!=null){return fso;}try{fso=new ActiveXObject(\"Scripting.FileSystemObject\");return fso;}catch(e){throw \"Not support 'Scripting.FileSystemObject'!\";}};"
+ "var classHome=null;var getTreeNodeByClassHome=function(){classHome=document.getElementById('jsrepath').value;if(classHome!=''){classHome=classHome.replace(/jsre\\.js$/,'classes');}else{classHome=System.getClassHome();}if(/^file:\\/\\//.test(classHome)){classHome=classHome.replace(/^file:\\/\\//, '');};try {classHome=getFileSystemObject().getFolder(classHome).path;}catch(e){throw 'Security Error! FSO can not access the real path (classHome):'+classHome;};var root=new jsvm.tools.TreeNode(\"Class Home\", classHome);finishChildNodes(root);return root;};var finishChildNodes=function(node){var folder=getFileSystemObject().getFolder(node.value);var files=new Enumerator(folder.Files);for(;!files.atEnd();files.moveNext()){var file=files.item();if(/\\.class\\.js$/.test(file.name)){var childNode=new jsvm.tools.TreeNode(file.name, file.path);var className=file.path.replace(classHome,\"\").replace(\".class.js\",\"\").replace(/^\\\\/, \"\").replace(/\\\\/g, \".\");childNode.setAttribute(\"className\", className);node.appendChild(childNode);}}var folders=new Enumerator(folder.SubFolders);for(;!folders.atEnd();folders.moveNext()){var subfolder=folders.item();if(subfolder.name!=\"CVS\"){var childNode=new jsvm.tools.TreeNode(subfolder.name, subfolder.path);finishChildNodes(childNode);node.appendChild(childNode);}}};\r\n"
+ "var out={print:function(s){System.out.print(s);document.getElementById('divPanel3').insertAdjacentHTML(\"beforeEnd\",s);},println:function(s){System.out.println(s);document.getElementById('divPanel3').insertAdjacentHTML(\"beforeEnd\",s+'<br/>');}};"
+ "var currIndex=0;function showPanel(n){if(n<4)currIndex=n;hideAllPanel();document.getElementById('divPanel'+n).style.display='';}\r\n"
+ "function hideAllPanel(){for(var i=0;i<4;i++)document.getElementById('divPanel'+i).style.display='none';}\r\n"
+ "var allClassTree=null;"
+ "function listAllClasses(){try {System.gc();allClassTree=getTreeNodeByClassHome();allClassTree.build('allClassTreeContainer');allClassTree.expand();}catch(e){alert(e.message||e);}}\r\n"
+ "function listLibClasses(){var path=document.getElementById('jsarpath').value;if(path==''){alert('Must enter the js archive location.');return;}var lib=jsvm.tools.JSArchivePackager.loadLibInfo(path);var sb=[];for(var clz in lib.entity){if(clz==null||clz=='null'){continue;}var id='libclz_'+clz;sb.push('<input type=checkbox checked name=\\'lib-class\\' id=\\''+id+'\\' value=\\''+clz+'\\'> <label for=\\''+id+'\\'>'+clz+'</label>');};document.getElementById('libClassesContainer').innerHTML=sb.join('<br/>')||'No class found';}\r\n"
+ "function listLoadedClasses(){try {var classes=opener.jsvm.tools.JSArchivePackager.getLoadedClasses();var sb=[];for(var i=0;i<classes.length;i++){var clz=classes[i],id='loadclz_'+clz;sb.push('<input type=checkbox checked name=\\'loaded-class\\' id=\\''+id+'\\' value=\\''+clz+'\\'> <label for=\\''+id+'\\'>'+clz+'</label>');};document.getElementById('loadedClassesContainer').innerHTML=sb.join('<br/>')||'No class found';}catch(e){alert(e.message||e);}}\r\n"
+ "function getSelectedAllClasses(){if(allClassTree==null)return[];var classes=[];var nodes=allClassTree.getCheckedChildNodes();for(var i=0;i<nodes.length;i++){var className=nodes[i].getAttribute('className');if(className!=null){classes.push(className);}}return classes;}\r\n"
+ "function getSelectedLibClasses(){var els=document.getElementsByName('lib-class');var clzes=[];for(var i=0;i<els.length;i++){if(els[i].checked){clzes.push(els[i].value);}}return clzes;}\r\n"
+ "function getSelectedLoadedClasses(){var els=document.getElementsByName('loaded-class');var clzes=[];for(var i=0;i<els.length;i++){if(els[i].checked){clzes.push(els[i].value);}}return clzes;}\r\n"
+ "function getJSARClasses(){if(currIndex==0){return getSelectedAllClasses();}else if(currIndex==1){return getSelectedLibClasses();}else if(currIndex==2){return getSelectedLoadedClasses();}else{alert('err currIndex');}}\r\n"
+ "function buildJSAR(){"
+ "try{var path = document.getElementById('ja_path').value;"
+ "if(path==''){alert('Must enter the path of export!');return;}\r\n"
+ "if(getFileSystemObject().fileExists(path)&&!confirm('File: \\''+path+'\\' already exists, overwrite it?')){return;};"
+ "var config={path: path,name: document.getElementById('ja_name').value,version: document.getElementById('ja_version').value,author: document.getElementById('ja_author').value,classes:getJSARClasses(),isOverwrite:true,ignoreError:document.getElementById('js_ignore').checked};"
//+ "document.getElementById('panel3').click();
+ "setTimeout(function(){jsvm.tools.JSArchivePackager.exportJSArchive(config, out);});"
+ "}catch(ex){alert(ex);}}\r\n"
+ "</script></head><body scroll=\"auto\" onload=\"showPanel(0)\">"
+ "<div style='margin-bottom:5px'>"
+ "<input type=radio name='panelSwith' id='panel0' onclick='showPanel(0);' checked><label for='panel0'>All Class</label> "
+ "<input type=radio id='panel1' name='panelSwith' onclick='showPanel(1);'><label for='panel1'>File Class</label> "
+ "<input type=radio id='panel2' name='panelSwith' onclick='showPanel(2);'><label for='panel2'>Loaded Class</label> "
+ "<input type=radio id='panel3' name='panelSwith' onclick='showPanel(3);'><label for='panel3'>Execute Logs</label>"
+ "</div>"
+ "<div id='divPanel0' class='panel' style='display:none;'><div><strong>jsvm2/jsre.js location:</strong> <input type=file id='jsrepath' style='height:22px'><input type=button style='height:22px' value=' list ' onclick='listAllClasses();'></div><div id='allClassTreeContainer'>no data</div></div>"
+ "<div id='divPanel1' class='panel' style='display:none;'><div><strong>js archive location:</strong> <input id='jsarpath' type=file style='height:22px'><input type=button style='height:22px' value=' list ' onclick='listLibClasses();'></div><div id='libClassesContainer'>no data</div></div>"
+ "<div id='divPanel2' class='panel' style='display:none;'><div><strong>all loaded classes in memory.</strong> <a href='#' onclick='listLoadedClasses();return false;'>list & refresh</a></div><div id='loadedClassesContainer'>no data</div></div>"
+ "<div id='divPanel3' class='panel' style='display:none;' contentEditable=true>JavaScript Archive Packager :\r\n</div>"
+ "<fieldset style='margin-top:5px;margin-bottom:5px;padding:5px;width:440px;'><legend style='padding:2px'>JS Archive Information</legend>"
+ "Name: <input type='text' style='width:120px' id='ja_name' /> "
+ "Author: <input type='text' style='width:120px' id='ja_author' /> Version:<input type='text' style='width:60px' value='1.0' id='ja_version' />"
+ "<br/>Path:<input type='file' style='width:300px;margin-left:9px' id='ja_path' /> <input type='checkbox' id='js_ignore' checked /> <label for='js_ignore'>ignore error</label><br/>"
+ "</fieldset>"
+ "<input type='button' class='button' value='export' onclick='buildJSAR();' /> "
+ "<input type='button' class='button' value='close' onclick='window.close();' />"
+ "</body></html>");
selectorHDL.width = "480px";
selectorHDL.height = "500px";
selectorHDL.resizable = 0;
selectorHDL.scrollbars = "no";
selectorHDL.status = 0;
return selectorHDL;
}
/**
* Packs a JSArchive
*/
jsvm.tools.JSArchivePackager.packJSArchive = function () {
getSelectorWindow().show();
}
jsvm.tools.JSArchivePackager.getLoadedClasses = function () {
var clzes = [];
var classes = js.lang.System.VM.getContainer().getClasses();
for (var c in classes) {
if (js.lang.System.VM.getClassloader().findClass(c) != null) {
clzes.push(c);
}
}
return clzes;
}
/**
* check security
*/
var createFileSystemObject = function () {
if (!js.lang.System.isIeBrowser()) {
throw "Only support IE!";
}
try {
return new ActiveXObject("Scripting.FileSystemObject");
} catch (ex) {
throw "Can not create fileSystemObject.";
}
}
/**
* Saves to file.
*/
var saveToFile = function (path, content) {
try {
var f = createFileSystemObject().createTextFile(path);
f.writeLine(content);
} catch (ex) {
throw Class.forName("js.lang.Exception").newInstance('save failed.', ex);
} finally {
if (f != null) {
f.close();
f = null;
}
}
}
jsvm.tools.JSArchivePackager.loadLibInfo = function (path) {
var info;
var _JSVM_Namespace = {
"runtimeEnvironment": {
"JSVM": {
"getClassloader": function () {
return {
"loadLib" : function (lib) {
info = lib;
}
}
}
}
}
};
try {
var xhrt = js.lang.System.RE.getXMLHttpRequest();
xhrt.open("GET", path, false);
xhrt.send(null);
eval(xhrt.responseText);
return info;
} catch (ex) {
throw ex;
} finally {
xhrt = null;
}
}
/**
* export js archive file
*/
jsvm.tools.JSArchivePackager.exportJSArchive = function (config, out) {
try {
if (out == null) {
out = js.lang.System.out;
}
var fso = createFileSystemObject();
var sPath = config.path;
var sName = config.name;
var sVer = config.version;
var sAuthor = config.author;
var classes = (config.classes || []).sort();
var isOverwrite = config.isOverwrite;
var ignoreError = config.ignoreError;
if (fso.fileExists(sPath) && !isOverwrite) {
if (!confirm("The target file exist. overwrite it?")) {
return 0;
}
}
var sNowTime = new Date().toGMTString();
out.println("Export: JSVM2 Library on " + sNowTime);
out.println("Copyright (c) 2004, 2006, Homolo Information Technology Co., Ltd. All rights reserved.");
var sb = Class.forName("js.lang.StringBuffer").newInstance();
sb.append("/**\r\n* Created in ").append(sNowTime).append("\r\n*/\r\n");
sb.append("_JSVM_Namespace.runtimeEnvironment\r\n");
sb.append(" .JSVM.getClassloader().loadLib(\r\n");
sb.append("{\r\n").append("manifest :\r\n");
sb.append("{\r\n");
sb.append("'name' : '").append(convertToStringPart(sName))
.append("',\r\n");
sb.append("'uri' : '").append(convertToStringPart(sPath.replace(/.*\\/, "")))
.append("',\r\n");
sb.append("'version' : '").append(convertToStringPart(sVer))
.append("',\r\n");
sb.append("'lastModified' : '").append(sNowTime).append("',\r\n");
sb.append("'author' : '").append(convertToStringPart(sAuthor))
.append("',\r\n");
sb.append("'remark' : ''\r\n},\r\n");
sb.append("entity :\r\n").append("{\r\n");
var sc = 0, fc = 0;
for (var i = 0, l = classes.length; i < l; i++) {
var className = classes[i];
out.print("Compress class: " + className + "\t");
try {
// load the specifed class
Class.forName(className);
var code = js.lang.System.VM.getContainer().getClassCode(className);
if (code == null) {
code = js.lang.System.VM.getCompiler().compile(
js.lang.System.VM.getClassloader().loadClass(className));
}
code = compress(code);
} catch (ex) {
if (ignoreError == true) {
ex.printStackTrace();
out.println("\t...\tfailed.");
fc++;
continue;
} else {
throw ex;
}
}
sb.append("'").append(className).append("' : ");
sb.append(convertToStringExpression(code, "'"));
sb.append(" ,\r\n");
out.println("\t...\tsuccessful.");
sc++;
}
sb.append("'null':null\r\n}});");
out.println("js archive file content is ready. total = " + (sc + fc)
+ " , success = " + sc + ", failure = " + fc + " .");
saveToFile(sPath, sb.toString());
out.println("exported to: '" + sPath + "'.");
out.println("");
return 1;
} catch (ex) {
ex.printStackTrace();
out.println("export failed.");
return 2;
}
}
});
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?