348 lines
7.9 KiB
JavaScript
348 lines
7.9 KiB
JavaScript
/**
|
|
* @fileOverview
|
|
* A bootstrap script that creates some basic required objects
|
|
* for loading other scripts.
|
|
* @author Michael Mathews, micmath@gmail.com
|
|
* @version $Id: run.js 756 2009-01-07 21:32:58Z micmath $
|
|
*/
|
|
|
|
/**
|
|
* @namespace Keep track of any messages from the running script.
|
|
*/
|
|
LOG = {
|
|
warn: function(msg, e) {
|
|
if (JSDOC.opt.q) return;
|
|
if (e) msg = e.fileName+", line "+e.lineNumber+": "+msg;
|
|
|
|
msg = ">> WARNING: "+msg;
|
|
LOG.warnings.push(msg);
|
|
if (LOG.out) LOG.out.write(msg+"\n");
|
|
else print(msg);
|
|
},
|
|
|
|
inform: function(msg) {
|
|
if (JSDOC.opt.q) return;
|
|
msg = " > "+msg;
|
|
if (LOG.out) LOG.out.write(msg+"\n");
|
|
else if (typeof LOG.verbose != "undefined" && LOG.verbose) print(msg);
|
|
}
|
|
};
|
|
LOG.warnings = [];
|
|
LOG.verbose = false
|
|
LOG.out = undefined;
|
|
|
|
/**
|
|
* @class Manipulate a filepath.
|
|
*/
|
|
function FilePath(absPath, separator) {
|
|
this.slash = separator || "/";
|
|
this.root = this.slash;
|
|
this.path = [];
|
|
this.file = "";
|
|
|
|
var parts = absPath.split(/[\\\/]/);
|
|
if (parts) {
|
|
if (parts.length) this.root = parts.shift() + this.slash;
|
|
if (parts.length) this.file = parts.pop()
|
|
if (parts.length) this.path = parts;
|
|
}
|
|
|
|
this.path = this.resolvePath();
|
|
}
|
|
|
|
/** Collapse any dot-dot or dot items in a filepath. */
|
|
FilePath.prototype.resolvePath = function() {
|
|
var resolvedPath = [];
|
|
for (var i = 0; i < this.path.length; i++) {
|
|
if (this.path[i] == "..") resolvedPath.pop();
|
|
else if (this.path[i] != ".") resolvedPath.push(this.path[i]);
|
|
}
|
|
return resolvedPath;
|
|
}
|
|
|
|
/** Trim off the filename. */
|
|
FilePath.prototype.toDir = function() {
|
|
if (this.file) this.file = "";
|
|
return this;
|
|
}
|
|
|
|
/** Go up a directory. */
|
|
FilePath.prototype.upDir = function() {
|
|
this.toDir();
|
|
if (this.path.length) this.path.pop();
|
|
return this;
|
|
}
|
|
|
|
FilePath.prototype.toString = function() {
|
|
return this.root
|
|
+ this.path.join(this.slash)
|
|
+ ((this.path.length > 0)? this.slash : "")
|
|
+ this.file;
|
|
}
|
|
|
|
/**
|
|
* Turn a path into just the name of the file.
|
|
*/
|
|
FilePath.fileName = function(path) {
|
|
var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
|
|
return path.substring(nameStart);
|
|
}
|
|
|
|
/**
|
|
* Get the extension of a filename
|
|
*/
|
|
FilePath.fileExtension = function(filename) {
|
|
return filename.split(".").pop().toLowerCase();
|
|
};
|
|
|
|
/**
|
|
* Turn a path into just the directory part.
|
|
*/
|
|
FilePath.dir = function(path) {
|
|
var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
|
|
return path.substring(0, nameStart-1);
|
|
}
|
|
|
|
|
|
importClass(java.lang.System);
|
|
|
|
/**
|
|
* @namespace A collection of information about your system.
|
|
*/
|
|
SYS = {
|
|
/**
|
|
* Information about your operating system: arch, name, version.
|
|
* @type string
|
|
*/
|
|
os: [
|
|
new String(System.getProperty("os.arch")),
|
|
new String(System.getProperty("os.name")),
|
|
new String(System.getProperty("os.version"))
|
|
].join(", "),
|
|
|
|
/**
|
|
* Which way does your slash lean.
|
|
* @type string
|
|
*/
|
|
slash: System.getProperty("file.separator")||"/",
|
|
|
|
/**
|
|
* The path to the working directory where you ran java.
|
|
* @type string
|
|
*/
|
|
userDir: new String(System.getProperty("user.dir")),
|
|
|
|
/**
|
|
* Where is Java's home folder.
|
|
* @type string
|
|
*/
|
|
javaHome: new String(System.getProperty("java.home")),
|
|
|
|
/**
|
|
* The absolute path to the directory containing this script.
|
|
* @type string
|
|
*/
|
|
pwd: undefined
|
|
};
|
|
|
|
// jsrun appends an argument, with the path to here.
|
|
if (arguments[arguments.length-1].match(/^-j=(.+)/)) {
|
|
if (RegExp.$1.charAt(0) == SYS.slash || RegExp.$1.charAt(1) == ":") { // absolute path to here
|
|
SYS.pwd = new FilePath(RegExp.$1).toDir().toString();
|
|
}
|
|
else { // relative path to here
|
|
SYS.pwd = new FilePath(SYS.userDir + SYS.slash + RegExp.$1).toDir().toString();
|
|
}
|
|
arguments.pop();
|
|
}
|
|
else {
|
|
print("The run.js script requires you use jsrun.jar.");
|
|
quit();
|
|
}
|
|
|
|
// shortcut
|
|
var File = Packages.java.io.File;
|
|
|
|
/**
|
|
* @namespace A collection of functions that deal with reading a writing to disk.
|
|
*/
|
|
IO = {
|
|
|
|
/**
|
|
* Create a new file in the given directory, with the given name and contents.
|
|
*/
|
|
saveFile: function(/**string*/ outDir, /**string*/ fileName, /**string*/ content) {
|
|
var out = new Packages.java.io.PrintWriter(
|
|
new Packages.java.io.OutputStreamWriter(
|
|
new Packages.java.io.FileOutputStream(outDir+SYS.slash+fileName),
|
|
IO.encoding
|
|
)
|
|
);
|
|
out.write(content);
|
|
out.flush();
|
|
out.close();
|
|
},
|
|
|
|
/**
|
|
* @type string
|
|
*/
|
|
readFile: function(/**string*/ path) {
|
|
if (!IO.exists(path)) {
|
|
throw "File doesn't exist there: "+path;
|
|
}
|
|
return readFile(path, IO.encoding);
|
|
},
|
|
|
|
/**
|
|
* @param inFile
|
|
* @param outDir
|
|
* @param [fileName=The original filename]
|
|
*/
|
|
copyFile: function(/**string*/ inFile, /**string*/ outDir, /**string*/ fileName) {
|
|
if (fileName == null) fileName = FilePath.fileName(inFile);
|
|
|
|
var inFile = new File(inFile);
|
|
var outFile = new File(outDir+SYS.slash+fileName);
|
|
|
|
var bis = new Packages.java.io.BufferedInputStream(new Packages.java.io.FileInputStream(inFile), 4096);
|
|
var bos = new Packages.java.io.BufferedOutputStream(new Packages.java.io.FileOutputStream(outFile), 4096);
|
|
var theChar;
|
|
while ((theChar = bis.read()) != -1) {
|
|
bos.write(theChar);
|
|
}
|
|
bos.close();
|
|
bis.close();
|
|
},
|
|
|
|
/**
|
|
* Creates a series of nested directories.
|
|
*/
|
|
mkPath: function(/**Array*/ path) {
|
|
if (path.constructor != Array) path = path.split(/[\\\/]/);
|
|
var make = "";
|
|
for (var i = 0, l = path.length; i < l; i++) {
|
|
make += path[i] + SYS.slash;
|
|
if (! IO.exists(make)) {
|
|
IO.makeDir(make);
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Creates a directory at the given path.
|
|
*/
|
|
makeDir: function(/**string*/ path) {
|
|
(new File(path)).mkdir();
|
|
},
|
|
|
|
/**
|
|
* @type string[]
|
|
* @param dir The starting directory to look in.
|
|
* @param [recurse=1] How many levels deep to scan.
|
|
* @returns An array of all the paths to files in the given dir.
|
|
*/
|
|
ls: function(/**string*/ dir, /**number*/ recurse, _allFiles, _path) {
|
|
if (_path === undefined) { // initially
|
|
var _allFiles = [];
|
|
var _path = [dir];
|
|
}
|
|
if (_path.length == 0) return _allFiles;
|
|
if (recurse === undefined) recurse = 1;
|
|
|
|
dir = new File(dir);
|
|
if (!dir.directory) return [String(dir)];
|
|
var files = dir.list();
|
|
|
|
for (var f = 0; f < files.length; f++) {
|
|
var file = String(files[f]);
|
|
if (file.match(/^\.[^\.\/\\]/)) continue; // skip dot files
|
|
|
|
if ((new File(_path.join(SYS.slash)+SYS.slash+file)).list()) { // it's a directory
|
|
_path.push(file);
|
|
if (_path.length-1 < recurse) IO.ls(_path.join(SYS.slash), recurse, _allFiles, _path);
|
|
_path.pop();
|
|
}
|
|
else {
|
|
_allFiles.push((_path.join(SYS.slash)+SYS.slash+file).replace(SYS.slash+SYS.slash, SYS.slash));
|
|
}
|
|
}
|
|
|
|
return _allFiles;
|
|
},
|
|
|
|
/**
|
|
* @type boolean
|
|
*/
|
|
exists: function(/**string*/ path) {
|
|
file = new File(path);
|
|
|
|
if (file.isDirectory()){
|
|
return true;
|
|
}
|
|
if (!file.exists()){
|
|
return false;
|
|
}
|
|
if (!file.canRead()){
|
|
return false;
|
|
}
|
|
return true;
|
|
},
|
|
|
|
/**
|
|
*
|
|
*/
|
|
open: function(/**string*/ path, /**string*/ append) {
|
|
var append = true;
|
|
var outFile = new File(path);
|
|
var out = new Packages.java.io.PrintWriter(
|
|
new Packages.java.io.OutputStreamWriter(
|
|
new Packages.java.io.FileOutputStream(outFile, append),
|
|
IO.encoding
|
|
)
|
|
);
|
|
return out;
|
|
},
|
|
|
|
/**
|
|
* Sets {@link IO.encoding}.
|
|
* Encoding is used when reading and writing text to files,
|
|
* and in the meta tags of HTML output.
|
|
*/
|
|
setEncoding: function(/**string*/ encoding) {
|
|
if (/ISO-8859-([0-9]+)/i.test(encoding)) {
|
|
IO.encoding = "ISO8859_"+RegExp.$1;
|
|
}
|
|
else {
|
|
IO.encoding = encoding;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* @default "utf-8"
|
|
* @private
|
|
*/
|
|
encoding: "utf-8",
|
|
|
|
/**
|
|
* Load the given script.
|
|
*/
|
|
include: function(relativePath) {
|
|
load(SYS.pwd+relativePath);
|
|
},
|
|
|
|
/**
|
|
* Loads all scripts from the given directory path.
|
|
*/
|
|
includeDir: function(path) {
|
|
if (!path) return;
|
|
|
|
for (var lib = IO.ls(SYS.pwd+path), i = 0; i < lib.length; i++)
|
|
if (/\.js$/i.test(lib[i])) load(lib[i]);
|
|
}
|
|
}
|
|
|
|
// now run the application
|
|
IO.include("frame.js");
|
|
IO.include("main.js");
|
|
|
|
main();
|