Spaces:
Sleeping
Sleeping
| /** | |
| * @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(); | |