aboutsummaryrefslogtreecommitdiff
path: root/tools/jsdoc-toolkit-2.4.0/app/frame
diff options
context:
space:
mode:
Diffstat (limited to 'tools/jsdoc-toolkit-2.4.0/app/frame')
-rw-r--r--tools/jsdoc-toolkit-2.4.0/app/frame/Chain.js102
-rw-r--r--tools/jsdoc-toolkit-2.4.0/app/frame/Dumper.js144
-rw-r--r--tools/jsdoc-toolkit-2.4.0/app/frame/Hash.js84
-rw-r--r--tools/jsdoc-toolkit-2.4.0/app/frame/Link.js173
-rw-r--r--tools/jsdoc-toolkit-2.4.0/app/frame/Namespace.js10
-rw-r--r--tools/jsdoc-toolkit-2.4.0/app/frame/Opt.js134
-rw-r--r--tools/jsdoc-toolkit-2.4.0/app/frame/Reflection.js26
-rw-r--r--tools/jsdoc-toolkit-2.4.0/app/frame/String.js93
-rw-r--r--tools/jsdoc-toolkit-2.4.0/app/frame/Testrun.js129
9 files changed, 895 insertions, 0 deletions
diff --git a/tools/jsdoc-toolkit-2.4.0/app/frame/Chain.js b/tools/jsdoc-toolkit-2.4.0/app/frame/Chain.js
new file mode 100644
index 0000000..506469d
--- /dev/null
+++ b/tools/jsdoc-toolkit-2.4.0/app/frame/Chain.js
@@ -0,0 +1,102 @@
+/**@constructor*/
+function ChainNode(object, link) {
+ this.value = object;
+ this.link = link; // describes this node's relationship to the previous node
+}
+
+/**@constructor*/
+function Chain(valueLinks) {
+ this.nodes = [];
+ this.cursor = -1;
+
+ if (valueLinks && valueLinks.length > 0) {
+ this.push(valueLinks[0], "//");
+ for (var i = 1, l = valueLinks.length; i < l; i+=2) {
+ this.push(valueLinks[i+1], valueLinks[i]);
+ }
+ }
+}
+
+Chain.prototype.push = function(o, link) {
+ if (this.nodes.length > 0 && link) this.nodes.push(new ChainNode(o, link));
+ else this.nodes.push(new ChainNode(o));
+}
+
+Chain.prototype.unshift = function(o, link) {
+ if (this.nodes.length > 0 && link) this.nodes[0].link = link;
+ this.nodes.unshift(new ChainNode(o));
+ this.cursor++;
+}
+
+Chain.prototype.get = function() {
+ if (this.cursor < 0 || this.cursor > this.nodes.length-1) return null;
+ return this.nodes[this.cursor];
+}
+
+Chain.prototype.first = function() {
+ this.cursor = 0;
+ return this.get();
+}
+
+Chain.prototype.last = function() {
+ this.cursor = this.nodes.length-1;
+ return this.get();
+}
+
+Chain.prototype.next = function() {
+ this.cursor++;
+ return this.get();
+}
+
+Chain.prototype.prev = function() {
+ this.cursor--;
+ return this.get();
+}
+
+Chain.prototype.toString = function() {
+ var string = "";
+ for (var i = 0, l = this.nodes.length; i < l; i++) {
+ if (this.nodes[i].link) string += " -("+this.nodes[i].link+")-> ";
+ string += this.nodes[i].value.toString();
+ }
+ return string;
+}
+
+Chain.prototype.joinLeft = function() {
+ var result = "";
+ for (var i = 0, l = this.cursor; i < l; i++) {
+ if (result && this.nodes[i].link) result += this.nodes[i].link;
+ result += this.nodes[i].value.toString();
+ }
+ return result;
+}
+
+
+/* USAGE:
+
+var path = "one/two/three.four/five-six";
+var pathChain = new Chain(path.split(/([\/.-])/));
+print(pathChain);
+
+var lineage = new Chain();
+lineage.push("Port");
+lineage.push("Les", "son");
+lineage.push("Dawn", "daughter");
+lineage.unshift("Purdie", "son");
+
+print(lineage);
+
+// walk left
+for (var node = lineage.last(); node !== null; node = lineage.prev()) {
+ print("< "+node.value);
+}
+
+// walk right
+var node = lineage.first()
+while (node !== null) {
+ print(node.value);
+ node = lineage.next();
+ if (node && node.link) print("had a "+node.link+" named");
+}
+
+*/ \ No newline at end of file
diff --git a/tools/jsdoc-toolkit-2.4.0/app/frame/Dumper.js b/tools/jsdoc-toolkit-2.4.0/app/frame/Dumper.js
new file mode 100644
index 0000000..d8b007b
--- /dev/null
+++ b/tools/jsdoc-toolkit-2.4.0/app/frame/Dumper.js
@@ -0,0 +1,144 @@
+/**
+ * @class
+<pre>
+This is a lightly modified version of Kevin Jones' JavaScript
+library Data.Dump. To download the original visit:
+ <a href="http://openjsan.org/doc/k/ke/kevinj/Data/Dump/">http://openjsan.org/doc/k/ke/kevinj/Data/Dump/</a>
+
+AUTHORS
+
+The Data.Dump JavaScript module is written by Kevin Jones
+(kevinj@cpan.org), based on Data::Dump by Gisle Aas (gisle@aas.no),
+based on Data::Dumper by Gurusamy Sarathy (gsar@umich.edu).
+
+COPYRIGHT
+
+Copyright 2007 Kevin Jones. Copyright 1998-2000,2003-2004 Gisle Aas.
+Copyright 1996-1998 Gurusamy Sarathy.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the Perl Artistic License
+
+See http://www.perl.com/perl/misc/Artistic.html
+</pre>
+ * @static
+ */
+Dumper = {
+ /** @param [...] The objects to dump. */
+ dump: function () {
+ if (arguments.length > 1)
+ return this._dump(arguments);
+ else if (arguments.length == 1)
+ return this._dump(arguments[0]);
+ else
+ return "()";
+ },
+
+ _dump: function (obj) {
+ if (typeof obj == 'undefined') return 'undefined';
+ var out;
+ if (obj.serialize) { return obj.serialize(); }
+ var type = this._typeof(obj);
+ if (obj.circularReference) obj.circularReference++;
+ switch (type) {
+ case 'circular':
+ out = "{ //circularReference\n}";
+ break;
+ case 'object':
+ var pairs = new Array;
+
+ for (var prop in obj) {
+ if (prop != "circularReference" && obj.hasOwnProperty(prop)) { //hide inherited properties
+ pairs.push(prop + ': ' + this._dump(obj[prop]));
+ }
+ }
+
+ out = '{' + this._format_list(pairs) + '}';
+ break;
+
+ case 'string':
+ for (var prop in Dumper.ESC) {
+ if (Dumper.ESC.hasOwnProperty(prop)) {
+ obj = obj.replace(prop, Dumper.ESC[prop]);
+ }
+ }
+
+ // Escape UTF-8 Strings
+ if (obj.match(/^[\x00-\x7f]*$/)) {
+ out = '"' + obj.replace(/\"/g, "\\\"").replace(/([\n\r]+)/g, "\\$1") + '"';
+ }
+ else {
+ out = "unescape('"+escape(obj)+"')";
+ }
+ break;
+
+ case 'array':
+ var elems = new Array;
+
+ for (var i=0; i<obj.length; i++) {
+ elems.push( this._dump(obj[i]) );
+ }
+
+ out = '[' + this._format_list(elems) + ']';
+ break;
+
+ case 'date':
+ // firefox returns GMT strings from toUTCString()...
+ var utc_string = obj.toUTCString().replace(/GMT/,'UTC');
+ out = 'new Date("' + utc_string + '")';
+ break;
+
+ case 'element':
+ // DOM element
+ out = this._dump_dom(obj);
+ break;
+
+ default:
+ out = obj;
+ }
+
+ out = String(out).replace(/\n/g, '\n ');
+ out = out.replace(/\n (.*)$/,"\n$1");
+
+ return out;
+ },
+
+ _format_list: function (list) {
+ if (!list.length) return '';
+ var nl = list.toString().length > 60 ? '\n' : ' ';
+ return nl + list.join(',' + nl) + nl;
+ },
+
+ _typeof: function (obj) {
+ if (obj && obj.circularReference && obj.circularReference > 1) return 'circular';
+ if (Array.prototype.isPrototypeOf(obj)) return 'array';
+ if (Date.prototype.isPrototypeOf(obj)) return 'date';
+ if (typeof obj.nodeType != 'undefined') return 'element';
+ return typeof(obj);
+ },
+
+ _dump_dom: function (obj) {
+ return '"' + Dumper.nodeTypes[obj.nodeType] + '"';
+ }
+};
+
+Dumper.ESC = {
+ "\t": "\\t",
+ "\n": "\\n",
+ "\f": "\\f"
+};
+
+Dumper.nodeTypes = {
+ 1: "ELEMENT_NODE",
+ 2: "ATTRIBUTE_NODE",
+ 3: "TEXT_NODE",
+ 4: "CDATA_SECTION_NODE",
+ 5: "ENTITY_REFERENCE_NODE",
+ 6: "ENTITY_NODE",
+ 7: "PROCESSING_INSTRUCTION_NODE",
+ 8: "COMMENT_NODE",
+ 9: "DOCUMENT_NODE",
+ 10: "DOCUMENT_TYPE_NODE",
+ 11: "DOCUMENT_FRAGMENT_NODE",
+ 12: "NOTATION_NODE"
+}; \ No newline at end of file
diff --git a/tools/jsdoc-toolkit-2.4.0/app/frame/Hash.js b/tools/jsdoc-toolkit-2.4.0/app/frame/Hash.js
new file mode 100644
index 0000000..62cfad6
--- /dev/null
+++ b/tools/jsdoc-toolkit-2.4.0/app/frame/Hash.js
@@ -0,0 +1,84 @@
+/**
+ @constructor
+ @example
+ var _index = new Hash();
+ _index.set("a", "apple");
+ _index.set("b", "blue");
+ _index.set("c", "coffee");
+
+ for (var p = _index.first(); p; p = _index.next()) {
+ print(p.key+" is for "+p.value);
+ }
+
+ */
+var Hash = function() {
+ this._map = {};
+ this._keys = [];
+ this._vals = [];
+ this.reset();
+}
+
+Hash.prototype.set = function(k, v) {
+ if (k != "") {
+ this._keys.push(k);
+ this._map["="+k] = this._vals.length;
+ this._vals.push(v);
+ }
+}
+
+Hash.prototype.replace = function(k, k2, v) {
+ if (k == k2) return;
+
+ var offset = this._map["="+k];
+ this._keys[offset] = k2;
+ if (typeof v != "undefined") this._vals[offset] = v;
+ this._map["="+k2] = offset;
+ delete(this._map["="+k]);
+}
+
+Hash.prototype.drop = function(k) {
+ if (k != "") {
+ var offset = this._map["="+k];
+ this._keys.splice(offset, 1);
+ this._vals.splice(offset, 1);
+ delete(this._map["="+k]);
+ for (var p in this._map) {
+ if (this._map[p] >= offset) this._map[p]--;
+ }
+ if (this._cursor >= offset && this._cursor > 0) this._cursor--;
+ }
+}
+
+Hash.prototype.get = function(k) {
+ if (k != "") {
+ return this._vals[this._map["="+k]];
+ }
+}
+
+Hash.prototype.keys = function() {
+ return this._keys;
+}
+
+Hash.prototype.hasKey = function(k) {
+ if (k != "") {
+ return (typeof this._map["="+k] != "undefined");
+ }
+}
+
+Hash.prototype.values = function() {
+ return this._vals;
+}
+
+Hash.prototype.reset = function() {
+ this._cursor = 0;
+}
+
+Hash.prototype.first = function() {
+ this.reset();
+ return this.next();
+}
+
+Hash.prototype.next = function() {
+ if (this._cursor++ < this._keys.length)
+ return {key: this._keys[this._cursor-1], value: this._vals[this._cursor-1]};
+} \ No newline at end of file
diff --git a/tools/jsdoc-toolkit-2.4.0/app/frame/Link.js b/tools/jsdoc-toolkit-2.4.0/app/frame/Link.js
new file mode 100644
index 0000000..1e6241b
--- /dev/null
+++ b/tools/jsdoc-toolkit-2.4.0/app/frame/Link.js
@@ -0,0 +1,173 @@
+/** Handle the creation of HTML links to documented symbols.
+ @constructor
+*/
+function Link() {
+ this.alias = "";
+ this.src = "";
+ this.file = "";
+ this.text = "";
+ this.innerName = "";
+ this.classLink = false;
+ this.targetName = "";
+
+ this.target = function(targetName) {
+ if (defined(targetName)) this.targetName = targetName;
+ return this;
+ }
+ this.inner = function(inner) {
+ if (defined(inner)) this.innerName = inner;
+ return this;
+ }
+ this.withText = function(text) {
+ if (defined(text)) this.text = text;
+ return this;
+ }
+ this.toSrc = function(filename) {
+ if (defined(filename)) this.src = filename;
+ return this;
+ }
+ this.toSymbol = function(alias) {
+ if (defined(alias)) this.alias = new String(alias);
+ return this;
+ }
+ this.toClass = function(alias) {
+ this.classLink = true;
+ return this.toSymbol(alias);
+ }
+ this.toFile = function(file) {
+ if (defined(file)) this.file = file;
+ return this;
+ }
+
+ this.toString = function() {
+ var linkString;
+ var thisLink = this;
+
+ if (this.alias) {
+ linkString = this.alias.replace(/(^|[^a-z$0-9_#.:^-])([|a-z$0-9_#.:^-]+)($|[^a-z$0-9_#.:^-])/i,
+ function(match, prematch, symbolName, postmatch) {
+ var symbolNames = symbolName.split("|");
+ var links = [];
+ for (var i = 0, l = symbolNames.length; i < l; i++) {
+ thisLink.alias = symbolNames[i];
+ links.push(thisLink._makeSymbolLink(symbolNames[i]));
+ }
+ return prematch+links.join("|")+postmatch;
+ }
+ );
+ }
+ else if (this.src) {
+ linkString = thisLink._makeSrcLink(this.src);
+ }
+ else if (this.file) {
+ linkString = thisLink._makeFileLink(this.file);
+ }
+
+ return linkString;
+ }
+}
+
+/** prefixed for hashes */
+Link.hashPrefix = "";
+
+/** Appended to the front of relative link paths. */
+Link.base = "";
+
+Link.symbolNameToLinkName = function(symbol) {
+ var linker = "",
+ ns = "";
+
+ if (symbol.isStatic) linker = ".";
+ else if (symbol.isInner) linker = "-";
+
+ if (symbol.isEvent && !/^event:/.test(symbol.name)) {
+ ns = "event:";
+ }
+ return Link.hashPrefix+linker+ns+symbol.name;
+}
+
+Link.getSymbol= function(alias) {
+ var symbol= Link.symbolSet.getSymbol(alias);
+
+ if (symbol)
+ return symbol;
+
+ if ('#'!==alias.charAt(0) || !Link.currentSymbol)
+ return null;
+
+ // resolve relative name
+ var container= Link.currentSymbol;
+
+ while (container)
+ {
+ symbol= Link.symbolSet.getSymbol(container.alias + alias);
+ if (symbol)
+ return symbol;
+
+ // No superclass
+ if (!container.augments.length)
+ return null;
+
+ container= Link.symbolSet.getSymbol(container.augments[0].desc);
+ }
+
+ return null;
+}
+
+/** Create a link to another symbol. */
+Link.prototype._makeSymbolLink = function(alias) {
+ var linkBase = Link.base+publish.conf.symbolsDir;
+ var linkTo = Link.getSymbol(alias);
+ var linkPath;
+ var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
+
+ // if there is no symbol by that name just return the name unaltered
+ if (!linkTo)
+ return this.text || alias;
+
+ // it's a symbol in another file
+ else {
+ if (!linkTo.is("CONSTRUCTOR") && !linkTo.isNamespace) { // it's a method or property
+ linkPath= (Link.filemap) ? Link.filemap[linkTo.memberOf] :
+ escape(linkTo.memberOf) || "_global_";
+ linkPath += publish.conf.ext + "#" + Link.symbolNameToLinkName(linkTo);
+ }
+ else {
+ linkPath = (Link.filemap)? Link.filemap[linkTo.alias] : escape(linkTo.alias);
+ linkPath += publish.conf.ext;// + (this.classLink? "":"#" + Link.hashPrefix + "constructor");
+ }
+ linkPath = linkBase + linkPath
+ }
+
+ var linkText= this.text || alias;
+
+ var link = {linkPath: linkPath, linkText: linkText, linkInner: (this.innerName? "#"+this.innerName : "")};
+
+ if (typeof JSDOC.PluginManager != "undefined") {
+ JSDOC.PluginManager.run("onSymbolLink", link);
+ }
+
+ return "<a href=\""+link.linkPath+link.linkInner+"\""+target+">"+link.linkText+"</a>";
+}
+
+/** Create a link to a source file. */
+Link.prototype._makeSrcLink = function(srcFilePath) {
+ var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
+
+ // transform filepath into a filename
+ var srcFile = srcFilePath.replace(/\.\.?[\\\/]/g, "").replace(/[:\\\/]/g, "_");
+ var outFilePath = Link.base + publish.conf.srcDir + srcFile + publish.conf.ext;
+
+ if (!this.text) this.text = FilePath.fileName(srcFilePath);
+ return "<a href=\""+outFilePath+"\""+target+">"+this.text+"</a>";
+}
+
+/** Create a link to a source file. */
+Link.prototype._makeFileLink = function(filePath) {
+ var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
+
+ var outFilePath = Link.base + filePath;
+
+ if (!this.text) this.text = filePath;
+ return "<a href=\""+outFilePath+"\""+target+">"+this.text+"</a>";
+} \ No newline at end of file
diff --git a/tools/jsdoc-toolkit-2.4.0/app/frame/Namespace.js b/tools/jsdoc-toolkit-2.4.0/app/frame/Namespace.js
new file mode 100644
index 0000000..fa1e41d
--- /dev/null
+++ b/tools/jsdoc-toolkit-2.4.0/app/frame/Namespace.js
@@ -0,0 +1,10 @@
+_global_ = this;
+
+function Namespace(name, f) {
+ var n = name.split(".");
+ for (var o = _global_, i = 0, l = n.length; i < l; i++) {
+ o = o[n[i]] = o[n[i]] || {};
+ }
+
+ if (f) f();
+} \ No newline at end of file
diff --git a/tools/jsdoc-toolkit-2.4.0/app/frame/Opt.js b/tools/jsdoc-toolkit-2.4.0/app/frame/Opt.js
new file mode 100644
index 0000000..352f159
--- /dev/null
+++ b/tools/jsdoc-toolkit-2.4.0/app/frame/Opt.js
@@ -0,0 +1,134 @@
+/** @namespace */
+Opt = {
+ /**
+ * Get commandline option values.
+ * @param {Array} args Commandline arguments. Like ["-a=xml", "-b", "--class=new", "--debug"]
+ * @param {object} optNames Map short names to long names. Like {a:"accept", b:"backtrace", c:"class", d:"debug"}.
+ * @return {object} Short names and values. Like {a:"xml", b:true, c:"new", d:true}
+ */
+ get: function(args, optNames) {
+ var opt = {"_": []}; // the unnamed option allows multiple values
+ for (var i = 0; i < args.length; i++) {
+ var arg = new String(args[i]);
+ var name;
+ var value;
+ if (arg.charAt(0) == "-") {
+ if (arg.charAt(1) == "-") { // it's a longname like --foo
+ arg = arg.substring(2);
+ var m = arg.split("=");
+ name = m.shift();
+ value = m.shift();
+ if (typeof value == "undefined") value = true;
+
+ for (var n in optNames) { // convert it to a shortname
+ if (name == optNames[n]) {
+ name = n;
+ }
+ }
+ }
+ else { // it's a shortname like -f
+ arg = arg.substring(1);
+ var m = arg.split("=");
+ name = m.shift();
+ value = m.shift();
+ if (typeof value == "undefined") value = true;
+
+ for (var n in optNames) { // find the matching key
+ if (name == n || name+'[]' == n) {
+ name = n;
+ break;
+ }
+ }
+ }
+ if (name.match(/(.+)\[\]$/)) { // it's an array type like n[]
+ name = RegExp.$1;
+ if (!opt[name]) opt[name] = [];
+ }
+
+ if (opt[name] && opt[name].push) {
+ opt[name].push(value);
+ }
+ else {
+ opt[name] = value;
+ }
+ }
+ else { // not associated with any optname
+ opt._.push(args[i]);
+ }
+ }
+ return opt;
+ }
+}
+
+/*t:
+ plan(11, "Testing Opt.");
+
+ is(
+ typeof Opt,
+ "object",
+ "Opt is an object."
+ );
+
+ is(
+ typeof Opt.get,
+ "function",
+ "Opt.get is a function."
+ );
+
+ var optNames = {a:"accept", b:"backtrace", c:"class", d:"debug", "e[]":"exceptions"};
+ var t_options = Opt.get(["-a=xml", "-b", "--class=new", "--debug", "-e=one", "-e=two", "foo", "bar"], optNames);
+
+ is(
+ t_options.a,
+ "xml",
+ "an option defined with a short name can be accessed by its short name."
+ );
+
+ is(
+ t_options.b,
+ true,
+ "an option defined with a short name and no value are true."
+ );
+
+ is(
+ t_options.c,
+ "new",
+ "an option defined with a long name can be accessed by its short name."
+ );
+
+ is(
+ t_options.d,
+ true,
+ "an option defined with a long name and no value are true."
+ );
+
+ is(
+ typeof t_options.e,
+ "object",
+ "an option that can accept multiple values is defined."
+ );
+
+ is(
+ t_options.e.length,
+ 2,
+ "an option that can accept multiple values can have more than one value."
+ );
+
+ is(
+ t_options.e[1],
+ "two",
+ "an option that can accept multiple values can be accessed as an array."
+ );
+
+ is(
+ typeof t_options._,
+ "object",
+ "the property '_' is defined for unnamed options."
+ );
+
+ is(
+ t_options._[0],
+ "foo",
+ "the property '_' can be accessed as an array."
+ );
+ */ \ No newline at end of file
diff --git a/tools/jsdoc-toolkit-2.4.0/app/frame/Reflection.js b/tools/jsdoc-toolkit-2.4.0/app/frame/Reflection.js
new file mode 100644
index 0000000..0968f1c
--- /dev/null
+++ b/tools/jsdoc-toolkit-2.4.0/app/frame/Reflection.js
@@ -0,0 +1,26 @@
+/**@constructor*/
+function Reflection(obj) {
+ this.obj = obj;
+}
+
+Reflection.prototype.getConstructorName = function() {
+ if (this.obj.constructor.name) return this.obj.constructor.name;
+ var src = this.obj.constructor.toSource();
+ var name = src.substring(name.indexOf("function")+8, src.indexOf('(')).replace(/ /g,'');
+ return name;
+}
+
+Reflection.prototype.getMethod = function(name) {
+ for (var p in this.obj) {
+ if (p == name && typeof(this.obj[p]) == "function") return this.obj[p];
+ }
+ return null;
+}
+
+Reflection.prototype.getParameterNames = function() {
+ var src = this.obj.toSource();
+ src = src.substring(
+ src.indexOf("(", 8)+1, src.indexOf(")")
+ );
+ return src.split(/, ?/);
+}
diff --git a/tools/jsdoc-toolkit-2.4.0/app/frame/String.js b/tools/jsdoc-toolkit-2.4.0/app/frame/String.js
new file mode 100644
index 0000000..c183c27
--- /dev/null
+++ b/tools/jsdoc-toolkit-2.4.0/app/frame/String.js
@@ -0,0 +1,93 @@
+/**
+ @name String
+ @class Additions to the core string object.
+*/
+
+/** @author Steven Levithan, released as public domain. */
+String.prototype.trim = function() {
+ var str = this.replace(/^\s+/, '');
+ for (var i = str.length - 1; i >= 0; i--) {
+ if (/\S/.test(str.charAt(i))) {
+ str = str.substring(0, i + 1);
+ break;
+ }
+ }
+ return str;
+}
+/*t:
+ plan(6, "Testing String.prototype.trim.");
+
+ var s = " a bc ".trim();
+ is(s, "a bc", "multiple spaces front and back are trimmed.");
+
+ s = "a bc\n\n".trim();
+ is(s, "a bc", "newlines only in back are trimmed.");
+
+ s = "\ta bc".trim();
+ is(s, "a bc", "tabs only in front are trimmed.");
+
+ s = "\n \t".trim();
+ is(s, "", "an all-space string is trimmed to empty.");
+
+ s = "a b\nc".trim();
+ is(s, "a b\nc", "a string with no spaces in front or back is trimmed to itself.");
+
+ s = "".trim();
+ is(s, "", "an empty string is trimmed to empty.");
+
+*/
+
+String.prototype.balance = function(open, close) {
+ var i = 0;
+ while (this.charAt(i) != open) {
+ if (i == this.length) return [-1, -1];
+ i++;
+ }
+
+ var j = i+1;
+ var balance = 1;
+ while (j < this.length) {
+ if (this.charAt(j) == open) balance++;
+ if (this.charAt(j) == close) balance--;
+ if (balance == 0) break;
+ j++;
+ if (j == this.length) return [-1, -1];
+ }
+
+ return [i, j];
+}
+/*t:
+ plan(16, "Testing String.prototype.balance.");
+
+ var s = "{abc}".balance("{","}");
+ is(s[0], 0, "opener in first is found.");
+ is(s[1], 4, "closer in last is found.");
+
+ s = "ab{c}de".balance("{","}");
+ is(s[0], 2, "opener in middle is found.");
+ is(s[1], 4, "closer in middle is found.");
+
+ s = "a{b{c}de}f".balance("{","}");
+ is(s[0], 1, "nested opener is found.");
+ is(s[1], 8, "nested closer is found.");
+
+ s = "{}".balance("{","}");
+ is(s[0], 0, "opener with no content is found.");
+ is(s[1], 1, "closer with no content is found.");
+
+ s = "".balance("{","}");
+ is(s[0], -1, "empty string opener is -1.");
+ is(s[1], -1, "empty string closer is -1.");
+
+ s = "{abc".balance("{","}");
+ is(s[0], -1, "opener with no closer returns -1.");
+ is(s[1], -1, "no closer returns -1.");
+
+ s = "abc".balance("{","}");
+ is(s[0], -1, "no opener or closer returns -1 for opener.");
+ is(s[1], -1, "no opener or closer returns -1 for closer.");
+
+ s = "a<bc}de".balance("<","}");
+ is(s[0], 1, "unmatching opener is found.");
+ is(s[1], 4, "unmatching closer is found.");
+*/ \ No newline at end of file
diff --git a/tools/jsdoc-toolkit-2.4.0/app/frame/Testrun.js b/tools/jsdoc-toolkit-2.4.0/app/frame/Testrun.js
new file mode 100644
index 0000000..a33bb41
--- /dev/null
+++ b/tools/jsdoc-toolkit-2.4.0/app/frame/Testrun.js
@@ -0,0 +1,129 @@
+/**
+ * @fileOverview
+ * @name JsTestrun
+ * @author Michael Mathews micmath@gmail.com
+ * @url $HeadURL: https://jsdoc-toolkit.googlecode.com/svn/tags/jsdoc_toolkit-2.4.0/jsdoc-toolkit/app/frame/Testrun.js $
+ * @revision $Id: Testrun.js 418 2008-01-15 21:40:33Z micmath $
+ * @license <a href="http://en.wikipedia.org/wiki/MIT_License">X11/MIT License</a>
+ * (See the accompanying README file for full details.)
+ */
+
+/**
+ Yet another unit testing tool for JavaScript.
+ @author Michael Mathews <a href="mailto:micmath@gmail.com">micmath@gmail.com</a>
+ @param {object} testCases Properties are testcase names, values are functions to execute as tests.
+*/
+function testrun(testCases) {
+ var ran = 0;
+ for (t in testCases) {
+ var result = testCases[t]();
+ ran++;
+ }
+
+ return testrun.reportOut+"-------------------------------\n"+((testrun.fails>0)? ":( Failed "+testrun.fails+"/" : ":) Passed all ")+testrun.count+" test"+((testrun.count == 1)? "":"s")+".\n";
+}
+
+
+testrun.count = 0;
+testrun.current = null;
+testrun.passes = 0;
+testrun.fails = 0;
+testrun.reportOut = "";
+
+/** @private */
+testrun.report = function(text) {
+ testrun.reportOut += text+"\n";
+}
+
+/**
+ Check if test evaluates to true.
+ @param {string} test To be evaluated.
+ @param {string} message Optional. To be displayed in the report.
+ @return {boolean} True if the string test evaluates to true.
+*/
+ok = function(test, message) {
+ testrun.count++;
+
+ var result;
+ try {
+ result = eval(test);
+
+ if (result) {
+ testrun.passes++;
+ testrun.report(" OK "+testrun.count+" - "+((message != null)? message : ""));
+ }
+ else {
+ testrun.fails++;
+ testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
+ }
+ }
+ catch(e) {
+ testrun.fails++
+ testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
+
+ }
+}
+
+/**
+ Check if test is same as expected.
+ @param {string} test To be evaluated.
+ @param {string} expected
+ @param {string} message Optional. To be displayed in the report.
+ @return {boolean} True if (test == expected). Note that the comparison is not a strict equality check.
+*/
+is = function(test, expected, message) {
+ testrun.count++;
+
+ var result;
+ try {
+ result = eval(test);
+
+ if (result == expected) {
+ testrun.passes++
+ testrun.report(" OK "+testrun.count+" - "+((message != null)? message : ""));
+ }
+ else {
+ testrun.fails++
+ testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
+ testrun.report("expected: "+expected);
+ testrun.report(" got: "+result);
+ }
+ }
+ catch(e) {
+ testrun.fails++
+ testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
+ testrun.report("expected: "+expected);
+ testrun.report(" got: "+result);}
+}
+
+/**
+ Check if test matches pattern.
+ @param {string} test To be evaluated.
+ @param {string} pattern Used to create a RegExp.
+ @param {string} message Optional. To be displayed in the report.
+ @return {boolean} True if test matches pattern.
+*/
+like = function(test, pattern, message) {
+ testrun.count++;
+
+ var result;
+ try {
+ result = eval(test);
+ var rgx = new RegExp(pattern);
+
+ if (rgx.test(result)) {
+ testrun.passes++
+ testrun.report(" OK "+testrun.count+" - "+((message != null)? message : ""));
+ }
+ else {
+ testrun.fails++
+ testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
+ testrun.report(" this: "+result);
+ testrun.report("is not like: "+pattern);
+ }
+ }
+ catch(e) {
+ testrun.fails++
+ testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
+ }
+} \ No newline at end of file