diff --git a/bin/generateJsDoc.sh b/bin/generateJsDoc.sh index aa62a0d5b..397a54d68 100755 --- a/bin/generateJsDoc.sh +++ b/bin/generateJsDoc.sh @@ -1,20 +1,17 @@ -#!/bin/sh -if [ ! -x /usr/bin/java ]; then - echo "You need to install Java to generate the JSDocs!" - exit 1 -fi +#!/bin/bash if [ -d "../bin" ]; then cd "../" fi -cd "doc/jsdoc-toolkit" +type -P node &>/dev/null || { + echo "You need to install node!" >&2 + exit 1 +} -JSRUN="jsrun.jar" -RUNJS="app/run.js" -OUTPUT_DIR="../jsdoc" -NODE_DIR="../../node" -TEMPLATE_DIR="templates/jsdoc" +type -P doc.md &>/dev/null || { + echo "You need to install doc.md! npm install -g doc.md" >&2 + exit 1 +} -java -jar $JSRUN $RUNJS -v -d=$OUTPUT_DIR -t=$TEMPLATE_DIR $NODE_DIR && -echo "Look on http://code.google.com/p/jsdoc-toolkit/wiki/InlineDocs to get Tipps for better documentation" +doc.md node doc/jsdoc diff --git a/doc/jsdoc-toolkit/README.txt b/doc/jsdoc-toolkit/README.txt deleted file mode 100644 index 3782da88d..000000000 --- a/doc/jsdoc-toolkit/README.txt +++ /dev/null @@ -1,183 +0,0 @@ -====================================================================== - -DESCRIPTION: - -This is the source code for JsDoc Toolkit, an automatic documentation -generation tool for JavaScript. It is written in JavaScript and is run -from a command line (or terminal) using Java and Mozilla's Rhino -JavaScript runtime engine. - -Using this tool you can automatically turn JavaDoc-like comments in -your JavaScript source code into published output files, such as HTML -or XML. - -For more information, to report a bug, or to browse the technical -documentation for this tool please visit the official JsDoc Toolkit -project homepage at http://code.google.com/p/jsdoc-toolkit/ - -For the most up-to-date documentation on JsDoc Toolkit see the -official wiki at http://code.google.com/p/jsdoc-toolkit/w/list - -====================================================================== - -REQUIREMENTS: - -JsDoc Toolkit is known to work with: -java version "1.6.0_03" -Java(TM) SE Runtime Environment (build 1.6.0_03-b05) -on Windows XP, -and java version "1.5.0_19" -Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_19-b02-304) -on Mac OS X 10.5. - -Other versions of java may or may not work with JsDoc Toolkit. - -====================================================================== - -USAGE: - -Running JsDoc Toolkit requires you to have Java installed on your -computer. For more information see http://www.java.com/getjava/ - -Before running the JsDoc Toolkit app you should change your current -working directory to the jsdoc-toolkit folder. Then follow the -examples below, or as shown on the project wiki. - -On a computer running Windows a valid command line to run JsDoc -Toolkit might look like this: - -> java -jar jsrun.jar app\run.js -a -t=templates\jsdoc mycode.js - -On Mac OS X or Linux the same command would look like this: - -$ java -jar jsrun.jar app/run.js -a -t=templates/jsdoc mycode.js - -The above assumes your current working directory contains jsrun.jar, -the "app" and "templates" subdirectories from the standard JsDoc -Toolkit distribution and that the relative path to the code you wish -to document is "mycode.js". - -The output documentation files will be saved to a new directory named -"out" (by default) in the current directory, or if you specify a --d=somewhere_else option, to the somewhere_else directory. - -For help (usage notes) enter this on the command line: - -$ java -jar jsrun.jar app/run.js --help - -More information about the various command line options used by JsDoc -Toolkit are available on the project wiki. - -====================================================================== - -RUNNING VIA SHELL SCRIPT - -Avi Deitcher has contributed the file jsrun.sh with the following usage notes: - -A script to simplify running jsdoc from the command-line, especially when -running from within a development or build environment such as ant. - -Normally, to run jsdoc, you need a command-line as the following: -java -Djsdoc.dir=/some/long/dir/path/to/jsdoc -jar -/some/long/dir/path/to/jsdoc/jsrun.jar /some/long/dir/path/to/jsdoc/app/run.js --t=template -r=4 /some/long/dir/path/to/my/src/code - -This can get tedious to redo time and again, and difficult to use from within a build environment. - -To simplify the process, jsrun.sh will automatically run this path, as well as passing through any arguments. - -Usage: jsrun.sh - -All will be passed through. -Additionally, jsrun.sh will take the following actions: -1) If the environment variable JSDOCDIR is set, it will add -"-Djsdoc.dir=$JSDOCDIR" to the command-line -2) If the environment variable JSDOCTEMPLATEDIR is set, it will add -"-Djsdoc.template.dir=$JSDOCTEMPLATEDIR" to the command-line -3) java with the appropriate path to jsrun.jar and run.js will be instantiated - -If not variables are set, it is assumed that the path to jsrun.jar and app/ is in the current working directory. - -Example: -# jsrun.sh ./src/ -Assuming JSDOCDIR=/some/path/to/my/jsdoc will cause the following command to -execute: -java -Djsdoc.dir=/some/path/to/my/jsdoc -jar /some/path/to/my/jsdoc/jsrun.jar -/some/path/to/my/jsdoc/app/run.js ./src/ - -====================================================================== - -TESTING: - -To run the suite of unit tests included with JsDoc Toolkit enter this -on the command line: - -$ java -jar jsrun.jar app/run.js -T - -To see a dump of the internal data structure that JsDoc Toolkit has -built from your source files use this command: - -$ java -jar jsrun.jar app/run.js mycode.js -Z - -====================================================================== - -LICENSE: - -JSDoc.pm - -This project is based on the JSDoc.pm tool, created by Michael -Mathews and Gabriel Reid. More information on JsDoc.pm can -be found on the JSDoc.pm homepage: http://jsdoc.sourceforge.net/ - -Complete documentation on JsDoc Toolkit can be found on the project -wiki at http://code.google.com/p/jsdoc-toolkit/w/list - -Rhino - -Rhino (JavaScript in Java) is open source and licensed by Mozilla -under the MPL 1.1 or later/GPL 2.0 or later licenses, the text of -which is available at http://www.mozilla.org/MPL/ - -You can obtain the source code for Rhino from the Mozilla web site at -http://www.mozilla.org/rhino/download.html - -JsDoc Toolkit is a larger work that uses the Rhino JavaScript engine -but is not derived from it in any way. The Rhino library is used -without modification and without any claims whatsoever. - -The Rhino Debugger - -You can obtain more information about the Rhino Debugger from the -Mozilla web site at http://www.mozilla.org/rhino/debugger.html - -JsDoc Toolkit is a larger work that uses the Rhino Debugger but -is not derived from it in any way. The Rhino Debugger is used -without modification and without any claims whatsoever. - -JsDoc Toolkit - -All code specific to JsDoc Toolkit are free, open source and licensed -for use under the X11/MIT License. - -JsDoc Toolkit is Copyright (c)2009 Michael Mathews - -This program is free software; you can redistribute it and/or -modify it under the terms below. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: The above copyright notice and this -permission notice must be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/doc/jsdoc-toolkit/app/frame.js b/doc/jsdoc-toolkit/app/frame.js deleted file mode 100644 index 1beb40559..000000000 --- a/doc/jsdoc-toolkit/app/frame.js +++ /dev/null @@ -1,33 +0,0 @@ -IO.include("frame/Opt.js"); -IO.include("frame/Chain.js"); -IO.include("frame/Link.js"); -IO.include("frame/String.js"); -IO.include("frame/Hash.js"); -IO.include("frame/Namespace.js"); -//IO.include("frame/Reflection.js"); - -/** A few helper functions to make life a little easier. */ - -function defined(o) { - return (o !== undefined); -} - -function copy(o) { // todo check for circular refs - if (o == null || typeof(o) != 'object') return o; - var c = new o.constructor(); - for(var p in o) c[p] = copy(o[p]); - return c; -} - -function isUnique(arr) { - var l = arr.length; - for(var i = 0; i < l; i++ ) { - if (arr.lastIndexOf(arr[i]) > i) return false; - } - return true; -} - -/** Returns the given string with all regex meta characters backslashed. */ -RegExp.escapeMeta = function(str) { - return str.replace(/([$^\\\/()|?+*\[\]{}.-])/g, "\\$1"); -} diff --git a/doc/jsdoc-toolkit/app/frame/Chain.js b/doc/jsdoc-toolkit/app/frame/Chain.js deleted file mode 100644 index 506469d18..000000000 --- a/doc/jsdoc-toolkit/app/frame/Chain.js +++ /dev/null @@ -1,102 +0,0 @@ -/**@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/doc/jsdoc-toolkit/app/frame/Dumper.js b/doc/jsdoc-toolkit/app/frame/Dumper.js deleted file mode 100644 index d8b007b1d..000000000 --- a/doc/jsdoc-toolkit/app/frame/Dumper.js +++ /dev/null @@ -1,144 +0,0 @@ -/** - * @class -
-This is a lightly modified version of Kevin Jones' JavaScript
-library Data.Dump. To download the original visit:
-    http://openjsan.org/doc/k/ke/kevinj/Data/Dump/
-
-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
-
- * @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 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/doc/jsdoc-toolkit/app/frame/Hash.js b/doc/jsdoc-toolkit/app/frame/Hash.js deleted file mode 100644 index 62cfad646..000000000 --- a/doc/jsdoc-toolkit/app/frame/Hash.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - @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/doc/jsdoc-toolkit/app/frame/Link.js b/doc/jsdoc-toolkit/app/frame/Link.js deleted file mode 100644 index ef5dc0a4d..000000000 --- a/doc/jsdoc-toolkit/app/frame/Link.js +++ /dev/null @@ -1,153 +0,0 @@ -/** 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 = ""; - if (symbol.isStatic) linker = "."; - else if (symbol.isInner) linker = "-"; - - return Link.hashPrefix+linker+symbol.name; -} - -/** Create a link to another symbol. */ -Link.prototype._makeSymbolLink = function(alias) { - var linkBase = Link.base+publish.conf.symbolsDir; - var linkTo = Link.symbolSet.getSymbol(alias); - var linkPath; - var target = (this.targetName)? " target=\""+this.targetName+"\"" : ""; - - // is it an internal link? - if (alias.charAt(0) == "#") var linkPath = alias; - - // if there is no symbol by that name just return the name unaltered - else 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 - if (linkTo.isEvent) { - linkPath = - (Link.filemap)? Link.filemap[linkTo.memberOf] - : - escape(linkTo.memberOf) || "_global_"; - linkPath += publish.conf.ext + "#event:" + Link.symbolNameToLinkName(linkTo); - } - else { - 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 ""+link.linkText+""; -} - -/** 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 ""+this.text+""; -} - -/** 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 ""+this.text+""; -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/frame/Namespace.js b/doc/jsdoc-toolkit/app/frame/Namespace.js deleted file mode 100644 index fa1e41d10..000000000 --- a/doc/jsdoc-toolkit/app/frame/Namespace.js +++ /dev/null @@ -1,10 +0,0 @@ -_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/doc/jsdoc-toolkit/app/frame/Opt.js b/doc/jsdoc-toolkit/app/frame/Opt.js deleted file mode 100644 index 352f15903..000000000 --- a/doc/jsdoc-toolkit/app/frame/Opt.js +++ /dev/null @@ -1,134 +0,0 @@ -/** @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/doc/jsdoc-toolkit/app/frame/Reflection.js b/doc/jsdoc-toolkit/app/frame/Reflection.js deleted file mode 100644 index 0968f1c64..000000000 --- a/doc/jsdoc-toolkit/app/frame/Reflection.js +++ /dev/null @@ -1,26 +0,0 @@ -/**@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/doc/jsdoc-toolkit/app/frame/String.js b/doc/jsdoc-toolkit/app/frame/String.js deleted file mode 100644 index c183c27d5..000000000 --- a/doc/jsdoc-toolkit/app/frame/String.js +++ /dev/null @@ -1,93 +0,0 @@ -/** - @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 = "aX11/MIT License - * (See the accompanying README file for full details.) - */ - -/** - Yet another unit testing tool for JavaScript. - @author Michael Mathews micmath@gmail.com - @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 diff --git a/doc/jsdoc-toolkit/app/handlers/FOODOC.js b/doc/jsdoc-toolkit/app/handlers/FOODOC.js deleted file mode 100644 index b208f55b1..000000000 --- a/doc/jsdoc-toolkit/app/handlers/FOODOC.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - This is the main container for the FOODOC handler. - @namespace -*/ -FOODOC = { -}; - -/** The current version string of this application. */ -FOODOC.VERSION = "1.0"; - -FOODOC.handle = function(srcFile, src) { - LOG.inform("Handling file '" + srcFile + "'"); - - return [ - new JSDOC.Symbol( - "foo", - [], - "VIRTUAL", - new JSDOC.DocComment("/** This is a foo. */") - ) - ]; -}; - -FOODOC.publish = function(symbolgroup) { - LOG.inform("Publishing symbolgroup."); -}; diff --git a/doc/jsdoc-toolkit/app/handlers/XMLDOC.js b/doc/jsdoc-toolkit/app/handlers/XMLDOC.js deleted file mode 100755 index 40f87b355..000000000 --- a/doc/jsdoc-toolkit/app/handlers/XMLDOC.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This is the main container for the XMLDOC handler. - * @namespace - * @author Brett Fattori (bfattori@fry.com) - * @version $Revision: 498 $ - */ -XMLDOC = { - -}; - -/** The current version string of this application. */ -XMLDOC.VERSION = "1.0"; - -/** Include the library necessary to handle XML files */ -IO.includeDir("handlers/XMLDOC/"); - -/** - * @type Symbol[] - */ -XMLDOC.handle = function(srcFile, src) { - -}; - -XMLDOC.publish = function(symbolgroup) { - -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js b/doc/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js deleted file mode 100755 index 240563daf..000000000 --- a/doc/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js +++ /dev/null @@ -1,159 +0,0 @@ -LOG.inform("XMLDOC.DomReader loaded"); - -XMLDOC.DomReader = function(root) { - - this.dom = root; - - /** - * The current node the reader is on - */ - this.node = root; - - /** - * Get the current node the reader is on - * @type XMLDOC.Parser.node - */ - XMLDOC.DomReader.prototype.getNode = function() { - return this.node; - }; - - /** - * Set the node the reader should be positioned on. - * @param node {XMLDOC.Parser.node} - */ - XMLDOC.DomReader.prototype.setNode = function(node) { - this.node = node; - }; - - /** - * A helper method to make sure the current node will - * never return null, unless null is passed as the root. - * @param step {String} An expression to evaluate - should return a node or null - */ - XMLDOC.DomReader.prototype.navigate = function(step) { - var n; - if ((n = step) != null) - { - this.node = n; - return this.node; - } - return null; - }; - - /** - * Get the root node of the current node's document. - */ - XMLDOC.DomReader.prototype.root = function() { - this.navigate(this.dom); - }; - - /** - * Get the parent of the current node. - */ - XMLDOC.DomReader.prototype.parent = function() { - return this.navigate(this.node.parentNode()); - }; - - /** - * Get the first child of the current node. - */ - XMLDOC.DomReader.prototype.firstChild = function() { - return this.navigate(this.node.firstChild()); - }; - - /** - * Get the last child of the current node. - */ - XMLDOC.DomReader.prototype.lastChild = function() { - return this.navigate(this.node.lastChild()); - }; - - /** - * Get the next sibling of the current node. - */ - XMLDOC.DomReader.prototype.nextSibling = function() { - return this.navigate(this.node.nextSibling()); - }; - - /** - * Get the previous sibling of the current node. - */ - XMLDOC.DomReader.prototype.prevSibling = function() { - return this.navigate(this.node.prevSibling()); - }; - - //=============================================================================================== - // Support methods - - /** - * Walk the tree starting with the current node, calling the plug-in for - * each node visited. Each time the plug-in is called, the DomReader - * is passed as the only parameter. Use the {@link XMLDOC.DomReader#getNode} method - * to access the current node. This method uses a depth first traversal pattern. - * - * @param srcFile {String} The source file being evaluated - */ - XMLDOC.DomReader.prototype.getSymbols = function(srcFile) - { - XMLDOC.DomReader.symbols = []; - XMLDOC.DomReader.currentFile = srcFile; - JSDOC.Symbol.srcFile = (srcFile || ""); - - if (defined(JSDOC.PluginManager)) { - JSDOC.PluginManager.run("onDomGetSymbols", this); - } - - return XMLDOC.DomReader.symbols; - }; - - /** - * Find the node with the given name using a depth first traversal. - * Does not modify the DomReader's current node. - * - * @param name {String} The name of the node to find - * @return the node that was found, or null if not found - */ - XMLDOC.DomReader.prototype.findNode = function(name) - { - var findNode = null; - - // Start at the current node and move into the subtree, - // looking for the node with the given name - function deeper(node, find) - { - var look = null; - - if (node) { - if (node.name == find) - { - return node; - } - - if (node.firstChild()) - { - look = deeper(node.firstChild(), find); - } - - if (!look && node.nextSibling()) - { - look = deeper(node.nextSibling(), find); - } - } - - return look; - } - - return deeper(this.getNode().firstChild(), name); - }; - - /** - * Find the next node with the given name using a depth first traversal. - * - * @param name {String} The name of the node to find - */ - XMLDOC.DomReader.prototype.findPreviousNode = function(name) - { - }; - -}; - diff --git a/doc/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js b/doc/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js deleted file mode 100755 index e9b3e3ce8..000000000 --- a/doc/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js +++ /dev/null @@ -1,16 +0,0 @@ -LOG.inform("XMLDOC.symbolize loaded"); - -/** - * Convert the source file to a set of symbols - */ -XMLDOC.symbolize = function(srcFile, src) { - - LOG.inform("Symbolizing file '" + srcFile + "'"); - - // XML files already have a defined structure, so we don't need to - // do anything but parse them. The DOM reader can create a symbol - // table from the parsed XML. - var dr = new XMLDOC.DomReader(XMLDOC.Parser.parse(src)); - return dr.getSymbols(srcFile); - -}; diff --git a/doc/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js b/doc/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js deleted file mode 100755 index 78e8f4556..000000000 --- a/doc/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js +++ /dev/null @@ -1,292 +0,0 @@ -LOG.inform("XMLDOC.Parser loaded"); - -/** - * XML Parser object. Returns an {@link #XMLDOC.Parser.node} which is - * the root element of the parsed document. - *

- * By default, this parser will only handle well formed XML. To - * allow the parser to handle HTML, set the XMLDOC.Parser.strictMode - * variable to false before calling XMLDOC.Parser.parse(). - *

- * Note: If you pass poorly formed XML, it will cause the parser to throw - * an exception. - * - * @author Brett Fattori (bfattori@fry.com) - * @author $Author: micmath $ - * @version $Revision: 497 $ - */ -XMLDOC.Parser = {}; - -/** - * Strict mode setting. Setting this to false allows HTML-style source to - * be parsed. Normally, well formed XML has defined end tags, or empty tags - * are properly formed. Default: true - * @type Boolean - */ -XMLDOC.Parser.strictMode = true; - -/** - * A node in an XML Document. Node types are ROOT, ELEMENT, COMMENT, PI, and TEXT. - * @param parent {XMLDOC.Parser.node} The parent node - * @param name {String} The node name - * @param type {String} One of the types - */ -XMLDOC.Parser.node = function(parent, name, type) -{ - this.name = name; - this.type = type || "ELEMENT"; - this.parent = parent; - this.charData = ""; - this.attrs = {}; - this.nodes = []; - this.cPtr = 0; - - XMLDOC.Parser.node.prototype.getAttributeNames = function() { - var a = []; - for (var o in this.attrs) - { - a.push(o); - } - - return a; - }; - - XMLDOC.Parser.node.prototype.getAttribute = function(attr) { - return this.attrs[attr]; - }; - - XMLDOC.Parser.node.prototype.setAttribute = function(attr, val) { - this.attrs[attr] = val; - }; - - XMLDOC.Parser.node.prototype.getChild = function(idx) { - return this.nodes[idx]; - }; - - XMLDOC.Parser.node.prototype.parentNode = function() { - return this.parent; - }; - - XMLDOC.Parser.node.prototype.firstChild = function() { - return this.nodes[0]; - }; - - XMLDOC.Parser.node.prototype.lastChild = function() { - return this.nodes[this.nodes.length - 1]; - }; - - XMLDOC.Parser.node.prototype.nextSibling = function() { - var p = this.parent; - if (p && (p.nodes.indexOf(this) + 1 != p.nodes.length)) - { - return p.getChild(p.nodes.indexOf(this) + 1); - } - return null; - }; - - XMLDOC.Parser.node.prototype.prevSibling = function() { - var p = this.parent; - if (p && (p.nodes.indexOf(this) - 1 >= 0)) - { - return p.getChild(p.nodes.indexOf(this) - 1); - } - return null; - }; -}; - -/** - * Parse an XML Document from the specified source. The XML should be - * well formed, unless strict mode is disabled, then the parser will - * handle HTML-style XML documents. - * @param src {String} The source to parse - */ -XMLDOC.Parser.parse = function(src) -{ - var A = []; - - // Normailize whitespace - A = src.split("\r\n"); - src = A.join("\n"); - A = src.split("\r"); - src = A.join("\n"); - - // Remove XML and DOCTYPE specifier - src.replace(/<\?XML .*\?>/i, ""); - src.replace(//i, ""); - - // The document is the root node and cannot be modified or removed - var doc = new XMLDOC.Parser.node(null, "ROOT", "DOCUMENT"); - - // Let's break it down - XMLDOC.Parser.eat(doc, src); - - return doc; -}; - -/** - * The XML fragment processing routine. This method is private and should not be called - * directly. - * @param parentNode {XMLDOC.Parser.node} The node which is the parent of this fragment - * @param src {String} The source within the fragment to process - * @private - */ -XMLDOC.Parser.eat = function(parentNode, src) -{ - // A simple tag def - var reTag = new RegExp("<(!|)(\\?|--|)((.|\\s)*?)\\2>","g"); - - // Special tag types - var reCommentTag = //; - var rePITag = /<\?((.|\s)*?)\?>/; - - // A start tag (with potential empty marker) - var reStartTag = /<(.*?)( +([\w_\-]*)=(\"|')(.*)\4)*(\/)?>/; - - // An empty HTML style tag (not proper XML, but we'll accept it so we can process HTML) - var reHTMLEmptyTag = /<(.*?)( +([\w_\-]*)=(\"|')(.*)\4)*>/; - - // Fully enclosing tag with nested tags - var reEnclosingTag = /<(.*?)( +([\w_\-]*)=(\"|')(.*?)\4)*>((.|\s)*?)<\/\1>/; - - // Breaks down attributes - var reAttributes = new RegExp(" +([\\w_\\-]*)=(\"|')(.*?)\\2","g"); - - // Find us a tag - var tag; - while ((tag = reTag.exec(src)) != null) - { - if (tag.index > 0) - { - // The next tag has some text before it - var text = src.substring(0, tag.index).replace(/^[ \t\n]+((.|\n)*?)[ \t\n]+$/, "$1"); - - if (text.length > 0 && (text != "\n")) - { - var txtnode = new XMLDOC.Parser.node(parentNode, "", "TEXT"); - txtnode.charData = text; - - // Append the new text node - parentNode.nodes.push(txtnode); - } - - // Reset the lastIndex of reTag - reTag.lastIndex -= src.substring(0, tag.index).length; - - // Eat the text - src = src.substring(tag.index); - } - - if (reCommentTag.test(tag[0])) - { - // Is this a comment? - var comment = new XMLDOC.Parser.node(parentNode, "", "COMMENT"); - comment.charData = reCommentTag.exec(tag[0])[1]; - - // Append the comment - parentNode.nodes.push(comment); - - // Move the lastIndex of reTag - reTag.lastIndex -= tag[0].length; - - // Eat the tag - src = src.replace(reCommentTag, ""); - } - else if (rePITag.test(tag[0])) - { - // Is this a processing instruction? - var pi = new XMLDOC.Parser.node(parentNode, "", "PI"); - pi.charData = rePITag.exec(tag[0])[1]; - - // Append the processing instruction - parentNode.nodes.push(pi); - - // Move the lastIndex of reTag - reTag.lastIndex -= tag[0].length; - - // Eat the tag - src = src.replace(rePITag, ""); - } - else if (reStartTag.test(tag[0])) - { - // Break it down - var e = reStartTag.exec(tag[0]); - var elem = new XMLDOC.Parser.node(parentNode, e[1], "ELEMENT"); - - // Get attributes from the tag - var a; - while ((a = reAttributes.exec(e[2])) != null ) - { - elem.attrs[a[1]] = a[3]; - } - - // Is this an empty XML-style tag? - if (e[6] == "/") - { - // Append the empty element - parentNode.nodes.push(elem); - - // Move the lastIndex of reTag (include the start tag length) - reTag.lastIndex -= e[0].length; - - // Eat the tag - src = src.replace(reStartTag, ""); - } - else - { - // Check for malformed XML tags - var htmlParsed = false; - var htmlStartTag = reHTMLEmptyTag.exec(src); - - // See if there isn't an end tag within this block - var reHTMLEndTag = new RegExp(""); - var htmlEndTag = reHTMLEndTag.exec(src); - - if (XMLDOC.Parser.strictMode && htmlEndTag == null) - { - // Poorly formed XML fails in strict mode - var err = new Error("Malformed XML passed to XMLDOC.Parser... Error contains malformed 'src'"); - err.src = src; - throw err; - } - else if (htmlEndTag == null) - { - // This is an HTML-style empty tag, store the element for it in non-strict mode - parentNode.nodes.push(elem); - - // Eat the tag - src = src.replace(reHTMLEmptyTag, ""); - htmlParsed = true; - } - - // If we didn't parse HTML-style, it must be an enclosing tag - if (!htmlParsed) - { - var enc = reEnclosingTag.exec(src); - - // Go deeper into the document - XMLDOC.Parser.eat(elem, enc[6]); - - // Append the new element node - parentNode.nodes.push(elem); - - // Eat the tag - src = src.replace(reEnclosingTag, ""); - } - } - - // Reset the lastIndex of reTag - reTag.lastIndex = 0; - } - } - - // No tag was found... append the text if there is any - src = src.replace(/^[ \t\n]+((.|\n)*?)[ \t\n]+$/, "$1"); - if (src.length > 0 && (src != "\n")) - { - var txtNode = new XMLDOC.Parser.node(parentNode, "", "TEXT"); - txtNode.charData = src; - - // Append the new text node - parentNode.nodes.push(txtNode); - } -}; diff --git a/doc/jsdoc-toolkit/app/lib/JSDOC.js b/doc/jsdoc-toolkit/app/lib/JSDOC.js deleted file mode 100644 index ca59089a7..000000000 --- a/doc/jsdoc-toolkit/app/lib/JSDOC.js +++ /dev/null @@ -1,104 +0,0 @@ -/** - @overview - @date $Date: 2009-09-04 07:43:41 +0100 (Fri, 04 Sep 2009) $ - @version $Revision: 814 $ - @location $HeadURL: https://jsdoc-toolkit.googlecode.com/svn/tags/jsdoc_toolkit-2.3.2/jsdoc-toolkit/app/lib/JSDOC.js $ - @name JSDOC.js - */ - -/** - This is the main container for the JSDOC application. - @namespace -*/ -JSDOC = { -}; - -/** - @requires Opt - */ -if (typeof arguments == "undefined") arguments = []; -JSDOC.opt = Opt.get( - arguments, - { - a: "allfunctions", - c: "conf", - d: "directory", - "D[]": "define", - e: "encoding", - "E[]": "exclude", - h: "help", - n: "nocode", - o: "out", - p: "private", - q: "quiet", - r: "recurse", - S: "securemodules", - s: "suppress", - t: "template", - T: "testmode", - u: "unique", - v: "verbose", - x: "ext" - } -); - -/** The current version string of this application. */ -JSDOC.VERSION = "2.3.2"; - -/** Print out usage information and quit. */ -JSDOC.usage = function() { - print("USAGE: java -jar jsrun.jar app/run.js [OPTIONS] ..."); - print(""); - print("OPTIONS:"); - print(" -a or --allfunctions\n Include all functions, even undocumented ones.\n"); - print(" -c or --conf\n Load a configuration file.\n"); - print(" -d= or --directory=\n Output to this directory (defaults to \"out\").\n"); - print(" -D=\"myVar:My value\" or --define=\"myVar:My value\"\n Multiple. Define a variable, available in JsDoc as JSDOC.opt.D.myVar.\n"); - print(" -e= or --encoding=\n Use this encoding to read and write files.\n"); - print(" -E=\"REGEX\" or --exclude=\"REGEX\"\n Multiple. Exclude files based on the supplied regex.\n"); - print(" -h or --help\n Show this message and exit.\n"); - print(" -n or --nocode\n Ignore all code, only document comments with @name tags.\n"); - print(" -o= or --out=\n Print log messages to a file (defaults to stdout).\n"); - print(" -p or --private\n Include symbols tagged as private, underscored and inner symbols.\n"); - print(" -q or --quiet\n Do not output any messages, not even warnings.\n"); - print(" -r= or --recurse=\n Descend into src directories.\n"); - print(" -s or --suppress\n Suppress source code output.\n"); - print(" -S or --securemodules\n Use Secure Modules mode to parse source code.\n"); - print(" -t= or --template=\n Required. Use this template to format the output.\n"); - print(" -T or --test\n Run all unit tests and exit.\n"); - print(" -u or --unique\n Force file names to be unique, but not based on symbol names.\n"); - print(" -v or --verbose\n Provide verbose feedback about what is happening.\n"); - print(" -x=[,EXT]... or --ext=[,EXT]...\n Scan source files with the given extension/s (defaults to js).\n"); - - quit(); -} - -/*t: - plan(4, "Testing JSDOC namespace."); - - is( - typeof JSDOC, - "object", - "JSDOC.usage is a function." - ); - - is( - typeof JSDOC.VERSION, - "string", - "JSDOC.VERSION is a string." - ); - - is( - typeof JSDOC.usage, - "function", - "JSDOC.usage is a function." - ); - - is( - typeof JSDOC.opt, - "object", - "JSDOC.opt is a object." - ); - */ - -if (this.IO) IO.includeDir("lib/JSDOC/"); diff --git a/doc/jsdoc-toolkit/app/lib/JSDOC/DocComment.js b/doc/jsdoc-toolkit/app/lib/JSDOC/DocComment.js deleted file mode 100644 index c6c8d7d4f..000000000 --- a/doc/jsdoc-toolkit/app/lib/JSDOC/DocComment.js +++ /dev/null @@ -1,200 +0,0 @@ -if (typeof JSDOC == "undefined") JSDOC = {}; - -/** - Create a new DocComment. This takes a raw documentation comment, - and wraps it in useful accessors. - @class Represents a documentation comment object. - */ -JSDOC.DocComment = function(/**String*/comment) { - this.init(); - if (typeof comment != "undefined") { - this.parse(comment); - } -} - -JSDOC.DocComment.prototype.init = function() { - this.isUserComment = true; - this.src = ""; - this.meta = ""; - this.tagTexts = []; - this.tags = []; -} - -/** - @requires JSDOC.DocTag - */ -JSDOC.DocComment.prototype.parse = function(/**String*/comment) { - if (comment == "") { - comment = "/** @desc */"; - this.isUserComment = false; - } - - this.src = JSDOC.DocComment.unwrapComment(comment); - - this.meta = ""; - if (this.src.indexOf("#") == 0) { - this.src.match(/#(.+[+-])([\s\S]*)$/); - if (RegExp.$1) this.meta = RegExp.$1; - if (RegExp.$2) this.src = RegExp.$2; - } - - if (typeof JSDOC.PluginManager != "undefined") { - JSDOC.PluginManager.run("onDocCommentSrc", this); - } - - this.fixDesc(); - - this.src = JSDOC.DocComment.shared+"\n"+this.src; - - this.tagTexts = - this.src - .split(/(^|[\r\n])\s*@/) - .filter(function($){return $.match(/\S/)}); - - /** - The tags found in the comment. - @type JSDOC.DocTag[] - */ - this.tags = this.tagTexts.map(function($){return new JSDOC.DocTag($)}); - - if (typeof JSDOC.PluginManager != "undefined") { - JSDOC.PluginManager.run("onDocCommentTags", this); - } -} - -/*t: - plan(5, "testing JSDOC.DocComment"); - requires("../frame/String.js"); - requires("../lib/JSDOC/DocTag.js"); - - var com = new JSDOC.DocComment("/**@foo some\n* comment here*"+"/"); - is(com.tagTexts[0], "foo some\ncomment here", "first tag text is found."); - is(com.tags[0].title, "foo", "the title is found in a comment with one tag."); - - var com = new JSDOC.DocComment("/** @foo first\n* @bar second*"+"/"); - is(com.getTag("bar").length, 1, "getTag() returns one tag by that title."); - - JSDOC.DocComment.shared = "@author John Smith"; - var com = new JSDOC.DocComment("/**@foo some\n* comment here*"+"/"); - is(com.tags[0].title, "author", "shared comment is added."); - is(com.tags[1].title, "foo", "shared comment is added to existing tag."); -*/ - -/** - If no @desc tag is provided, this function will add it. - */ -JSDOC.DocComment.prototype.fixDesc = function() { - if (this.meta && this.meta != "@+") return; - if (/^\s*[^@\s]/.test(this.src)) { - this.src = "@desc "+this.src; - } -} - -/*t: - plan(5, "testing JSDOC.DocComment#fixDesc"); - - var com = new JSDOC.DocComment(); - - com.src = "this is a desc\n@author foo"; - com.fixDesc(); - is(com.src, "@desc this is a desc\n@author foo", "if no @desc tag is provided one is added."); - - com.src = "x"; - com.fixDesc(); - is(com.src, "@desc x", "if no @desc tag is provided one is added to a single character."); - - com.src = "\nx"; - com.fixDesc(); - is(com.src, "@desc \nx", "if no @desc tag is provided one is added to return and character."); - - com.src = " "; - com.fixDesc(); - is(com.src, " ", "if no @desc tag is provided one is not added to just whitespace."); - - com.src = ""; - com.fixDesc(); - is(com.src, "", "if no @desc tag is provided one is not added to empty."); -*/ - -/** - Remove slash-star comment wrapper from a raw comment string. - @type String - */ -JSDOC.DocComment.unwrapComment = function(/**String*/comment) { - if (!comment) return ""; - var unwrapped = comment.replace(/(^\/\*\*|\*\/$)/g, "").replace(/^\s*\* ?/gm, ""); - return unwrapped; -} - -/*t: - plan(5, "testing JSDOC.DocComment.unwrapComment"); - - var com = "/**x*"+"/"; - var unwrapped = JSDOC.DocComment.unwrapComment(com); - is(unwrapped, "x", "a single character jsdoc is found."); - - com = "/***x*"+"/"; - unwrapped = JSDOC.DocComment.unwrapComment(com); - is(unwrapped, "x", "three stars are allowed in the opener."); - - com = "/****x*"+"/"; - unwrapped = JSDOC.DocComment.unwrapComment(com); - is(unwrapped, "*x", "fourth star in the opener is kept."); - - com = "/**x\n * y\n*"+"/"; - unwrapped = JSDOC.DocComment.unwrapComment(com); - is(unwrapped, "x\ny\n", "leading stars and spaces are trimmed."); - - com = "/**x\n * y\n*"+"/"; - unwrapped = JSDOC.DocComment.unwrapComment(com); - is(unwrapped, "x\n y\n", "only first space after leading stars are trimmed."); -*/ - -/** - Provides a printable version of the comment. - @type String - */ -JSDOC.DocComment.prototype.toString = function() { - return this.src; -} - -/*t: - plan(1, "testing JSDOC.DocComment#fixDesc"); - var com = new JSDOC.DocComment(); - com.src = "foo"; - is(""+com, "foo", "stringifying a comment returns the unwrapped src."); -*/ - -/** - Given the title of a tag, returns all tags that have that title. - @type JSDOC.DocTag[] - */ -JSDOC.DocComment.prototype.getTag = function(/**String*/tagTitle) { - return this.tags.filter(function($){return $.title == tagTitle}); -} - -/*t: - plan(1, "testing JSDOC.DocComment#getTag"); - requires("../frame/String.js"); - requires("../lib/JSDOC/DocTag.js"); - - var com = new JSDOC.DocComment("/**@foo some\n* @bar\n* @bar*"+"/"); - is(com.getTag("bar").length, 2, "getTag returns expected number of tags."); -*/ - -/** - Used to store the currently shared tag text. -*/ -JSDOC.DocComment.shared = ""; - -/*t: - plan(2, "testing JSDOC.DocComment.shared"); - requires("../frame/String.js"); - requires("../lib/JSDOC/DocTag.js"); - - JSDOC.DocComment.shared = "@author Michael"; - - var com = new JSDOC.DocComment("/**@foo\n* @foo*"+"/"); - is(com.getTag("author").length, 1, "getTag returns shared tag."); - is(com.getTag("foo").length, 2, "getTag returns unshared tags too."); -*/ \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/lib/JSDOC/DocTag.js b/doc/jsdoc-toolkit/app/lib/JSDOC/DocTag.js deleted file mode 100644 index 77ec07cac..000000000 --- a/doc/jsdoc-toolkit/app/lib/JSDOC/DocTag.js +++ /dev/null @@ -1,294 +0,0 @@ -if (typeof JSDOC == "undefined") JSDOC = {}; - -/** - @constructor - */ -JSDOC.DocTag = function(src) { - this.init(); - if (typeof src != "undefined") { - this.parse(src); - } -} - -/** - Create and initialize the properties of this. - */ -JSDOC.DocTag.prototype.init = function() { - this.title = ""; - this.type = ""; - this.name = ""; - this.isOptional = false; - this.defaultValue = ""; - this.desc = ""; - - return this; -} - -/** - Populate the properties of this from the given tag src. - @param {string} src - */ -JSDOC.DocTag.prototype.parse = function(src) { - if (typeof src != "string") throw "src must be a string not "+(typeof src); - - try { - src = this.nibbleTitle(src); - if (JSDOC.PluginManager) { - JSDOC.PluginManager.run("onDocTagSynonym", this); - } - - src = this.nibbleType(src); - - // only some tags are allowed to have names. - if (this.title == "param" || this.title == "property" || this.title == "config") { // @config is deprecated - src = this.nibbleName(src); - } - } - catch(e) { - if (LOG) LOG.warn(e); - else throw e; - } - this.desc = src; // whatever is left - - // example tags need to have whitespace preserved - if (this.title != "example") this.desc = this.desc.trim(); - - if (JSDOC.PluginManager) { - JSDOC.PluginManager.run("onDocTag", this); - } -} - -/** - Automatically called when this is stringified. - */ -JSDOC.DocTag.prototype.toString = function() { - return this.desc; -} - -/*t: - plan(1, "testing JSDOC.DocTag#toString"); - - var tag = new JSDOC.DocTag("param {object} date A valid date."); - is(""+tag, "A valid date.", "stringifying a tag returns the desc."); - */ - -/** - Find and shift off the title of a tag. - @param {string} src - @return src - */ -JSDOC.DocTag.prototype.nibbleTitle = function(src) { - if (typeof src != "string") throw "src must be a string not "+(typeof src); - - var parts = src.match(/^\s*(\S+)(?:\s([\s\S]*))?$/); - - if (parts && parts[1]) this.title = parts[1]; - if (parts && parts[2]) src = parts[2]; - else src = ""; - - return src; -} - -/*t: - plan(8, "testing JSDOC.DocTag#nibbleTitle"); - - var tag = new JSDOC.DocTag(); - - tag.init().nibbleTitle("aTitleGoesHere"); - is(tag.title, "aTitleGoesHere", "a title can be found in a single-word string."); - - var src = tag.init().nibbleTitle("aTitleGoesHere and the rest"); - is(tag.title, "aTitleGoesHere", "a title can be found in a multi-word string."); - is(src, "and the rest", "the rest is returned when the title is nibbled off."); - - src = tag.init().nibbleTitle(""); - is(tag.title, "", "given an empty string the title is empty."); - is(src, "", "the rest is empty when the tag is empty."); - - var src = tag.init().nibbleTitle(" aTitleGoesHere\n a description"); - is(tag.title, "aTitleGoesHere", "leading and trailing spaces are not part of the title."); - is(src, " a description", "leading spaces (less one) are part of the description."); - - tag.init().nibbleTitle("a.Title::Goes_Here foo"); - is(tag.title, "a.Title::Goes_Here", "titles with punctuation are allowed."); - */ - -/** - Find and shift off the type of a tag. - @requires frame/String.js - @param {string} src - @return src - */ -JSDOC.DocTag.prototype.nibbleType = function(src) { - if (typeof src != "string") throw "src must be a string not "+(typeof src); - - if (src.match(/^\s*\{/)) { - var typeRange = src.balance("{", "}"); - if (typeRange[1] == -1) { - throw "Malformed comment tag ignored. Tag type requires an opening { and a closing }: "+src; - } - this.type = src.substring(typeRange[0]+1, typeRange[1]).trim(); - this.type = this.type.replace(/\s*,\s*/g, "|"); // multiples can be separated by , or | - src = src.substring(typeRange[1]+1); - } - - return src; -} - -/*t: - plan(5, "testing JSDOC.DocTag.parser.nibbleType"); - requires("../frame/String.js"); - - var tag = new JSDOC.DocTag(); - - tag.init().nibbleType("{String[]} aliases"); - is(tag.type, "String[]", "type can have non-alpha characters."); - - tag.init().nibbleType("{ aTypeGoesHere } etc etc"); - is(tag.type, "aTypeGoesHere", "type is trimmed."); - - tag.init().nibbleType("{ oneType, twoType ,\n threeType } etc etc"); - is(tag.type, "oneType|twoType|threeType", "multiple types can be separated by commas."); - - var error; - try { tag.init().nibbleType("{widget foo"); } - catch(e) { error = e; } - is(typeof error, "string", "malformed tag type throws error."); - isnt(error.indexOf("Malformed"), -1, "error message tells tag is malformed."); - */ - -/** - Find and shift off the name of a tag. - @requires frame/String.js - @param {string} src - @return src - */ -JSDOC.DocTag.prototype.nibbleName = function(src) { - if (typeof src != "string") throw "src must be a string not "+(typeof src); - - src = src.trim(); - - // is optional? - if (src.charAt(0) == "[") { - var nameRange = src.balance("[", "]"); - if (nameRange[1] == -1) { - throw "Malformed comment tag ignored. Tag optional name requires an opening [ and a closing ]: "+src; - } - this.name = src.substring(nameRange[0]+1, nameRange[1]).trim(); - this.isOptional = true; - - src = src.substring(nameRange[1]+1); - - // has default value? - var nameAndValue = this.name.split("="); - if (nameAndValue.length) { - this.name = nameAndValue.shift().trim(); - this.defaultValue = nameAndValue.join("="); - } - } - else { - var parts = src.match(/^(\S+)(?:\s([\s\S]*))?$/); - if (parts) { - if (parts[1]) this.name = parts[1]; - if (parts[2]) src = parts[2].trim(); - else src = ""; - } - } - - return src; -} - -/*t: - requires("../frame/String.js"); - plan(9, "testing JSDOC.DocTag.parser.nibbleName"); - - var tag = new JSDOC.DocTag(); - - tag.init().nibbleName("[foo] This is a description."); - is(tag.isOptional, true, "isOptional syntax is detected."); - is(tag.name, "foo", "optional param name is found."); - - tag.init().nibbleName("[foo] This is a description."); - is(tag.isOptional, true, "isOptional syntax is detected when no type."); - is(tag.name, "foo", "optional param name is found when no type."); - - tag.init().nibbleName("[foo=7] This is a description."); - is(tag.name, "foo", "optional param name is found when default value."); - is(tag.defaultValue, 7, "optional param default value is found when default value."); - - //tag.init().nibbleName("[foo= a value] This is a description."); - //is(tag.defaultValue, " a value", "optional param default value is found when default value has spaces (issue #112)."); - - tag.init().nibbleName("[foo=[]] This is a description."); - is(tag.defaultValue, "[]", "optional param default value is found when default value is [] (issue #95)."); - - tag.init().nibbleName("[foo=a=b] This is a description."); - is(tag.name, "foo", "optional param name is found when default value is a=b."); - is(tag.defaultValue, "a=b", "optional param default value is found when default value is a=b.") - */ - -/*t: - plan(32, "Testing JSDOC.DocTag.parser."); - requires("../frame/String.js"); - - var tag = new JSDOC.DocTag(); - - is(typeof tag, "object", "JSDOC.DocTag.parser with an empty string returns an object."); - is(typeof tag.title, "string", "returned object has a string property 'title'."); - is(typeof tag.type, "string", "returned object has a string property 'type'."); - is(typeof tag.name, "string", "returned object has a string property 'name'."); - is(typeof tag.defaultValue, "string", "returned object has a string property 'defaultValue'."); - is(typeof tag.isOptional, "boolean", "returned object has a boolean property 'isOptional'."); - is(typeof tag.desc, "string", "returned object has a string property 'desc'."); - - tag = new JSDOC.DocTag("param {widget} foo"); - is(tag.title, "param", "param title is found."); - is(tag.name, "foo", "param name is found when desc is missing."); - is(tag.desc, "", "param desc is empty when missing."); - - tag = new JSDOC.DocTag("param {object} date A valid date."); - is(tag.name, "date", "param name is found with a type."); - is(tag.type, "object", "param type is found."); - is(tag.desc, "A valid date.", "param desc is found with a type."); - - tag = new JSDOC.DocTag("param aName a description goes\n here."); - is(tag.name, "aName", "param name is found without a type."); - is(tag.desc, "a description goes\n here.", "param desc is found without a type."); - - tag = new JSDOC.DocTag("param {widget}"); - is(tag.name, "", "param name is empty when it is not given."); - - tag = new JSDOC.DocTag("param {widget} [foo] This is a description."); - is(tag.name, "foo", "optional param name is found."); - - tag = new JSDOC.DocTag("return {aType} This is a description."); - is(tag.type, "aType", "when return tag has no name, type is found."); - is(tag.desc, "This is a description.", "when return tag has no name, desc is found."); - - tag = new JSDOC.DocTag("author Joe Coder "); - is(tag.title, "author", "author tag has a title."); - is(tag.type, "", "the author tag has no type."); - is(tag.name, "", "the author tag has no name."); - is(tag.desc, "Joe Coder ", "author tag has desc."); - - tag = new JSDOC.DocTag("private \t\n "); - is(tag.title, "private", "private tag has a title."); - is(tag.type, "", "the private tag has no type."); - is(tag.name, "", "the private tag has no name."); - is(tag.desc, "", "private tag has no desc."); - - tag = new JSDOC.DocTag("example\n example(code);\n more();"); - is(tag.desc, " example(code);\n more();", "leading whitespace (less one) in examples code is preserved."); - - tag = new JSDOC.DocTag("param theName \n"); - is(tag.name, "theName", "name only is found."); - - tag = new JSDOC.DocTag("type theDesc \n"); - is(tag.desc, "theDesc", "desc only is found."); - - tag = new JSDOC.DocTag("type {theType} \n"); - is(tag.type, "theType", "type only is found."); - - tag = new JSDOC.DocTag(""); - is(tag.title, "", "title is empty when tag is empty."); - */ \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js b/doc/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js deleted file mode 100644 index 2c4bfb82b..000000000 --- a/doc/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js +++ /dev/null @@ -1,126 +0,0 @@ -/** - @constructor - @param [opt] Used to override the commandline options. Useful for testing. - @version $Id: JsDoc.js 773 2009-01-24 09:42:04Z micmath $ -*/ -JSDOC.JsDoc = function(/**object*/ opt) { - if (opt) { - JSDOC.opt = opt; - } - - if (JSDOC.opt.h) { - JSDOC.usage(); - quit(); - } - - // defend against options that are not sane - if (JSDOC.opt._.length == 0) { - LOG.warn("No source files to work on. Nothing to do."); - quit(); - } - if (JSDOC.opt.t === true || JSDOC.opt.d === true) { - JSDOC.usage(); - } - - if (typeof JSDOC.opt.d == "string") { - if (!JSDOC.opt.d.charAt(JSDOC.opt.d.length-1).match(/[\\\/]/)) { - JSDOC.opt.d = JSDOC.opt.d+"/"; - } - LOG.inform("Output directory set to '"+JSDOC.opt.d+"'."); - IO.mkPath(JSDOC.opt.d); - } - if (JSDOC.opt.e) IO.setEncoding(JSDOC.opt.e); - - // the -r option: scan source directories recursively - if (typeof JSDOC.opt.r == "boolean") JSDOC.opt.r = 10; - else if (!isNaN(parseInt(JSDOC.opt.r))) JSDOC.opt.r = parseInt(JSDOC.opt.r); - else JSDOC.opt.r = 1; - - // the -D option: define user variables - var D = {}; - if (JSDOC.opt.D) { - for (var i = 0; i < JSDOC.opt.D.length; i++) { - var defineParts = JSDOC.opt.D[i].split(":", 2); - if (defineParts) D[defineParts[0]] = defineParts[1]; - } - } - JSDOC.opt.D = D; - // combine any conf file D options with the commandline D options - if (defined(JSDOC.conf)) for (var c in JSDOC.conf.D) { - if (!defined(JSDOC.opt.D[c])) { - JSDOC.opt.D[c] = JSDOC.conf.D[c]; - } - } - - // Give plugins a chance to initialize - if (defined(JSDOC.PluginManager)) { - JSDOC.PluginManager.run("onInit", JSDOC.opt); - } - - JSDOC.opt.srcFiles = JSDOC.JsDoc._getSrcFiles(); - JSDOC.JsDoc._parseSrcFiles(); - JSDOC.JsDoc.symbolSet = JSDOC.Parser.symbols; -} - -/** - Retrieve source file list. - @returns {String[]} The pathnames of the files to be parsed. - */ -JSDOC.JsDoc._getSrcFiles = function() { - JSDOC.JsDoc.srcFiles = []; - - var ext = ["js"]; - if (JSDOC.opt.x) { - ext = JSDOC.opt.x.split(",").map(function($) {return $.toLowerCase()}); - } - - for (var i = 0; i < JSDOC.opt._.length; i++) { - JSDOC.JsDoc.srcFiles = JSDOC.JsDoc.srcFiles.concat( - IO.ls(JSDOC.opt._[i], JSDOC.opt.r).filter( - function($) { - var thisExt = $.split(".").pop().toLowerCase(); - - if (JSDOC.opt.E) { - for(var n = 0; n < JSDOC.opt.E.length; n++) { - if ($.match(new RegExp(JSDOC.opt.E[n]))) { - LOG.inform("Excluding " + $); - return false; // if the file matches the regex then it's excluded. - } - } - } - - return (ext.indexOf(thisExt) > -1); // we're only interested in files with certain extensions - } - ) - ); - } - - return JSDOC.JsDoc.srcFiles; -} - -JSDOC.JsDoc._parseSrcFiles = function() { - JSDOC.Parser.init(); - for (var i = 0, l = JSDOC.JsDoc.srcFiles.length; i < l; i++) { - var srcFile = JSDOC.JsDoc.srcFiles[i]; - - if (JSDOC.opt.v) LOG.inform("Parsing file: " + srcFile); - - try { - var src = IO.readFile(srcFile); - } - catch(e) { - LOG.warn("Can't read source file '"+srcFile+"': "+e.message); - } - - var tr = new JSDOC.TokenReader(); - var ts = new JSDOC.TokenStream(tr.tokenize(new JSDOC.TextStream(src))); - - JSDOC.Parser.parse(ts, srcFile); - - } - JSDOC.Parser.finish(); - - if (JSDOC.PluginManager) { - JSDOC.PluginManager.run("onFinishedParsing", JSDOC.Parser.symbols); - } -} diff --git a/doc/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js b/doc/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js deleted file mode 100644 index bcaebc9c5..000000000 --- a/doc/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js +++ /dev/null @@ -1,109 +0,0 @@ -/** - @constructor -*/ -JSDOC.JsPlate = function(templateFile) { - if (templateFile) this.template = IO.readFile(templateFile); - - this.templateFile = templateFile; - this.code = ""; - this.parse(); -} - -JSDOC.JsPlate.prototype.parse = function() { - this.template = this.template.replace(/\{#[\s\S]+?#\}/gi, ""); - this.code = "var output=\u001e"+this.template; - - this.code = this.code.replace( - //gi, - function (match, eachName, inName) { - return "\u001e;\rvar $"+eachName+"_keys = keys("+inName+");\rfor(var $"+eachName+"_i = 0; $"+eachName+"_i < $"+eachName+"_keys.length; $"+eachName+"_i++) {\rvar $"+eachName+"_last = ($"+eachName+"_i == $"+eachName+"_keys.length-1);\rvar $"+eachName+"_key = $"+eachName+"_keys[$"+eachName+"_i];\rvar "+eachName+" = "+inName+"[$"+eachName+"_key];\routput+=\u001e"; - } - ); - this.code = this.code.replace(//g, "\u001e;\rif ($1) { output+=\u001e"); - this.code = this.code.replace(//g, "\u001e;}\relse if ($1) { output+=\u001e"); - this.code = this.code.replace(//g, "\u001e;}\relse { output+=\u001e"); - this.code = this.code.replace(/<\/(if|for)>/g, "\u001e;\r};\routput+=\u001e"); - this.code = this.code.replace( - /\{\+\s*([\s\S]+?)\s*\+\}/gi, - function (match, code) { - code = code.replace(/"/g, "\u001e"); // prevent qoute-escaping of inline code - code = code.replace(/(\r?\n)/g, " "); - return "\u001e+ ("+code+") +\u001e"; - } - ); - this.code = this.code.replace( - /\{!\s*([\s\S]+?)\s*!\}/gi, - function (match, code) { - code = code.replace(/"/g, "\u001e"); // prevent qoute-escaping of inline code - code = code.replace(/(\n)/g, " "); - return "\u001e; "+code+";\routput+=\u001e"; - } - ); - this.code = this.code+"\u001e;"; - - this.code = this.code.replace(/(\r?\n)/g, "\\n"); - this.code = this.code.replace(/"/g, "\\\""); - this.code = this.code.replace(/\u001e/g, "\""); -} - -JSDOC.JsPlate.prototype.toCode = function() { - return this.code; -} - -JSDOC.JsPlate.keys = function(obj) { - var keys = []; - if (obj.constructor.toString().indexOf("Array") > -1) { - for (var i = 0; i < obj.length; i++) { - keys.push(i); - } - } - else { - for (var i in obj) { - keys.push(i); - } - } - return keys; -}; - -JSDOC.JsPlate.values = function(obj) { - var values = []; - if (obj.constructor.toString().indexOf("Array") > -1) { - for (var i = 0; i < obj.length; i++) { - values.push(obj[i]); - } - } - else { - for (var i in obj) { - values.push(obj[i]); - } - } - return values; -}; - -JSDOC.JsPlate.prototype.process = function(data, compact) { - var keys = JSDOC.JsPlate.keys; - var values = JSDOC.JsPlate.values; - - try { - eval(this.code); - } - catch (e) { - print(">> There was an error evaluating the compiled code from template: "+this.templateFile); - print(" The error was on line "+e.lineNumber+" "+e.name+": "+e.message); - var lines = this.code.split("\r"); - if (e.lineNumber-2 >= 0) print("line "+(e.lineNumber-1)+": "+lines[e.lineNumber-2]); - print("line "+e.lineNumber+": "+lines[e.lineNumber-1]); - print(""); - } - - if (compact) { // patch by mcbain.asm - // Remove lines that contain only space-characters, usually left by lines in the template - // which originally only contained JSPlate tags or code. This makes it easier to write - // non-tricky templates which still put out nice code (not bloated with extra lines). - // Lines purposely left blank (just a line ending) are left alone. - output = output.replace(/\s+?(\r?)\n/g, "$1\n"); - } - - /*debug*///print(this.code); - return output; -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/lib/JSDOC/Lang.js b/doc/jsdoc-toolkit/app/lib/JSDOC/Lang.js deleted file mode 100644 index 62919d7d8..000000000 --- a/doc/jsdoc-toolkit/app/lib/JSDOC/Lang.js +++ /dev/null @@ -1,144 +0,0 @@ -/** - @namespace -*/ -JSDOC.Lang = { -} - -JSDOC.Lang.isBuiltin = function(name) { - return (JSDOC.Lang.isBuiltin.coreObjects.indexOf(name) > -1); -} -JSDOC.Lang.isBuiltin.coreObjects = ['_global_', 'Array', 'Boolean', 'Date', 'Error', 'Function', 'Math', 'Number', 'Object', 'RegExp', 'String']; - -JSDOC.Lang.whitespace = function(ch) { - return JSDOC.Lang.whitespace.names[ch]; -} -JSDOC.Lang.whitespace.names = { - " ": "SPACE", - "\f": "FORMFEED", - "\t": "TAB", - "\u0009": "UNICODE_TAB", - "\u000A": "UNICODE_NBR", - "\u0008": "VERTICAL_TAB" -}; - -JSDOC.Lang.newline = function(ch) { - return JSDOC.Lang.newline.names[ch]; -} -JSDOC.Lang.newline.names = { - "\n": "NEWLINE", - "\r": "RETURN", - "\u000A": "UNICODE_LF", - "\u000D": "UNICODE_CR", - "\u2029": "UNICODE_PS", - "\u2028": "UNICODE_LS" -}; - -JSDOC.Lang.keyword = function(word) { - return JSDOC.Lang.keyword.names["="+word]; -} -JSDOC.Lang.keyword.names = { - "=break": "BREAK", - "=case": "CASE", - "=catch": "CATCH", - "=const": "VAR", - "=continue": "CONTINUE", - "=default": "DEFAULT", - "=delete": "DELETE", - "=do": "DO", - "=else": "ELSE", - "=false": "FALSE", - "=finally": "FINALLY", - "=for": "FOR", - "=function": "FUNCTION", - "=if": "IF", - "=in": "IN", - "=instanceof": "INSTANCEOF", - "=new": "NEW", - "=null": "NULL", - "=return": "RETURN", - "=switch": "SWITCH", - "=this": "THIS", - "=throw": "THROW", - "=true": "TRUE", - "=try": "TRY", - "=typeof": "TYPEOF", - "=void": "VOID", - "=while": "WHILE", - "=with": "WITH", - "=var": "VAR" -}; - -JSDOC.Lang.punc = function(ch) { - return JSDOC.Lang.punc.names[ch]; -} -JSDOC.Lang.punc.names = { - ";": "SEMICOLON", - ",": "COMMA", - "?": "HOOK", - ":": "COLON", - "||": "OR", - "&&": "AND", - "|": "BITWISE_OR", - "^": "BITWISE_XOR", - "&": "BITWISE_AND", - "===": "STRICT_EQ", - "==": "EQ", - "=": "ASSIGN", - "!==": "STRICT_NE", - "!=": "NE", - "<<": "LSH", - "<=": "LE", - "<": "LT", - ">>>": "URSH", - ">>": "RSH", - ">=": "GE", - ">": "GT", - "++": "INCREMENT", - "--": "DECREMENT", - "+": "PLUS", - "-": "MINUS", - "*": "MUL", - "/": "DIV", - "%": "MOD", - "!": "NOT", - "~": "BITWISE_NOT", - ".": "DOT", - "[": "LEFT_BRACKET", - "]": "RIGHT_BRACKET", - "{": "LEFT_CURLY", - "}": "RIGHT_CURLY", - "(": "LEFT_PAREN", - ")": "RIGHT_PAREN" -}; - -JSDOC.Lang.matching = function(name) { - return JSDOC.Lang.matching.names[name]; -} -JSDOC.Lang.matching.names = { - "LEFT_PAREN": "RIGHT_PAREN", - "RIGHT_PAREN": "LEFT_PAREN", - "LEFT_CURLY": "RIGHT_CURLY", - "RIGHT_CURLY": "LEFT_CURLY", - "LEFT_BRACE": "RIGHT_BRACE", - "RIGHT_BRACE": "LEFT_BRACE" -} - -JSDOC.Lang.isNumber = function(str) { - return /^(\.[0-9]|[0-9]+\.|[0-9])[0-9]*([eE][+-][0-9]+)?$/i.test(str); -} - -JSDOC.Lang.isHexDec = function(str) { - return /^0x[0-9A-F]+$/i.test(str); -} - -JSDOC.Lang.isWordChar = function(str) { - return /^[a-zA-Z0-9$_.]+$/.test(str); -} - -JSDOC.Lang.isSpace = function(str) { - return (typeof JSDOC.Lang.whitespace(str) != "undefined"); -} - -JSDOC.Lang.isNewline = function(str) { - return (typeof JSDOC.Lang.newline(str) != "undefined"); -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/lib/JSDOC/Parser.js b/doc/jsdoc-toolkit/app/lib/JSDOC/Parser.js deleted file mode 100644 index f407dd1a1..000000000 --- a/doc/jsdoc-toolkit/app/lib/JSDOC/Parser.js +++ /dev/null @@ -1,145 +0,0 @@ -if (typeof JSDOC == "undefined") JSDOC = {}; - -/** - @namespace - @requires JSDOC.Walker - @requires JSDOC.Symbol - @requires JSDOC.DocComment -*/ -JSDOC.Parser = { - conf: { - ignoreCode: JSDOC.opt.n, - ignoreAnonymous: true, // factory: true - treatUnderscoredAsPrivate: true, // factory: true - explain: false // factory: false - }, - - addSymbol: function(symbol) { - -if (JSDOC.Parser.rename) { - for (var n in JSDOC.Parser.rename) { - if (symbol.alias.indexOf(n) == 0) { - if (symbol.name == symbol.alias) { - symbol.name = symbol.name.replace(n, JSDOC.Parser.rename[n]); - } - symbol.alias = symbol.alias.replace(n, JSDOC.Parser.rename[n]); - } - } -} - -if (JSDOC.opt.S) { - if (typeof JSDOC.Parser.secureModules == "undefined") JSDOC.Parser.secureModules = {}; - if (/^exports\./.test(symbol.alias)) { - symbol.srcFile.match(/(^|[\\\/])([^\\\/]+)\.js/i); - var fileNS = RegExp.$2; - symbol.alias = symbol.alias.replace(/^exports\./, fileNS); - symbol.name = symbol.name.replace(/^exports\./, ""); - symbol.memberOf = fileNS; - - // need to create the namespace associated with this file first - if (!JSDOC.Parser.secureModules[fileNS]) { - JSDOC.Parser.secureModules[fileNS] = 1; - var nsSymbol = new JSDOC.Symbol(fileNS, [], "GLOBAL", new JSDOC.DocComment("")); - nsSymbol.isNamespace = true; - nsSymbol.srcFile = ""; - nsSymbol.isPrivate = false; - nsSymbol.srcFile = symbol.srcFile; - nsSymbol.desc = (JSDOC.Parser.symbols.getSymbol(symbol.srcFile) || {desc: ""}).desc; - JSDOC.Parser.addSymbol(nsSymbol); - - } - } - else { // a method that is not exported? - if (!symbol.isNamespace) return; - } -} - // if a symbol alias is documented more than once the last one with the user docs wins - if (JSDOC.Parser.symbols.hasSymbol(symbol.alias)) { - var oldSymbol = JSDOC.Parser.symbols.getSymbol(symbol.alias); - if (oldSymbol.comment.isUserComment) { - if (symbol.comment.isUserComment) { // old and new are both documented - LOG.warn("The symbol '"+symbol.alias+"' is documented more than once."); - } - else { // old is documented but new isn't - return; - } - } - } - - // we don't document anonymous things - if (JSDOC.Parser.conf.ignoreAnonymous && symbol.name.match(/\$anonymous\b/)) return; - - // uderscored things may be treated as if they were marked private, this cascades - if (JSDOC.Parser.conf.treatUnderscoredAsPrivate && symbol.name.match(/[.#-]_[^.#-]+$/)) { - if (!symbol.comment.getTag("public").length > 0) symbol.isPrivate = true; - } - - // -p flag is required to document private things - if (!JSDOC.opt.p && symbol.isPrivate) return; // issue #161 fixed by mcbain.asm - - // ignored things are not documented, this doesn't cascade - if (symbol.isIgnored) return; - JSDOC.Parser.symbols.addSymbol(symbol); - }, - - addBuiltin: function(name) { - var builtin = new JSDOC.Symbol(name, [], "CONSTRUCTOR", new JSDOC.DocComment("")); - builtin.isNamespace = true; - builtin.srcFile = ""; - builtin.isPrivate = false; - JSDOC.Parser.addSymbol(builtin); - return builtin; - }, - - init: function() { - JSDOC.Parser.symbols = new JSDOC.SymbolSet(); - JSDOC.Parser.walker = new JSDOC.Walker(); - }, - - finish: function() { - JSDOC.Parser.symbols.relate(); - - // make a litle report about what was found - if (JSDOC.Parser.conf.explain) { - var symbols = JSDOC.Parser.symbols.toArray(); - var srcFile = ""; - for (var i = 0, l = symbols.length; i < l; i++) { - var symbol = symbols[i]; - if (srcFile != symbol.srcFile) { - srcFile = symbol.srcFile; - print("\n"+srcFile+"\n-------------------"); - } - print(i+":\n alias => "+symbol.alias + "\n name => "+symbol.name+ "\n isa => "+symbol.isa + "\n memberOf => " + symbol.memberOf + "\n isStatic => " + symbol.isStatic + ", isInner => " + symbol.isInner+ ", isPrivate => " + symbol.isPrivate); - } - print("-------------------\n"); - } - } -} - -JSDOC.Parser.parse = function(/**JSDOC.TokenStream*/ts, /**String*/srcFile) { - JSDOC.Symbol.srcFile = (srcFile || ""); - JSDOC.DocComment.shared = ""; // shared comments don't cross file boundaries - - if (!JSDOC.Parser.walker) JSDOC.Parser.init(); - JSDOC.Parser.walker.walk(ts); // adds to our symbols - - // filter symbols by option - for (var p = JSDOC.Parser.symbols._index.first(); p; p = JSDOC.Parser.symbols._index.next()) { - var symbol = p.value; - - if (!symbol) continue; - - if (symbol.is("FILE") || symbol.is("GLOBAL")) { - continue; - } - else if (!JSDOC.opt.a && !symbol.comment.isUserComment) { - JSDOC.Parser.symbols.deleteSymbol(symbol.alias); - } - - if (/#$/.test(symbol.alias)) { // we don't document prototypes - JSDOC.Parser.symbols.deleteSymbol(symbol.alias); - } - } - - return JSDOC.Parser.symbols.toArray(); -} diff --git a/doc/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js b/doc/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js deleted file mode 100644 index 9c9119310..000000000 --- a/doc/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - @namespace Holds functionality related to running plugins. -*/ -JSDOC.PluginManager = { -} - -/** - @param name A unique name that identifies that plugin. - @param handlers A collection of named functions. The names correspond to hooks in the core code. -*/ -JSDOC.PluginManager.registerPlugin = function(/**String*/name, /**Object*/handlers) { - if (!defined(JSDOC.PluginManager.plugins)) - /** The collection of all plugins. Requires a unique name for each. - */ - JSDOC.PluginManager.plugins = {}; - - - JSDOC.PluginManager.plugins[name] = handlers; -} - -/** - @param hook The name of the hook that is being caught. - @param target Any object. This will be passed as the only argument to the handler whose - name matches the hook name. Handlers cannot return a value, so must modify the target - object to have an effect. -*/ -JSDOC.PluginManager.run = function(/**String*/hook, /**Mixed*/target) { - for (var name in JSDOC.PluginManager.plugins) { - if (defined(JSDOC.PluginManager.plugins[name][hook])) { - JSDOC.PluginManager.plugins[name][hook](target); - } - } -} diff --git a/doc/jsdoc-toolkit/app/lib/JSDOC/Symbol.js b/doc/jsdoc-toolkit/app/lib/JSDOC/Symbol.js deleted file mode 100644 index c5b76a860..000000000 --- a/doc/jsdoc-toolkit/app/lib/JSDOC/Symbol.js +++ /dev/null @@ -1,645 +0,0 @@ -if (typeof JSDOC == "undefined") JSDOC = {}; - -/** - Create a new Symbol. - @class Represents a symbol in the source code. - */ -JSDOC.Symbol = function() { - this.init(); - if (arguments.length) this.populate.apply(this, arguments); -} - -JSDOC.Symbol.count = 0; - -JSDOC.Symbol.prototype.init = function() { - this._name = ""; - this._params = []; - this.$args = []; - this.addOn = ""; - this.alias = ""; - this.augments = []; - this.author = ""; - this.classDesc = ""; - this.comment = {}; - this.defaultValue = undefined; - this.deprecated = ""; - this.desc = ""; - this.example = []; - this.exceptions = []; - this.fires = []; - this.id = JSDOC.Symbol.count++; - this.inherits = []; - this.inheritsFrom = []; - this.isa = "OBJECT"; - this.isConstant = false; - this.isEvent = false; - this.isIgnored = false; - this.isInner = false; - this.isNamespace = false; - this.isPrivate = false; - this.isStatic = false; - this.memberOf = ""; - this.methods = []; - this.properties = []; - this.requires = []; - this.returns = []; - this.see = []; - this.since = ""; - this.srcFile = {}; - this.type = ""; - this.version = ""; -} - -JSDOC.Symbol.prototype.serialize = function() { - var keys = []; - for (var p in this) { - keys.push (p); - } - keys = keys.sort(); - - var out = ""; - for (var i in keys) { - if (typeof this[keys[i]] == "function") continue; - out += keys[i]+" => "+Dumper.dump(this[keys[i]])+",\n"; - } - return "\n{\n" + out + "}\n"; -} - -JSDOC.Symbol.prototype.clone = function() { - var clone = new JSDOC.Symbol(); - clone.populate.apply(clone, this.$args); // repopulate using the original arguments - clone.srcFile = this.srcFile; // not the current srcFile, the one when the original was made - return clone; -} - -JSDOC.Symbol.prototype.__defineSetter__("name", - function(n) { n = n.replace(/^_global_[.#-]/, ""); n = n.replace(/\.prototype\.?/g, '#'); this._name = n; } -); -JSDOC.Symbol.prototype.__defineGetter__("name", - function() { return this._name; } -); -JSDOC.Symbol.prototype.__defineSetter__("params", - function(v) { - for (var i = 0, l = v.length; i < l; i++) { - if (v[i].constructor != JSDOC.DocTag) { // may be a generic object parsed from signature, like {type:..., name:...} - this._params[i] = new JSDOC.DocTag("param"+((v[i].type)?" {"+v[i].type+"}":"")+" "+v[i].name); - } - else { - this._params[i] = v[i]; - } - } - } -); -JSDOC.Symbol.prototype.__defineGetter__("params", - function() { return this._params; } -); - -JSDOC.Symbol.prototype.getEvents = function() { - var events = []; - for (var i = 0, l = this.methods.length; i < l; i++) { - if (this.methods[i].isEvent) { - this.methods[i].name = this.methods[i].name.replace("event:", ""); - events.push(this.methods[i]); - } - } - return events; -} - -JSDOC.Symbol.prototype.getMethods = function() { - var nonEvents = []; - for (var i = 0, l = this.methods.length; i < l; i++) { - if (!this.methods[i].isEvent) { - nonEvents.push(this.methods[i]); - } - } - return nonEvents; -} - - -JSDOC.Symbol.prototype.populate = function( - /** String */ name, - /** Object[] */ params, - /** String */ isa, - /** JSDOC.DocComment */ comment -) { - this.$args = arguments; - - this.name = name; - this.alias = this.name; - - this.params = params; - this.isa = (isa == "VIRTUAL")? "OBJECT":isa; - this.comment = comment || new JSDOC.DocComment(""); - this.srcFile = JSDOC.Symbol.srcFile; - - if (this.is("FILE") && !this.alias) this.alias = this.srcFile; - - this.setTags(); - - if (typeof JSDOC.PluginManager != "undefined") { - JSDOC.PluginManager.run("onSymbol", this); - } -} - -JSDOC.Symbol.prototype.setTags = function() { - // @author - var authors = this.comment.getTag("author"); - if (authors.length) { - this.author = authors.map(function($){return $.desc;}).join(", "); - } - - /*t: - plan(34, "testing JSDOC.Symbol"); - - requires("../lib/JSDOC/DocComment.js"); - requires("../frame/String.js"); - requires("../lib/JSDOC/DocTag.js"); - - var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@author Joe Smith*"+"/")); - is(sym.author, "Joe Smith", "@author tag, author is found."); - */ - - // @desc - var descs = this.comment.getTag("desc"); - if (descs.length) { - this.desc = descs.map(function($){return $.desc;}).join("\n"); // multiple descriptions are concatenated into one - } - - /*t: - var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@desc This is a description.*"+"/")); - is(sym.desc, "This is a description.", "@desc tag, description is found."); - */ - - // @overview - if (this.is("FILE")) { - if (!this.alias) this.alias = this.srcFile; - - var overviews = this.comment.getTag("overview"); - if (overviews.length) { - this.desc = [this.desc].concat(overviews.map(function($){return $.desc;})).join("\n"); - } - } - - /*t: - var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@overview This is an overview.*"+"/")); - is(sym.desc, "\nThis is an overview.", "@overview tag, description is found."); - */ - - // @since - var sinces = this.comment.getTag("since"); - if (sinces.length) { - this.since = sinces.map(function($){return $.desc;}).join(", "); - } - - /*t: - var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@since 1.01*"+"/")); - is(sym.since, "1.01", "@since tag, description is found."); - */ - - // @constant - if (this.comment.getTag("constant").length) { - this.isConstant = true; - } - - /*t: - var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@constant*"+"/")); - is(sym.isConstant, true, "@constant tag, isConstant set."); - */ - - // @version - var versions = this.comment.getTag("version"); - if (versions.length) { - this.version = versions.map(function($){return $.desc;}).join(", "); - } - - /*t: - var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@version 2.0x*"+"/")); - is(sym.version, "2.0x", "@version tag, version is found."); - */ - - // @deprecated - var deprecateds = this.comment.getTag("deprecated"); - if (deprecateds.length) { - this.deprecated = deprecateds.map(function($){return $.desc;}).join("\n"); - } - - /*t: - var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@deprecated Use other method.*"+"/")); - is(sym.deprecated, "Use other method.", "@deprecated tag, desc is found."); - */ - - // @example - var examples = this.comment.getTag("example"); - if (examples.length) { - this.example = examples.map( - // trim trailing whitespace - function($) { - $.desc = $.desc.replace(/\s+$/, ""); - return $; - } - ); - } - - /*t: - var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@example This\n is an example. \n*"+"/")); - isnt(typeof sym.example[0], "undefined", "@example tag, creates sym.example array."); - is(sym.example[0], "This\n is an example.", "@example tag, desc is found."); - */ - - // @see - var sees = this.comment.getTag("see"); - if (sees.length) { - var thisSee = this.see; - sees.map(function($){thisSee.push($.desc);}); - } - - /*t: - var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@see The other thing.*"+"/")); - is(sym.see, "The other thing.", "@see tag, desc is found."); - */ - - // @class - var classes = this.comment.getTag("class"); - if (classes.length) { - this.isa = "CONSTRUCTOR"; - this.classDesc = classes[0].desc; // desc can't apply to the constructor as there is none. - } - - /*t: - var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@class This describes the class.*"+"/")); - is(sym.isa, "CONSTRUCTOR", "@class tag, makes symbol a constructor."); - is(sym.classDesc, "This describes the class.", "@class tag, class description is found."); - */ - - // @namespace - var namespaces = this.comment.getTag("namespace"); - if (namespaces.length) { - this.classDesc = namespaces[0].desc; - this.isNamespace = true; - } - - /*t: - var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@namespace This describes the namespace.*"+"/")); - is(sym.classDesc, "This describes the namespace.", "@namespace tag, class description is found."); - */ - - // @param - var params = this.comment.getTag("param"); - if (params.length) { - // user-defined params overwrite those with same name defined by the parser - var thisParams = this.params; - - if (thisParams.length == 0) { // none exist yet, so just bung all these user-defined params straight in - this.params = params; - } - else { // need to overlay these user-defined params on to existing parser-defined params - for (var i = 0, l = params.length; i < l; i++) { - if (thisParams[i]) { - if (params[i].type) thisParams[i].type = params[i].type; - thisParams[i].name = params[i].name; - thisParams[i].desc = params[i].desc; - thisParams[i].isOptional = params[i].isOptional; - thisParams[i].defaultValue = params[i].defaultValue; - } - else thisParams[i] = params[i]; - } - } - } - - /*t: - var sym = new JSDOC.Symbol("foo", [{type: "array", name: "pages"}], "FUNCTION", new JSDOC.DocComment("/**Description.*"+"/")); - is(sym.params.length, 1, "parser defined param is found."); - - sym = new JSDOC.Symbol("foo", [], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {array} pages*"+"/")); - is(sym.params.length, 1, "user defined param is found."); - is(sym.params[0].type, "array", "user defined param type is found."); - is(sym.params[0].name, "pages", "user defined param name is found."); - - sym = new JSDOC.Symbol("foo", [{type: "array", name: "pages"}], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {string} uid*"+"/")); - is(sym.params.length, 1, "user defined param overwrites parser defined param."); - is(sym.params[0].type, "string", "user defined param type overwrites parser defined param type."); - is(sym.params[0].name, "uid", "user defined param name overwrites parser defined param name."); - - sym = new JSDOC.Symbol("foo", [{type: "array", name: "pages"}, {type: "number", name: "count"}], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {string} uid*"+"/")); - is(sym.params.length, 2, "user defined params overlay parser defined params."); - is(sym.params[1].type, "number", "user defined param type overlays parser defined param type."); - is(sym.params[1].name, "count", "user defined param name overlays parser defined param name."); - - sym = new JSDOC.Symbol("foo", [], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {array} pages The pages description.*"+"/")); - is(sym.params.length, 1, "user defined param with description is found."); - is(sym.params[0].desc, "The pages description.", "user defined param description is found."); - */ - - // @constructor - if (this.comment.getTag("constructor").length) { - this.isa = "CONSTRUCTOR"; - } - - /*t: - var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@constructor*"+"/")); - is(sym.isa, "CONSTRUCTOR", "@constructor tag, makes symbol a constructor."); - */ - - // @static - if (this.comment.getTag("static").length) { - this.isStatic = true; - if (this.isa == "CONSTRUCTOR") { - this.isNamespace = true; - } - } - - /*t: - var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@static\n@constructor*"+"/")); - is(sym.isStatic, true, "@static tag, makes isStatic true."); - is(sym.isNamespace, true, "@static and @constructor tag, makes isNamespace true."); - */ - - // @inner - if (this.comment.getTag("inner").length) { - this.isInner = true; - this.isStatic = false; - } - - /*t: - var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@inner*"+"/")); - is(sym.isStatic, false, "@inner tag, makes isStatic false."); - is(sym.isInner, true, "@inner makes isInner true."); - */ - - // @name - var names = this.comment.getTag("name"); - if (names.length) { - this.name = names[0].desc; - } - - /*t: - // todo - */ - - // @field - if (this.comment.getTag("field").length) { - this.isa = "OBJECT"; - } - - /*t: - var sym = new JSDOC.Symbol("foo", [], "FUNCTION", new JSDOC.DocComment("/**@field*"+"/")); - is(sym.isa, "OBJECT", "@field tag, makes symbol an object."); - */ - - // @function - if (this.comment.getTag("function").length) { - this.isa = "FUNCTION"; - if (/event:/.test(this.alias)) this.isEvent = true; - } - - /*t: - var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@function*"+"/")); - is(sym.isa, "FUNCTION", "@function tag, makes symbol a function."); - */ - - // @event - var events = this.comment.getTag("event"); - if (events.length) { - this.isa = "FUNCTION"; - this.isEvent = true; - if (!/event:/.test(this.alias)) - this.alias = this.alias.replace(/^(.*[.#-])([^.#-]+)$/, "$1event:$2"); - } - - /*t: - var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@event*"+"/")); - is(sym.isa, "FUNCTION", "@event tag, makes symbol a function."); - is(sym.isEvent, true, "@event makes isEvent true."); - */ - - // @fires - var fires = this.comment.getTag("fires"); - if (fires.length) { - for (var i = 0; i < fires.length; i++) { - this.fires.push(fires[i].desc); - } - } - - /*t: - // todo - */ - - // @property - var properties = this.comment.getTag("property"); - if (properties.length) { - thisProperties = this.properties; - for (var i = 0; i < properties.length; i++) { - var property = new JSDOC.Symbol(this.alias+"#"+properties[i].name, [], "OBJECT", new JSDOC.DocComment("/**"+properties[i].desc+"\n@name "+properties[i].name+"\n@memberOf "+this.alias+"#*/")); - // TODO: shouldn't the following happen in the addProperty method of Symbol? - property.name = properties[i].name; - property.memberOf = this.alias; - if (properties[i].type) property.type = properties[i].type; - if (properties[i].defaultValue) property.defaultValue = properties[i].defaultValue; - this.addProperty(property); - JSDOC.Parser.addSymbol(property); - } - } - - /*t: - // todo - */ - - // @return - var returns = this.comment.getTag("return"); - if (returns.length) { // there can be many return tags in a single doclet - this.returns = returns; - this.type = returns.map(function($){return $.type}).join(", "); - } - - /*t: - // todo - */ - - // @exception - this.exceptions = this.comment.getTag("throws"); - - /*t: - // todo - */ - - // @requires - var requires = this.comment.getTag("requires"); - if (requires.length) { - this.requires = requires.map(function($){return $.desc}); - } - - /*t: - // todo - */ - - // @type - var types = this.comment.getTag("type"); - if (types.length) { - this.type = types[0].desc; //multiple type tags are ignored - } - - /*t: - // todo - */ - - // @private - if (this.comment.getTag("private").length || this.isInner) { - this.isPrivate = true; - } - - // @ignore - if (this.comment.getTag("ignore").length) { - this.isIgnored = true; - } - - /*t: - // todo - */ - - // @inherits ... as ... - var inherits = this.comment.getTag("inherits"); - if (inherits.length) { - for (var i = 0; i < inherits.length; i++) { - if (/^\s*([a-z$0-9_.#:-]+)(?:\s+as\s+([a-z$0-9_.#:-]+))?/i.test(inherits[i].desc)) { - var inAlias = RegExp.$1; - var inAs = RegExp.$2 || inAlias; - - if (inAlias) inAlias = inAlias.replace(/\.prototype\.?/g, "#"); - - if (inAs) { - inAs = inAs.replace(/\.prototype\.?/g, "#"); - inAs = inAs.replace(/^this\.?/, "#"); - } - - if (inAs.indexOf(inAlias) != 0) { //not a full namepath - var joiner = "."; - if (this.alias.charAt(this.alias.length-1) == "#" || inAs.charAt(0) == "#") { - joiner = ""; - } - inAs = this.alias + joiner + inAs; - } - } - this.inherits.push({alias: inAlias, as: inAs}); - } - } - - /*t: - // todo - */ - - // @augments - this.augments = this.comment.getTag("augments"); - - // @default - var defaults = this.comment.getTag("default"); - if (defaults.length) { - if (this.is("OBJECT")) { - this.defaultValue = defaults[0].desc; - } - } - - /*t: - // todo - */ - - // @memberOf - var memberOfs = this.comment.getTag("memberOf"); - if (memberOfs.length) { - this.memberOf = memberOfs[0].desc; - this.memberOf = this.memberOf.replace(/\.prototype\.?/g, "#"); - } - - /*t: - // todo - */ - - // @public - if (this.comment.getTag("public").length) { - this.isPrivate = false; - } - - /*t: - // todo - */ - - if (JSDOC.PluginManager) { - JSDOC.PluginManager.run("onSetTags", this); - } -} - -JSDOC.Symbol.prototype.is = function(what) { - return this.isa === what; -} - -JSDOC.Symbol.prototype.isBuiltin = function() { - return JSDOC.Lang.isBuiltin(this.alias); -} - -JSDOC.Symbol.prototype.setType = function(/**String*/comment, /**Boolean*/overwrite) { - if (!overwrite && this.type) return; - var typeComment = JSDOC.DocComment.unwrapComment(comment); - this.type = typeComment; -} - -JSDOC.Symbol.prototype.inherit = function(symbol) { - if (!this.hasMember(symbol.name) && !symbol.isInner) { - if (symbol.is("FUNCTION")) - this.methods.push(symbol); - else if (symbol.is("OBJECT")) - this.properties.push(symbol); - } -} - -JSDOC.Symbol.prototype.hasMember = function(name) { - return (this.hasMethod(name) || this.hasProperty(name)); -} - -JSDOC.Symbol.prototype.addMember = function(symbol) { - if (symbol.is("FUNCTION")) { this.addMethod(symbol); } - else if (symbol.is("OBJECT")) { this.addProperty(symbol); } -} - -JSDOC.Symbol.prototype.hasMethod = function(name) { - var thisMethods = this.methods; - for (var i = 0, l = thisMethods.length; i < l; i++) { - if (thisMethods[i].name == name) return true; - if (thisMethods[i].alias == name) return true; - } - return false; -} - -JSDOC.Symbol.prototype.addMethod = function(symbol) { - var methodAlias = symbol.alias; - var thisMethods = this.methods; - for (var i = 0, l = thisMethods.length; i < l; i++) { - if (thisMethods[i].alias == methodAlias) { - thisMethods[i] = symbol; // overwriting previous method - return; - } - } - thisMethods.push(symbol); // new method with this alias -} - -JSDOC.Symbol.prototype.hasProperty = function(name) { - var thisProperties = this.properties; - for (var i = 0, l = thisProperties.length; i < l; i++) { - if (thisProperties[i].name == name) return true; - if (thisProperties[i].alias == name) return true; - } - return false; -} - -JSDOC.Symbol.prototype.addProperty = function(symbol) { - var propertyAlias = symbol.alias; - var thisProperties = this.properties; - for (var i = 0, l = thisProperties.length; i < l; i++) { - if (thisProperties[i].alias == propertyAlias) { - thisProperties[i] = symbol; // overwriting previous property - return; - } - } - - thisProperties.push(symbol); // new property with this alias -} - -JSDOC.Symbol.srcFile = ""; //running reference to the current file being parsed diff --git a/doc/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js b/doc/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js deleted file mode 100644 index 82657e44e..000000000 --- a/doc/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js +++ /dev/null @@ -1,241 +0,0 @@ -/** @constructor */ -JSDOC.SymbolSet = function() { - this.init(); -} - -JSDOC.SymbolSet.prototype.init = function() { - this._index = new Hash(); -} - -JSDOC.SymbolSet.prototype.keys = function() { - return this._index.keys(); -} - -JSDOC.SymbolSet.prototype.hasSymbol = function(alias) { - return this._index.hasKey(alias); -} - -JSDOC.SymbolSet.prototype.addSymbol = function(symbol) { - if (this.hasSymbol(symbol.alias)) { - LOG.warn("Overwriting symbol documentation for: "+symbol.alias + "."); - } - this._index.set(symbol.alias, symbol); -} - -JSDOC.SymbolSet.prototype.getSymbol = function(alias) { - if (this.hasSymbol(alias)) return this._index.get(alias); -} - -JSDOC.SymbolSet.prototype.getSymbolByName = function(name) { - for (var p = this._index.first(); p; p = this._index.next()) { - var symbol = p.value; - if (symbol.name == name) return symbol; - } -} - -JSDOC.SymbolSet.prototype.toArray = function() { - return this._index.values(); -} - -JSDOC.SymbolSet.prototype.deleteSymbol = function(alias) { - if (!this.hasSymbol(alias)) return; - this._index.drop(alias); -} - -JSDOC.SymbolSet.prototype.renameSymbol = function(oldName, newName) { - // todo: should check if oldname or newname already exist - this._index.replace(oldName, newName); - this._index.get(newName).alias = newName; - return newName; -} - -JSDOC.SymbolSet.prototype.relate = function() { - this.resolveBorrows(); - this.resolveMemberOf(); - this.resolveAugments(); -} - -JSDOC.SymbolSet.prototype.resolveBorrows = function() { - for (var p = this._index.first(); p; p = this._index.next()) { - var symbol = p.value; - if (symbol.is("FILE") || symbol.is("GLOBAL")) continue; - - var borrows = symbol.inherits; - for (var i = 0; i < borrows.length; i++) { - -if (/#$/.test(borrows[i].alias)) { - LOG.warn("Attempted to borrow entire instance of "+borrows[i].alias+" but that feature is not yet implemented."); - return; -} - var borrowed = this.getSymbol(borrows[i].alias); - - if (!borrowed) { - LOG.warn("Can't borrow undocumented "+borrows[i].alias+"."); - continue; - } - - if (borrows[i].as == borrowed.alias) { - var assumedName = borrowed.name.split(/([#.-])/).pop(); - borrows[i].as = symbol.name+RegExp.$1+assumedName; - LOG.inform("Assuming borrowed as name is "+borrows[i].as+" but that feature is experimental."); - } - - var borrowAsName = borrows[i].as; - var borrowAsAlias = borrowAsName; - if (!borrowAsName) { - LOG.warn("Malformed @borrow, 'as' is required."); - continue; - } - - if (borrowAsName.length > symbol.alias.length && borrowAsName.indexOf(symbol.alias) == 0) { - borrowAsName = borrowAsName.replace(borrowed.alias, "") - } - else { - var joiner = ""; - if (borrowAsName.charAt(0) != "#") joiner = "."; - borrowAsAlias = borrowed.alias + joiner + borrowAsName; - } - - borrowAsName = borrowAsName.replace(/^[#.]/, ""); - - if (this.hasSymbol(borrowAsAlias)) continue; - - var clone = borrowed.clone(); - clone.name = borrowAsName; - clone.alias = borrowAsAlias; - this.addSymbol(clone); - } - } -} - -JSDOC.SymbolSet.prototype.resolveMemberOf = function() { - for (var p = this._index.first(); p; p = this._index.next()) { - var symbol = p.value; - if (symbol.is("FILE") || symbol.is("GLOBAL")) continue; - - // the memberOf value was provided in the @memberOf tag - else if (symbol.memberOf) { - - // like foo.bar is a memberOf foo - if (symbol.alias.indexOf(symbol.memberOf) == 0) { - var memberMatch = new RegExp("^("+symbol.memberOf+")[.#-]?(.+)$"); - var aliasParts = symbol.alias.match(memberMatch); - - if (aliasParts) { - symbol.memberOf = aliasParts[1]; - symbol.name = aliasParts[2]; - } - - var nameParts = symbol.name.match(memberMatch); - - if (nameParts) { - symbol.name = nameParts[2]; - } - } - // like bar is a memberOf foo - else { - var joiner = symbol.memberOf.charAt(symbol.memberOf.length-1); - if (!/[.#-]/.test(joiner)) symbol.memberOf += "."; - this.renameSymbol(symbol.alias, symbol.memberOf + symbol.name); - } - } - // the memberOf must be calculated - else { - var parts = symbol.alias.match(/^(.*[.#-])([^.#-]+)$/); - if (parts) { - symbol.memberOf = parts[1]; - symbol.name = parts[2]; - } - } - - // set isStatic, isInner - if (symbol.memberOf) { - switch (symbol.memberOf.charAt(symbol.memberOf.length-1)) { - case '#' : - symbol.isStatic = false; - symbol.isInner = false; - break; - case '.' : - symbol.isStatic = true; - symbol.isInner = false; - break; - case '-' : - symbol.isStatic = false; - symbol.isInner = true; - break; - default: // memberOf ends in none of the above - symbol.isStatic = true; - break; - } - } - - // unowned methods and fields belong to the global object - if (!symbol.is("CONSTRUCTOR") && !symbol.isNamespace && symbol.memberOf == "") { - symbol.memberOf = "_global_"; - } - - // clean up - if (symbol.memberOf.match(/[.#-]$/)) { - symbol.memberOf = symbol.memberOf.substr(0, symbol.memberOf.length-1); - } - // add to parent's methods or properties list - if (symbol.memberOf) { - - var container = this.getSymbol(symbol.memberOf); - if (!container) { - if (JSDOC.Lang.isBuiltin(symbol.memberOf)) container = JSDOC.Parser.addBuiltin(symbol.memberOf); - else { - LOG.warn("Trying to document "+symbol.name +" as a member of undocumented symbol "+symbol.memberOf+"."); - } - } - - if (container) container.addMember(symbol); - } - } -} - -JSDOC.SymbolSet.prototype.resolveAugments = function() { - for (var p = this._index.first(); p; p = this._index.next()) { - var symbol = p.value; - - if (symbol.alias == "_global_" || symbol.is("FILE")) continue; - JSDOC.SymbolSet.prototype.walk.apply(this, [symbol]); - } -} - -JSDOC.SymbolSet.prototype.walk = function(symbol) { - var augments = symbol.augments; - for(var i = 0; i < augments.length; i++) { - var contributer = this.getSymbol(augments[i]); - if (!contributer && JSDOC.Lang.isBuiltin(''+augments[i])) { - contributer = new JSDOC.Symbol("_global_."+augments[i], [], augments[i], new JSDOC.DocComment("Built in.")); - contributer.isNamespace = true; - contributer.srcFile = ""; - contributer.isPrivate = false; - JSDOC.Parser.addSymbol(contributer); - } - - if (contributer) { - if (contributer.augments.length) { - JSDOC.SymbolSet.prototype.walk.apply(this, [contributer]); - } - - symbol.inheritsFrom.push(contributer.alias); - //if (!isUnique(symbol.inheritsFrom)) { - // LOG.warn("Can't resolve augments: Circular reference: "+symbol.alias+" inherits from "+contributer.alias+" more than once."); - //} - //else { - var cmethods = contributer.methods; - var cproperties = contributer.properties; - - for (var ci = 0, cl = cmethods.length; ci < cl; ci++) { - if (!cmethods[ci].isStatic) symbol.inherit(cmethods[ci]); - } - for (var ci = 0, cl = cproperties.length; ci < cl; ci++) { - if (!cproperties[ci].isStatic) symbol.inherit(cproperties[ci]); - } - //} - } - else LOG.warn("Can't augment contributer: "+augments[i]+", not found."); - } -} diff --git a/doc/jsdoc-toolkit/app/lib/JSDOC/TextStream.js b/doc/jsdoc-toolkit/app/lib/JSDOC/TextStream.js deleted file mode 100644 index ccc48a87d..000000000 --- a/doc/jsdoc-toolkit/app/lib/JSDOC/TextStream.js +++ /dev/null @@ -1,41 +0,0 @@ - -/** - @constructor -*/ -JSDOC.TextStream = function(text) { - if (typeof(text) == "undefined") text = ""; - text = ""+text; - this.text = text; - this.cursor = 0; -} - -JSDOC.TextStream.prototype.look = function(n) { - if (typeof n == "undefined") n = 0; - - if (this.cursor+n < 0 || this.cursor+n >= this.text.length) { - var result = new String(""); - result.eof = true; - return result; - } - return this.text.charAt(this.cursor+n); -} - -JSDOC.TextStream.prototype.next = function(n) { - if (typeof n == "undefined") n = 1; - if (n < 1) return null; - - var pulled = ""; - for (var i = 0; i < n; i++) { - if (this.cursor+i < this.text.length) { - pulled += this.text.charAt(this.cursor+i); - } - else { - var result = new String(""); - result.eof = true; - return result; - } - } - - this.cursor += n; - return pulled; -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/lib/JSDOC/Token.js b/doc/jsdoc-toolkit/app/lib/JSDOC/Token.js deleted file mode 100644 index fb7f9d949..000000000 --- a/doc/jsdoc-toolkit/app/lib/JSDOC/Token.js +++ /dev/null @@ -1,18 +0,0 @@ -if (typeof JSDOC == "undefined") JSDOC = {}; - -/** - @constructor -*/ -JSDOC.Token = function(data, type, name) { - this.data = data; - this.type = type; - this.name = name; -} - -JSDOC.Token.prototype.toString = function() { - return "<"+this.type+" name=\""+this.name+"\">"+this.data+""; -} - -JSDOC.Token.prototype.is = function(what) { - return this.name === what || this.type === what; -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js b/doc/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js deleted file mode 100644 index 9f658fb9f..000000000 --- a/doc/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js +++ /dev/null @@ -1,332 +0,0 @@ -if (typeof JSDOC == "undefined") JSDOC = {}; - -/** - @class Search a {@link JSDOC.TextStream} for language tokens. -*/ -JSDOC.TokenReader = function() { - this.keepDocs = true; - this.keepWhite = false; - this.keepComments = false; -} - -/** - @type {JSDOC.Token[]} - */ -JSDOC.TokenReader.prototype.tokenize = function(/**JSDOC.TextStream*/stream) { - var tokens = []; - /**@ignore*/ tokens.last = function() { return tokens[tokens.length-1]; } - /**@ignore*/ tokens.lastSym = function() { - for (var i = tokens.length-1; i >= 0; i--) { - if (!(tokens[i].is("WHIT") || tokens[i].is("COMM"))) return tokens[i]; - } - } - - while (!stream.look().eof) { - if (this.read_mlcomment(stream, tokens)) continue; - if (this.read_slcomment(stream, tokens)) continue; - if (this.read_dbquote(stream, tokens)) continue; - if (this.read_snquote(stream, tokens)) continue; - if (this.read_regx(stream, tokens)) continue; - if (this.read_numb(stream, tokens)) continue; - if (this.read_punc(stream, tokens)) continue; - if (this.read_newline(stream, tokens)) continue; - if (this.read_space(stream, tokens)) continue; - if (this.read_word(stream, tokens)) continue; - - // if execution reaches here then an error has happened - tokens.push(new JSDOC.Token(stream.next(), "TOKN", "UNKNOWN_TOKEN")); - } - return tokens; -} - -/** - @returns {Boolean} Was the token found? - */ -JSDOC.TokenReader.prototype.read_word = function(/**JSDOC.TokenStream*/stream, tokens) { - var found = ""; - while (!stream.look().eof && JSDOC.Lang.isWordChar(stream.look())) { - found += stream.next(); - } - - if (found === "") { - return false; - } - else { - var name; - if ((name = JSDOC.Lang.keyword(found))) tokens.push(new JSDOC.Token(found, "KEYW", name)); - else tokens.push(new JSDOC.Token(found, "NAME", "NAME")); - return true; - } -} - -/** - @returns {Boolean} Was the token found? - */ -JSDOC.TokenReader.prototype.read_punc = function(/**JSDOC.TokenStream*/stream, tokens) { - var found = ""; - var name; - while (!stream.look().eof && JSDOC.Lang.punc(found+stream.look())) { - found += stream.next(); - } - - if (found === "") { - return false; - } - else { - tokens.push(new JSDOC.Token(found, "PUNC", JSDOC.Lang.punc(found))); - return true; - } -} - -/** - @returns {Boolean} Was the token found? - */ -JSDOC.TokenReader.prototype.read_space = function(/**JSDOC.TokenStream*/stream, tokens) { - var found = ""; - - while (!stream.look().eof && JSDOC.Lang.isSpace(stream.look())) { - found += stream.next(); - } - - if (found === "") { - return false; - } - else { - if (this.collapseWhite) found = " "; - if (this.keepWhite) tokens.push(new JSDOC.Token(found, "WHIT", "SPACE")); - return true; - } -} - -/** - @returns {Boolean} Was the token found? - */ -JSDOC.TokenReader.prototype.read_newline = function(/**JSDOC.TokenStream*/stream, tokens) { - var found = ""; - - while (!stream.look().eof && JSDOC.Lang.isNewline(stream.look())) { - found += stream.next(); - } - - if (found === "") { - return false; - } - else { - if (this.collapseWhite) found = "\n"; - if (this.keepWhite) tokens.push(new JSDOC.Token(found, "WHIT", "NEWLINE")); - return true; - } -} - -/** - @returns {Boolean} Was the token found? - */ -JSDOC.TokenReader.prototype.read_mlcomment = function(/**JSDOC.TokenStream*/stream, tokens) { - if (stream.look() == "/" && stream.look(1) == "*") { - var found = stream.next(2); - - while (!stream.look().eof && !(stream.look(-1) == "/" && stream.look(-2) == "*")) { - found += stream.next(); - } - - // to start doclet we allow /** or /*** but not /**/ or /**** - if (/^\/\*\*([^\/]|\*[^*])/.test(found) && this.keepDocs) tokens.push(new JSDOC.Token(found, "COMM", "JSDOC")); - else if (this.keepComments) tokens.push(new JSDOC.Token(found, "COMM", "MULTI_LINE_COMM")); - return true; - } - return false; -} - -/** - @returns {Boolean} Was the token found? - */ -JSDOC.TokenReader.prototype.read_slcomment = function(/**JSDOC.TokenStream*/stream, tokens) { - var found; - if ( - (stream.look() == "/" && stream.look(1) == "/" && (found=stream.next(2))) - || - (stream.look() == "<" && stream.look(1) == "!" && stream.look(2) == "-" && stream.look(3) == "-" && (found=stream.next(4))) - ) { - - while (!stream.look().eof && !JSDOC.Lang.isNewline(stream.look())) { - found += stream.next(); - } - - if (this.keepComments) { - tokens.push(new JSDOC.Token(found, "COMM", "SINGLE_LINE_COMM")); - } - return true; - } - return false; -} - -/** - @returns {Boolean} Was the token found? - */ -JSDOC.TokenReader.prototype.read_dbquote = function(/**JSDOC.TokenStream*/stream, tokens) { - if (stream.look() == "\"") { - // find terminator - var string = stream.next(); - - while (!stream.look().eof) { - if (stream.look() == "\\") { - if (JSDOC.Lang.isNewline(stream.look(1))) { - do { - stream.next(); - } while (!stream.look().eof && JSDOC.Lang.isNewline(stream.look())); - string += "\\\n"; - } - else { - string += stream.next(2); - } - } - else if (stream.look() == "\"") { - string += stream.next(); - tokens.push(new JSDOC.Token(string, "STRN", "DOUBLE_QUOTE")); - return true; - } - else { - string += stream.next(); - } - } - } - return false; // error! unterminated string -} - -/** - @returns {Boolean} Was the token found? - */ -JSDOC.TokenReader.prototype.read_snquote = function(/**JSDOC.TokenStream*/stream, tokens) { - if (stream.look() == "'") { - // find terminator - var string = stream.next(); - - while (!stream.look().eof) { - if (stream.look() == "\\") { // escape sequence - string += stream.next(2); - } - else if (stream.look() == "'") { - string += stream.next(); - tokens.push(new JSDOC.Token(string, "STRN", "SINGLE_QUOTE")); - return true; - } - else { - string += stream.next(); - } - } - } - return false; // error! unterminated string -} - -/** - @returns {Boolean} Was the token found? - */ -JSDOC.TokenReader.prototype.read_numb = function(/**JSDOC.TokenStream*/stream, tokens) { - if (stream.look() === "0" && stream.look(1) == "x") { - return this.read_hex(stream, tokens); - } - - var found = ""; - - while (!stream.look().eof && JSDOC.Lang.isNumber(found+stream.look())){ - found += stream.next(); - } - - if (found === "") { - return false; - } - else { - if (/^0[0-7]/.test(found)) tokens.push(new JSDOC.Token(found, "NUMB", "OCTAL")); - else tokens.push(new JSDOC.Token(found, "NUMB", "DECIMAL")); - return true; - } -} -/*t: - requires("../lib/JSDOC/TextStream.js"); - requires("../lib/JSDOC/Token.js"); - requires("../lib/JSDOC/Lang.js"); - - plan(3, "testing JSDOC.TokenReader.prototype.read_numb"); - - //// setup - var src = "function foo(num){while (num+8.0 >= 0x20 && num < 0777){}}"; - var tr = new JSDOC.TokenReader(); - var tokens = tr.tokenize(new JSDOC.TextStream(src)); - - var hexToken, octToken, decToken; - for (var i = 0; i < tokens.length; i++) { - if (tokens[i].name == "HEX_DEC") hexToken = tokens[i]; - if (tokens[i].name == "OCTAL") octToken = tokens[i]; - if (tokens[i].name == "DECIMAL") decToken = tokens[i]; - } - //// - - is(decToken.data, "8.0", "decimal number is found in source."); - is(hexToken.data, "0x20", "hexdec number is found in source (issue #99)."); - is(octToken.data, "0777", "octal number is found in source."); -*/ - -/** - @returns {Boolean} Was the token found? - */ -JSDOC.TokenReader.prototype.read_hex = function(/**JSDOC.TokenStream*/stream, tokens) { - var found = stream.next(2); - - while (!stream.look().eof) { - if (JSDOC.Lang.isHexDec(found) && !JSDOC.Lang.isHexDec(found+stream.look())) { // done - tokens.push(new JSDOC.Token(found, "NUMB", "HEX_DEC")); - return true; - } - else { - found += stream.next(); - } - } - return false; -} - -/** - @returns {Boolean} Was the token found? - */ -JSDOC.TokenReader.prototype.read_regx = function(/**JSDOC.TokenStream*/stream, tokens) { - var last; - if ( - stream.look() == "/" - && - ( - - ( - !(last = tokens.lastSym()) // there is no last, the regex is the first symbol - || - ( - !last.is("NUMB") - && !last.is("NAME") - && !last.is("RIGHT_PAREN") - && !last.is("RIGHT_BRACKET") - ) - ) - ) - ) { - var regex = stream.next(); - - while (!stream.look().eof) { - if (stream.look() == "\\") { // escape sequence - regex += stream.next(2); - } - else if (stream.look() == "/") { - regex += stream.next(); - - while (/[gmi]/.test(stream.look())) { - regex += stream.next(); - } - - tokens.push(new JSDOC.Token(regex, "REGX", "REGX")); - return true; - } - else { - regex += stream.next(); - } - } - // error: unterminated regex - } - return false; -} diff --git a/doc/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js b/doc/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js deleted file mode 100644 index 1eeb44cbb..000000000 --- a/doc/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js +++ /dev/null @@ -1,133 +0,0 @@ -if (typeof JSDOC == "undefined") JSDOC = {}; - -/** - @constructor -*/ -JSDOC.TokenStream = function(tokens) { - this.tokens = (tokens || []); - this.rewind(); -} - -/** - @constructor - @private -*/ -function VoidToken(/**String*/type) { - this.toString = function() {return ""}; - this.is = function(){return false;} -} - -JSDOC.TokenStream.prototype.rewind = function() { - this.cursor = -1; -} - -/** - @type JSDOC.Token -*/ -JSDOC.TokenStream.prototype.look = function(/**Number*/n, /**Boolean*/considerWhitespace) { - if (typeof n == "undefined") n = 0; - - if (considerWhitespace == true) { - if (this.cursor+n < 0 || this.cursor+n > this.tokens.length) return {}; - return this.tokens[this.cursor+n]; - } - else { - var count = 0; - var i = this.cursor; - - while (true) { - if (i < 0) return new JSDOC.Token("", "VOID", "START_OF_STREAM"); - else if (i > this.tokens.length) return new JSDOC.Token("", "VOID", "END_OF_STREAM"); - - if (i != this.cursor && (this.tokens[i] === undefined || this.tokens[i].is("WHIT"))) { - if (n < 0) i--; else i++; - continue; - } - - if (count == Math.abs(n)) { - return this.tokens[i]; - } - count++; - (n < 0)? i-- : i++; - } - - return new JSDOC.Token("", "VOID", "STREAM_ERROR"); // because null isn't an object and caller always expects an object - } -} - -/** - @type JSDOC.Token|JSDOC.Token[] -*/ -JSDOC.TokenStream.prototype.next = function(/**Number*/howMany) { - if (typeof howMany == "undefined") howMany = 1; - if (howMany < 1) return null; - var got = []; - - for (var i = 1; i <= howMany; i++) { - if (this.cursor+i >= this.tokens.length) { - return null; - } - got.push(this.tokens[this.cursor+i]); - } - this.cursor += howMany; - - if (howMany == 1) { - return got[0]; - } - else return got; -} - -/** - @type JSDOC.Token[] -*/ -JSDOC.TokenStream.prototype.balance = function(/**String*/start, /**String*/stop) { - if (!stop) stop = JSDOC.Lang.matching(start); - - var depth = 0; - var got = []; - var started = false; - - while ((token = this.look())) { - if (token.is(start)) { - depth++; - started = true; - } - - if (started) { - got.push(token); - } - - if (token.is(stop)) { - depth--; - if (depth == 0) return got; - } - if (!this.next()) break; - } -} - -JSDOC.TokenStream.prototype.getMatchingToken = function(/**String*/start, /**String*/stop) { - var depth = 0; - var cursor = this.cursor; - - if (!start) { - start = JSDOC.Lang.matching(stop); - depth = 1; - } - if (!stop) stop = JSDOC.Lang.matching(start); - - while ((token = this.tokens[cursor])) { - if (token.is(start)) { - depth++; - } - - if (token.is(stop) && cursor) { - depth--; - if (depth == 0) return this.tokens[cursor]; - } - cursor++; - } -} - -JSDOC.TokenStream.prototype.insertAhead = function(/**JSDOC.Token*/token) { - this.tokens.splice(this.cursor+1, 0, token); -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/lib/JSDOC/Util.js b/doc/jsdoc-toolkit/app/lib/JSDOC/Util.js deleted file mode 100644 index 6d7edb368..000000000 --- a/doc/jsdoc-toolkit/app/lib/JSDOC/Util.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @namespace - * @deprecated Use {@link FilePath} instead. - */ -JSDOC.Util = { -} - -/** - * @deprecated Use {@link FilePath.fileName} instead. - */ -JSDOC.Util.fileName = function(path) { - LOG.warn("JSDOC.Util.fileName is deprecated. Use FilePath.fileName instead."); - var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0); - return path.substring(nameStart); -} - -/** - * @deprecated Use {@link FilePath.fileExtension} instead. - */ -JSDOC.Util.fileExtension = function(filename) { - LOG.warn("JSDOC.Util.fileExtension is deprecated. Use FilePath.fileExtension instead."); - return filename.split(".").pop().toLowerCase(); -}; - -/** - * @deprecated Use {@link FilePath.dir} instead. - */ -JSDOC.Util.dir = function(path) { - LOG.warn("JSDOC.Util.dir is deprecated. Use FilePath.dir instead."); - var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0); - return path.substring(0, nameStart-1); -} diff --git a/doc/jsdoc-toolkit/app/lib/JSDOC/Walker.js b/doc/jsdoc-toolkit/app/lib/JSDOC/Walker.js deleted file mode 100644 index befec4d35..000000000 --- a/doc/jsdoc-toolkit/app/lib/JSDOC/Walker.js +++ /dev/null @@ -1,474 +0,0 @@ -if (typeof JSDOC == "undefined") JSDOC = {}; - -/** @constructor */ -JSDOC.Walker = function(/**JSDOC.TokenStream*/ts) { - this.init(); - if (typeof ts != "undefined") { - this.walk(ts); - } -} - -JSDOC.Walker.prototype.init = function() { - this.ts = null; - - var globalSymbol = new JSDOC.Symbol("_global_", [], "GLOBAL", new JSDOC.DocComment("")); - globalSymbol.isNamespace = true; - globalSymbol.srcFile = ""; - globalSymbol.isPrivate = false; - JSDOC.Parser.addSymbol(globalSymbol); - this.lastDoc = null; - this.token = null; - - /** - The chain of symbols under which we are currently nested. - @type Array - */ - this.namescope = [globalSymbol]; - this.namescope.last = function(n){ if (!n) n = 0; return this[this.length-(1+n)] || "" }; -} - -JSDOC.Walker.prototype.walk = function(/**JSDOC.TokenStream*/ts) { - this.ts = ts; - while (this.token = this.ts.look()) { - if (this.token.popNamescope) { - - var symbol = this.namescope.pop(); - if (symbol.is("FUNCTION")) { - if (this.ts.look(1).is("LEFT_PAREN") && symbol.comment.getTag("function").length == 0) { - symbol.isa = "OBJECT"; - } - } - } - this.step(); - if (!this.ts.next()) break; - } -} - -JSDOC.Walker.prototype.step = function() { - if (this.token.is("JSDOC")) { // it's a doc comment - - var doc = new JSDOC.DocComment(this.token.data); - - - if (doc.getTag("exports").length > 0) { - var exports = doc.getTag("exports")[0]; - - exports.desc.match(/(\S+) as (\S+)/i); - var n1 = RegExp.$1; - var n2 = RegExp.$2; - - if (!n1 && n2) throw "@exports tag requires a value like: 'name as ns.name'"; - - JSDOC.Parser.rename = (JSDOC.Parser.rename || {}); - JSDOC.Parser.rename[n1] = n2 - } - - if (doc.getTag("lends").length > 0) { - var lends = doc.getTag("lends")[0]; - - var name = lends.desc - if (!name) throw "@lends tag requires a value."; - - var symbol = new JSDOC.Symbol(name, [], "OBJECT", doc); - - this.namescope.push(symbol); - - var matching = this.ts.getMatchingToken("LEFT_CURLY"); - if (matching) matching.popNamescope = name; - else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + "."); - - this.lastDoc = null; - return true; - } - else if (doc.getTag("name").length > 0 && doc.getTag("overview").length == 0) { // it's a virtual symbol - var virtualName = doc.getTag("name")[0].desc; - if (!virtualName) throw "@name tag requires a value."; - - var symbol = new JSDOC.Symbol(virtualName, [], "VIRTUAL", doc); - - JSDOC.Parser.addSymbol(symbol); - - this.lastDoc = null; - return true; - } - else if (doc.meta) { // it's a meta doclet - if (doc.meta == "@+") JSDOC.DocComment.shared = doc.src; - else if (doc.meta == "@-") JSDOC.DocComment.shared = ""; - else if (doc.meta == "nocode+") JSDOC.Parser.conf.ignoreCode = true; - else if (doc.meta == "nocode-") JSDOC.Parser.conf.ignoreCode = JSDOC.opt.n; - else throw "Unrecognized meta comment: "+doc.meta; - - this.lastDoc = null; - return true; - } - else if (doc.getTag("overview").length > 0) { // it's a file overview - symbol = new JSDOC.Symbol("", [], "FILE", doc); - - JSDOC.Parser.addSymbol(symbol); - - this.lastDoc = null; - return true; - } - else { - this.lastDoc = doc; - return false; - } - } - else if (!JSDOC.Parser.conf.ignoreCode) { // it's code - if (this.token.is("NAME")) { // it's the name of something - var symbol; - var name = this.token.data; - var doc = null; if (this.lastDoc) doc = this.lastDoc; - var params = []; - - // it's inside an anonymous object - if (this.ts.look(1).is("COLON") && this.ts.look(-1).is("LEFT_CURLY") && !(this.ts.look(-2).is("JSDOC") || this.namescope.last().comment.getTag("lends").length || this.ts.look(-2).is("ASSIGN") || this.ts.look(-2).is("COLON"))) { - name = "$anonymous"; - name = this.namescope.last().alias+"-"+name - - params = []; - - symbol = new JSDOC.Symbol(name, params, "OBJECT", doc); - - JSDOC.Parser.addSymbol(symbol); - - this.namescope.push(symbol); - - var matching = this.ts.getMatchingToken(null, "RIGHT_CURLY"); - if (matching) matching.popNamescope = name; - else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + "."); - } - // function foo() {} - else if (this.ts.look(-1).is("FUNCTION") && this.ts.look(1).is("LEFT_PAREN")) { - var isInner; - - if (this.lastDoc) doc = this.lastDoc; - name = this.namescope.last().alias+"-"+name; - if (!this.namescope.last().is("GLOBAL")) isInner = true; - - params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN")); - - symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc); - if (isInner) symbol.isInner = true; - - if (this.ts.look(1).is("JSDOC")) { - var inlineReturn = ""+this.ts.look(1).data; - inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, ""); - symbol.type = inlineReturn; - } - - JSDOC.Parser.addSymbol(symbol); - - this.namescope.push(symbol); - - var matching = this.ts.getMatchingToken("LEFT_CURLY"); - if (matching) matching.popNamescope = name; - else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + "."); - } - // foo = function() {} - else if (this.ts.look(1).is("ASSIGN") && this.ts.look(2).is("FUNCTION")) { - var isInner; - if (this.ts.look(-1).is("VAR") || this.isInner) { - name = this.namescope.last().alias+"-"+name - if (!this.namescope.last().is("GLOBAL")) isInner = true; - } - else if (name.indexOf("this.") == 0) { - name = this.resolveThis(name); - } - - if (this.lastDoc) doc = this.lastDoc; - params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN")); - - symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc); - if (isInner) symbol.isInner = true; - - if (this.ts.look(1).is("JSDOC")) { - var inlineReturn = ""+this.ts.look(1).data; - inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, ""); - symbol.type = inlineReturn; - } - - JSDOC.Parser.addSymbol(symbol); - - this.namescope.push(symbol); - - var matching = this.ts.getMatchingToken("LEFT_CURLY"); - if (matching) matching.popNamescope = name; - else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + "."); - } - // foo = new function() {} or foo = (function() {} - else if (this.ts.look(1).is("ASSIGN") && (this.ts.look(2).is("NEW") || this.ts.look(2).is("LEFT_PAREN")) && this.ts.look(3).is("FUNCTION")) { - var isInner; - if (this.ts.look(-1).is("VAR") || this.isInner) { - name = this.namescope.last().alias+"-"+name - if (!this.namescope.last().is("GLOBAL")) isInner = true; - } - else if (name.indexOf("this.") == 0) { - name = this.resolveThis(name); - } - - this.ts.next(3); // advance past the "new" or "(" - - if (this.lastDoc) doc = this.lastDoc; - params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN")); - - symbol = new JSDOC.Symbol(name, params, "OBJECT", doc); - if (isInner) symbol.isInner = true; - - if (this.ts.look(1).is("JSDOC")) { - var inlineReturn = ""+this.ts.look(1).data; - inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, ""); - symbol.type = inlineReturn; - } - - JSDOC.Parser.addSymbol(symbol); - - symbol.scopeType = "INSTANCE"; - this.namescope.push(symbol); - - var matching = this.ts.getMatchingToken("LEFT_CURLY"); - if (matching) matching.popNamescope = name; - else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + "."); - } - // foo: function() {} - else if (this.ts.look(1).is("COLON") && this.ts.look(2).is("FUNCTION")) { - name = (this.namescope.last().alias+"."+name).replace("#.", "#"); - - if (this.lastDoc) doc = this.lastDoc; - params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN")); - - if (doc && doc.getTag("constructs").length) { - name = name.replace(/\.prototype(\.|$)/, "#"); - - if (name.indexOf("#") > -1) name = name.match(/(^[^#]+)/)[0]; - else name = this.namescope.last().alias; - - symbol = new JSDOC.Symbol(name, params, "CONSTRUCTOR", doc); - } - else { - symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc); - } - - if (this.ts.look(1).is("JSDOC")) { - var inlineReturn = ""+this.ts.look(1).data; - inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, ""); - symbol.type = inlineReturn; - } - - JSDOC.Parser.addSymbol(symbol); - - this.namescope.push(symbol); - - var matching = this.ts.getMatchingToken("LEFT_CURLY"); - if (matching) matching.popNamescope = name; - else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + "."); - } - // foo = {} - else if (this.ts.look(1).is("ASSIGN") && this.ts.look(2).is("LEFT_CURLY")) { - var isInner; - if (this.ts.look(-1).is("VAR") || this.isInner) { - name = this.namescope.last().alias+"-"+name - if (!this.namescope.last().is("GLOBAL")) isInner = true; - } - else if (name.indexOf("this.") == 0) { - name = this.resolveThis(name); - } - - if (this.lastDoc) doc = this.lastDoc; - - symbol = new JSDOC.Symbol(name, params, "OBJECT", doc); - if (isInner) symbol.isInner = true; - - - if (doc) JSDOC.Parser.addSymbol(symbol); - - this.namescope.push(symbol); - - var matching = this.ts.getMatchingToken("LEFT_CURLY"); - if (matching) matching.popNamescope = name; - else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + "."); - } - // var foo; - else if (this.ts.look(1).is("SEMICOLON")) { - var isInner; - - if (this.ts.look(-1).is("VAR") || this.isInner) { - name = this.namescope.last().alias+"-"+name - if (!this.namescope.last().is("GLOBAL")) isInner = true; - - if (this.lastDoc) doc = this.lastDoc; - - symbol = new JSDOC.Symbol(name, params, "OBJECT", doc); - if (isInner) symbol.isInner = true; - - - if (doc) JSDOC.Parser.addSymbol(symbol); - } - } - // foo = x - else if (this.ts.look(1).is("ASSIGN")) { - var isInner; - if (this.ts.look(-1).is("VAR") || this.isInner) { - name = this.namescope.last().alias+"-"+name - if (!this.namescope.last().is("GLOBAL")) isInner = true; - } - else if (name.indexOf("this.") == 0) { - name = this.resolveThis(name); - } - - if (this.lastDoc) doc = this.lastDoc; - - symbol = new JSDOC.Symbol(name, params, "OBJECT", doc); - if (isInner) symbol.isInner = true; - - - if (doc) JSDOC.Parser.addSymbol(symbol); - } - // foo: {} - else if (this.ts.look(1).is("COLON") && this.ts.look(2).is("LEFT_CURLY")) { - name = (this.namescope.last().alias+"."+name).replace("#.", "#"); - - if (this.lastDoc) doc = this.lastDoc; - - symbol = new JSDOC.Symbol(name, params, "OBJECT", doc); - - - if (doc) JSDOC.Parser.addSymbol(symbol); - - this.namescope.push(symbol); - - var matching = this.ts.getMatchingToken("LEFT_CURLY"); - if (matching) matching.popNamescope = name; - else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + "."); - } - // foo: x - else if (this.ts.look(1).is("COLON")) { - name = (this.namescope.last().alias+"."+name).replace("#.", "#");; - - if (this.lastDoc) doc = this.lastDoc; - - symbol = new JSDOC.Symbol(name, params, "OBJECT", doc); - - - if (doc) JSDOC.Parser.addSymbol(symbol); - } - // foo(...) - else if (this.ts.look(1).is("LEFT_PAREN")) { - if (typeof JSDOC.PluginManager != "undefined") { - var functionCall = {name: name}; - - var cursor = this.ts.cursor; - params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN")); - this.ts.cursor = cursor; - - for (var i = 0; i < params.length; i++) - functionCall["arg" + (i + 1)] = params[i].name; - - JSDOC.PluginManager.run("onFunctionCall", functionCall); - if (functionCall.doc) { - this.ts.insertAhead(new JSDOC.Token(functionCall.doc, "COMM", "JSDOC")); - } - } - } - this.lastDoc = null; - } - else if (this.token.is("FUNCTION")) { // it's an anonymous function - if ( - (!this.ts.look(-1).is("COLON") || !this.ts.look(-1).is("ASSIGN")) - && !this.ts.look(1).is("NAME") - ) { - if (this.lastDoc) doc = this.lastDoc; - - name = "$anonymous"; - name = this.namescope.last().alias+"-"+name - - params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN")); - - symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc); - - JSDOC.Parser.addSymbol(symbol); - - this.namescope.push(symbol); - - var matching = this.ts.getMatchingToken("LEFT_CURLY"); - if (matching) matching.popNamescope = name; - else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + "."); - } - } - } - return true; -} - -/** - Resolves what "this." means when it appears in a name. - @param name The name that starts with "this.". - @returns The name with "this." resolved. - */ -JSDOC.Walker.prototype.resolveThis = function(name) { - name.match(/^this\.(.+)$/) - var nameFragment = RegExp.$1; - if (!nameFragment) return name; - - var symbol = this.namescope.last(); - var scopeType = symbol.scopeType || symbol.isa; - - // if we are in a constructor function, `this` means the instance - if (scopeType == "CONSTRUCTOR") { - name = symbol.alias+"#"+nameFragment; - } - - // if we are in an anonymous constructor function, `this` means the instance - else if (scopeType == "INSTANCE") { - name = symbol.alias+"."+nameFragment; - } - - // if we are in a function, `this` means the container (possibly the global) - else if (scopeType == "FUNCTION") { - // in a method of a prototype, so `this` means the constructor - if (symbol.alias.match(/(^.*)[#.-][^#.-]+/)) { - var parentName = RegExp.$1; - var parent = JSDOC.Parser.symbols.getSymbol(parentName); - - if (!parent) { - if (JSDOC.Lang.isBuiltin(parentName)) parent = JSDOC.Parser.addBuiltin(parentName); - else { - if (symbol.alias.indexOf("$anonymous") < 0) // these will be ignored eventually - LOG.warn("Trying to document "+symbol.alias+" without first documenting "+parentName+"."); - } - } - if (parent) name = parentName+(parent.is("CONSTRUCTOR")?"#":".")+nameFragment; - } - else { - parent = this.namescope.last(1); - name = parent.alias+(parent.is("CONSTRUCTOR")?"#":".")+nameFragment; - } - } - // otherwise it means the global - else { - name = nameFragment; - } - - return name; -} - -JSDOC.Walker.onParamList = function(/**Array*/paramTokens) { - if (!paramTokens) { - LOG.warn("Malformed parameter list. Can't parse code."); - return []; - } - var params = []; - for (var i = 0, l = paramTokens.length; i < l; i++) { - if (paramTokens[i].is("JSDOC")) { - var paramType = paramTokens[i].data.replace(/(^\/\*\* *| *\*\/$)/g, ""); - - if (paramTokens[i+1] && paramTokens[i+1].is("NAME")) { - i++; - params.push({type: paramType, name: paramTokens[i].data}); - } - } - else if (paramTokens[i].is("NAME")) { - params.push({name: paramTokens[i].data}); - } - } - return params; -} diff --git a/doc/jsdoc-toolkit/app/main.js b/doc/jsdoc-toolkit/app/main.js deleted file mode 100644 index 9b78182c1..000000000 --- a/doc/jsdoc-toolkit/app/main.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * @version $Id: main.js 795 2009-06-19 07:03:22Z micmath $ - */ - -function main() { - IO.include("lib/JSDOC.js"); - IO.includeDir("plugins/"); - - // process the options - - // the -c option: options are defined in a configuration file - if (JSDOC.opt.c) { - eval("JSDOC.conf = " + IO.readFile(JSDOC.opt.c)); - - LOG.inform("Using configuration file at '"+JSDOC.opt.c+"'."); - - for (var c in JSDOC.conf) { - if (c !== "D" && !defined(JSDOC.opt[c])) { // commandline overrules config file - JSDOC.opt[c] = JSDOC.conf[c]; - } - } - - if (typeof JSDOC.conf["_"] != "undefined") { - JSDOC.opt["_"] = JSDOC.opt["_"].concat(JSDOC.conf["_"]); - } - - LOG.inform("With configuration: "); - for (var o in JSDOC.opt) { - LOG.inform(" "+o+": "+JSDOC.opt[o]); - } - } - - // be verbose - if (JSDOC.opt.v) LOG.verbose = true; - - // send log messages to a file - if (JSDOC.opt.o) LOG.out = IO.open(JSDOC.opt.o); - - // run the unit tests - if (JSDOC.opt.T) { - LOG.inform("JsDoc Toolkit running in test mode at "+new Date()+"."); - IO.include("frame/Testrun.js"); - IO.include("test.js"); - } - else { - // a template must be defined and must be a directory path - if (!JSDOC.opt.t && System.getProperty("jsdoc.template.dir")) { - JSDOC.opt.t = System.getProperty("jsdoc.template.dir"); - } - if (JSDOC.opt.t && !JSDOC.opt.t.charAt(JSDOC.opt.t.length-1).match(/[\\\/]/)) { - JSDOC.opt.t += SYS.slash; - } - - // verbose messages about the options we were given - LOG.inform("JsDoc Toolkit main() running at "+new Date()+"."); - LOG.inform("With options: "); - for (var o in JSDOC.opt) { - LOG.inform(" "+o+": "+JSDOC.opt[o]); - } - - // initialize and build a symbolSet from your code - JSDOC.JsDoc(); - - // debugger's option: dump the entire symbolSet produced from your code - if (JSDOC.opt.Z) { - LOG.warn("So you want to see the data structure, eh? This might hang if you have circular refs..."); - IO.include("frame/Dumper.js"); - var symbols = JSDOC.JsDoc.symbolSet.toArray(); - for (var i = 0, l = symbols.length; i < l; i++) { - var symbol = symbols[i]; - print("// symbol: " + symbol.alias); - print(symbol.serialize()); - } - } - else { - if (typeof JSDOC.opt.t != "undefined") { - try { - // a file named "publish.js" must exist in the template directory - load(JSDOC.opt.t+"publish.js"); - - // and must define a function named "publish" - if (!publish) { - LOG.warn("No publish() function is defined in that template so nothing to do."); - } - else { - // which will be called with the symbolSet produced from your code - publish(JSDOC.JsDoc.symbolSet); - } - } - catch(e) { - LOG.warn("Sorry, that doesn't seem to be a valid template: "+JSDOC.opt.t+"publish.js : "+e); - } - } - else { - LOG.warn("No template given. Might as well read the usage notes."); - JSDOC.usage(); - } - } - } - - // notify of any warnings - if (!JSDOC.opt.q && LOG.warnings.length) { - print(LOG.warnings.length+" warning"+(LOG.warnings.length != 1? "s":"")+"."); - } - - // stop sending log messages to a file - if (LOG.out) { - LOG.out.flush(); - LOG.out.close(); - } -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/plugins/commentSrcJson.js b/doc/jsdoc-toolkit/app/plugins/commentSrcJson.js deleted file mode 100644 index e826b5722..000000000 --- a/doc/jsdoc-toolkit/app/plugins/commentSrcJson.js +++ /dev/null @@ -1,20 +0,0 @@ -JSDOC.PluginManager.registerPlugin( - "JSDOC.commentSrcJson", - { - onDocCommentSrc: function(comment) { - var json; - if (/^\s*@json\b/.test(comment)) { - comment.src = new String(comment.src).replace("@json", ""); - - eval("json = "+comment.src); - var tagged = ""; - for (var i in json) { - var tag = json[i]; - // todo handle cases where tag is an object - tagged += "@"+i+" "+tag+"\n"; - } - comment.src = tagged; - } - } - } -); \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/plugins/frameworkPrototype.js b/doc/jsdoc-toolkit/app/plugins/frameworkPrototype.js deleted file mode 100644 index 9c417518b..000000000 --- a/doc/jsdoc-toolkit/app/plugins/frameworkPrototype.js +++ /dev/null @@ -1,16 +0,0 @@ -JSDOC.PluginManager.registerPlugin( - "JSDOC.frameworkPrototype", - { - onPrototypeClassCreate: function(classCreator) { - var desc = ""; - if (classCreator.comment) { - desc = classCreator.comment; - } - var insert = desc+"/** @name "+classCreator.name+"\n@constructor\n@scope "+classCreator.name+".prototype */" - - insert = insert.replace(/\*\/\/\*\*/g, "\n"); - /*DEBUG*///print("insert is "+insert); - classCreator.addComment.data = insert; - } - } -); diff --git a/doc/jsdoc-toolkit/app/plugins/functionCall.js b/doc/jsdoc-toolkit/app/plugins/functionCall.js deleted file mode 100644 index 6f87705ee..000000000 --- a/doc/jsdoc-toolkit/app/plugins/functionCall.js +++ /dev/null @@ -1,10 +0,0 @@ -JSDOC.PluginManager.registerPlugin( - "JSDOC.functionCall", - { - onFunctionCall: function(functionCall) { - if (functionCall.name == "dojo.define" && functionCall.arg1) { - functionCall.doc = "/** @lends "+eval(functionCall.arg1)+".prototype */"; - } - } - } -); \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/plugins/publishSrcHilite.js b/doc/jsdoc-toolkit/app/plugins/publishSrcHilite.js deleted file mode 100644 index 65514f2c9..000000000 --- a/doc/jsdoc-toolkit/app/plugins/publishSrcHilite.js +++ /dev/null @@ -1,62 +0,0 @@ -JSDOC.PluginManager.registerPlugin( - "JSDOC.publishSrcHilite", - { - onPublishSrc: function(src) { - if (src.path in JsHilite.cache) { - return; // already generated src code - } - else JsHilite.cache[src.path] = true; - - try { - var sourceCode = IO.readFile(src.path); - } - catch(e) { - print(e.message); - quit(); - } - - var hiliter = new JsHilite(sourceCode, src.charset); - src.hilited = hiliter.hilite(); - } - } -); - -function JsHilite(src, charset) { - - var tr = new JSDOC.TokenReader(); - - tr.keepComments = true; - tr.keepDocs = true; - tr.keepWhite = true; - - this.tokens = tr.tokenize(new JSDOC.TextStream(src)); - - // TODO is redefining toString() the best way? - JSDOC.Token.prototype.toString = function() { - return ""+this.data.replace(/"; - } - - if (!charset) charset = "utf-8"; - - this.header = ' '+ - "

";
-	this.footer = "
"; - this.showLinenumbers = true; -} - -JsHilite.cache = {}; - -JsHilite.prototype.hilite = function() { - var hilited = this.tokens.join(""); - var line = 1; - if (this.showLinenumbers) hilited = hilited.replace(/(^|\n)/g, function(m){return m+""+((line<10)? " ":"")+((line<100)? " ":"")+(line++)+" "}); - - return this.header+hilited+this.footer; -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/plugins/symbolLink.js b/doc/jsdoc-toolkit/app/plugins/symbolLink.js deleted file mode 100644 index c87f1ca7b..000000000 --- a/doc/jsdoc-toolkit/app/plugins/symbolLink.js +++ /dev/null @@ -1,10 +0,0 @@ -JSDOC.PluginManager.registerPlugin( - "JSDOC.symbolLink", - { - onSymbolLink: function(link) { - // modify link.linkPath (the href part of the link) - // or link.linkText (the text displayed) - // or link.linkInner (the #name part of the link) - } - } -); \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/plugins/tagParamConfig.js b/doc/jsdoc-toolkit/app/plugins/tagParamConfig.js deleted file mode 100644 index 3ea8a1be2..000000000 --- a/doc/jsdoc-toolkit/app/plugins/tagParamConfig.js +++ /dev/null @@ -1,31 +0,0 @@ -JSDOC.PluginManager.registerPlugin( - "JSDOC.tagParamConfig", - { - onDocCommentTags: function(comment) { - var currentParam = null; - var tags = comment.tags; - for (var i = 0, l = tags.length; i < l; i++) { - - if (tags[i].title == "param") { - if (tags[i].name.indexOf(".") == -1) { - currentParam = i; - } - } - else if (tags[i].title == "config") { - tags[i].title = "param"; - if (currentParam == null) { - tags[i].name = "arguments"+"."+tags[i].name; - } - else if (tags[i].name.indexOf(tags[currentParam].name+".") != 0) { - tags[i].name = tags[currentParam].name+"."+tags[i].name; - } - currentParam != null - //tags[currentParam].properties.push(tags[i]); - } - else { - currentParam = null; - } - } - } - } -); diff --git a/doc/jsdoc-toolkit/app/plugins/tagSynonyms.js b/doc/jsdoc-toolkit/app/plugins/tagSynonyms.js deleted file mode 100644 index 49a874f19..000000000 --- a/doc/jsdoc-toolkit/app/plugins/tagSynonyms.js +++ /dev/null @@ -1,43 +0,0 @@ -JSDOC.PluginManager.registerPlugin( - "JSDOC.tagSynonyms", - { - onDocCommentSrc: function(comment) { - comment.src = comment.src.replace(/@methodOf\b/i, "@function\n@memberOf"); - comment.src = comment.src.replace(/@fieldOf\b/i, "@field\n@memberOf"); - }, - - onDocCommentTags: function(comment) { - for (var i = 0, l = comment.tags.length; i < l; i++) { - var title = comment.tags[i].title.toLowerCase(); - var syn; - if ((syn = JSDOC.tagSynonyms.synonyms["="+title])) { - comment.tags[i].title = syn; - } - } - } - } -); - -new Namespace( - "JSDOC.tagSynonyms", - function() { - JSDOC.tagSynonyms.synonyms = { - "=member": "memberOf", - "=memberof": "memberOf", - "=description": "desc", - "=exception": "throws", - "=argument": "param", - "=returns": "return", - "=classdescription": "class", - "=fileoverview": "overview", - "=extends": "augments", - "=base": "augments", - "=projectdescription": "overview", - "=classdescription": "class", - "=link": "see", - "=borrows": "inherits", - "=scope": "lends", - "=construct": "constructor" - } - } -); \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/run.js b/doc/jsdoc-toolkit/app/run.js deleted file mode 100644 index 1f875cdbb..000000000 --- a/doc/jsdoc-toolkit/app/run.js +++ /dev/null @@ -1,348 +0,0 @@ -/** - * @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(); diff --git a/doc/jsdoc-toolkit/app/t/TestDoc.js b/doc/jsdoc-toolkit/app/t/TestDoc.js deleted file mode 100644 index c0768b71c..000000000 --- a/doc/jsdoc-toolkit/app/t/TestDoc.js +++ /dev/null @@ -1,144 +0,0 @@ -var TestDoc = { - fails: 0, - plans: 0, - passes: 0, - results: [] -}; - -TestDoc.record = function(result) { - TestDoc.results.push(result); - if (typeof result.verdict == "boolean") { - if (result.verdict === false) TestDoc.fails++; - if (result.verdict === true) TestDoc.passes++; - } -} - -TestDoc.prove = function(filePath) { - if (typeof document != "undefined" && typeof document.write != "undefined") { - if (TestDoc.console) print = function(s) { TestDoc.console.appendChild(document.createTextNode(s+"\n")); } - else print = function(s) { document.write(s+"
"); } - } - TestDoc.run(TestDoc.readFile(filePath)); -} - -TestDoc.run = function(src) { - try { eval(src); } catch(e) { print("# ERROR! "+e); } - - var chunks = src.split(/\/\*t:/); - - var run = function(chunk) { - // local shortcuts - var is = TestDoc.assertEquals; - var isnt = TestDoc.assertNotEquals; - var plan = TestDoc.plan; - var requires = TestDoc.requires; - - try { eval(chunk); } catch(e) { print("# ERROR! "+e); } - } - for (var start = -1, end = 0; (start = src.indexOf("/*t:", end)) > end; start = end) { - run( - src.substring( - start+4, - (end = src.indexOf("*/", start)) - ) - ); - } -} - -TestDoc.Result = function(verdict, message) { - this.verdict = verdict; - this.message = message; -} - -TestDoc.Result.prototype.toString = function() { - if (typeof this.verdict == "boolean") { - return (this.verdict? "ok" : "not ok") + " " + (++TestDoc.report.counter) + " - " + this.message; - } - - return "# " + this.message; -} - -TestDoc.requires = function(file) { - if (!TestDoc.requires.loaded[file]) { - load(file); - TestDoc.requires.loaded[file] = true; - } -} -TestDoc.requires.loaded = {}; - -TestDoc.report = function() { - TestDoc.report.counter = 0; - print("1.."+TestDoc.plans); - for (var i = 0; i < TestDoc.results.length; i++) { - print(TestDoc.results[i]); - } - print("----------------------------------------"); - if (TestDoc.fails == 0 && TestDoc.passes == TestDoc.plans) { - print("All tests successful."); - } - else { - print("Failed " + TestDoc.fails + "/" + TestDoc.plans + " tests, "+((TestDoc.plans == 0)? 0 : Math.round(TestDoc.passes/(TestDoc.passes+TestDoc.fails)*10000)/100)+"% okay. Planned to run "+TestDoc.plans+", did run "+(TestDoc.passes+TestDoc.fails)+".") - } -} - -TestDoc.plan = function(n, message) { - TestDoc.plans += n; - TestDoc.record(new TestDoc.Result(null, message+" ("+n+" tests)")); -} - -TestDoc.assertEquals = function(a, b, message) { - var result = (a == b); - if (!result) message += "\n#\n# " + a + " does not equal " + b + "\n#"; - TestDoc.record(new TestDoc.Result(result, message)); -} - -TestDoc.assertNotEquals = function(a, b, message) { - var result = (a != b); - if (!result) message += "\n#\n# " + a + " equals " + b + "\n#"; - TestDoc.record(new TestDoc.Result(result, message)); -} - -TestDoc.readFile = (function(){ - // rhino - if (typeof readFile == "function") { - return function(url) { - var text = readFile(url); - return text || ""; - } - } - - // a web browser - else { - return function(url) { - var httpRequest; - - if (window.XMLHttpRequest) { // Mozilla, Safari, etc - httpRequest = new XMLHttpRequest(); - } - else if (window.ActiveXObject) { // IE - try { - httpRequest = new ActiveXObject("Msxml2.XMLHTTP"); - } - catch (e) { - try { - httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); - } - catch (e) { - } - } - } - - if (!httpRequest) { throw "Cannot create HTTP Request."; } - - httpRequest.open('GET', url, false); - httpRequest.send(''); - if (httpRequest.readyState == 4) { - if (httpRequest.status >= 400) { - throw "The HTTP Request returned an error code: "+httpRequest.status; - } - } - - return httpRequest.responseText || ""; - } - } -})(); diff --git a/doc/jsdoc-toolkit/app/t/runner.js b/doc/jsdoc-toolkit/app/t/runner.js deleted file mode 100644 index 3f9fb4c96..000000000 --- a/doc/jsdoc-toolkit/app/t/runner.js +++ /dev/null @@ -1,13 +0,0 @@ -// try: java -jar ../../jsrun.jar runner.js - -load("TestDoc.js"); - -TestDoc.prove("../frame/Opt.js"); -TestDoc.prove("../lib/JSDOC.js"); -TestDoc.prove("../frame/String.js"); -TestDoc.prove("../lib/JSDOC/DocTag.js"); -TestDoc.prove("../lib/JSDOC/DocComment.js"); -TestDoc.prove("../lib/JSDOC/TokenReader.js"); -TestDoc.prove("../lib/JSDOC/Symbol.js"); - -TestDoc.report(); diff --git a/doc/jsdoc-toolkit/app/test.js b/doc/jsdoc-toolkit/app/test.js deleted file mode 100644 index 787d84f72..000000000 --- a/doc/jsdoc-toolkit/app/test.js +++ /dev/null @@ -1,325 +0,0 @@ -load("app/frame/Dumper.js"); -function symbolize(opt) { - symbols = null; - JSDOC.JsDoc(opt); - symbols = JSDOC.JsDoc.symbolSet; -} - -var testCases = [ - function() { - symbolize({a:true, p:true, _: [SYS.pwd+"test/overview.js"]}); - //print(Dumper.dump(symbols)); - is('symbols.getSymbolByName("My Cool Library").name', 'My Cool Library', 'File overview can be found by alias.'); - } - , - function() { - symbolize({_: [SYS.pwd+"test/name.js"]}); - - is('symbols.getSymbol("Response").name', "Response", 'Virtual class name is found.'); - is('symbols.getSymbol("Response#text").alias', "Response#text", 'Virtual method name is found.'); - is('symbols.getSymbol("Response#text").memberOf', "Response", 'Virtual method parent name is found.'); - } - , - function() { - symbolize({a:true, p:true, _: [SYS.pwd+"test/prototype.js"]}); - - is('symbols.getSymbol("Article").name', "Article", 'Function set to constructor prototype with inner constructor name is found.'); - is('symbols.getSymbol("Article").hasMethod("init")', true, 'The initializer method name of prototype function is correct.'); - is('symbols.getSymbol("Article").hasMember("counter")', true, 'A static property set in the prototype definition is found.'); - is('symbols.getSymbol("Article").hasMember("title")', true, 'An instance property set in the prototype is found.'); - is('symbols.getSymbol("Article#title").isStatic', false, 'An instance property has isStatic set to false.'); - is('symbols.getSymbol("Article.counter").name', "counter", 'A static property set in the initializer has the name set correctly.'); - is('symbols.getSymbol("Article.counter").memberOf', "Article", 'A static property set in the initializer has the memberOf set correctly.'); - is('symbols.getSymbol("Article.counter").isStatic', true, 'A static property set in the initializer has isStatic set to true.'); - } - , - function() { - symbolize({a:true, _: [SYS.pwd+"test/prototype_oblit.js"]}); - - is('symbols.getSymbol("Article").name', "Article", 'Oblit set to constructor prototype name is found.'); - is('typeof symbols.getSymbol("Article.prototype")', "undefined", 'The prototype oblit is not a symbol.'); - is('symbols.getSymbol("Article#getTitle").name', "getTitle", 'The nonstatic method name of prototype oblit is correct.'); - is('symbols.getSymbol("Article#getTitle").alias', "Article#getTitle", 'The alias of non-static method of prototype oblit is correct.'); - is('symbols.getSymbol("Article#getTitle").isStatic', false, 'The isStatic of a nonstatic method of prototype oblit is correct.'); - is('symbols.getSymbol("Article.getTitle").name', "getTitle", 'The static method name of prototype oblit is correct.'); - is('symbols.getSymbol("Article.getTitle").isStatic', true, 'The isStatic of a static method of prototype oblit is correct.'); - is('symbols.getSymbol("Article#getTitle").isa', "FUNCTION", 'The isa of non-static method of prototype oblit is correct.'); - is('symbols.getSymbol("Article.getTitle").alias', "Article.getTitle", 'The alias of a static method of prototype oblit is correct.'); - is('symbols.getSymbol("Article.getTitle").isa', "FUNCTION", 'The isa of static method of prototype oblit is correct.'); - } - , - function() { - symbolize({a:true, p:true, _: [SYS.pwd+"test/prototype_oblit_constructor.js"]}); - - is('symbols.getSymbol("Article").name', "Article", 'Oblit set to constructor prototype with inner constructor name is found.'); - is('symbols.getSymbol("Article#init").name', "init", 'The initializer method name of prototype oblit is correct.'); - is('symbols.getSymbol("Article").hasMember("pages")', true, 'Property set by initializer method "this" is on the outer constructor.'); - is('symbols.getSymbol("Article#Title").name', "Title", 'Name of the inner constructor name is found.'); - is('symbols.getSymbol("Article#Title").memberOf', "Article", 'The memberOf of the inner constructor name is found.'); - is('symbols.getSymbol("Article#Title").isa', "CONSTRUCTOR", 'The isa of the inner constructor name is constructor.'); - is('symbols.getSymbol("Article#Title").hasMember("title")', true, 'A property set on the inner constructor "this" is on the inner constructor.'); - } - , - function() { - symbolize({a:true, p:true, _: [SYS.pwd+"test/inner.js"]}); - - is('symbols.getSymbol("Outer").name', "Outer", 'Outer constructor prototype name is found.'); - is('symbols.getSymbol("Outer").methods.length', 1, 'Inner function doesnt appear as a method of the outer.'); - is('symbols.getSymbol("Outer").hasMethod("open")', true, 'Outer constructors methods arent affected by inner function.'); - is('symbols.getSymbol("Outer-Inner").alias', "Outer-Inner", 'Alias of inner function is found.'); - is('symbols.getSymbol("Outer-Inner").isa', "CONSTRUCTOR", 'isa of inner function constructor is found.'); - is('symbols.getSymbol("Outer-Inner").memberOf', "Outer", 'The memberOf of inner function is found.'); - is('symbols.getSymbol("Outer-Inner").name', "Inner", 'The name of inner function is found.'); - is('symbols.getSymbol("Outer-Inner#name").name', "name", 'A member of the inner function constructor, attached to "this" is found on inner.'); - is('symbols.getSymbol("Outer-Inner#name").memberOf', "Outer-Inner", 'The memberOf of an inner function member is found.'); - } - , - function() { - symbolize({a:true, _: [SYS.pwd+"test/prototype_nested.js"]}); - - is('symbols.getSymbol("Word").name', "Word", 'Base constructor name is found.'); - is('symbols.getSymbol("Word").hasMethod("reverse")', true, 'Base constructor method is found.'); - is('symbols.getSymbol("Word").methods.length', 1, 'Base constructor has only one method.'); - is('symbols.getSymbol("Word").memberOf', "", 'Base constructor memberOf is empty.'); - is('symbols.getSymbol("Word#reverse").name', "reverse", 'Member of constructor prototype name is found.'); - is('symbols.getSymbol("Word#reverse").memberOf', "Word", 'Member of constructor prototype memberOf is found.'); - is('symbols.getSymbol("Word#reverse.utf8").name', "utf8", 'Member of constructor prototype method name is found.'); - is('symbols.getSymbol("Word#reverse.utf8").memberOf', "Word#reverse", 'Static nested member memberOf is found.'); - } - , - function() { - symbolize({a:true, _: [SYS.pwd+"test/namespace_nested.js"]}); - - is('symbols.getSymbol("ns1").name', "ns1", 'Base namespace name is found.'); - is('symbols.getSymbol("ns1").memberOf', "", 'Base namespace memberOf is empty (its a constructor).'); - is('symbols.getSymbol("ns1.ns2").name', "ns2", 'Nested namespace name is found.'); - is('symbols.getSymbol("ns1.ns2").alias', "ns1.ns2", 'Nested namespace alias is found.'); - is('symbols.getSymbol("ns1.ns2").memberOf', "ns1", 'Nested namespace memberOf is found.'); - is('symbols.getSymbol("ns1.ns2.Function1").name', "Function1", 'Method of nested namespace name is found.'); - is('symbols.getSymbol("ns1.ns2.Function1").memberOf', "ns1.ns2", 'Constructor of nested namespace memberOf is found.'); - } - , - function() { - symbolize({a:true, p:true, _: [SYS.pwd+"test/functions_nested.js"]}); - - is('symbols.getSymbol("Zop").name', "Zop", 'Any constructor name is found.'); - is('symbols.getSymbol("Zop").isa', "CONSTRUCTOR", 'It isa constructor.'); - is('symbols.getSymbol("Zop").hasMethod("zap")', true, 'Its method name, set later, is in methods array.'); - is('symbols.getSymbol("Foo").name', "Foo", 'The containing constructor name is found.'); - is('symbols.getSymbol("Foo").hasMethod("methodOne")', true, 'Its method name is found.'); - is('symbols.getSymbol("Foo").hasMethod("methodTwo")', true, 'Its second method name is found.'); - is('symbols.getSymbol("Foo#methodOne").alias', "Foo#methodOne", 'A methods alias is found.'); - is('symbols.getSymbol("Foo#methodOne").isStatic', false, 'A methods is not static.'); - is('symbols.getSymbol("Bar").name', "Bar", 'A global function declared inside another function is found.'); - is('symbols.getSymbol("Bar").isa', "FUNCTION", 'It isa function.'); - is('symbols.getSymbol("Bar").memberOf', "_global_", 'It is global.'); - is('symbols.getSymbol("Foo-inner").name', "inner", 'An inner functions name is found.'); - is('symbols.getSymbol("Foo-inner").memberOf', "Foo", 'It is member of the outer function.'); - is('symbols.getSymbol("Foo-inner").isInner', true, 'It is an inner function.'); - } - , - function() { - symbolize({a:true, _: [SYS.pwd+"test/memberof_constructor.js"]}); - - is('symbols.getSymbol("Circle#Tangent").name', "Tangent", 'Constructor set on prototype using @member has correct name.'); - is('symbols.getSymbol("Circle#Tangent").memberOf', "Circle", 'Constructor set on prototype using @member has correct memberOf.'); - is('symbols.getSymbol("Circle#Tangent").alias', "Circle#Tangent", 'Constructor set on prototype using @member has correct alias.'); - is('symbols.getSymbol("Circle#Tangent").isa', "CONSTRUCTOR", 'Constructor set on prototype using @member has correct isa.'); - is('symbols.getSymbol("Circle#Tangent").isStatic', false, 'Constructor set on prototype using @member is not static.'); - is('symbols.getSymbol("Circle#Tangent#getDiameter").name', "getDiameter", 'Method set on prototype using @member has correct name.'); - is('symbols.getSymbol("Circle#Tangent#getDiameter").memberOf', "Circle#Tangent", 'Method set on prototype using @member has correct memberOf.'); - is('symbols.getSymbol("Circle#Tangent#getDiameter").alias', "Circle#Tangent#getDiameter", 'Method set on prototype using @member has correct alias.'); - is('symbols.getSymbol("Circle#Tangent#getDiameter").isa', "FUNCTION", 'Method set on prototype using @member has correct isa.'); - is('symbols.getSymbol("Circle#Tangent#getDiameter").isStatic', false, 'Method set on prototype using @member is not static.'); - } - , - function() { - symbolize({a:true, p: true, _: [SYS.pwd+"test/memberof.js"]}); - - is('symbols.getSymbol("pack.install").alias', "pack.install", 'Using @memberOf sets alias, when parent name is in memberOf tag.'); - is('symbols.getSymbol("pack.install.overwrite").name', "install.overwrite", 'Using @memberOf sets name, even if the name is dotted.'); - is('symbols.getSymbol("pack.install.overwrite").memberOf', "pack", 'Using @memberOf sets memberOf.'); - is('symbols.getSymbol("pack.install.overwrite").isStatic', true, 'Using @memberOf with value not ending in octothorp sets isStatic to true.'); - } - , - function() { - symbolize({a:true, p:true, _: [SYS.pwd+"test/borrows.js"]}); - - is('symbols.getSymbol("Layout").name', "Layout", 'Constructor can be found.'); - is('symbols.getSymbol("Layout").hasMethod("init")', true, 'Constructor method name can be found.'); - is('symbols.getSymbol("Layout").hasMember("orientation")', true, 'Constructor property name can be found.'); - - is('symbols.getSymbol("Page").hasMethod("reset")', true, 'Second constructor method name can be found.'); - is('symbols.getSymbol("Page").hasMember("orientation")', true, 'Second constructor borrowed property name can be found in properties.'); - is('symbols.getSymbol("Page#orientation").memberOf', "Page", 'Second constructor borrowed property memberOf can be found.'); - is('symbols.getSymbol("Page-getInnerElements").alias', "Page-getInnerElements", 'Can borrow an inner function and it is still inner.'); - is('symbols.getSymbol("Page.units").alias', "Page.units", 'Can borrow a static function and it is still static.'); - - is('symbols.getSymbol("ThreeColumnPage#init").alias', "ThreeColumnPage#init", 'Third constructor method can be found even though method with same name is borrowed.'); - is('symbols.getSymbol("ThreeColumnPage#reset").alias', "ThreeColumnPage#reset", 'Borrowed method can be found.'); - is('symbols.getSymbol("ThreeColumnPage#orientation").alias', "ThreeColumnPage#orientation", 'Twice borrowed method can be found.'); - - } - , - function() { - symbolize({a:true, p:true, _: [SYS.pwd+"test/borrows2.js"]}); - - is('symbols.getSymbol("Foo").hasMethod("my_zop")', true, 'Borrowed method can be found.'); - is('symbols.getSymbol("Bar").hasMethod("my_zip")', true, 'Second borrowed method can be found.'); - } - , - function() { - symbolize({a:true, p:true, _: [SYS.pwd+"test/constructs.js"]}); - - is('symbols.getSymbol("Person").hasMethod("say")', true, 'The constructs tag creates a class that lends can add a method to.'); - } - , - function() { - symbolize({a: true, _: [SYS.pwd+"test/augments.js", SYS.pwd+"test/augments2.js"]}); - - is('symbols.getSymbol("Page").augments[0]', "Layout", 'An augmented class can be found.'); - is('symbols.getSymbol("Page#reset").alias', "Page#reset", 'Method of augmenter can be found.'); - is('symbols.getSymbol("Page").hasMethod("Layout#init")', true, 'Method from augmented can be found.'); - is('symbols.getSymbol("Page").hasMember("Layout#orientation")', true, 'Property from augmented can be found.'); - is('symbols.getSymbol("Page").methods.length', 3, 'Methods of augmented class are included in methods array.'); - - is('symbols.getSymbol("ThreeColumnPage").augments[0]', "Page", 'The extends tag is a synonym for augments.'); - is('symbols.getSymbol("ThreeColumnPage").hasMethod("ThreeColumnPage#init")', true, 'Local method overrides augmented method of same name.'); - is('symbols.getSymbol("ThreeColumnPage").methods.length', 3, 'Local method count is right.'); - - is('symbols.getSymbol("NewsletterPage").augments[0]', "ThreeColumnPage", 'Can augment across file boundaries.'); - is('symbols.getSymbol("NewsletterPage").augments.length', 2, 'Multiple augments are supported.'); - is('symbols.getSymbol("NewsletterPage").inherits[0].alias', "Junkmail#annoy", 'Inherited method with augments.'); - is('symbols.getSymbol("NewsletterPage").methods.length', 6, 'Methods of augmented class are included in methods array across files.'); - is('symbols.getSymbol("NewsletterPage").properties.length', 1, 'Properties of augmented class are included in properties array across files.'); - } - , - function() { - symbolize({a:true, _: [SYS.pwd+"test/static_this.js"]}); - - is('symbols.getSymbol("box.holder").name', "holder", 'Static namespace name can be found.'); - is('symbols.getSymbol("box.holder.foo").name', "foo", 'Static namespace method name can be found.'); - is('symbols.getSymbol("box.holder").isStatic', true, 'Static namespace method is static.'); - - is('symbols.getSymbol("box.holder.counter").name', "counter", 'Instance namespace property name set on "this" can be found.'); - is('symbols.getSymbol("box.holder.counter").alias', "box.holder.counter", 'Instance namespace property alias set on "this" can be found.'); - is('symbols.getSymbol("box.holder.counter").memberOf', "box.holder", 'Static namespace property memberOf set on "this" can be found.'); - } - , - function() { - symbolize({a:true, p: true, _: [SYS.pwd+"test/lend.js"]}); - - is('symbols.getSymbol("Person").name', "Person", 'Class defined in lend comment is found.'); - is('symbols.getSymbol("Person").hasMethod("initialize")', true, 'Lent instance method name can be found.'); - is('symbols.getSymbol("Person").hasMethod("say")', true, 'Second instance method can be found.'); - is('symbols.getSymbol("Person#sing").isStatic', false, 'Instance method is known to be not static.'); - - is('symbols.getSymbol("Person.getCount").name', "getCount", 'Static method name from second lend comment can be found.'); - is('symbols.getSymbol("Person.getCount").isStatic', true, 'Static method from second lend comment is known to be static.'); - - is('LOG.warnings.filter(function($){if($.indexOf("notok") > -1) return $}).length', 1, 'A warning is emitted when lending to an undocumented parent.'); - } - , - function() { - symbolize({a:true, _: [SYS.pwd+"test/param_inline.js"]}); - - is('symbols.getSymbol("Layout").params[0].type', "int", 'Inline param name is set.'); - is('symbols.getSymbol("Layout").params[0].desc', "The number of columns.", 'Inline param desc is set from comment.'); - is('symbols.getSymbol("Layout#getElement").params[0].name', "id", 'User defined param documentation takes precedence over parser defined.'); - is('symbols.getSymbol("Layout#getElement").params[0].isOptional', true, 'Default for param is to not be optional.'); - is('symbols.getSymbol("Layout#getElement").params[1].isOptional', false, 'Can mark a param as being optional.'); - is('symbols.getSymbol("Layout#getElement").params[1].type', "number|string", 'Type of inline param doc can have multiple values.'); - is('symbols.getSymbol("Layout#Canvas").params[0].type', "", 'Type can be not defined for some params.'); - is('symbols.getSymbol("Layout#Canvas").params[2].type', "int", 'Type can be defined inline for only some params.'); - is('symbols.getSymbol("Layout#rotate").params.length', 0, 'Docomments inside function sig is ignored without a param.'); - is('symbols.getSymbol("Layout#init").params[2].type', "zoppler", 'Doc comment type overrides inline type for param with same name.'); - } - , - function() { - symbolize({a: true, _: [SYS.pwd+"test/shared.js", SYS.pwd+"test/shared2.js"]}); - - is('symbols.getSymbol("Array#some").name', 'some', 'The name of a symbol in a shared section is found.'); - is('symbols.getSymbol("Array#some").alias', 'Array#some', 'The alias of a symbol in a shared section is found.'); - is('symbols.getSymbol("Array#some").desc', "Extension to builtin array.", 'A description can be shared.'); - is('symbols.getSymbol("Array#filter").desc', "Extension to builtin array.\nChange every element of an array.", 'A shared description is appended.'); - is('symbols.getSymbol("Queue").desc', "A first in, first out data structure.", 'A description is not shared when outside a shared section.'); - is('symbols.getSymbol("Queue.rewind").alias', "Queue.rewind", 'Second shared tag can be started.'); - is('symbols.getSymbol("startOver").alias', "startOver", 'Shared tag doesnt cross over files.'); - } - , - function() { - symbolize({a: true, _: [SYS.pwd+"test/config.js"]}); - is('symbols.getSymbol("Contact").params[0].name', 'person', 'The name of a param is found.'); - is('symbols.getSymbol("Contact").params[1].name', 'person.name', 'The name of a param set with a dot name is found.'); - is('symbols.getSymbol("Contact").params[2].name', 'person.age', 'The name of a second param set with a dot name is found.'); - is('symbols.getSymbol("Contact").params[4].name', 'connection', 'The name of a param after config is found.'); - - is('symbols.getSymbol("Family").params[0].name', 'persons', 'Another name of a param is found.'); - is('symbols.getSymbol("Family").params[1].name', 'persons.Father', 'The name of a param+config is found.'); - is('symbols.getSymbol("Family").params[2].name', 'persons.Mother', 'The name of a second param+config is found.'); - is('symbols.getSymbol("Family").params[3].name', 'persons.Children', 'The name of a third param+config is found.'); - } - , - function() { - symbolize({a:true, p:true, _: [SYS.pwd+"test/ignore.js"]}); - is('LOG.warnings.filter(function($){if($.indexOf("undocumented symbol Ignored") > -1) return $}).length', 1, 'A warning is emitted when documenting members of an ignored parent.'); - } - , - function() { - symbolize({a:true, p:true, _: [SYS.pwd+"test/functions_anon.js"]}); - is('symbols.getSymbol("a.b").alias', 'a.b', 'In anonymous constructor this is found to be the container object.'); - is('symbols.getSymbol("a.f").alias', 'a.f', 'In anonymous constructor this can have a method.'); - is('symbols.getSymbol("a.c").alias', 'a.c', 'In anonymous constructor method this is found to be the container object.'); - is('symbols.getSymbol("g").alias', 'g', 'In anonymous function executed inline this is the global.'); - is('symbols.getSymbol("bar2.p").alias', 'bar2.p', 'In named constructor executed inline this is the container object.'); - is('symbols.getSymbol("module.pub").alias', 'module.pub', 'In parenthesized anonymous function executed inline function scoped variables arent documented.'); - } - , - function() { - symbolize({a:true, p:true, _: [SYS.pwd+"test/oblit_anon.js"]}); - is('symbols.getSymbol("opt").name', 'opt', 'Anonymous object properties are created.'); - is('symbols.getSymbol("opt.conf.keep").alias', 'opt.conf.keep', 'Anonymous object first property is assigned to $anonymous.'); - is('symbols.getSymbol("opt.conf.base").alias', 'opt.conf.base', 'Anonymous object second property is assigned to $anonymous.'); - } - , - function() { - symbolize({a:true, p:true, _: [SYS.pwd+"test/params_optional.js"]}); - is('symbols.getSymbol("Document").params.length', 3, 'Correct number of params are found when optional param syntax is used.'); - is('symbols.getSymbol("Document").params[1].name', "id", 'Name of optional param is found.'); - is('symbols.getSymbol("Document").params[1].isOptional', true, 'Optional param is marked isOptional.'); - is('symbols.getSymbol("Document").params[2].name', "title", 'Name of optional param with default value is found.'); - is('symbols.getSymbol("Document").params[2].isOptional', true, 'Optional param with default value is marked isOptional.'); - is('symbols.getSymbol("Document").params[2].defaultValue', " This is untitled.", 'Optional param default value is found.'); - } - , - function() { - symbolize({a:true, p:true, _: [SYS.pwd+"test/synonyms.js"]}); - is('symbols.getSymbol("myObject.myFunc").type', 'function', 'Type can be set to function.'); - } - , - function() { - symbolize({a:true, p:true, _: [SYS.pwd+"test/event.js"]}); - is('symbols.getSymbol("Kitchen#event:cakeEaten").isEvent', true, 'Function with event prefix is an event.'); - is('symbols.getSymbol("Kitchen#cakeEaten").isa', "FUNCTION", 'Function with same name as event isa function.'); - } - , - function() { - symbolize({x:"js", a:true, _: [SYS.pwd+"test/scripts/"]}); - is('JSDOC.JsDoc.srcFiles.length', 1, 'Only js files are scanned when -x=js.'); - } - , - function() { - symbolize({x:"js", a:true, _: [SYS.pwd+"test/exports.js"]}); - is('symbols.getSymbol("mxn.Map#doThings").name', 'doThings', 'Exports creates a documentation alias that can have methods.'); - } - , - function() { - symbolize({p:true, a:true, _: [SYS.pwd+"test/module.js"]}); - is('symbols.getSymbol("myProject.myModule.myPublicMethod").name', 'myPublicMethod', 'A function wrapped in parens can be recognized.'); - is('symbols.getSymbol("myProject.myModule-myPrivateMethod").name', 'myPrivateMethod', 'A private method in the scope of a function wrapped in parens can be recognized.'); - is('symbols.getSymbol("myProject.myModule-myPrivateVar").name', 'myPrivateVar', 'A private member in the scope of a function wrapped in parens can be recognized.'); - } -]; - -//// run and print results -print(testrun(testCases)); diff --git a/doc/jsdoc-toolkit/app/test/addon.js b/doc/jsdoc-toolkit/app/test/addon.js deleted file mode 100644 index 888620533..000000000 --- a/doc/jsdoc-toolkit/app/test/addon.js +++ /dev/null @@ -1,24 +0,0 @@ -String.prototype.reverse = function() { -} - -String.prototype.reverse.utf8 = function() { -} - -Function.count = function() { -} - -/** @memberOf Function */ -Function.count.reset = function() { -} - -/** @memberOf Function */ -count.getValue = function() { -} - -/** @memberOf Function.prototype */ -getSig = function() { -} - -/** @memberOf Function.prototype */ -Function.prototype.getProps = function() { -} diff --git a/doc/jsdoc-toolkit/app/test/anon_inner.js b/doc/jsdoc-toolkit/app/test/anon_inner.js deleted file mode 100644 index 227eeee55..000000000 --- a/doc/jsdoc-toolkit/app/test/anon_inner.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * @name bar - * @namespace - */ - -new function() { - /** - * @name bar-foo - * @function - * @param {number} x - */ - function foo(x) { - } -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/augments.js b/doc/jsdoc-toolkit/app/test/augments.js deleted file mode 100644 index 12e706ebc..000000000 --- a/doc/jsdoc-toolkit/app/test/augments.js +++ /dev/null @@ -1,31 +0,0 @@ -/** -@constructor -*/ -function Layout(p) { - this.init = function(p) { - } - - this.getId = function() { - } - - /** @type Page */ - this.orientation = "landscape"; -} - -/** -@constructor -@augments Layout -*/ -function Page() { - this.reset = function(b) { - } -} - -/** -@extends Page -@constructor -*/ -function ThreeColumnPage() { - this.init = function(resetCode) { - } -} diff --git a/doc/jsdoc-toolkit/app/test/augments2.js b/doc/jsdoc-toolkit/app/test/augments2.js deleted file mode 100644 index e8388f0f8..000000000 --- a/doc/jsdoc-toolkit/app/test/augments2.js +++ /dev/null @@ -1,26 +0,0 @@ -/** -@constructor -*/ -function LibraryItem() { - this.reserve = function() { - } -} - -/** -@constructor -*/ -function Junkmail() { - this.annoy = function() { - } -} - -/** -@inherits Junkmail.prototype.annoy as pester -@augments ThreeColumnPage -@augments LibraryItem -@constructor -*/ -function NewsletterPage() { - this.getHeadline = function() { - } -} diff --git a/doc/jsdoc-toolkit/app/test/borrows.js b/doc/jsdoc-toolkit/app/test/borrows.js deleted file mode 100644 index a5d8ea4aa..000000000 --- a/doc/jsdoc-toolkit/app/test/borrows.js +++ /dev/null @@ -1,46 +0,0 @@ -/** -@constructor -*/ -function Layout(p) { - /** initilize 1 */ - this.init = function(p) { - } - - /** get the id */ - this.getId = function() { - } - - /** @type string */ - this.orientation = "landscape"; - - function getInnerElements(elementSecretId){ - } -} - -/** A static method. */ -Layout.units = function() { -} - -/** -@constructor -@borrows Layout#orientation -@borrows Layout-getInnerElements -@borrows Layout.units -*/ -function Page() { - /** reset the page */ - this.reset = function(b) { - } -} - -/** -@constructor -@borrows Layout.prototype.orientation as this.orientation -@borrows Layout.prototype.init as #init -@inherits Page.prototype.reset as #reset -*/ -function ThreeColumnPage() { - /** initilize 2 */ - this.init = function(p) { - } -} diff --git a/doc/jsdoc-toolkit/app/test/borrows2.js b/doc/jsdoc-toolkit/app/test/borrows2.js deleted file mode 100644 index c0d5ea21f..000000000 --- a/doc/jsdoc-toolkit/app/test/borrows2.js +++ /dev/null @@ -1,23 +0,0 @@ -// testing circular borrows - -/** - @class - @borrows Bar#zop as this.my_zop -*/ -function Foo() { - /** this is a zip. */ - this.zip = function() {} - - this.my_zop = new Bar().zop; -} - -/** - @class - @borrows Foo#zip as this.my_zip -*/ -function Bar() { - /** this is a zop. */ - this.zop = function() {} - - this.my_zip = new Foo().zip; -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/config.js b/doc/jsdoc-toolkit/app/test/config.js deleted file mode 100644 index 0748a210a..000000000 --- a/doc/jsdoc-toolkit/app/test/config.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * @constructor - * @param person The person. - * @param {string} person.name The person's name. - * @config {integer} age The person's age. - * @config [id=1] Optional id number to use. - * @param connection - */ -function Contact(person, connection) { - -} - -/** - * @constructor - * @param persons - * @config {string} Father The paternal person. - * @config {string} Mother The maternal person. - * @config {string[]} Children And the rest. - */ -function Family(/**Object*/persons) { - -} diff --git a/doc/jsdoc-toolkit/app/test/constructs.js b/doc/jsdoc-toolkit/app/test/constructs.js deleted file mode 100644 index cca5dbd38..000000000 --- a/doc/jsdoc-toolkit/app/test/constructs.js +++ /dev/null @@ -1,18 +0,0 @@ -var Person = makeClass( - /** - @scope Person - */ - { - /** - This is just another way to define a constructor. - @constructs - @param {string} name The name of the person. - */ - initialize: function(name) { - this.name = name; - }, - say: function(message) { - return this.name + " says: " + message; - } - } -); \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/encoding.js b/doc/jsdoc-toolkit/app/test/encoding.js deleted file mode 100644 index ba6421931..000000000 --- a/doc/jsdoc-toolkit/app/test/encoding.js +++ /dev/null @@ -1,10 +0,0 @@ - -/** - * @Constructor - * @desc é…置文件 - * @class 什么也ä¸è¿”回 - */ -function Test(conf) { - // do something; -} - diff --git a/doc/jsdoc-toolkit/app/test/encoding_other.js b/doc/jsdoc-toolkit/app/test/encoding_other.js deleted file mode 100644 index b144da4cf..000000000 --- a/doc/jsdoc-toolkit/app/test/encoding_other.js +++ /dev/null @@ -1,12 +0,0 @@ - -/** - * @Constructor - * @desc ðïîÛ - * @class ßàáâãäåæçèçìëêíîï °±²³´µ¡¶·¸¹ - */ -function Test(conf) { - // do something; -} - -// run with commanline option -e=iso-8859-5 - diff --git a/doc/jsdoc-toolkit/app/test/event.js b/doc/jsdoc-toolkit/app/test/event.js deleted file mode 100644 index 7e41d6f63..000000000 --- a/doc/jsdoc-toolkit/app/test/event.js +++ /dev/null @@ -1,54 +0,0 @@ -/** - * @name Kitchen - * @constructor - * @fires Bakery#event:donutOrdered - */ - -/** - * Fired when some cake is eaten. - * @name Kitchen#event:cakeEaten - * @function - * @param {Number} pieces The number of pieces eaten. - */ - -/** - * Find out if cake was eaten. - * @name Kitchen#cakeEaten - * @function - * @param {Boolean} wasEaten - */ - -/** - * @name getDesert - * @function - * @fires Kitchen#event:cakeEaten - */ - -/** - * @name Bakery - * @constructor - * @extends Kitchen - */ - -/** - * Fired when a donut order is made. - * @name Bakery#event:donutOrdered - * @event - * @param {Event} e The event object. - * @param {String} [e.topping] Optional sprinkles. - */ - -/** - * @constructor - * @borrows Bakery#event:donutOrdered as this.event:cakeOrdered - */ -function CakeShop() { -} - -/** @event */ -CakeShop.prototype.icingReady = function(isPink) { -} - -/** @event */ -function amHungry(/**Boolean*/enoughToEatAHorse) { -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/exports.js b/doc/jsdoc-toolkit/app/test/exports.js deleted file mode 100644 index 63a87cb4d..000000000 --- a/doc/jsdoc-toolkit/app/test/exports.js +++ /dev/null @@ -1,14 +0,0 @@ -/** @namespace */ -var mxn = {}; - -(function(){ - /** @exports Map as mxn.Map */ - var Map = - /** @constructor */ - mxn.Map = function() { - }; - - /** A method. */ - Map.prototype.doThings = function() { - }; -})(); \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/functions_anon.js b/doc/jsdoc-toolkit/app/test/functions_anon.js deleted file mode 100644 index e9dd6c1be..000000000 --- a/doc/jsdoc-toolkit/app/test/functions_anon.js +++ /dev/null @@ -1,39 +0,0 @@ -/** an anonymous constructor executed inline */ -a = new function() { - /** a.b*/ - this.b = 1; - /** a.f */ - this.f = function() { - /** a.c */ - this.c = 2; - } -} - - -/** - named function executed inline -*/ -bar1 = function Zoola1() { - /** property of global */ - this.g = 1; -}(); - -/** - named constructor executed inline -*/ -bar2 = new function Zoola2() { - /** property of bar */ - this.p = 1; -}; - -/** module pattern */ -module = (function () { - /** won't appear in documentation */ - var priv = 1; - - /** @scope module */ - return { - /** will appear as a property of module */ - pub: 1 - } -})(); diff --git a/doc/jsdoc-toolkit/app/test/functions_nested.js b/doc/jsdoc-toolkit/app/test/functions_nested.js deleted file mode 100644 index f044fafee..000000000 --- a/doc/jsdoc-toolkit/app/test/functions_nested.js +++ /dev/null @@ -1,33 +0,0 @@ -/** @constructor */ -function Zop() { -} - -/** - @class -*/ -Foo = function(id) { - // this is a bit twisted, but if you call Foo() you will then - // modify Foo(). This is kinda, sorta non-insane, because you - // would have to call Foo() 100% of the time to use Foo's methods - Foo.prototype.methodOne = function(bar) { - alert(bar); - }; - - // same again - Foo.prototype.methodTwo = function(bar2) { - alert(bar2); - }; - - // and these are only executed if the enclosing function is actually called - // and who knows if that will ever happen? - Bar = function(pez) { - alert(pez); - }; - Zop.prototype.zap = function(p){ - alert(p); - }; - - // but this is only visible inside Foo - function inner() { - } -}; diff --git a/doc/jsdoc-toolkit/app/test/global.js b/doc/jsdoc-toolkit/app/test/global.js deleted file mode 100644 index 5ea489496..000000000 --- a/doc/jsdoc-toolkit/app/test/global.js +++ /dev/null @@ -1,13 +0,0 @@ -/** ecks */ -var x = [1, 2, 4]; - -var y = { - foo: function(){ - } -} - -bar = function() { -} - -function zop() { -} diff --git a/doc/jsdoc-toolkit/app/test/globals.js b/doc/jsdoc-toolkit/app/test/globals.js deleted file mode 100644 index 3f83fb1f9..000000000 --- a/doc/jsdoc-toolkit/app/test/globals.js +++ /dev/null @@ -1,25 +0,0 @@ -function example(/**Circle*/a, b) { - /** a global defined in function */ - var number = a; - - var hideNumber = function(){ - } - - setNumber = function(){ - } - alert('You have chosen: ' + b); -} - -function initPage() { - var supported = document.createElement && document.getElementsByTagName; - if (!supported) return; - // start of DOM script - var x = document.getElementById('writeroot'); - // etc. -} - -/** an example var */ -var document = new Document(x, y); - -var getNumber = function(){ -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/ignore.js b/doc/jsdoc-toolkit/app/test/ignore.js deleted file mode 100644 index d3fac9ed5..000000000 --- a/doc/jsdoc-toolkit/app/test/ignore.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * A test constructor. - * @constructor - * @ignore - */ -function Ignored() { - /** a method */ - this.bar = function() { - } -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/inner.js b/doc/jsdoc-toolkit/app/test/inner.js deleted file mode 100644 index 37cfa9dc2..000000000 --- a/doc/jsdoc-toolkit/app/test/inner.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * @constructor - */ -function Outer() { - /** - * @constructor - */ - function Inner(name) { - /** The name of this. */ - this.name = name; - } - - this.open = function(name) { - return (new Inner(name)); - } -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/jsdoc_test.js b/doc/jsdoc-toolkit/app/test/jsdoc_test.js deleted file mode 100644 index 081771285..000000000 --- a/doc/jsdoc-toolkit/app/test/jsdoc_test.js +++ /dev/null @@ -1,477 +0,0 @@ -/** - * @fileoverview This file is to be used for testing the JSDoc parser - * It is not intended to be an example of good JavaScript OO-programming, - * nor is it intended to fulfill any specific purpose apart from - * demonstrating the functionality of the - * JSDoc parser - * - * @author Gabriel Reid gab_reid@users.sourceforge.net - * @version 0.1 - */ - - -/** - * Construct a new Shape object. - * @class This is the basic Shape class. - * It can be considered an abstract class, even though no such thing - * really existing in JavaScript - * @constructor - * @throws MemoryException if there is no more memory - * @throws GeneralShapeException rarely (if ever) - * @return {Shape|Coordinate} A new shape. - */ -function Shape(){ - - /** - * This is an example of a function that is not given as a property - * of a prototype, but instead it is assigned within a constructor. - * For inner functions like this to be picked up by the parser, the - * function that acts as a constructor must be denoted with - * the @constructor tag in its comment. - * @type String - */ - this.getClassName = function(){ - return "Shape"; - } - - /** - * This is an inner method, just used here as an example - * @since version 0.5 - * @author Sue Smart - */ - function addReference(){ - // Do nothing... - } - -} - -/** - * Create a new Hexagon instance. - * @extends Shape - * @class Hexagon is a class that is a logical sublcass of - * {@link Shape} (thanks to the @extends tag), but in - * reality it is completely unrelated to Shape. - * @param {int} sideLength The length of one side for the new Hexagon - * @example - * var h = new Hexagon(2); - * @example - * if (hasHex) { - * hex = new Hexagon(5); - * color = hex.getColor(); - * } - */ -function Hexagon(sideLength) { -} - - -/** - * This is an unattached (static) function that adds two integers together. - * @param {int} One The first number to add - * @param {int} Two The second number to add - * @author Gabriel Reid - * @deprecated So you shouldn't use it anymore! Use {@link Shape#getClassName} instead. - */ -function Add(One, Two){ - return One + Two; -} - - -/** - * The color of this shape - * @type Color - */ -Shape.prototype.color = null; - -/** - * The border of this shape. - * @field - * @type int - */ -Shape.prototype.border = function(){return border;}; - -/* - * These are all the instance method implementations for Shape - */ - -/** - * Get the coordinates of this shape. It is assumed that we're always talking - * about shapes in a 2D location here. - * @requires The {@link Shape} class - * @returns A Coordinate object representing the location of this Shape - * @type Coordinate[] - */ -Shape.prototype.getCoords = function(){ - return this.coords; -} - -/** - * Get the color of this shape. - * @see #setColor - * @see The Color library. - * @link Shape - * @type Color - */ -Shape.prototype.getColor = function(){ - return this.color; -} - -/** - * Set the coordinates for this Shape - * @param {Coordinate} coordinates The coordinates to set for this Shape - */ -Shape.prototype.setCoords = function(coordinates){ - this.coords = coordinates; -} - -/** - * Set the color for this Shape - * @param {Color} color The color to set for this Shape - * @param other There is no other param, but it can still be documented if - * optional parameters are used - * @throws NonExistantColorException (no, not really!) - * @see #getColor - */ -Shape.prototype.setColor = function(color){ - this.color = color; -} - -/** - * Clone this shape - * @returns A copy of this shape - * @type Shape - * @author Gabriel Reid - */ -Shape.prototype.clone = function(){ - return new Shape(); -} - -/** - * Create a new Rectangle instance. - * @class A basic rectangle class, inherits from Shape. - * This class could be considered a concrete implementation class - * @constructor - * @param {int} width The optional width for this Rectangle - * @param {int} height Thie optional height for this Rectangle - * @author Gabriel Reid - * @see Shape is the base class for this - * @augments Shape - * @hilited - */ -function Rectangle(width, // This is the width - height // This is the height - ){ - if (width){ - this.width = width; - if (height){ - this.height = height; - } - } -} - - -/* Inherit from Shape */ -Rectangle.prototype = new Shape(); - -/** - * Value to represent the width of the Rectangle. - *
Text in bold and italic and a - * link to SourceForge - * @private - * @type int - */ -Rectangle.prototype.width = 0; - -/** - * Value to represent the height of the Rectangle - * @private - * @type int - */ -Rectangle.prototype.height = 0; - -/** - * Get the type of this object. - * @type String - */ -Rectangle.prototype.getClassName= function(){ - return "Rectangle"; -} - -/** - * Get the value of the width for the Rectangle - * @type int - * @see Rectangle#setWidth - */ -Rectangle.prototype.getWidth = function(){ - return this.width; -} - -/** - * Get the value of the height for the Rectangle. - * Another getter is the {@link Shape#getColor} method in the - * {@link Shape} base class. - * @return The height of this Rectangle - * @type int - * @see Rectangle#setHeight - */ -Rectangle.prototype.getHeight = function(){ - return this.height; -} - -/** - * Set the width value for this Rectangle. - * @param {int} width The width value to be set - * @see #setWidth - */ -Rectangle.prototype.setWidth = function(width){ - this.width = width; -} - -/** - * Set the height value for this Rectangle. - * @param {int} height The height value to be set - * @see #getHeight - */ -Rectangle.prototype.setHeight = function(height){ - this.height = height; -} - -/** - * Get the value for the total area of this Rectangle - * @return total area of this Rectangle - * @type int - */ -Rectangle.prototype.getArea = function(){ - return width * height; -} - - -/** - * Create a new Square instance. - * @class A Square is a subclass of {@link Rectangle} - * @param {int} width The optional width for this Rectangle - * @param {int} height The optional height for this Rectangle - * @augments Rectangle - */ -function Square(width, height){ - if (width){ - this.width = width; - if (height){ - this.height = height; - } - } - -} - -/* Square is a subclass of Rectangle */ -Square.prototype = new Rectangle(); - -/** - * Set the width value for this Shape. - * @param {int} width The width value to be set - * @see #getWidth - */ -Square.prototype.setWidth = function(width){ - this.width = this.height = width; -} - -/** - * Set the height value for this Shape - * Sets the {@link Rectangle#height} attribute in the Rectangle. - * @param {int} height The height value to be set - */ -Square.prototype.setHeight = function(height){ - this.height = this.width = height; -} - - -/** - * Create a new Circle instance based on a radius. - * @class Circle class is another subclass of Shape - * @extends Shape - * @param {int} radius The optional radius of this {@link Circle } - * @mixin Square.prototype.setWidth as this.setDiameter - */ -function Circle(radius){ - if (radius) { - /** The radius of the this Circle. */ - this.radius = radius; - } -} - -/* Circle inherits from {@link Shape} */ -Circle.prototype = new Shape(); - -/** - * The radius value for this Circle - * @private - * @type int - */ -Circle.prototype.radius = 0; - -/** - * A very simple class (static) field that is also a constant - * @final - * @type float - */ -Circle.PI = 3.14; - -/** - * Get the radius value for this Circle - * @type int - * @see #setRadius - */ -Circle.prototype.getRadius = function(){ - return this.radius; -} - -/** - * Set the radius value for this Circle - * @param {int} radius The {@link Circle#radius} value to set - * @see #getRadius - */ -Circle.prototype.setRadius = function(radius){ - this.radius = radius; -} - -/** - * An example of a class (static) method that acts as a factory for Circle - * objects. Given a radius value, this method creates a new Circle. - * @param {int} radius The radius value to use for the new Circle. - * @type Circle - */ -Circle.createCircle = function(radius){ - return new Circle(radius); -} - - -/** - * Create a new Coordinate instance based on x and y grid data. - * @class Coordinate is a class that can encapsulate location information. - * @param {int} [x=0] The optional x portion of the Coordinate - * @param {int} [y=0] The optinal y portion of the Coordinate - */ -function Coordinate(x, y){ - if (x){ - this.x = x; - if (y){ - this.y = y; - } - } -} - -/** - * The x portion of the Coordinate - * @type int - * @see #getX - * @see #setX - */ -Coordinate.prototype.x = 0; - -/** - * The y portion of the Coordinate - * @type int - * @see #getY - * @see #setY - */ -Coordinate.prototype.y = 0; - -/** - * Gets the x portion of the Coordinate. - * @type int - * @see #setX - */ -Coordinate.prototype.getX = function(){ - return this.x; -} - -/** - * Get the y portion of the Coordinate. - * @type int - * @see #setY - */ -Coordinate.prototype.getY = function(){ - return this.y; -} - -/** - * Sets the x portion of the Coordinate. - * @param {int} x The x value to set - * @see #getX - */ -Coordinate.prototype.setX = function(x){ - this.x = x; -} - -/** - * Sets the y portion of the Coordinate. - * @param {int} y The y value to set - * @see #getY - */ -Coordinate.prototype.setY = function(y){ - this.y = y; -} - -/** - * @class This class exists to demonstrate the assignment of a class prototype - * as an anonymous block. - */ -function ShapeFactory(){ -} - -ShapeFactory.prototype = { - /** - * Creates a new {@link Shape} instance. - * @return A new {@link Shape} - * @type Shape - */ - createShape: function(){ - return new Shape(); - } -} - -/** - * An example of a singleton class - * @param ... Arguments represent {@link coordinate}s in the shape. - * @constructor - */ -MySingletonShapeFactory = function(){ - - /** - * Get the next {@link Shape} - * @type Shape - * @return A new {@link Shape} - */ - this.getShape = function(){ - return null; - } - -} - - -/** - * Create a new Foo instance. - * @class This is the Foo class. It exists to demonstrate 'nested' classes. - * @constructor - * @see Foo.Bar - */ -function Foo(){} - -/** - * Creates a new instance of Bar. - * @class This class exists to demonstrate 'nested' classes. - * @constructor - * @see Foo.Bar - */ -function Bar(){} - -/** - * Nested class - * @constructor - */ -Foo.Bar = function(){ - /** The x. */ this.x = 2; -} - -Foo.Bar.prototype = new Bar(); -/** The y. */ -Foo.Bar.prototype.y = '3'; diff --git a/doc/jsdoc-toolkit/app/test/lend.js b/doc/jsdoc-toolkit/app/test/lend.js deleted file mode 100644 index 92b15d5ad..000000000 --- a/doc/jsdoc-toolkit/app/test/lend.js +++ /dev/null @@ -1,33 +0,0 @@ - /** @class */ -var Person = Class.create( - /** - @lends Person.prototype - */ - { - initialize: function(name) { - this.name = name; - }, - say: function(message) { - return this.name + ': ' + message; - } - } - ); - -/** @lends Person.prototype */ -{ - /** like say but more musical */ - sing: function(song) { - } -} - -/** @lends Person */ -{ - getCount: function() { - } -} - -/** @lends Unknown.prototype */ -{ - notok: function() { - } -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/memberof.js b/doc/jsdoc-toolkit/app/test/memberof.js deleted file mode 100644 index 883bbdeb0..000000000 --- a/doc/jsdoc-toolkit/app/test/memberof.js +++ /dev/null @@ -1,19 +0,0 @@ -/** @constructor */ -pack = function() { - this.init = function(){} - function config(){} -} - - pack.build = function(task) {}; - -/** @memberOf pack */ -pack.install = function() {} - -/** @memberOf pack */ -pack.install.overwrite = function() {} - -/** @memberOf pack */ -clean = function() {} - -/** @memberOf pack-config */ -install = function() {}; diff --git a/doc/jsdoc-toolkit/app/test/memberof_constructor.js b/doc/jsdoc-toolkit/app/test/memberof_constructor.js deleted file mode 100644 index 80fde735c..000000000 --- a/doc/jsdoc-toolkit/app/test/memberof_constructor.js +++ /dev/null @@ -1,17 +0,0 @@ -/** @constructor */ -function Circle(){} - -/** - @constructor - @memberOf Circle# - */ -Circle.prototype.Tangent = function(){}; - -// renaming Circle#Tangent to Circle#Circle#Tangent - -/** - @memberOf Circle#Tangent# - */ -Circle.prototype.Tangent.prototype.getDiameter = function(){}; - - diff --git a/doc/jsdoc-toolkit/app/test/module.js b/doc/jsdoc-toolkit/app/test/module.js deleted file mode 100644 index 5b3fe42c5..000000000 --- a/doc/jsdoc-toolkit/app/test/module.js +++ /dev/null @@ -1,17 +0,0 @@ -/** @namespace */ -myProject = myProject || {}; - -/** @namespace */ -myProject.myModule = (function () { - /** describe myPrivateVar here */ - var myPrivateVar = ""; - - var myPrivateMethod = function () { - } - - /** @scope myProject.myModule */ - return { - myPublicMethod: function () { - } - }; -})(); \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/name.js b/doc/jsdoc-toolkit/app/test/name.js deleted file mode 100644 index e88a51a71..000000000 --- a/doc/jsdoc-toolkit/app/test/name.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - @name Response - @class -*/ - -Response.prototype = { - /** - @name Response#text - @function - @description - Gets the body of the response as plain text - @returns {String} - Response as text - */ - - text: function() { - return this.nativeResponse.responseText; - } -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/namespace_nested.js b/doc/jsdoc-toolkit/app/test/namespace_nested.js deleted file mode 100644 index 46cafa2fa..000000000 --- a/doc/jsdoc-toolkit/app/test/namespace_nested.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - @namespace This is the first namespace. -*/ -ns1 = {}; - -/** - This is the second namespace. - @namespace -*/ -ns1.ns2 = {}; - -/** - This part of ns1.ns2 - @constructor -*/ -ns1.ns2.Function1 = function() { -}; - -ns1.staticFunction = function() { -}; - -/** A static field in a namespace. */ -ns1.ns2.staticField = 1; diff --git a/doc/jsdoc-toolkit/app/test/nocode.js b/doc/jsdoc-toolkit/app/test/nocode.js deleted file mode 100644 index 1cf99bc98..000000000 --- a/doc/jsdoc-toolkit/app/test/nocode.js +++ /dev/null @@ -1,13 +0,0 @@ -/**#nocode+*/ - /** - @name star - @function - */ - function blahblah() { - - } -/**#nocode-*/ - -function yaddayadda() { - -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/oblit_anon.js b/doc/jsdoc-toolkit/app/test/oblit_anon.js deleted file mode 100644 index 8d9e9413e..000000000 --- a/doc/jsdoc-toolkit/app/test/oblit_anon.js +++ /dev/null @@ -1,20 +0,0 @@ -/** the options */ -opt = Opt.get( - arguments, - { - d: "directory", - c: "conf", - "D[]": "define" - } -); - -/** configuration */ -opt.conf = { - /** keep */ - keep: true, - /** base */ - base: getBase(this, {p: properties}) -} - - - diff --git a/doc/jsdoc-toolkit/app/test/overview.js b/doc/jsdoc-toolkit/app/test/overview.js deleted file mode 100644 index 1dfc09b1f..000000000 --- a/doc/jsdoc-toolkit/app/test/overview.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * @overview This "library" contains a - * lot of classes and functions. - * @example -
-	var x (x < 1);
-	alert("This 'is' \"code\"");
- 
- * @name My Cool Library - * @author Joe Smith jsmith@company.com - * @version 0.1 - */ - -/** - * Gets the current foo - * @param {String} fooId The unique identifier for the foo. - * @return {Object} Returns the current foo. - */ -function getFoo(fooID){ -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/param_inline.js b/doc/jsdoc-toolkit/app/test/param_inline.js deleted file mode 100644 index 09845b283..000000000 --- a/doc/jsdoc-toolkit/app/test/param_inline.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - @constructor - @param columns The number of columns. -*/ -function Layout(/**int*/columns){ - /** - @param [id] The id of the element. - @param elName The name of the element. - */ - this.getElement = function( - /** string */ elName, - /** number|string */ id - ) { - }; - - /** - @constructor - */ - this.Canvas = function(top, left, /**int*/width, height) { - /** Is it initiated yet? */ - this.initiated = true; - } - - this.rotate = function(/**nothing*/) { - } - - /** - @param x - @param y - @param {zoppler} z*/ - this.init = function(x, y, /**abbler*/z) { - /** The xyz. */ - this.xyz = x+y+z; - this.getXyz = function() { - } - } -} diff --git a/doc/jsdoc-toolkit/app/test/params_optional.js b/doc/jsdoc-toolkit/app/test/params_optional.js deleted file mode 100644 index 18bf59829..000000000 --- a/doc/jsdoc-toolkit/app/test/params_optional.js +++ /dev/null @@ -1,8 +0,0 @@ - -/** - * @param {Page[]} pages - * @param {number} [id] Specifies the id, if applicable. - * @param {String} [title = This is untitled.] Specifies the title. - */ -function Document(pages, id, title){ -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/prototype.js b/doc/jsdoc-toolkit/app/test/prototype.js deleted file mode 100644 index 114700837..000000000 --- a/doc/jsdoc-toolkit/app/test/prototype.js +++ /dev/null @@ -1,17 +0,0 @@ -/** @constructor */ -function Article() { -} - -Article.prototype.init = function(title) { - /** the instance title */ - this.title = title; - - /** the static counter */ - Article.counter = 1; -} - -a = new Article(); -a.Init("my title"); - -print(a.title); -print(Article.counter); \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/prototype_nested.js b/doc/jsdoc-toolkit/app/test/prototype_nested.js deleted file mode 100644 index e8ca1ced2..000000000 --- a/doc/jsdoc-toolkit/app/test/prototype_nested.js +++ /dev/null @@ -1,9 +0,0 @@ -/** @constructor */ -function Word() { -} - -Word.prototype.reverse = function() { -} - -Word.prototype.reverse.utf8 = function() { -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/prototype_oblit.js b/doc/jsdoc-toolkit/app/test/prototype_oblit.js deleted file mode 100644 index 6cfc39caf..000000000 --- a/doc/jsdoc-toolkit/app/test/prototype_oblit.js +++ /dev/null @@ -1,13 +0,0 @@ -/** @constructor */ -function Article() { -} - -Article.prototype = { - /** instance get title */ - getTitle: function(){ - } -} - -/** static get title */ -Article.getTitle = function(){ -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/prototype_oblit_constructor.js b/doc/jsdoc-toolkit/app/test/prototype_oblit_constructor.js deleted file mode 100644 index 924824864..000000000 --- a/doc/jsdoc-toolkit/app/test/prototype_oblit_constructor.js +++ /dev/null @@ -1,24 +0,0 @@ -/** @constructor */ -function Article() { -} - -Article.prototype = { - /** @constructor */ - Title: function(title) { - /** the value of the Title instance */ - this.title = title; - }, - - init: function(pages) { - /** the value of the pages of the Article instance */ - this.pages = pages; - } -} - -f = new Article(); -f.init("one two three"); - -t = new f.Title("my title"); - -print(f.pages); -print(t.title); \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/public.js b/doc/jsdoc-toolkit/app/test/public.js deleted file mode 100644 index 35d34f6f0..000000000 --- a/doc/jsdoc-toolkit/app/test/public.js +++ /dev/null @@ -1,10 +0,0 @@ -/**@constructor*/ -function Foo() { - /** - @public - @static - @field - */ - var bar = function(x) { - } -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/scripts/code.js b/doc/jsdoc-toolkit/app/test/scripts/code.js deleted file mode 100644 index e9d7ed2ec..000000000 --- a/doc/jsdoc-toolkit/app/test/scripts/code.js +++ /dev/null @@ -1,5 +0,0 @@ -/** - @class - */ -function thisiscode() { -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/scripts/notcode.txt b/doc/jsdoc-toolkit/app/test/scripts/notcode.txt deleted file mode 100644 index fcd737e77..000000000 --- a/doc/jsdoc-toolkit/app/test/scripts/notcode.txt +++ /dev/null @@ -1,5 +0,0 @@ -(This is not code) -function foo(){{{{ -( -! -@ \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/shared.js b/doc/jsdoc-toolkit/app/test/shared.js deleted file mode 100644 index e1c277a6f..000000000 --- a/doc/jsdoc-toolkit/app/test/shared.js +++ /dev/null @@ -1,42 +0,0 @@ - -/** - * Builtin object. - * @class - * @name Array - */ - -/**#@+ - * Extension to builtin array. - * @memberOf Array - * @method - */ - -/** - * @returns Boolen if some array members... - */ -Array.prototype.some = function(){}; - -/** - * Change every element of an array. - * @returns Filtered array copy. - */ -Array.prototype.filter = function(){}; - -/**#@-*/ - - -/** - * A first in, first out data structure. - * @constructor - */ -Queue = function(){}; - -/**#@+ - * Extension to Queue. - * @memberOf Queue - */ - -rewind = function(){ -} - -// should close automatically here. \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/shared2.js b/doc/jsdoc-toolkit/app/test/shared2.js deleted file mode 100644 index 3f7736a77..000000000 --- a/doc/jsdoc-toolkit/app/test/shared2.js +++ /dev/null @@ -1,2 +0,0 @@ -startOver = function(){ -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/shortcuts.js b/doc/jsdoc-toolkit/app/test/shortcuts.js deleted file mode 100644 index f738f1e1c..000000000 --- a/doc/jsdoc-toolkit/app/test/shortcuts.js +++ /dev/null @@ -1,22 +0,0 @@ -// /**#=+ -// * { -// * 'D': 'Date.prototype', -// * '$N': 'Number' -// * } -// */ -// var D = Date.prototype, -// $N = Number; -// -// D.locale = function(){ -// }; -// -// /** -// @return {string} The cardinal number string. -// */ -// $N.nth = function(n){ -// }; -// -// LOAD.file = function(){ -// } -// -// /**#=-*/ \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/static_this.js b/doc/jsdoc-toolkit/app/test/static_this.js deleted file mode 100644 index 9407b20f3..000000000 --- a/doc/jsdoc-toolkit/app/test/static_this.js +++ /dev/null @@ -1,13 +0,0 @@ -/** the parent */ -var box = {}; - -/** @namespace */ -box.holder = {} - -box.holder.foo = function() { - /** the counter */ - this.counter = 1; -} - -box.holder.foo(); -print(box.holder.counter); diff --git a/doc/jsdoc-toolkit/app/test/synonyms.js b/doc/jsdoc-toolkit/app/test/synonyms.js deleted file mode 100644 index 09066b98f..000000000 --- a/doc/jsdoc-toolkit/app/test/synonyms.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - @class - @inherits Bar#zop as #my_zop -*/ -function Foo() { - /** this is a zip. */ - this.zip = function() {} - - /** from Bar */ - this.my_zop = new Bar().zop; -} - -/** - @class - @borrows Foo#zip as this.my_zip -*/ -function Bar() { - /** this is a zop. */ - this.zop = function() {} - - /** from Foo */ - this.my_zip = new Foo().zip; -} - -/** @namespace */ -var myObject = { - /** - @type function - */ - myFunc: getFunction() -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/tosource.js b/doc/jsdoc-toolkit/app/test/tosource.js deleted file mode 100644 index 706d47652..000000000 --- a/doc/jsdoc-toolkit/app/test/tosource.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * @param {Object} object - * @return {string} - */ -function valueOf(object) {} - -/** - * @param {Object} object - * @return {string} - */ -function toString(object) {} - -/** - * @param {Object} object - * @return {string} - */ -function toSource(object) {} - -/** - * @param {Object} object - * @return {string} - */ -function constructor(object) {} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/app/test/variable_redefine.js b/doc/jsdoc-toolkit/app/test/variable_redefine.js deleted file mode 100644 index 2c07da09a..000000000 --- a/doc/jsdoc-toolkit/app/test/variable_redefine.js +++ /dev/null @@ -1,14 +0,0 @@ -/** @constructor */ -function Foo() { - var bar = 1; - bar = 2; // redefining a private - - this.baz = 1; - baz = 2; // global - - /** a private */ - var blap = { - /** in here */ - tada: 1 - } -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/changes.txt b/doc/jsdoc-toolkit/changes.txt deleted file mode 100644 index d664750f3..000000000 --- a/doc/jsdoc-toolkit/changes.txt +++ /dev/null @@ -1,107 +0,0 @@ -== 2.3.2 == - - * Minor update to the usage notes and corrected the version number displayed in the output. - -== 2.3.1 == - - * Fixed HTML typo in allfiles template. (issue #228) - * Modified template to display version information for classes. - * Modified template to better support multiple methods with the same name. - * Fixed bug that caused template to error when backtick characters appeared around class names. - -== 2.3.0 == - - * Added option -u, --unique to avoid bug that causes multiple symbols with names that differ only by case to overwrite each others output on case-insensitive filesystems. ( issue #162 ) - * Fixed bug where {@links} in @deprecated tags did not resolve. ( issue #220 ) - * Fixed bug that caused parens around a function to make it to be unrecognized. ( issue #213 ) - * Fixed bug prevented explicit links to named anchors from working (thanks katgao.pku). ( issue #215 ) - * Fixed bug that prevented full description from appearing in file overview. ( issue #224 ) - -== 2.2.1 == - - * Fixed bug with class template, where sorting of methods was accidentally removed (thanks dezfowler). - * Added missing test files for the @exports unit tests. - -== 2.2.0 == - - * Fixed bug that caused exception when given a folder containing non-js files, even with the x commandline option set to "js". ( issue #193 ) - * Fixed typo in index template [patch submitted by olle]. ( issue #198 ) - * Modified @borrows tag experimentally to allow for missing "as ..." clause. - * Added support for the @exports tag, to allow one symbol to be documented as another. - * Added support for the -S option to document code following the Secure Modules pattern. - -== 2.1.0 == - - * Added support for the @event tag. - * Fixed bug that prevented the : character from appearing in symbol names. - * Fixed bug that prevented underscored symbols marked with @public being tagged as private. (issue #184 ) - * Fixed bug that randomly affected the @memberOf tag when the name of the symbol did not include the parent name. - * Fixed bug that prevented templates that were not in the jsdoc-toolkit folder from being found. ( issue #176 ) - * Added ability to check for trailing slash on template path. ( issue #177 ) - * Modified classDesc so that it no longer is appended with the constructor desc. - * Fixed call to plugin onDocCommentSrc. - * Added missing support for inline doc comments for function return types. ( issue #189 ) - * Added command line option -q, --quiet. - * Added command line option -E, --exclude. ( issue #143 ) - * Added 2 more hooks for plugins. ( issue #163 ) - * Added support for extending built-ins. ( issue #160 ) - * Added "compact" option to JSDOC.JsPlate.prototype.process. ( issue #159 ) - * @augments no longer documents static members as inherited. ( issue #138 ) - * @link to a class now goes to the page for that class, not the constructor. ( issue #178 ) - * Warnings of mismatched curly brace now include filename. ( issue #166 ) - * Fixed bug affecting template paths loaded via a configuration file when the trailing slash is missing. ( issue #191 ) - * Minor optimizations. - -== 2.0.2 == - - * Fixed bug that sometimes caused an example of division in the source code to be interpretted as a regex by the JsDoc Toolkit analyzer. ( issue #158 ) - * Fixed a bug that prevented private variables marked as @public from appearing in the documentation. ( issue #161 ) - * Fixed bug that prevented variable names with underscored properties from appearing in summaries. ( issue #173 ) - -== 2.0.1 == - - * Fixed bug that prevented @fileOverview tag from being recognized. - * Added support for @fieldOf as a synonym for @field plus @memberOf. - * Added support for @name tag in a @fileOverview comment to control the displayed name of the file. - * Added support for multiple @example tags. ( issue #152 ) - * Modified style sheet of jsdoc template to make more readable. ( issue #151 ) - * Fixed bug that prevented @since documentation from displaying correctly when it appeared in a class. ( issue #150 ) - * Fixed bug that caused inhertited properties to sometimes not resolve correctly. ( issue #144 ) - * Modified so that trailing whitespace in @example is always trimmed. ( issue #153 ) - * Added support for elseif to JsPlate. (hat tip to fredck) - * Added support for @location urls in the @overview comment to the jsdoc template. - -== Changes From Versions 1.4.0 to 2.0.0 == - - * Upgraded included version of Rhino from 1.6 to 1.7R1. - * Removed circular references in parsed documentation objects. - * Improved inheritance handling, now properties and events can be inherited same as methods. - * Improved handling of cross-file relationships, now having two related objects in separate files is not a problem. - * Improved ability to recognize membership of previously defined objects. - * Added ability to redefine parsing behavior with plugins. - * @methodOf is a synonym for @function and @memberOf. - * Added @default to document default values of members that are objects. - * Added ability to parse and refer to inner functions. - * Fixed bug that appeared when calling a method to set properties of the instance referred to by "this". - * Added ability to automatically create links to other symbols. - * New "jsdoc" template now produces fully W3C valid XHTML. - * Inline parameter type hint comments are now documented. - * Fixed error: Locally scoped variables (declared with var) no longer appear as global. - * It is now possible to run JsDoc Toolkit from any directory. - * Added support for inline {@link ...} tags. - * Added support for the -H command-line option to allow for custom content handlers. - * Tag names @inherits and @scope changed to @borrows and @lends. - ? Combining @constructor in a doclet with @lends now supported. - * Multiple @lend tags now supported. - * Added support for the @constructs tag, used inside a @lends block. - * Added support for the @constant tag. - * Fixed bug that prevented the use of [] as a default value. - * Added support for the @field tag. - * Added support for the @public tag (applied to inner functions). - * @namespace tag can now be applied to functions, not just object literals. - * Added support for the -s command line option to suppress source code output. - * Added new unit test framework. - * Underscored symbols are now treated as if they have a @private tag by default. - * Improved support for anonymous constructors. - * Added support for the nocode meta tag. - \ No newline at end of file diff --git a/doc/jsdoc-toolkit/conf/sample.conf b/doc/jsdoc-toolkit/conf/sample.conf deleted file mode 100644 index ad0f08e65..000000000 --- a/doc/jsdoc-toolkit/conf/sample.conf +++ /dev/null @@ -1,31 +0,0 @@ -/* - This is an example of one way you could set up a configuration file to more - conveniently define some commandline options. You might like to do this if - you frequently reuse the same options. Note that you don't need to define - every option in this file, you can combine a configuration file with - additional options on the commandline if your wish. - - You would include this configuration file by running JsDoc Toolkit like so: - java -jar jsrun.jar app/run.js -c=conf/sample.conf - -*/ - -{ - // source files to use - _: ['app/test/jsdoc_test.js'], - - // document all functions, even uncommented ones - a: true, - - // including those marked @private - p: true, - - // some extra variables I want to include - D: {generatedBy: "Michael Mathews", copyright: "2008"}, - - // use this directory as the output directory - d: "docs", - - // use this template - t: "templates/jsdoc" -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/java/build.xml b/doc/jsdoc-toolkit/java/build.xml deleted file mode 100644 index bb845ce3a..000000000 --- a/doc/jsdoc-toolkit/java/build.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/doc/jsdoc-toolkit/java/build_1.4.xml b/doc/jsdoc-toolkit/java/build_1.4.xml deleted file mode 100644 index ab408a4c4..000000000 --- a/doc/jsdoc-toolkit/java/build_1.4.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/jsdoc-toolkit/java/classes/js.jar b/doc/jsdoc-toolkit/java/classes/js.jar deleted file mode 100644 index 0352cb180..000000000 Binary files a/doc/jsdoc-toolkit/java/classes/js.jar and /dev/null differ diff --git a/doc/jsdoc-toolkit/java/src/JsDebugRun.java b/doc/jsdoc-toolkit/java/src/JsDebugRun.java deleted file mode 100755 index 319a5c67b..000000000 --- a/doc/jsdoc-toolkit/java/src/JsDebugRun.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * A trivial bootstrap class that simply adds the path to the - * .js file as an argument to the Rhino call. This little hack - * allows the code in the .js file to have access to it's own - * path via the Rhino arguments object. This is necessary to - * allow the .js code to find resource files in a location - * relative to itself. - * - * USAGE: java -jar jsdebug.jar path/to/file.js - */ -public class JsDebugRun { - public static void main(String[] args) { - String[] jsargs = {"-j="+args[0]}; - - String[] allArgs = new String[jsargs.length + args.length]; - System.arraycopy(args, 0, allArgs, 0, args.length); - System.arraycopy(jsargs, 0, allArgs, args.length ,jsargs.length); - - org.mozilla.javascript.tools.debugger.Main.main(allArgs); - } -} diff --git a/doc/jsdoc-toolkit/java/src/JsRun.java b/doc/jsdoc-toolkit/java/src/JsRun.java deleted file mode 100644 index 25f519a95..000000000 --- a/doc/jsdoc-toolkit/java/src/JsRun.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * A trivial bootstrap class that simply adds the path to the - * .js file as an argument to the Rhino call. This little hack - * allows the code in the .js file to have access to it's own - * path via the Rhino arguments object. This is necessary to - * allow the .js code to find resource files in a location - * relative to itself. - * - * USAGE: java -jar jsrun.jar path/to/file.js - */ -public class JsRun { - public static void main(String[] args) { - String[] jsargs = {"-j="+args[0]}; - - String[] allArgs = new String[jsargs.length + args.length]; - System.arraycopy(args, 0, allArgs, 0, args.length); - System.arraycopy(jsargs, 0, allArgs, args.length ,jsargs.length); - - org.mozilla.javascript.tools.shell.Main.main(allArgs); - } -} diff --git a/doc/jsdoc-toolkit/jsdebug.jar b/doc/jsdoc-toolkit/jsdebug.jar deleted file mode 100644 index a0ac7daa6..000000000 Binary files a/doc/jsdoc-toolkit/jsdebug.jar and /dev/null differ diff --git a/doc/jsdoc-toolkit/jsrun.jar b/doc/jsdoc-toolkit/jsrun.jar deleted file mode 100644 index 49c03f4c6..000000000 Binary files a/doc/jsdoc-toolkit/jsrun.jar and /dev/null differ diff --git a/doc/jsdoc-toolkit/jsrun.sh b/doc/jsdoc-toolkit/jsrun.sh deleted file mode 100644 index 74ca79c05..000000000 --- a/doc/jsdoc-toolkit/jsrun.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/ksh - -# launcher script for jsdoc -# Author: Avi Deitcher -# -# This program is released under the MIT License as follows: - -# Copyright (c) 2008-2009 Atomic Inc -# -#Permission is hereby granted, free of charge, to any person -#obtaining a copy of this software and associated documentation -#files (the "Software"), to deal in the Software without -#restriction, including without limitation the rights to use, -#copy, modify, merge, publish, distribute, sublicense, and/or sell -#copies of the Software, and to permit persons to whom the -#Software is furnished to do so, subject to the following -#conditions: -## -#The above copyright notice and this permission notice shall be -#included in all copies or substantial portions of the Software. -# -#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -#EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -#OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -#NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -#HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -#WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -#FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -#OTHER DEALINGS IN THE SOFTWARE. -# - - -if [[ -n "$JSDOCDIR" ]]; then - _DOCDIR="-Djsdoc.dir=$JSDOCDIR" - _APPDIR="$JSDOCDIR/app" - _BASEDIR="$JSDOCDIR" -else - _DOCDIR="" - _APPDIR="./app" - _BASEDIR="." -fi - -if [[ -n "$JSDOCTEMPLATEDIR" ]]; then - _TDIR="-Djsdoc.template.dir=$JSDOCTEMPLATEDIR" -else - _TDIR="" -fi - -CMD="java $_DOCDIR $_TDIR -jar $_BASEDIR/jsrun.jar $_APPDIR/run.js $@" -echo $CMD -$CMD - diff --git a/doc/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl b/doc/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl deleted file mode 100644 index 32f43582f..000000000 --- a/doc/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl +++ /dev/null @@ -1,17 +0,0 @@ -
{+new Link().toFile("index.html").withText("Class Index")+} -| {+new Link().toFile("files.html").withText("File Index")+}
-
-

Classes

-
    - -
  • {! - if (thisClass.alias == "_global_") { - output += ""+new Link().toClass(thisClass.alias)+""; - } - else { - output += new Link().toClass(thisClass.alias); - } - !}
  • -
    -
-
\ No newline at end of file diff --git a/doc/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl b/doc/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl deleted file mode 100644 index 4c7de1cd5..000000000 --- a/doc/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl +++ /dev/null @@ -1,56 +0,0 @@ - - - - - {! Link.base = ""; /* all generated links will be relative to this */ !} - JsDoc Reference - File Index - - - - - - - {+include("static/header.html")+} - -
- {+publish.classesIndex+} -
- -
-

File Index

- - -
-

{+new Link().toSrc(item.alias).withText(item.name)+}

- {+resolveLinks(item.desc)+} -
- -
Author:
-
{+item.author+}
-
- -
Version:
-
{+item.version+}
-
- {! var locations = item.comment.getTag('location').map(function($){return $.toString().replace(/(^\$ ?| ?\$$)/g, '').replace(/^HeadURL: https:/g, 'http:');}) !} - -
Location:
- -
{+location+}
-
-
-
-
-
-
- -
-
- ©{+JSDOC.opt.D.copyright+}
- Documentation generated by JsDoc Toolkit {+JSDOC.VERSION+} on {+new Date()+} -
- - \ No newline at end of file diff --git a/doc/jsdoc-toolkit/templates/jsdoc/class.tmpl b/doc/jsdoc-toolkit/templates/jsdoc/class.tmpl deleted file mode 100644 index 181ed1188..000000000 --- a/doc/jsdoc-toolkit/templates/jsdoc/class.tmpl +++ /dev/null @@ -1,649 +0,0 @@ - - - - - - {! Link.base = "../"; /* all generated links will be relative to this */ !} - JsDoc Reference - {+data.alias+} - - - - - - - - {+include("static/header.html")+} - - - -
- - {+publish.classesIndex+} - -
- -
- -

- {! - var classType = ""; - - if (data.isBuiltin()) { - classType += "Built-In "; - } - - if (data.isNamespace) { - if (data.is('FUNCTION')) { - classType += "Function "; - } - classType += "Namespace "; - } - else { - classType += "Class "; - } - !} - {+classType+}{+data.alias+} -

- - -

-
Version - {+ data.version +}.
-
-
Extends - {+ - data.augments - .sort() - .map( - function($) { return new Link().toSymbol($); } - ) - .join(", ") - +}.
-
- - {+resolveLinks(data.classDesc)+} - - {# isn't defined in any file #} -
Defined in: {+new Link().toSrc(data.srcFile)+}. -
-

- - - - - - - - - - - - - - - - - -
{+classType+}Summary
Constructor AttributesConstructor Name and Description
{! - if (data.isPrivate) output += "<private> "; - if (data.isInner) output += "<inner> "; - !}  -
- {+ new Link().toSymbol(data.alias).inner('constructor')+}{+ makeSignature(data.params) +} -
-
{+resolveLinks(summarize(data.desc))+}
-
-
- - - - {! var ownProperties = data.properties.filter(function($){return $.memberOf == data.alias && !$.isNamespace}).sort(makeSortby("name")); !} - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
{! - if (member.isPrivate) output += "<private> "; - if (member.isInner) output += "<inner> "; - if (member.isStatic) output += "<static> "; - if (member.isConstant) output += "<constant> "; - !}  -
- {+member.memberOf+}.{+new Link().toSymbol(member.alias).withText(member.name)+} -
-
{+resolveLinks(summarize(member.desc))+}
-
-
- - -
- {! - var borrowedMembers = data.properties.filter(function($) {return $.memberOf != data.alias}); - - var contributers = []; - borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)}); - for (var i = 0, l = contributers.length; i < l; i++) { - output += - "
Fields borrowed from class "+new Link().toSymbol(contributers[i])+":
" - + - "
" + - borrowedMembers - .filter( - function($) { return $.memberOf == contributers[i] } - ) - .sort(makeSortby("name")) - .map( - function($) { return new Link().toSymbol($.alias).withText($.name) } - ) - .join(", ") - + - "
"; - } - !} -
-
-
- - - - {! var ownMethods = data.methods.filter(function($){return $.memberOf == data.alias && !$.isNamespace}).sort(makeSortby("name")); !} - - - - - - - - - - - - - - - - - -
Method Summary
Method AttributesMethod Name and Description
{! - if (member.isPrivate) output += "<private> "; - if (member.isInner) output += "<inner> "; - if (member.isStatic) output += "<static> "; - !}  -
{+member.memberOf+}.{+new Link().toSymbol(member.alias).withText(member.name.replace(/\^\d+$/, ''))+}{+makeSignature(member.params)+} -
-
{+resolveLinks(summarize(member.desc))+}
-
-
- - -
- {! - var borrowedMembers = data.methods.filter(function($) {return $.memberOf != data.alias}); - var contributers = []; - borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)}); - for (var i = 0, l = contributers.length; i < l; i++) { - output += - "
Methods borrowed from class "+new Link().toSymbol(contributers[i])+":
" - + - "
" + - borrowedMembers - .filter( - function($) { return $.memberOf == contributers[i] } - ) - .sort(makeSortby("name")) - .map( - function($) { return new Link().toSymbol($.alias).withText($.name) } - ) - .join(", ") - + - "
"; - } - - !} -
-
-
- - - {! var ownEvents = data.events.filter(function($){return $.memberOf == data.alias && !$.isNamespace}).sort(makeSortby("name")); !} - - - - - - - - - - - - - - - - - -
Event Summary
Event AttributesEvent Name and Description
{! - if (member.isPrivate) output += "<private> "; - if (member.isInner) output += "<inner> "; - if (member.isStatic) output += "<static> "; - !}  -
{+member.memberOf+}.{+new Link().toSymbol(member.alias).withText(member.name)+}{+makeSignature(member.params)+} -
-
{+resolveLinks(summarize(member.desc))+}
-
-
- - -
- {! - var borrowedMembers = data.events.filter(function($) {return $.memberOf != data.alias}); - var contributers = []; - borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)}); - for (var i = 0, l = contributers.length; i < l; i++) { - output += - "
Events borrowed from class "+new Link().toSymbol(contributers[i])+":
" - + - "
" + - borrowedMembers - .filter( - function($) { return $.memberOf == contributers[i] } - ) - .sort(makeSortby("name")) - .map( - function($) { return new Link().toSymbol($.alias).withText($.name) } - ) - .join(", ") - + - "
"; - } - - !} -
-
-
- - - -
-
- {+classType+}Detail -
- -
{! - if (data.isPrivate) output += "<private> "; - if (data.isInner) output += "<inner> "; - !} - {+ data.alias +}{+ makeSignature(data.params) +} -
- -
- {+resolveLinks(data.desc)+} -
Author: {+data.author+}.
-
- - - -
{+example+}
-
-
- - - -
-
Parameters:
- -
- {+((item.type)?""+("{"+(new Link().toSymbol(item.type)+"} ")) : "")+} {+item.name+} - Optional, Default: {+item.defaultValue+} -
-
{+resolveLinks(item.desc)+}
-
-
-
- -
-
Deprecated:
-
- {+resolveLinks(data.deprecated)+} -
-
-
- -
-
Since:
-
{+ data.since +}
-
-
- -
-
Throws:
- -
- {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+} {+item.name+} -
-
{+resolveLinks(item.desc)+}
-
-
-
- -
-
Returns:
- -
{+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+resolveLinks(item.desc)+}
-
-
-
- -
-
Requires:
- -
{+ resolveLinks(item) +}
-
-
-
- -
-
See:
- -
{+ new Link().toSymbol(item) +}
-
-
-
- -
-
- - - -
- Field Detail -
- - -
{! - if (member.isPrivate) output += "<private> "; - if (member.isInner) output += "<inner> "; - if (member.isStatic) output += "<static> "; - if (member.isConstant) output += "<constant> "; - !} - - {{+new Link().toSymbol(member.type)+}} - {+member.memberOf+}.{+member.name+} - -
-
- {+resolveLinks(member.desc)+} - -
- Defined in: {+new Link().toSrc(member.srcFile)+}. -
-
Author: {+member.author+}.
-
- - - -
{+example+}
-
-
- - -
-
Deprecated:
-
- {+ resolveLinks(member.deprecated) +} -
-
-
- -
-
Since:
-
{+ member.since +}
-
-
- -
-
See:
- -
{+ new Link().toSymbol(item) +}
-
-
-
- -
-
Default Value:
-
- {+resolveLinks(member.defaultValue)+} -
-
-
- -
-
-
- - - -
- Method Detail -
- - -
{! - if (member.isPrivate) output += "<private> "; - if (member.isInner) output += "<inner> "; - if (member.isStatic) output += "<static> "; - !} - - {{+new Link().toSymbol(member.type)+}} - {+member.memberOf+}.{+member.name.replace(/\^\d+$/, '')+}{+makeSignature(member.params)+} - -
-
- {+resolveLinks(member.desc)+} - -
- Defined in: {+new Link().toSrc(member.srcFile)+}. -
-
Author: {+member.author+}.
-
- - - -
{+example+}
-
-
- - -
-
Parameters:
- -
- {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+item.name+} - Optional, Default: {+item.defaultValue+} -
-
{+resolveLinks(item.desc)+}
-
-
-
- -
-
Deprecated:
-
- {+ resolveLinks(member.deprecated) +} -
-
-
- -
-
Since:
-
{+ member.since +}
-
- -
- -
-
Throws:
- -
- {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+} {+item.name+} -
-
{+resolveLinks(item.desc)+}
-
-
-
- -
-
Returns:
- -
{+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+resolveLinks(item.desc)+}
-
-
-
- -
-
Requires:
- -
{+ resolveLinks(item) +}
-
-
-
- -
-
See:
- -
{+ new Link().toSymbol(item) +}
-
-
-
- -
-
-
- - - -
- Event Detail -
- - -
{! - if (member.isPrivate) output += "<private> "; - if (member.isInner) output += "<inner> "; - if (member.isStatic) output += "<static> "; - !} - - {{+new Link().toSymbol(member.type)+}} - {+member.memberOf+}.{+member.name+}{+makeSignature(member.params)+} - -
-
- {+resolveLinks(member.desc)+} - -
- Defined in: {+new Link().toSrc(member.srcFile)+}. -
-
Author: {+member.author+}.
-
- - - -
{+example+}
-
-
- - -
-
Parameters:
- -
- {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+item.name+} - Optional, Default: {+item.defaultValue+} -
-
{+ resolveLinks(item.desc) +}
-
-
-
- -
-
Deprecated:
-
- {+ resolveLinks(member.deprecated) +} -
-
-
- -
-
Since:
-
{+ member.since +}
-
- -
- -
-
Throws:
- -
- {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+} {+item.name+} -
-
{+ resolveLinks(item.desc) +}
-
-
-
- -
-
Returns:
- -
{+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+resolveLinks(item.desc)+}
-
-
-
- -
-
Requires:
- -
{+ resolveLinks(item) +}
-
-
-
- -
-
See:
- -
{+ new Link().toSymbol(item) +}
-
-
-
- -
-
-
- -
-
- - - -
- ©{+JSDOC.opt.D.copyright+}
- Documentation generated by JsDoc Toolkit {+JSDOC.VERSION+} on {+new Date()+} -
- - diff --git a/doc/jsdoc-toolkit/templates/jsdoc/index.tmpl b/doc/jsdoc-toolkit/templates/jsdoc/index.tmpl deleted file mode 100644 index a5dc1158e..000000000 --- a/doc/jsdoc-toolkit/templates/jsdoc/index.tmpl +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - JsDoc Reference - Index - - - - - - - {+include("static/header.html")+} - -
- {+publish.classesIndex+} -
- -
-

Class Index

- - -
-

{+(new Link().toSymbol(thisClass.alias))+}

- {+resolveLinks(summarize(thisClass.classDesc))+} -
-
-
- -
-
- ©{+JSDOC.opt.D.copyright+}
- Documentation generated by JsDoc Toolkit {+JSDOC.VERSION+} on {+new Date()+} -
- - \ No newline at end of file diff --git a/doc/jsdoc-toolkit/templates/jsdoc/publish.js b/doc/jsdoc-toolkit/templates/jsdoc/publish.js deleted file mode 100644 index 446c92b13..000000000 --- a/doc/jsdoc-toolkit/templates/jsdoc/publish.js +++ /dev/null @@ -1,200 +0,0 @@ -/** Called automatically by JsDoc Toolkit. */ -function publish(symbolSet) { - publish.conf = { // trailing slash expected for dirs - ext: ".html", - outDir: JSDOC.opt.d || SYS.pwd+"../out/jsdoc/", - templatesDir: JSDOC.opt.t || SYS.pwd+"../templates/jsdoc/", - symbolsDir: "symbols/", - srcDir: "symbols/src/" - }; - - // is source output is suppressed, just display the links to the source file - if (JSDOC.opt.s && defined(Link) && Link.prototype._makeSrcLink) { - Link.prototype._makeSrcLink = function(srcFilePath) { - return "<"+srcFilePath+">"; - } - } - - // create the folders and subfolders to hold the output - IO.mkPath((publish.conf.outDir+"symbols/src").split("/")); - - // used to allow Link to check the details of things being linked to - Link.symbolSet = symbolSet; - - // create the required templates - try { - var classTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"class.tmpl"); - var classesTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"allclasses.tmpl"); - } - catch(e) { - print("Couldn't create the required templates: "+e); - quit(); - } - - // some ustility filters - function hasNoParent($) {return ($.memberOf == "")} - function isaFile($) {return ($.is("FILE"))} - function isaClass($) {return ($.is("CONSTRUCTOR") || $.isNamespace)} - - // get an array version of the symbolset, useful for filtering - var symbols = symbolSet.toArray(); - - // create the hilited source code files - var files = JSDOC.opt.srcFiles; - for (var i = 0, l = files.length; i < l; i++) { - var file = files[i]; - var srcDir = publish.conf.outDir + "symbols/src/"; - makeSrcFile(file, srcDir); - } - - // get a list of all the classes in the symbolset - var classes = symbols.filter(isaClass).sort(makeSortby("alias")); - - // create a filemap in which outfiles must be to be named uniquely, ignoring case - if (JSDOC.opt.u) { - var filemapCounts = {}; - Link.filemap = {}; - for (var i = 0, l = classes.length; i < l; i++) { - var lcAlias = classes[i].alias.toLowerCase(); - - if (!filemapCounts[lcAlias]) filemapCounts[lcAlias] = 1; - else filemapCounts[lcAlias]++; - - Link.filemap[classes[i].alias] = - (filemapCounts[lcAlias] > 1)? - lcAlias+"_"+filemapCounts[lcAlias] : lcAlias; - } - } - - // create a class index, displayed in the left-hand column of every class page - Link.base = "../"; - publish.classesIndex = classesTemplate.process(classes); // kept in memory - - // create each of the class pages - for (var i = 0, l = classes.length; i < l; i++) { - var symbol = classes[i]; - - symbol.events = symbol.getEvents(); // 1 order matters - symbol.methods = symbol.getMethods(); // 2 - - var output = ""; - output = classTemplate.process(symbol); - - IO.saveFile(publish.conf.outDir+"symbols/", ((JSDOC.opt.u)? Link.filemap[symbol.alias] : symbol.alias) + publish.conf.ext, output); - } - - // regenerate the index with different relative links, used in the index pages - Link.base = ""; - publish.classesIndex = classesTemplate.process(classes); - - // create the class index page - try { - var classesindexTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"index.tmpl"); - } - catch(e) { print(e.message); quit(); } - - var classesIndex = classesindexTemplate.process(classes); - IO.saveFile(publish.conf.outDir, "index"+publish.conf.ext, classesIndex); - classesindexTemplate = classesIndex = classes = null; - - // create the file index page - try { - var fileindexTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"allfiles.tmpl"); - } - catch(e) { print(e.message); quit(); } - - var documentedFiles = symbols.filter(isaFile); // files that have file-level docs - var allFiles = []; // not all files have file-level docs, but we need to list every one - - for (var i = 0; i < files.length; i++) { - allFiles.push(new JSDOC.Symbol(files[i], [], "FILE", new JSDOC.DocComment("/** */"))); - } - - for (var i = 0; i < documentedFiles.length; i++) { - var offset = files.indexOf(documentedFiles[i].alias); - allFiles[offset] = documentedFiles[i]; - } - - allFiles = allFiles.sort(makeSortby("name")); - - // output the file index page - var filesIndex = fileindexTemplate.process(allFiles); - IO.saveFile(publish.conf.outDir, "files"+publish.conf.ext, filesIndex); - fileindexTemplate = filesIndex = files = null; -} - - -/** Just the first sentence (up to a full stop). Should not break on dotted variable names. */ -function summarize(desc) { - if (typeof desc != "undefined") - return desc.match(/([\w\W]+?\.)[^a-z0-9_$]/i)? RegExp.$1 : desc; -} - -/** Make a symbol sorter by some attribute. */ -function makeSortby(attribute) { - return function(a, b) { - if (a[attribute] != undefined && b[attribute] != undefined) { - a = a[attribute].toLowerCase(); - b = b[attribute].toLowerCase(); - if (a < b) return -1; - if (a > b) return 1; - return 0; - } - } -} - -/** Pull in the contents of an external file at the given path. */ -function include(path) { - var path = publish.conf.templatesDir+path; - return IO.readFile(path); -} - -/** Turn a raw source file into a code-hilited page in the docs. */ -function makeSrcFile(path, srcDir, name) { - if (JSDOC.opt.s) return; - - if (!name) { - name = path.replace(/\.\.?[\\\/]/g, "").replace(/[\\\/]/g, "_"); - name = name.replace(/\:/g, "_"); - } - - var src = {path: path, name:name, charset: IO.encoding, hilited: ""}; - - if (defined(JSDOC.PluginManager)) { - JSDOC.PluginManager.run("onPublishSrc", src); - } - - if (src.hilited) { - IO.saveFile(srcDir, name+publish.conf.ext, src.hilited); - } -} - -/** Build output for displaying function parameters. */ -function makeSignature(params) { - if (!params) return "()"; - var signature = "(" - + - params.filter( - function($) { - return $.name.indexOf(".") == -1; // don't show config params in signature - } - ).map( - function($) { - return $.name; - } - ).join(", ") - + - ")"; - return signature; -} - -/** Find symbol {@link ...} strings in text and turn into html links */ -function resolveLinks(str, from) { - str = str.replace(/\{@link ([^} ]+) ?\}/gi, - function(match, symbolName) { - return new Link().toSymbol(symbolName); - } - ); - - return str; -} diff --git a/doc/jsdoc-toolkit/templates/jsdoc/static/default.css b/doc/jsdoc-toolkit/templates/jsdoc/static/default.css deleted file mode 100644 index 97e021ef6..000000000 --- a/doc/jsdoc-toolkit/templates/jsdoc/static/default.css +++ /dev/null @@ -1,162 +0,0 @@ -/* default.css */ -body -{ - font: 12px "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif; - width: 800px; -} - -.header -{ - clear: both; - background-color: #ccc; - padding: 8px; -} - -h1 -{ - font-size: 150%; - font-weight: bold; - padding: 0; - margin: 1em 0 0 .3em; -} - -hr -{ - border: none 0; - border-top: 1px solid #7F8FB1; - height: 1px; -} - -pre.code -{ - display: block; - padding: 8px; - border: 1px dashed #ccc; -} - -#index -{ - margin-top: 24px; - float: left; - width: 160px; - position: absolute; - left: 8px; - background-color: #F3F3F3; - padding: 8px; -} - -#content -{ - margin-left: 190px; - width: 600px; -} - -.classList -{ - list-style-type: none; - padding: 0; - margin: 0 0 0 8px; - font-family: arial, sans-serif; - font-size: 1em; - overflow: auto; -} - -.classList li -{ - padding: 0; - margin: 0 0 8px 0; -} - -.summaryTable { width: 100%; } - -h1.classTitle -{ - font-size:170%; - line-height:130%; -} - -h2 { font-size: 110%; } -caption, div.sectionTitle -{ - background-color: #7F8FB1; - color: #fff; - font-size:130%; - text-align: left; - padding: 2px 6px 2px 6px; - border: 1px #7F8FB1 solid; -} - -div.sectionTitle { margin-bottom: 8px; } -.summaryTable thead { display: none; } - -.summaryTable td -{ - vertical-align: top; - padding: 4px; - border-bottom: 1px #7F8FB1 solid; - border-right: 1px #7F8FB1 solid; -} - -/*col#summaryAttributes {}*/ -.summaryTable td.attributes -{ - border-left: 1px #7F8FB1 solid; - width: 140px; - text-align: right; -} - -td.attributes, .fixedFont -{ - line-height: 15px; - color: #002EBE; - font-family: "Courier New",Courier,monospace; - font-size: 13px; -} - -.summaryTable td.nameDescription -{ - text-align: left; - font-size: 13px; - line-height: 15px; -} - -.summaryTable td.nameDescription, .description -{ - line-height: 15px; - padding: 4px; - padding-left: 4px; -} - -.summaryTable { margin-bottom: 8px; } - -ul.inheritsList -{ - list-style: square; - margin-left: 20px; - padding-left: 0; -} - -.detailList { - margin-left: 20px; - line-height: 15px; -} -.detailList dt { margin-left: 20px; } - -.detailList .heading -{ - font-weight: bold; - padding-bottom: 6px; - margin-left: 0; -} - -.light, td.attributes, .light a:link, .light a:visited -{ - color: #777; - font-style: italic; -} - -.fineprint -{ - text-align: right; - font-size: 10px; -} \ No newline at end of file diff --git a/doc/jsdoc-toolkit/templates/jsdoc/static/header.html b/doc/jsdoc-toolkit/templates/jsdoc/static/header.html deleted file mode 100644 index 353b735a4..000000000 --- a/doc/jsdoc-toolkit/templates/jsdoc/static/header.html +++ /dev/null @@ -1,2 +0,0 @@ - \ No newline at end of file diff --git a/doc/jsdoc-toolkit/templates/jsdoc/static/index.html b/doc/jsdoc-toolkit/templates/jsdoc/static/index.html deleted file mode 100644 index 661f6f67d..000000000 --- a/doc/jsdoc-toolkit/templates/jsdoc/static/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - Generated Javascript Documentation - - - - - - <body> - <p> - This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. - </p> - </body> - - - \ No newline at end of file diff --git a/doc/jsdoc-toolkit/templates/jsdoc/symbol.tmpl b/doc/jsdoc-toolkit/templates/jsdoc/symbol.tmpl deleted file mode 100644 index f8f4bd1f6..000000000 --- a/doc/jsdoc-toolkit/templates/jsdoc/symbol.tmpl +++ /dev/null @@ -1,35 +0,0 @@ - - {+data.name+} - {+data.memberOf+} - {+data.isStatic+} - {+data.isa+} - {+data.desc+} - {+data.classDesc+} - - - - {+method.name+} - {+method.memberOf+} - {+method.isStatic+} - {+method.desc+} - - - {+param.type+} - {+param.name+} - {+param.desc+} - {+param.defaultValue+} - - - - - - - - {+property.name+} - {+property.memberOf+} - {+property.isStatic+} - {+property.desc+} - {+property.type+} - - - diff --git a/doc/jsdoc/AttributePoolFactory.md b/doc/jsdoc/AttributePoolFactory.md new file mode 100644 index 000000000..0fd3cdfa0 --- /dev/null +++ b/doc/jsdoc/AttributePoolFactory.md @@ -0,0 +1,32 @@ +#AttributePoolFactory +`require("./AttributePoolFactory");` + +Copyright 2009 Google Inc., 2011 Peter 'Pita' Martischka +* Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS-IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +##Functions + +###createAttributePool () +Copyright 2009 Google Inc., 2011 Peter 'Pita' Martischka +* Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS-IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +* **** + +##Variables + diff --git a/doc/jsdoc/AuthorManager.md b/doc/jsdoc/AuthorManager.md new file mode 100644 index 000000000..9b2bdbbe4 --- /dev/null +++ b/doc/jsdoc/AuthorManager.md @@ -0,0 +1,59 @@ +#AuthorManager +`require("./AuthorManager");` + +2011 Peter 'Pita' Martischka +* Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS-IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +##Functions + +###getAuthor4Token (token, callback) +2011 Peter 'Pita' Martischka +* Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS-IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +* **token** The token +* **callback** + +###getAuthorColorId (author, callback) +Returns the color Id of the author + +* **author** +* **callback** + +###getAuthorName (author, callback) +Returns the name of the author + +* **author** +* **callback** + +###setAuthorColorId (author, colorId, callback) +Sets the color Id of the author + +* **author** +* **colorId** +* **callback** + +###setAuthorName (author, name, callback) +Sets the name of the author + +* **author** +* **name** +* **callback** + +##Variables + diff --git a/doc/jsdoc/Changeset.md b/doc/jsdoc/Changeset.md new file mode 100644 index 000000000..3fb2e8be7 --- /dev/null +++ b/doc/jsdoc/Changeset.md @@ -0,0 +1,328 @@ +#Changeset +`require("./Changeset");` + +Copyright 2009 Google Inc., 2011 Peter 'Pita' Martischka +* Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS-IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +##Functions + +###_slicerZipperFunc (attOp, csOp, opOut, pool) + +* **attOp** +* **csOp** +* **opOut** +* **pool** + +###appendATextToAssembler (atext, assem) + +* **atext** +* **assem** + +###applyToAText (cs, atext, pool) + +* **cs** +* **atext** +* **pool** + +###applyToAttribution (cs, astr, pool) + +* **cs** +* **astr** +* **pool** + +###applyToText (cs, str) + +* **cs** +* **str** + +###applyZip (in1, idx1, in2, idx2, func) + +* **in1** +* **idx1** +* **in2** +* **idx2** +* **func** + +###attribsAttributeValue (attribs, key, pool) + +* **attribs** +* **key** +* **pool** + +###attributeTester (attribPair, pool) + +* **attribPair** +* **pool** + +###builder (oldLen) + +* **oldLen** + +###characterRangeFollow (cs, startChar, endChar, insertionsAfter) + +* **cs** +* **startChar** +* **endChar** +* **insertionsAfter** + +###checkRep (cs) + +* **cs** + +###clearOp (op) + +* **op** + +###cloneAText (atext) + +* **atext** + +###cloneOp (op) + +* **op** + +###compose (cs1, cs2, pool) + +* **cs1** +* **cs2** +* **pool** + +###composeAttributes (att1, att2, resultIsMutation, pool) + +* **att1** +* **att2** +* **resultIsMutation** +* **pool** + +###copyAText (atext1, atext2) + +* **atext1** +* **atext2** + +###copyOp (op1, op2) + +* **op1** +* **op2** + +###eachAttribNumber (cs, func) + +* **cs** +* **func** + +###filterAttribNumbers (cs, filter) + +* **cs** +* **filter** + +###follow (cs1, cs2, reverseInsertOrder, pool) + +* **cs1** +* **cs2** +* **reverseInsertOrder** +* **pool** + +###followAttributes (att1, att2, pool) + +* **att1** +* **att2** +* **pool** + +###identity (N) + +* **N** + +###inverse (cs, lines, alines, pool) + +* **cs** +* **lines** +* **alines** +* **pool** + +###isIdentity (cs) + +* **cs** + +###joinAttributionLines (theAlines) + +* **theAlines** + +###makeAText (text, attribs) + +* **text** +* **attribs** + +###makeAttribsString (opcode, attribs, pool) + +* **opcode** +* **attribs** +* **pool** + +###makeAttribution (text) + +* **text** + +###makeSplice (oldFullText, spliceStart, numRemoved, newText, optNewTextAPairs, pool) + +* **oldFullText** +* **spliceStart** +* **numRemoved** +* **newText** +* **optNewTextAPairs** +* **pool** + +###mapAttribNumbers (cs, func) + +* **cs** +* **func** + +###mergingOpAssembler () + +* **** + +###moveOpsToNewPool (cs, oldPool, newPool) + +* **cs** +* **oldPool** +* **newPool** + +###mutateAttributionLines (cs, lines, pool) +Copyright 2009 Google Inc., 2011 Peter 'Pita' Martischka +* Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS-IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +* **cs** +* **lines** +* **pool** + +###mutateTextLines (cs, lines) + +* **cs** +* **lines** + +###newLen (cs) + +* **cs** + +###newOp (optOpcode) + +* **optOpcode** + +###numToString (num) + +* **num** + +###oldLen (cs) + +* **cs** + +###oneInsertedLineAtATimeOpIterator (opsStr, optStartIndex, charBank) + +* **opsStr** +* **optStartIndex** +* **charBank** + +###opAssembler () + +* **** + +###opAttributeValue (op, key, pool) + +* **op** +* **key** +* **pool** + +###opIterator (opsStr, optStartIndex) + +* **opsStr** +* **optStartIndex** + +###opString (op) + +* **op** + +###pack (oldLen, newLen, opsStr, bank) + +* **oldLen** +* **newLen** +* **opsStr** +* **bank** + +###parseNum (str) + +* **str** + +###prepareForWire (cs, pool) + +* **cs** +* **pool** + +###smartOpAssembler () + +* **** + +###splitAttributionLines (attrOps, text) + +* **attrOps** +* **text** + +###splitTextLines (text) + +* **text** + +###stringAssembler () + +* **** + +###stringIterator (str) + +* **str** + +###stringOp (str) + +* **str** + +###subattribution (astr, start, optEnd) + +* **astr** +* **start** +* **optEnd** + +###textLinesMutator (lines) + +* **lines** + +###toBaseTen (cs) + +* **cs** + +###toSplices (cs) + +* **cs** + +###unpack (cs) + +* **cs** + +##Variables + +###assert + + +###error + + diff --git a/doc/jsdoc/MessageHandler.md b/doc/jsdoc/MessageHandler.md new file mode 100644 index 000000000..0b93994b4 --- /dev/null +++ b/doc/jsdoc/MessageHandler.md @@ -0,0 +1,48 @@ +#MessageHandler +`require("./MessageHandler");` + +Copyright 2009 Google Inc., 2011 Peter 'Pita' Martischka +* Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS-IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +##Functions + +###handleConnect (client) +Handles the connection of a new user + +* **client** the new client + +###handleDisconnect (client) +Handles the disconnection of a user + +* **client** the client that leaves + +###handleMessage (client, message) +Handles a message from a user + +* **client** the client that send this message +* **message** the message from the client + +###setSocketIO (socket_io) +Copyright 2009 Google Inc., 2011 Peter 'Pita' Martischka +* Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS-IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +* **socket_io** The Socket + +##Variables + diff --git a/doc/jsdoc/Models/Pad.md b/doc/jsdoc/Models/Pad.md new file mode 100644 index 000000000..e9d53d1e4 --- /dev/null +++ b/doc/jsdoc/Models/Pad.md @@ -0,0 +1,15 @@ +#Mod +`require("./Models/Pad");` + +Copied from the Etherpad source code, don't know what its good for +@param txt + +##Functions + +###cleanText (txt) +Copied from the Etherpad source code, don't know what its good for + +* **txt** + +##Variables + diff --git a/doc/jsdoc/PadManager.md b/doc/jsdoc/PadManager.md new file mode 100644 index 000000000..1e21b03d2 --- /dev/null +++ b/doc/jsdoc/PadManager.md @@ -0,0 +1,33 @@ +#PadManager +`require("./PadManager");` + +2011 Peter 'Pita' Martischka +* Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS-IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +##Functions + +###getPad (id, callback) +2011 Peter 'Pita' Martischka +* Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS-IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +* **id** A String with the id of the pad +* **callback** + +##Variables + diff --git a/doc/jsdoc/README b/doc/jsdoc/README deleted file mode 100644 index 9b7cc7534..000000000 --- a/doc/jsdoc/README +++ /dev/null @@ -1 +0,0 @@ -You can create the JSDocs with generateJsDoc.sh in the bin folder diff --git a/doc/jsdoc/db.md b/doc/jsdoc/db.md new file mode 100644 index 000000000..45f55c5c9 --- /dev/null +++ b/doc/jsdoc/db.md @@ -0,0 +1,25 @@ +#db +`require("./db");` + +2011 Peter 'Pita' Martischka +* Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS-IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +##Functions + +###init (callback) + +* **callback** + +##Variables + +###db + + diff --git a/doc/jsdoc/easysync_tests.md b/doc/jsdoc/easysync_tests.md new file mode 100644 index 000000000..089548bb5 --- /dev/null +++ b/doc/jsdoc/easysync_tests.md @@ -0,0 +1,18 @@ +#easysync_tests +`require("./easysync_tests");` + +Copyright 2009 Google Inc., 2011 Peter 'Pita' Martischka +* Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS-IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +##Functions + +##Variables + diff --git a/doc/jsdoc/files.html b/doc/jsdoc/files.html deleted file mode 100644 index ca3c061ef..000000000 --- a/doc/jsdoc/files.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - - JsDoc Reference - File Index - - - - - - - - -
- -
-

Classes

- -
-
- -
-

File Index

- - - -
- -
-

../../node/AuthorManager.js

- -
- - - - -
-
-
- -
-

../../node/Changeset.js

- -
- - - - -
-
-
- -
-

../../node/easysync_tests.js

- -
- - - - -
-
-
- -
-

../../node/MessageHandler.js

- -
- - - - -
-
-
- -
-

../../node/PadManager.js

- -
- - - - -
-
-
- -
-

../../node/server.js

- -
- - - - -
-
-
- - -
-
- - Documentation generated by JsDoc Toolkit 2.3.2 on Sat Mar 26 2011 18:26:06 GMT-0000 (GMT) -
- - \ No newline at end of file diff --git a/doc/jsdoc/index.html b/doc/jsdoc/index.html deleted file mode 100644 index 34592f3a3..000000000 --- a/doc/jsdoc/index.html +++ /dev/null @@ -1,210 +0,0 @@ - - - - - - JsDoc Reference - Index - - - - - - - - -
- -
-

Classes

- -
-
- -
-

Class Index

- - -
-

_global_

- -
-
- - -
-
- - Documentation generated by JsDoc Toolkit 2.3.2 on Sat Mar 26 2011 18:26:06 GMT-0000 (GMT) -
- - \ No newline at end of file diff --git a/doc/jsdoc/minify.md b/doc/jsdoc/minify.md new file mode 100644 index 000000000..39c0ba621 --- /dev/null +++ b/doc/jsdoc/minify.md @@ -0,0 +1,33 @@ +#minify +`require("./minify");` + +2011 Peter 'Pita' Martischka +* Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS-IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +##Functions + +###padJS (req, res) +2011 Peter 'Pita' Martischka +* Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS-IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +* **req** +* **res** + +##Variables + diff --git a/doc/jsdoc/server.md b/doc/jsdoc/server.md new file mode 100644 index 000000000..b1b86af07 --- /dev/null +++ b/doc/jsdoc/server.md @@ -0,0 +1,21 @@ +#server +`require("./server");` + +2011 Peter 'Pita' Martischka +* Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS-IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +##Functions + +##Variables + +###maxAge + + diff --git a/doc/jsdoc/settings.md b/doc/jsdoc/settings.md new file mode 100644 index 000000000..fd7154378 --- /dev/null +++ b/doc/jsdoc/settings.md @@ -0,0 +1,36 @@ +#settings +`require("./settings");` + +2011 Peter 'Pita' Martischka +* Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS-IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +##Functions + +##Variables + +###dbSettings + + +###dbType + + +###defaultPadText + + +###logHTTP + + +###minify + + +###port + + diff --git a/doc/jsdoc/symbols/_global_.html b/doc/jsdoc/symbols/_global_.html deleted file mode 100644 index 421a4f40a..000000000 --- a/doc/jsdoc/symbols/_global_.html +++ /dev/null @@ -1,1667 +0,0 @@ - - - - - - - JsDoc Reference - _global_ - - - - - - - - - - - -
- - -
-

Classes

- -
- -
- -
- -

- - Built-In Namespace _global_ -

- - -

- - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Field Summary
Field AttributesField Name and Description
  - -
Copyright 2009 Google Inc.
-
  -
- Changeset -
-
2011 Peter 'Pita' Martischka - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License.
-
  - -
Saves all Authors as a assoative Array.
-
  - -
A Array with all known Pads
-
  -
- http -
-
2011 Peter 'Pita' Martischka - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License.
-
  - -
A associative array that saves which sessions belong to a pad
-
  - -
Copyright 2009 Google Inc.
-
  - -
A associative array that translates a session to a pad
-
  - -
A associative array that saves some general informations about a session -key = sessionId -values = author, rev - rev = That last revision that was send to this client - author = the author name of this session
-
  -
- socketio -
-
Saves the Socket class we need to send and recieve data from the client
-
  - -
A easy key value pair.
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Method Summary
Method AttributesMethod Name and Description
  -
_correctMarkersInPad(atext, apool) -
-
Copied from the Etherpad Source Code.
-
  - -
Generates a random String with the given length.
-
  -
appendRevision(id, theChangeset, The) -
-
Append a changeset to a pad
-
  -
atext(id) -
-
Returns the Attributed Text of a pad
-
  -
createPad(id) -
-
Creates an empty pad
-
  - -
Returns all Authors of a Pad
-
  - -
Returns the latest Revision Number of the Pad
-
  -
getRevisionAuthor(id, revNum) -
-
Returns the author of a specific revision
-
  -
getRevisionChangeset(id, revNum) -
-
Returns the changeset of a specific revision
-
  -
handleClientReady(client, message) -
-
Handles a CLIENT_READY.
-
  -
handleUserChanges(client, message) -
-
Handles a USERINFO_UPDATE, that means that a user have changed his color or name.
-
  -
handleUserInfoUpdate(client, message) -
-
Handles a USERINFO_UPDATE, that means that a user have changed his color or name.
-
  -
pool(id) -
-
Returns the Attribute Pool whichs the Pad is using
-
  -
text(id) -
-
Returns the plain text of a pad
-
  - -
A internal function that checks if the Author exist and throws a exception if not
-
  - -
A internal function that simply checks if client or socketio is null and throws a exception if yes
-
  - -
Check if the ID is a valid Pad ID and trows an Exeption if not
-
  - -
Check if the Revision of a Pad is valid and throws an Exeption if not
-
- - - - - - - - - - - - -
- Field Detail -
- - -
- - - AttributePoolFactory - -
-
- Copyright 2009 Google Inc., 2011 Peter 'Pita' Martischka - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS-IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -
- Defined in: Changeset.js. - - -
- - - - - - - - -
- - -
- - - Changeset - -
-
- 2011 Peter 'Pita' Martischka - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS-IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -
- Defined in: PadManager.js. - - -
- - - - - - - - -
- - -
- - - globalAuthors - -
-
- Saves all Authors as a assoative Array. The Key is the author id. -Authors can have the following attributes: --name The Name of the Author as shown on the Pad --colorId The Id of Usercolor. A number between 0 and 31 --timestamp The timestamp on which the user was last seen - -
- Defined in: AuthorManager.js. - - -
- - - - - - - - -
- - -
- - - globalPads - -
-
- A Array with all known Pads - -
- Defined in: PadManager.js. - - -
- - - - - - - - -
- - -
- - - http - -
-
- 2011 Peter 'Pita' Martischka - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS-IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -
- Defined in: server.js. - - -
- - - - - - - - -
- - -
- - - pad2sessions - -
-
- A associative array that saves which sessions belong to a pad - -
- Defined in: MessageHandler.js. - - -
- - - - - - - - -
- - -
- - - padManager - -
-
- Copyright 2009 Google Inc., 2011 Peter 'Pita' Martischka - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS-IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -
- Defined in: MessageHandler.js. - - -
- - - - - - - - -
- - -
- - - session2pad - -
-
- A associative array that translates a session to a pad - -
- Defined in: MessageHandler.js. - - -
- - - - - - - - -
- - -
- - - sessioninfos - -
-
- A associative array that saves some general informations about a session -key = sessionId -values = author, rev - rev = That last revision that was send to this client - author = the author name of this session - -
- Defined in: MessageHandler.js. - - -
- - - - - - - - -
- - -
- - - socketio - -
-
- Saves the Socket class we need to send and recieve data from the client - -
- Defined in: MessageHandler.js. - - -
- - - - - - - - -
- - -
- - - token2author - -
-
- A easy key value pair. The Key is the token, the value is the authorid - -
- Defined in: AuthorManager.js. - - -
- - - - - - - - - - - - - - -
- Method Detail -
- - -
- - - _correctMarkersInPad(atext, apool) - -
-
- Copied from the Etherpad Source Code. Don't know what this methode does excatly... - -
- Defined in: MessageHandler.js. - - -
- - - - -
-
Parameters:
- -
- atext - -
-
- -
- apool - -
-
- -
- - - - - - - - -
- - -
- - - _randomString(len) - -
-
- Generates a random String with the given length. Is needed to generate the Author Ids - -
- Defined in: AuthorManager.js. - - -
- - - - -
-
Parameters:
- -
- len - -
-
- -
- - - - - - - - -
- - -
- - - appendRevision(id, theChangeset, The) - -
-
- Append a changeset to a pad - -
- Defined in: PadManager.js. - - -
- - - - -
-
Parameters:
- -
- id - -
-
The Pad id
- -
- theChangeset - -
-
the changeset which should apply to the text
- -
- The - -
-
author of the revision, can be null
- -
- - - - - - - - -
- - -
- - - atext(id) - -
-
- Returns the Attributed Text of a pad - -
- Defined in: PadManager.js. - - -
- - - - -
-
Parameters:
- -
- id - -
-
The Pad id
- -
- - - - - - - - -
- - -
- - - createPad(id) - -
-
- Creates an empty pad - -
- Defined in: PadManager.js. - - -
- - - - -
-
Parameters:
- -
- id - -
-
The Pad id
- -
- - - - - - - - -
- - -
- - - getAllAuthors(id) - -
-
- Returns all Authors of a Pad - -
- Defined in: PadManager.js. - - -
- - - - -
-
Parameters:
- -
- id - -
-
The Pad id
- -
- - - - - - - - -
- - -
- - - getHeadRevisionNumber(id) - -
-
- Returns the latest Revision Number of the Pad - -
- Defined in: PadManager.js. - - -
- - - - -
-
Parameters:
- -
- id - -
-
The Pad id
- -
- - - - - - - - -
- - -
- - - getRevisionAuthor(id, revNum) - -
-
- Returns the author of a specific revision - -
- Defined in: PadManager.js. - - -
- - - - -
-
Parameters:
- -
- id - -
-
The Pad id
- -
- revNum - -
-
The Revision Number
- -
- - - - - - - - -
- - -
- - - getRevisionChangeset(id, revNum) - -
-
- Returns the changeset of a specific revision - -
- Defined in: PadManager.js. - - -
- - - - -
-
Parameters:
- -
- id - -
-
The Pad id
- -
- revNum - -
-
The Revision Number
- -
- - - - - - - - -
- - -
- - - handleClientReady(client, message) - -
-
- Handles a CLIENT_READY. A CLIENT_READY is the first message from the client to the server. The Client sends his token -and the pad it wants to enter. The Server answers with the inital values (clientVars) of the pad - -
- Defined in: MessageHandler.js. - - -
- - - - -
-
Parameters:
- -
- client - -
-
the client that send this message
- -
- message - -
-
the message from the client
- -
- - - - - - - - -
- - -
- - - handleUserChanges(client, message) - -
-
- Handles a USERINFO_UPDATE, that means that a user have changed his color or name. Anyway, we get both informations -This Method is nearly 90% copied out of the Etherpad Source Code. So I can't tell you what happens here exactly -Look at https://github.com/ether/pad/blob/master/etherpad/src/etherpad/collab/collab_server.js in the function applyUserChanges() - -
- Defined in: MessageHandler.js. - - -
- - - - -
-
Parameters:
- -
- client - -
-
the client that send this message
- -
- message - -
-
the message from the client
- -
- - - - - - - - -
- - -
- - - handleUserInfoUpdate(client, message) - -
-
- Handles a USERINFO_UPDATE, that means that a user have changed his color or name. Anyway, we get both informations - -
- Defined in: MessageHandler.js. - - -
- - - - -
-
Parameters:
- -
- client - -
-
the client that send this message
- -
- message - -
-
the message from the client
- -
- - - - - - - - -
- - -
- - - pool(id) - -
-
- Returns the Attribute Pool whichs the Pad is using - -
- Defined in: PadManager.js. - - -
- - - - -
-
Parameters:
- -
- id - -
-
The Pad id
- -
- - - - - - - - -
- - -
- - - text(id) - -
-
- Returns the plain text of a pad - -
- Defined in: PadManager.js. - - -
- - - - -
-
Parameters:
- -
- id - -
-
The Pad id
- -
- - - - - - - - -
- - -
- - - throwExceptionIfAuthorNotExist(author) - -
-
- A internal function that checks if the Author exist and throws a exception if not - -
- Defined in: AuthorManager.js. - - -
- - - - -
-
Parameters:
- -
- author - -
-
- -
- - - - - - - - -
- - -
- - - throwExceptionIfClientOrIOisInvalid(client) - -
-
- A internal function that simply checks if client or socketio is null and throws a exception if yes - -
- Defined in: MessageHandler.js. - - -
- - - - -
-
Parameters:
- -
- client - -
-
- -
- - - - - - - - -
- - -
- - - throwExceptionIfPadDontExist(id) - -
-
- Check if the ID is a valid Pad ID and trows an Exeption if not - -
- Defined in: PadManager.js. - - -
- - - - -
-
Parameters:
- -
- id - -
-
The Pad id
- -
- - - - - - - - -
- - -
- - - throwExceptionIfRevDontExist(id, revNum) - -
-
- Check if the Revision of a Pad is valid and throws an Exeption if not - -
- Defined in: PadManager.js. - - -
- - - - -
-
Parameters:
- -
- id - -
-
The Pad id
- -
- revNum - -
-
- -
- - - - - - - - - - - - - - - -
-
- - - -
- - Documentation generated by JsDoc Toolkit 2.3.2 on Sat Mar 26 2011 18:26:06 GMT-0000 (GMT) -
- - diff --git a/doc/jsdoc/symbols/src/node_AttributePoolFactory.js.html b/doc/jsdoc/symbols/src/node_AttributePoolFactory.js.html deleted file mode 100644 index 957fc617b..000000000 --- a/doc/jsdoc/symbols/src/node_AttributePoolFactory.js.html +++ /dev/null @@ -1,90 +0,0 @@ -
  1 /**
-  2  * Copyright 2009 Google Inc., 2011 Peter 'Pita' Martischka
-  3  *
-  4  * Licensed under the Apache License, Version 2.0 (the "License");
-  5  * you may not use this file except in compliance with the License.
-  6  * You may obtain a copy of the License at
-  7  *
-  8  *      http://www.apache.org/licenses/LICENSE-2.0
-  9  *
- 10  * Unless required by applicable law or agreed to in writing, software
- 11  * distributed under the License is distributed on an "AS-IS" BASIS,
- 12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 13  * See the License for the specific language governing permissions and
- 14  * limitations under the License.
- 15  */
- 16 
- 17 exports.createAttributePool = function () {
- 18   var p = {};
- 19   p.numToAttrib = {}; // e.g. {0: ['foo','bar']}
- 20   p.attribToNum = {}; // e.g. {'foo,bar': 0}
- 21   p.nextNum = 0;
- 22 
- 23   p.putAttrib = function (attrib, dontAddIfAbsent) {
- 24     var str = String(attrib);
- 25     if (str in p.attribToNum) {
- 26       return p.attribToNum[str];
- 27     }
- 28     if (dontAddIfAbsent) {
- 29       return -1;
- 30     }
- 31     var num = p.nextNum++;
- 32     p.attribToNum[str] = num;
- 33     p.numToAttrib[num] = [String(attrib[0] || ''), String(attrib[1] || '')];
- 34     return num;
- 35   };
- 36 
- 37   p.getAttrib = function (num) {
- 38     var pair = p.numToAttrib[num];
- 39     if (!pair) {
- 40       return pair;
- 41     }
- 42     return [pair[0], pair[1]]; // return a mutable copy
- 43   };
- 44 
- 45   p.getAttribKey = function (num) {
- 46     var pair = p.numToAttrib[num];
- 47     if (!pair) return '';
- 48     return pair[0];
- 49   };
- 50 
- 51   p.getAttribValue = function (num) {
- 52     var pair = p.numToAttrib[num];
- 53     if (!pair) return '';
- 54     return pair[1];
- 55   };
- 56 
- 57   p.eachAttrib = function (func) {
- 58     for (var n in p.numToAttrib) {
- 59       var pair = p.numToAttrib[n];
- 60       func(pair[0], pair[1]);
- 61     }
- 62   };
- 63 
- 64   p.toJsonable = function () {
- 65     return {
- 66       numToAttrib: p.numToAttrib,
- 67       nextNum: p.nextNum
- 68     };
- 69   };
- 70 
- 71   p.fromJsonable = function (obj) {
- 72     p.numToAttrib = obj.numToAttrib;
- 73     p.nextNum = obj.nextNum;
- 74     p.attribToNum = {};
- 75     for (var n in p.numToAttrib) {
- 76       p.attribToNum[String(p.numToAttrib[n])] = Number(n);
- 77     }
- 78     return p;
- 79   };
- 80 
- 81   return p;
- 82 }
- 83 
\ No newline at end of file diff --git a/doc/jsdoc/symbols/src/node_AuthorManager.js.html b/doc/jsdoc/symbols/src/node_AuthorManager.js.html deleted file mode 100644 index e3ef555a6..000000000 --- a/doc/jsdoc/symbols/src/node_AuthorManager.js.html +++ /dev/null @@ -1,139 +0,0 @@ -
  1 /**
-  2  * 2011 Peter 'Pita' Martischka
-  3  *
-  4  * Licensed under the Apache License, Version 2.0 (the "License");
-  5  * you may not use this file except in compliance with the License.
-  6  * You may obtain a copy of the License at
-  7  *
-  8  *      http://www.apache.org/licenses/LICENSE-2.0
-  9  *
- 10  * Unless required by applicable law or agreed to in writing, software
- 11  * distributed under the License is distributed on an "AS-IS" BASIS,
- 12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 13  * See the License for the specific language governing permissions and
- 14  * limitations under the License.
- 15  */
- 16 
- 17 
- 18 /**
- 19  * The AuthorManager controlls all information about the Pad authors
- 20  */
- 21 
- 22 /**
- 23  * Saves all Authors as a assoative Array. The Key is the author id.
- 24  * Authors can have the following attributes:
- 25  * -name The Name of the Author as shown on the Pad
- 26  * -colorId The Id of Usercolor. A number between 0 and 31
- 27  * -timestamp The timestamp on which the user was last seen
- 28  */ 
- 29 var globalAuthors = {};
- 30 
- 31 /**
- 32  * A easy key value pair. The Key is the token, the value is the authorid 
- 33  */
- 34 var token2author = {};
- 35 
- 36 /**
- 37  * Returns the Author Id for a token. If the token is unkown, 
- 38  * it creates a author for the token
- 39  * @param token The token 
- 40  */
- 41 exports.getAuthor4Token = function (token)
- 42 {
- 43   var author;
- 44   
- 45   if(token2author[token] == null)
- 46   {
- 47     author = "g." + _randomString(16);
- 48     
- 49     while(globalAuthors[author] != null)
- 50     {
- 51       author = "g." + _randomString(16);
- 52     }
- 53     
- 54     token2author[token]=author;
- 55   
- 56     globalAuthors[author] = {};
- 57     globalAuthors[author].colorId = Math.floor(Math.random()*32);
- 58     globalAuthors[author].name = null;
- 59   }
- 60   else
- 61   {
- 62     author = token2author[token];
- 63   }
- 64   
- 65   globalAuthors[author].timestamp = new Date().getTime();
- 66   
- 67   return author;
- 68 }
- 69 
- 70 /**
- 71  * Returns the color Id of the author
- 72  */
- 73 exports.getAuthorColorId = function (author)
- 74 {
- 75   throwExceptionIfAuthorNotExist(author);
- 76   
- 77   return globalAuthors[author].colorId;
- 78 }
- 79 
- 80 /**
- 81  * Sets the color Id of the author
- 82  */
- 83 exports.setAuthorColorId = function (author, colorId)
- 84 {
- 85   throwExceptionIfAuthorNotExist(author);
- 86   
- 87   globalAuthors[author].colorId = colorId;
- 88 }
- 89 
- 90 /**
- 91  * Returns the name of the author
- 92  */
- 93 exports.getAuthorName = function (author)
- 94 {
- 95   throwExceptionIfAuthorNotExist(author);
- 96   
- 97   return globalAuthors[author].name;
- 98 }
- 99 
-100 /**
-101  * Sets the name of the author
-102  */
-103 exports.setAuthorName = function (author, name)
-104 {
-105   throwExceptionIfAuthorNotExist(author);
-106   
-107   globalAuthors[author].name = name;
-108 }
-109 
-110 /**
-111  * A internal function that checks if the Author exist and throws a exception if not
-112  */
-113 function throwExceptionIfAuthorNotExist(author)
-114 {
-115   if(globalAuthors[author] == null)
-116   {
-117     throw "Author '" + author + "' is unkown!";
-118   }
-119 }
-120 
-121 /**
-122  * Generates a random String with the given length. Is needed to generate the Author Ids
-123  */
-124 function _randomString(len) {
-125   // use only numbers and lowercase letters
-126   var pieces = [];
-127   for(var i=0;i<len;i++) {
-128     pieces.push(Math.floor(Math.random()*36).toString(36).slice(-1));
-129   }
-130   return pieces.join('');
-131 }
-132 
\ No newline at end of file diff --git a/doc/jsdoc/symbols/src/node_Changeset.js.html b/doc/jsdoc/symbols/src/node_Changeset.js.html deleted file mode 100644 index 7d5f002e5..000000000 --- a/doc/jsdoc/symbols/src/node_Changeset.js.html +++ /dev/null @@ -1,1965 +0,0 @@ -
  1 /**
-  2  * Copyright 2009 Google Inc., 2011 Peter 'Pita' Martischka
-  3  *
-  4  * Licensed under the Apache License, Version 2.0 (the "License");
-  5  * you may not use this file except in compliance with the License.
-  6  * You may obtain a copy of the License at
-  7  *
-  8  *      http://www.apache.org/licenses/LICENSE-2.0
-  9  *
- 10  * Unless required by applicable law or agreed to in writing, software
- 11  * distributed under the License is distributed on an "AS-IS" BASIS,
- 12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 13  * See the License for the specific language governing permissions and
- 14  * limitations under the License.
- 15  */
- 16 
- 17 var AttributePoolFactory = require("./AttributePoolFactory");
- 18 
- 19 var _opt = null;
- 20 
- 21 //var exports = {};
- 22 exports.error = function error(msg) {
- 23   var e = new Error(msg);
- 24   e.easysync = true;
- 25   throw e;
- 26 };
- 27 exports.assert = function assert(b, msgParts) {
- 28   if (!b) {
- 29     var msg = Array.prototype.slice.call(arguments, 1).join('');
- 30     exports.error("exports: " + msg);
- 31   }
- 32 };
- 33 
- 34 exports.parseNum = function (str) {
- 35   return parseInt(str, 36);
- 36 };
- 37 exports.numToString = function (num) {
- 38   return num.toString(36).toLowerCase();
- 39 };
- 40 exports.toBaseTen = function (cs) {
- 41   var dollarIndex = cs.indexOf('$');
- 42   var beforeDollar = cs.substring(0, dollarIndex);
- 43   var fromDollar = cs.substring(dollarIndex);
- 44   return beforeDollar.replace(/[0-9a-z]+/g, function (s) {
- 45     return String(exports.parseNum(s));
- 46   }) + fromDollar;
- 47 };
- 48 
- 49 exports.oldLen = function (cs) {
- 50   return exports.unpack(cs).oldLen;
- 51 };
- 52 exports.newLen = function (cs) {
- 53   return exports.unpack(cs).newLen;
- 54 };
- 55 
- 56 exports.opIterator = function (opsStr, optStartIndex) {
- 57   //print(opsStr);
- 58   var regex = /((?:\*[0-9a-z]+)*)(?:\|([0-9a-z]+))?([-+=])([0-9a-z]+)|\?|/g;
- 59   var startIndex = (optStartIndex || 0);
- 60   var curIndex = startIndex;
- 61   var prevIndex = curIndex;
- 62 
- 63   function nextRegexMatch() {
- 64     prevIndex = curIndex;
- 65     var result;
- 66     if (_opt) {
- 67       result = _opt.nextOpInString(opsStr, curIndex);
- 68       if (result) {
- 69         if (result.opcode() == '?') {
- 70           exports.error("Hit error opcode in op stream");
- 71         }
- 72         curIndex = result.lastIndex();
- 73       }
- 74     } else {
- 75       regex.lastIndex = curIndex;
- 76       result = regex.exec(opsStr);
- 77       curIndex = regex.lastIndex;
- 78       if (result[0] == '?') {
- 79         exports.error("Hit error opcode in op stream");
- 80       }
- 81     }
- 82     return result;
- 83   }
- 84   var regexResult = nextRegexMatch();
- 85   var obj = exports.newOp();
- 86 
- 87   function next(optObj) {
- 88     var op = (optObj || obj);
- 89     if (_opt && regexResult) {
- 90       op.attribs = regexResult.attribs();
- 91       op.lines = regexResult.lines();
- 92       op.chars = regexResult.chars();
- 93       op.opcode = regexResult.opcode();
- 94       regexResult = nextRegexMatch();
- 95     } else if ((!_opt) && regexResult[0]) {
- 96       op.attribs = regexResult[1];
- 97       op.lines = exports.parseNum(regexResult[2] || 0);
- 98       op.opcode = regexResult[3];
- 99       op.chars = exports.parseNum(regexResult[4]);
-100       regexResult = nextRegexMatch();
-101     } else {
-102       exports.clearOp(op);
-103     }
-104     return op;
-105   }
-106 
-107   function hasNext() {
-108     return !!(_opt ? regexResult : regexResult[0]);
-109   }
-110 
-111   function lastIndex() {
-112     return prevIndex;
-113   }
-114   return {
-115     next: next,
-116     hasNext: hasNext,
-117     lastIndex: lastIndex
-118   };
-119 };
-120 
-121 exports.clearOp = function (op) {
-122   op.opcode = '';
-123   op.chars = 0;
-124   op.lines = 0;
-125   op.attribs = '';
-126 };
-127 exports.newOp = function (optOpcode) {
-128   return {
-129     opcode: (optOpcode || ''),
-130     chars: 0,
-131     lines: 0,
-132     attribs: ''
-133   };
-134 };
-135 exports.cloneOp = function (op) {
-136   return {
-137     opcode: op.opcode,
-138     chars: op.chars,
-139     lines: op.lines,
-140     attribs: op.attribs
-141   };
-142 };
-143 exports.copyOp = function (op1, op2) {
-144   op2.opcode = op1.opcode;
-145   op2.chars = op1.chars;
-146   op2.lines = op1.lines;
-147   op2.attribs = op1.attribs;
-148 };
-149 exports.opString = function (op) {
-150   // just for debugging
-151   if (!op.opcode) return 'null';
-152   var assem = exports.opAssembler();
-153   assem.append(op);
-154   return assem.toString();
-155 };
-156 exports.stringOp = function (str) {
-157   // just for debugging
-158   return exports.opIterator(str).next();
-159 };
-160 
-161 exports.checkRep = function (cs) {
-162   // doesn't check things that require access to attrib pool (e.g. attribute order)
-163   // or original string (e.g. newline positions)
-164   var unpacked = exports.unpack(cs);
-165   var oldLen = unpacked.oldLen;
-166   var newLen = unpacked.newLen;
-167   var ops = unpacked.ops;
-168   var charBank = unpacked.charBank;
-169 
-170   var assem = exports.smartOpAssembler();
-171   var oldPos = 0;
-172   var calcNewLen = 0;
-173   var numInserted = 0;
-174   var iter = exports.opIterator(ops);
-175   while (iter.hasNext()) {
-176     var o = iter.next();
-177     switch (o.opcode) {
-178     case '=':
-179       oldPos += o.chars;
-180       calcNewLen += o.chars;
-181       break;
-182     case '-':
-183       oldPos += o.chars;
-184       exports.assert(oldPos < oldLen, oldPos, " >= ", oldLen, " in ", cs);
-185       break;
-186     case '+':
-187       {
-188         calcNewLen += o.chars;
-189         numInserted += o.chars;
-190         exports.assert(calcNewLen < newLen, calcNewLen, " >= ", newLen, " in ", cs);
-191         break;
-192       }
-193     }
-194     assem.append(o);
-195   }
-196 
-197   calcNewLen += oldLen - oldPos;
-198   charBank = charBank.substring(0, numInserted);
-199   while (charBank.length < numInserted) {
-200     charBank += "?";
-201   }
-202 
-203   assem.endDocument();
-204   var normalized = exports.pack(oldLen, calcNewLen, assem.toString(), charBank);
-205   exports.assert(normalized == cs, normalized, ' != ', cs);
-206 
-207   return cs;
-208 }
-209 
-210 exports.smartOpAssembler = function () {
-211   // Like opAssembler but able to produce conforming exportss
-212   // from slightly looser input, at the cost of speed.
-213   // Specifically:
-214   // - merges consecutive operations that can be merged
-215   // - strips final "="
-216   // - ignores 0-length changes
-217   // - reorders consecutive + and - (which margingOpAssembler doesn't do)
-218   var minusAssem = exports.mergingOpAssembler();
-219   var plusAssem = exports.mergingOpAssembler();
-220   var keepAssem = exports.mergingOpAssembler();
-221   var assem = exports.stringAssembler();
-222   var lastOpcode = '';
-223   var lengthChange = 0;
-224 
-225   function flushKeeps() {
-226     assem.append(keepAssem.toString());
-227     keepAssem.clear();
-228   }
-229 
-230   function flushPlusMinus() {
-231     assem.append(minusAssem.toString());
-232     minusAssem.clear();
-233     assem.append(plusAssem.toString());
-234     plusAssem.clear();
-235   }
-236 
-237   function append(op) {
-238     if (!op.opcode) return;
-239     if (!op.chars) return;
-240 
-241     if (op.opcode == '-') {
-242       if (lastOpcode == '=') {
-243         flushKeeps();
-244       }
-245       minusAssem.append(op);
-246       lengthChange -= op.chars;
-247     } else if (op.opcode == '+') {
-248       if (lastOpcode == '=') {
-249         flushKeeps();
-250       }
-251       plusAssem.append(op);
-252       lengthChange += op.chars;
-253     } else if (op.opcode == '=') {
-254       if (lastOpcode != '=') {
-255         flushPlusMinus();
-256       }
-257       keepAssem.append(op);
-258     }
-259     lastOpcode = op.opcode;
-260   }
-261 
-262   function appendOpWithText(opcode, text, attribs, pool) {
-263     var op = exports.newOp(opcode);
-264     op.attribs = exports.makeAttribsString(opcode, attribs, pool);
-265     var lastNewlinePos = text.lastIndexOf('\n');
-266     if (lastNewlinePos < 0) {
-267       op.chars = text.length;
-268       op.lines = 0;
-269       append(op);
-270     } else {
-271       op.chars = lastNewlinePos + 1;
-272       op.lines = text.match(/\n/g).length;
-273       append(op);
-274       op.chars = text.length - (lastNewlinePos + 1);
-275       op.lines = 0;
-276       append(op);
-277     }
-278   }
-279 
-280   function toString() {
-281     flushPlusMinus();
-282     flushKeeps();
-283     return assem.toString();
-284   }
-285 
-286   function clear() {
-287     minusAssem.clear();
-288     plusAssem.clear();
-289     keepAssem.clear();
-290     assem.clear();
-291     lengthChange = 0;
-292   }
-293 
-294   function endDocument() {
-295     keepAssem.endDocument();
-296   }
-297 
-298   function getLengthChange() {
-299     return lengthChange;
-300   }
-301 
-302   return {
-303     append: append,
-304     toString: toString,
-305     clear: clear,
-306     endDocument: endDocument,
-307     appendOpWithText: appendOpWithText,
-308     getLengthChange: getLengthChange
-309   };
-310 };
-311 
-312 if (_opt) {
-313   exports.mergingOpAssembler = function () {
-314     var assem = _opt.mergingOpAssembler();
-315 
-316     function append(op) {
-317       assem.append(op.opcode, op.chars, op.lines, op.attribs);
-318     }
-319 
-320     function toString() {
-321       return assem.toString();
-322     }
-323 
-324     function clear() {
-325       assem.clear();
-326     }
-327 
-328     function endDocument() {
-329       assem.endDocument();
-330     }
-331 
-332     return {
-333       append: append,
-334       toString: toString,
-335       clear: clear,
-336       endDocument: endDocument
-337     };
-338   };
-339 } else {
-340   exports.mergingOpAssembler = function () {
-341     // This assembler can be used in production; it efficiently
-342     // merges consecutive operations that are mergeable, ignores
-343     // no-ops, and drops final pure "keeps".  It does not re-order
-344     // operations.
-345     var assem = exports.opAssembler();
-346     var bufOp = exports.newOp();
-347 
-348     // If we get, for example, insertions [xxx\n,yyy], those don't merge,
-349     // but if we get [xxx\n,yyy,zzz\n], that merges to [xxx\nyyyzzz\n].
-350     // This variable stores the length of yyy and any other newline-less
-351     // ops immediately after it.
-352     var bufOpAdditionalCharsAfterNewline = 0;
-353 
-354     function flush(isEndDocument) {
-355       if (bufOp.opcode) {
-356         if (isEndDocument && bufOp.opcode == '=' && !bufOp.attribs) {
-357           // final merged keep, leave it implicit
-358         } else {
-359           assem.append(bufOp);
-360           if (bufOpAdditionalCharsAfterNewline) {
-361             bufOp.chars = bufOpAdditionalCharsAfterNewline;
-362             bufOp.lines = 0;
-363             assem.append(bufOp);
-364             bufOpAdditionalCharsAfterNewline = 0;
-365           }
-366         }
-367         bufOp.opcode = '';
-368       }
-369     }
-370 
-371     function append(op) {
-372       if (op.chars > 0) {
-373         if (bufOp.opcode == op.opcode && bufOp.attribs == op.attribs) {
-374           if (op.lines > 0) {
-375             // bufOp and additional chars are all mergeable into a multi-line op
-376             bufOp.chars += bufOpAdditionalCharsAfterNewline + op.chars;
-377             bufOp.lines += op.lines;
-378             bufOpAdditionalCharsAfterNewline = 0;
-379           } else if (bufOp.lines == 0) {
-380             // both bufOp and op are in-line
-381             bufOp.chars += op.chars;
-382           } else {
-383             // append in-line text to multi-line bufOp
-384             bufOpAdditionalCharsAfterNewline += op.chars;
-385           }
-386         } else {
-387           flush();
-388           exports.copyOp(op, bufOp);
-389         }
-390       }
-391     }
-392 
-393     function endDocument() {
-394       flush(true);
-395     }
-396 
-397     function toString() {
-398       flush();
-399       return assem.toString();
-400     }
-401 
-402     function clear() {
-403       assem.clear();
-404       exports.clearOp(bufOp);
-405     }
-406     return {
-407       append: append,
-408       toString: toString,
-409       clear: clear,
-410       endDocument: endDocument
-411     };
-412   };
-413 }
-414 
-415 if (_opt) {
-416   exports.opAssembler = function () {
-417     var assem = _opt.opAssembler();
-418     // this function allows op to be mutated later (doesn't keep a ref)
-419 
-420     function append(op) {
-421       assem.append(op.opcode, op.chars, op.lines, op.attribs);
-422     }
-423 
-424     function toString() {
-425       return assem.toString();
-426     }
-427 
-428     function clear() {
-429       assem.clear();
-430     }
-431     return {
-432       append: append,
-433       toString: toString,
-434       clear: clear
-435     };
-436   };
-437 } else {
-438   exports.opAssembler = function () {
-439     var pieces = [];
-440     // this function allows op to be mutated later (doesn't keep a ref)
-441 
-442     function append(op) {
-443       pieces.push(op.attribs);
-444       if (op.lines) {
-445         pieces.push('|', exports.numToString(op.lines));
-446       }
-447       pieces.push(op.opcode);
-448       pieces.push(exports.numToString(op.chars));
-449     }
-450 
-451     function toString() {
-452       return pieces.join('');
-453     }
-454 
-455     function clear() {
-456       pieces.length = 0;
-457     }
-458     return {
-459       append: append,
-460       toString: toString,
-461       clear: clear
-462     };
-463   };
-464 }
-465 
-466 exports.stringIterator = function (str) {
-467   var curIndex = 0;
-468 
-469   function assertRemaining(n) {
-470     exports.assert(n <= remaining(), "!(", n, " <= ", remaining(), ")");
-471   }
-472 
-473   function take(n) {
-474     assertRemaining(n);
-475     var s = str.substr(curIndex, n);
-476     curIndex += n;
-477     return s;
-478   }
-479 
-480   function peek(n) {
-481     assertRemaining(n);
-482     var s = str.substr(curIndex, n);
-483     return s;
-484   }
-485 
-486   function skip(n) {
-487     assertRemaining(n);
-488     curIndex += n;
-489   }
-490 
-491   function remaining() {
-492     return str.length - curIndex;
-493   }
-494   return {
-495     take: take,
-496     skip: skip,
-497     remaining: remaining,
-498     peek: peek
-499   };
-500 };
-501 
-502 exports.stringAssembler = function () {
-503   var pieces = [];
-504 
-505   function append(x) {
-506     pieces.push(String(x));
-507   }
-508 
-509   function toString() {
-510     return pieces.join('');
-511   }
-512   return {
-513     append: append,
-514     toString: toString
-515   };
-516 };
-517 
-518 // "lines" need not be an array as long as it supports certain calls (lines_foo inside).
-519 exports.textLinesMutator = function (lines) {
-520   // Mutates lines, an array of strings, in place.
-521   // Mutation operations have the same constraints as exports operations
-522   // with respect to newlines, but not the other additional constraints
-523   // (i.e. ins/del ordering, forbidden no-ops, non-mergeability, final newline).
-524   // Can be used to mutate lists of strings where the last char of each string
-525   // is not actually a newline, but for the purposes of N and L values,
-526   // the caller should pretend it is, and for things to work right in that case, the input
-527   // to insert() should be a single line with no newlines.
-528   var curSplice = [0, 0];
-529   var inSplice = false;
-530   // position in document after curSplice is applied:
-531   var curLine = 0,
-532       curCol = 0;
-533   // invariant: if (inSplice) then (curLine is in curSplice[0] + curSplice.length - {2,3}) &&
-534   //            curLine >= curSplice[0]
-535   // invariant: if (inSplice && (curLine >= curSplice[0] + curSplice.length - 2)) then
-536   //            curCol == 0
-537 
-538   function lines_applySplice(s) {
-539     lines.splice.apply(lines, s);
-540   }
-541 
-542   function lines_toSource() {
-543     return lines.toSource();
-544   }
-545 
-546   function lines_get(idx) {
-547     if (lines.get) {
-548       return lines.get(idx);
-549     } else {
-550       return lines[idx];
-551     }
-552   }
-553   // can be unimplemented if removeLines's return value not needed
-554 
-555   function lines_slice(start, end) {
-556     if (lines.slice) {
-557       return lines.slice(start, end);
-558     } else {
-559       return [];
-560     }
-561   }
-562 
-563   function lines_length() {
-564     if ((typeof lines.length) == "number") {
-565       return lines.length;
-566     } else {
-567       return lines.length();
-568     }
-569   }
-570 
-571   function enterSplice() {
-572     curSplice[0] = curLine;
-573     curSplice[1] = 0;
-574     if (curCol > 0) {
-575       putCurLineInSplice();
-576     }
-577     inSplice = true;
-578   }
-579 
-580   function leaveSplice() {
-581     lines_applySplice(curSplice);
-582     curSplice.length = 2;
-583     curSplice[0] = curSplice[1] = 0;
-584     inSplice = false;
-585   }
-586 
-587   function isCurLineInSplice() {
-588     return (curLine - curSplice[0] < (curSplice.length - 2));
-589   }
-590 
-591   function debugPrint(typ) {
-592     print(typ + ": " + curSplice.toSource() + " / " + curLine + "," + curCol + " / " + lines_toSource());
-593   }
-594 
-595   function putCurLineInSplice() {
-596     if (!isCurLineInSplice()) {
-597       curSplice.push(lines_get(curSplice[0] + curSplice[1]));
-598       curSplice[1]++;
-599     }
-600     return 2 + curLine - curSplice[0];
-601   }
-602 
-603   function skipLines(L, includeInSplice) {
-604     if (L) {
-605       if (includeInSplice) {
-606         if (!inSplice) {
-607           enterSplice();
-608         }
-609         for (var i = 0; i < L; i++) {
-610           curCol = 0;
-611           putCurLineInSplice();
-612           curLine++;
-613         }
-614       } else {
-615         if (inSplice) {
-616           if (L > 1) {
-617             leaveSplice();
-618           } else {
-619             putCurLineInSplice();
-620           }
-621         }
-622         curLine += L;
-623         curCol = 0;
-624       }
-625       //print(inSplice+" / "+isCurLineInSplice()+" / "+curSplice[0]+" / "+curSplice[1]+" / "+lines.length);
-626 /*if (inSplice && (! isCurLineInSplice()) && (curSplice[0] + curSplice[1] < lines.length)) {
-627 	  print("BLAH");
-628 	  putCurLineInSplice();
-629 	}*/
-630       // tests case foo in remove(), which isn't otherwise covered in current impl
-631     }
-632     //debugPrint("skip");
-633   }
-634 
-635   function skip(N, L, includeInSplice) {
-636     if (N) {
-637       if (L) {
-638         skipLines(L, includeInSplice);
-639       } else {
-640         if (includeInSplice && !inSplice) {
-641           enterSplice();
-642         }
-643         if (inSplice) {
-644           putCurLineInSplice();
-645         }
-646         curCol += N;
-647         //debugPrint("skip");
-648       }
-649     }
-650   }
-651 
-652   function removeLines(L) {
-653     var removed = '';
-654     if (L) {
-655       if (!inSplice) {
-656         enterSplice();
-657       }
-658 
-659       function nextKLinesText(k) {
-660         var m = curSplice[0] + curSplice[1];
-661         return lines_slice(m, m + k).join('');
-662       }
-663       if (isCurLineInSplice()) {
-664         //print(curCol);
-665         if (curCol == 0) {
-666           removed = curSplice[curSplice.length - 1];
-667           // print("FOO"); // case foo
-668           curSplice.length--;
-669           removed += nextKLinesText(L - 1);
-670           curSplice[1] += L - 1;
-671         } else {
-672           removed = nextKLinesText(L - 1);
-673           curSplice[1] += L - 1;
-674           var sline = curSplice.length - 1;
-675           removed = curSplice[sline].substring(curCol) + removed;
-676           curSplice[sline] = curSplice[sline].substring(0, curCol) + lines_get(curSplice[0] + curSplice[1]);
-677           curSplice[1] += 1;
-678         }
-679       } else {
-680         removed = nextKLinesText(L);
-681         curSplice[1] += L;
-682       }
-683       //debugPrint("remove");
-684     }
-685     return removed;
-686   }
-687 
-688   function remove(N, L) {
-689     var removed = '';
-690     if (N) {
-691       if (L) {
-692         return removeLines(L);
-693       } else {
-694         if (!inSplice) {
-695           enterSplice();
-696         }
-697         var sline = putCurLineInSplice();
-698         removed = curSplice[sline].substring(curCol, curCol + N);
-699         curSplice[sline] = curSplice[sline].substring(0, curCol) + curSplice[sline].substring(curCol + N);
-700         //debugPrint("remove");
-701       }
-702     }
-703     return removed;
-704   }
-705 
-706   function insert(text, L) {
-707     if (text) {
-708       if (!inSplice) {
-709         enterSplice();
-710       }
-711       if (L) {
-712         var newLines = exports.splitTextLines(text);
-713         if (isCurLineInSplice()) {
-714           //if (curCol == 0) {
-715           //curSplice.length--;
-716           //curSplice[1]--;
-717           //Array.prototype.push.apply(curSplice, newLines);
-718           //curLine += newLines.length;
-719           //}
-720           //else {
-721           var sline = curSplice.length - 1;
-722           var theLine = curSplice[sline];
-723           var lineCol = curCol;
-724           curSplice[sline] = theLine.substring(0, lineCol) + newLines[0];
-725           curLine++;
-726           newLines.splice(0, 1);
-727           Array.prototype.push.apply(curSplice, newLines);
-728           curLine += newLines.length;
-729           curSplice.push(theLine.substring(lineCol));
-730           curCol = 0;
-731           //}
-732         } else {
-733           Array.prototype.push.apply(curSplice, newLines);
-734           curLine += newLines.length;
-735         }
-736       } else {
-737         var sline = putCurLineInSplice();
-738         curSplice[sline] = curSplice[sline].substring(0, curCol) + text + curSplice[sline].substring(curCol);
-739         curCol += text.length;
-740       }
-741       //debugPrint("insert");
-742     }
-743   }
-744 
-745   function hasMore() {
-746     //print(lines.length+" / "+inSplice+" / "+(curSplice.length - 2)+" / "+curSplice[1]);
-747     var docLines = lines_length();
-748     if (inSplice) {
-749       docLines += curSplice.length - 2 - curSplice[1];
-750     }
-751     return curLine < docLines;
-752   }
-753 
-754   function close() {
-755     if (inSplice) {
-756       leaveSplice();
-757     }
-758     //debugPrint("close");
-759   }
-760 
-761   var self = {
-762     skip: skip,
-763     remove: remove,
-764     insert: insert,
-765     close: close,
-766     hasMore: hasMore,
-767     removeLines: removeLines,
-768     skipLines: skipLines
-769   };
-770   return self;
-771 };
-772 
-773 exports.applyZip = function (in1, idx1, in2, idx2, func) {
-774   var iter1 = exports.opIterator(in1, idx1);
-775   var iter2 = exports.opIterator(in2, idx2);
-776   var assem = exports.smartOpAssembler();
-777   var op1 = exports.newOp();
-778   var op2 = exports.newOp();
-779   var opOut = exports.newOp();
-780   while (op1.opcode || iter1.hasNext() || op2.opcode || iter2.hasNext()) {
-781     if ((!op1.opcode) && iter1.hasNext()) iter1.next(op1);
-782     if ((!op2.opcode) && iter2.hasNext()) iter2.next(op2);
-783     func(op1, op2, opOut);
-784     if (opOut.opcode) {
-785       //print(opOut.toSource());
-786       assem.append(opOut);
-787       opOut.opcode = '';
-788     }
-789   }
-790   assem.endDocument();
-791   return assem.toString();
-792 };
-793 
-794 exports.unpack = function (cs) {
-795   var headerRegex = /Z:([0-9a-z]+)([><])([0-9a-z]+)|/;
-796   var headerMatch = headerRegex.exec(cs);
-797   if ((!headerMatch) || (!headerMatch[0])) {
-798     exports.error("Not a exports: " + cs);
-799   }
-800   var oldLen = exports.parseNum(headerMatch[1]);
-801   var changeSign = (headerMatch[2] == '>') ? 1 : -1;
-802   var changeMag = exports.parseNum(headerMatch[3]);
-803   var newLen = oldLen + changeSign * changeMag;
-804   var opsStart = headerMatch[0].length;
-805   var opsEnd = cs.indexOf("$");
-806   if (opsEnd < 0) opsEnd = cs.length;
-807   return {
-808     oldLen: oldLen,
-809     newLen: newLen,
-810     ops: cs.substring(opsStart, opsEnd),
-811     charBank: cs.substring(opsEnd + 1)
-812   };
-813 };
-814 
-815 exports.pack = function (oldLen, newLen, opsStr, bank) {
-816   var lenDiff = newLen - oldLen;
-817   var lenDiffStr = (lenDiff >= 0 ? '>' + exports.numToString(lenDiff) : '<' + exports.numToString(-lenDiff));
-818   var a = [];
-819   a.push('Z:', exports.numToString(oldLen), lenDiffStr, opsStr, '$', bank);
-820   return a.join('');
-821 };
-822 
-823 exports.applyToText = function (cs, str) {
-824   var unpacked = exports.unpack(cs);
-825   exports.assert(str.length == unpacked.oldLen, "mismatched apply: ", str.length, " / ", unpacked.oldLen);
-826   var csIter = exports.opIterator(unpacked.ops);
-827   var bankIter = exports.stringIterator(unpacked.charBank);
-828   var strIter = exports.stringIterator(str);
-829   var assem = exports.stringAssembler();
-830   while (csIter.hasNext()) {
-831     var op = csIter.next();
-832     switch (op.opcode) {
-833     case '+':
-834       assem.append(bankIter.take(op.chars));
-835       break;
-836     case '-':
-837       strIter.skip(op.chars);
-838       break;
-839     case '=':
-840       assem.append(strIter.take(op.chars));
-841       break;
-842     }
-843   }
-844   assem.append(strIter.take(strIter.remaining()));
-845   return assem.toString();
-846 };
-847 
-848 exports.mutateTextLines = function (cs, lines) {
-849   var unpacked = exports.unpack(cs);
-850   var csIter = exports.opIterator(unpacked.ops);
-851   var bankIter = exports.stringIterator(unpacked.charBank);
-852   var mut = exports.textLinesMutator(lines);
-853   while (csIter.hasNext()) {
-854     var op = csIter.next();
-855     switch (op.opcode) {
-856     case '+':
-857       mut.insert(bankIter.take(op.chars), op.lines);
-858       break;
-859     case '-':
-860       mut.remove(op.chars, op.lines);
-861       break;
-862     case '=':
-863       mut.skip(op.chars, op.lines, ( !! op.attribs));
-864       break;
-865     }
-866   }
-867   mut.close();
-868 };
-869 
-870 exports.composeAttributes = function (att1, att2, resultIsMutation, pool) {
-871   // att1 and att2 are strings like "*3*f*1c", asMutation is a boolean.
-872   // Sometimes attribute (key,value) pairs are treated as attribute presence
-873   // information, while other times they are treated as operations that
-874   // mutate a set of attributes, and this affects whether an empty value
-875   // is a deletion or a change.
-876   // Examples, of the form (att1Items, att2Items, resultIsMutation) -> result
-877   // ([], [(bold, )], true) -> [(bold, )]
-878   // ([], [(bold, )], false) -> []
-879   // ([], [(bold, true)], true) -> [(bold, true)]
-880   // ([], [(bold, true)], false) -> [(bold, true)]
-881   // ([(bold, true)], [(bold, )], true) -> [(bold, )]
-882   // ([(bold, true)], [(bold, )], false) -> []
-883   // pool can be null if att2 has no attributes.
-884   if ((!att1) && resultIsMutation) {
-885     // In the case of a mutation (i.e. composing two exportss),
-886     // an att2 composed with an empy att1 is just att2.  If att1
-887     // is part of an attribution string, then att2 may remove
-888     // attributes that are already gone, so don't do this optimization.
-889     return att2;
-890   }
-891   if (!att2) return att1;
-892   var atts = [];
-893   att1.replace(/\*([0-9a-z]+)/g, function (_, a) {
-894     atts.push(pool.getAttrib(exports.parseNum(a)));
-895     return '';
-896   });
-897   att2.replace(/\*([0-9a-z]+)/g, function (_, a) {
-898     var pair = pool.getAttrib(exports.parseNum(a));
-899     var found = false;
-900     for (var i = 0; i < atts.length; i++) {
-901       var oldPair = atts[i];
-902       if (oldPair[0] == pair[0]) {
-903         if (pair[1] || resultIsMutation) {
-904           oldPair[1] = pair[1];
-905         } else {
-906           atts.splice(i, 1);
-907         }
-908         found = true;
-909         break;
-910       }
-911     }
-912     if ((!found) && (pair[1] || resultIsMutation)) {
-913       atts.push(pair);
-914     }
-915     return '';
-916   });
-917   atts.sort();
-918   var buf = exports.stringAssembler();
-919   for (var i = 0; i < atts.length; i++) {
-920     buf.append('*');
-921     buf.append(exports.numToString(pool.putAttrib(atts[i])));
-922   }
-923   //print(att1+" / "+att2+" / "+buf.toString());
-924   return buf.toString();
-925 };
-926 
-927 exports._slicerZipperFunc = function (attOp, csOp, opOut, pool) {
-928   // attOp is the op from the sequence that is being operated on, either an
-929   // attribution string or the earlier of two exportss being composed.
-930   // pool can be null if definitely not needed.
-931   //print(csOp.toSource()+" "+attOp.toSource()+" "+opOut.toSource());
-932   if (attOp.opcode == '-') {
-933     exports.copyOp(attOp, opOut);
-934     attOp.opcode = '';
-935   } else if (!attOp.opcode) {
-936     exports.copyOp(csOp, opOut);
-937     csOp.opcode = '';
-938   } else {
-939     switch (csOp.opcode) {
-940     case '-':
-941       {
-942         if (csOp.chars <= attOp.chars) {
-943           // delete or delete part
-944           if (attOp.opcode == '=') {
-945             opOut.opcode = '-';
-946             opOut.chars = csOp.chars;
-947             opOut.lines = csOp.lines;
-948             opOut.attribs = '';
-949           }
-950           attOp.chars -= csOp.chars;
-951           attOp.lines -= csOp.lines;
-952           csOp.opcode = '';
-953           if (!attOp.chars) {
-954             attOp.opcode = '';
-955           }
-956         } else {
-957           // delete and keep going
-958           if (attOp.opcode == '=') {
-959             opOut.opcode = '-';
-960             opOut.chars = attOp.chars;
-961             opOut.lines = attOp.lines;
-962             opOut.attribs = '';
-963           }
-964           csOp.chars -= attOp.chars;
-965           csOp.lines -= attOp.lines;
-966           attOp.opcode = '';
-967         }
-968         break;
-969       }
-970     case '+':
-971       {
-972         // insert
-973         exports.copyOp(csOp, opOut);
-974         csOp.opcode = '';
-975         break;
-976       }
-977     case '=':
-978       {
-979         if (csOp.chars <= attOp.chars) {
-980           // keep or keep part
-981           opOut.opcode = attOp.opcode;
-982           opOut.chars = csOp.chars;
-983           opOut.lines = csOp.lines;
-984           opOut.attribs = exports.composeAttributes(attOp.attribs, csOp.attribs, attOp.opcode == '=', pool);
-985           csOp.opcode = '';
-986           attOp.chars -= csOp.chars;
-987           attOp.lines -= csOp.lines;
-988           if (!attOp.chars) {
-989             attOp.opcode = '';
-990           }
-991         } else {
-992           // keep and keep going
-993           opOut.opcode = attOp.opcode;
-994           opOut.chars = attOp.chars;
-995           opOut.lines = attOp.lines;
-996           opOut.attribs = exports.composeAttributes(attOp.attribs, csOp.attribs, attOp.opcode == '=', pool);
-997           attOp.opcode = '';
-998           csOp.chars -= attOp.chars;
-999           csOp.lines -= attOp.lines;
-1000         }
-1001         break;
-1002       }
-1003     case '':
-1004       {
-1005         exports.copyOp(attOp, opOut);
-1006         attOp.opcode = '';
-1007         break;
-1008       }
-1009     }
-1010   }
-1011 };
-1012 
-1013 exports.applyToAttribution = function (cs, astr, pool) {
-1014   var unpacked = exports.unpack(cs);
-1015 
-1016   return exports.applyZip(astr, 0, unpacked.ops, 0, function (op1, op2, opOut) {
-1017     return exports._slicerZipperFunc(op1, op2, opOut, pool);
-1018   });
-1019 };
-1020 
-1021 /*exports.oneInsertedLineAtATimeOpIterator = function(opsStr, optStartIndex, charBank) {
-1022   var iter = exports.opIterator(opsStr, optStartIndex);
-1023   var bankIndex = 0;
-1024 
-1025 };*/
-1026 
-1027 exports.mutateAttributionLines = function (cs, lines, pool) {
-1028   //dmesg(cs);
-1029   //dmesg(lines.toSource()+" ->");
-1030   var unpacked = exports.unpack(cs);
-1031   var csIter = exports.opIterator(unpacked.ops);
-1032   var csBank = unpacked.charBank;
-1033   var csBankIndex = 0;
-1034   // treat the attribution lines as text lines, mutating a line at a time
-1035   var mut = exports.textLinesMutator(lines);
-1036 
-1037   var lineIter = null;
-1038 
-1039   function isNextMutOp() {
-1040     return (lineIter && lineIter.hasNext()) || mut.hasMore();
-1041   }
-1042 
-1043   function nextMutOp(destOp) {
-1044     if ((!(lineIter && lineIter.hasNext())) && mut.hasMore()) {
-1045       var line = mut.removeLines(1);
-1046       lineIter = exports.opIterator(line);
-1047     }
-1048     if (lineIter && lineIter.hasNext()) {
-1049       lineIter.next(destOp);
-1050     } else {
-1051       destOp.opcode = '';
-1052     }
-1053   }
-1054   var lineAssem = null;
-1055 
-1056   function outputMutOp(op) {
-1057     //print("outputMutOp: "+op.toSource());
-1058     if (!lineAssem) {
-1059       lineAssem = exports.mergingOpAssembler();
-1060     }
-1061     lineAssem.append(op);
-1062     if (op.lines > 0) {
-1063       exports.assert(op.lines == 1, "Can't have op.lines of ", op.lines, " in attribution lines");
-1064       // ship it to the mut
-1065       mut.insert(lineAssem.toString(), 1);
-1066       lineAssem = null;
-1067     }
-1068   }
-1069 
-1070   var csOp = exports.newOp();
-1071   var attOp = exports.newOp();
-1072   var opOut = exports.newOp();
-1073   while (csOp.opcode || csIter.hasNext() || attOp.opcode || isNextMutOp()) {
-1074     if ((!csOp.opcode) && csIter.hasNext()) {
-1075       csIter.next(csOp);
-1076     }
-1077     //print(csOp.toSource()+" "+attOp.toSource()+" "+opOut.toSource());
-1078     //print(csOp.opcode+"/"+csOp.lines+"/"+csOp.attribs+"/"+lineAssem+"/"+lineIter+"/"+(lineIter?lineIter.hasNext():null));
-1079     //print("csOp: "+csOp.toSource());
-1080     if ((!csOp.opcode) && (!attOp.opcode) && (!lineAssem) && (!(lineIter && lineIter.hasNext()))) {
-1081       break; // done
-1082     } else if (csOp.opcode == '=' && csOp.lines > 0 && (!csOp.attribs) && (!attOp.opcode) && (!lineAssem) && (!(lineIter && lineIter.hasNext()))) {
-1083       // skip multiple lines; this is what makes small changes not order of the document size
-1084       mut.skipLines(csOp.lines);
-1085       //print("skipped: "+csOp.lines);
-1086       csOp.opcode = '';
-1087     } else if (csOp.opcode == '+') {
-1088       if (csOp.lines > 1) {
-1089         var firstLineLen = csBank.indexOf('\n', csBankIndex) + 1 - csBankIndex;
-1090         exports.copyOp(csOp, opOut);
-1091         csOp.chars -= firstLineLen;
-1092         csOp.lines--;
-1093         opOut.lines = 1;
-1094         opOut.chars = firstLineLen;
-1095       } else {
-1096         exports.copyOp(csOp, opOut);
-1097         csOp.opcode = '';
-1098       }
-1099       outputMutOp(opOut);
-1100       csBankIndex += opOut.chars;
-1101       opOut.opcode = '';
-1102     } else {
-1103       if ((!attOp.opcode) && isNextMutOp()) {
-1104         nextMutOp(attOp);
-1105       }
-1106       //print("attOp: "+attOp.toSource());
-1107       exports._slicerZipperFunc(attOp, csOp, opOut, pool);
-1108       if (opOut.opcode) {
-1109         outputMutOp(opOut);
-1110         opOut.opcode = '';
-1111       }
-1112     }
-1113   }
-1114 
-1115   exports.assert(!lineAssem, "line assembler not finished");
-1116   mut.close();
-1117 
-1118   //dmesg("-> "+lines.toSource());
-1119 };
-1120 
-1121 exports.joinAttributionLines = function (theAlines) {
-1122   var assem = exports.mergingOpAssembler();
-1123   for (var i = 0; i < theAlines.length; i++) {
-1124     var aline = theAlines[i];
-1125     var iter = exports.opIterator(aline);
-1126     while (iter.hasNext()) {
-1127       assem.append(iter.next());
-1128     }
-1129   }
-1130   return assem.toString();
-1131 };
-1132 
-1133 exports.splitAttributionLines = function (attrOps, text) {
-1134   var iter = exports.opIterator(attrOps);
-1135   var assem = exports.mergingOpAssembler();
-1136   var lines = [];
-1137   var pos = 0;
-1138 
-1139   function appendOp(op) {
-1140     assem.append(op);
-1141     if (op.lines > 0) {
-1142       lines.push(assem.toString());
-1143       assem.clear();
-1144     }
-1145     pos += op.chars;
-1146   }
-1147 
-1148   while (iter.hasNext()) {
-1149     var op = iter.next();
-1150     var numChars = op.chars;
-1151     var numLines = op.lines;
-1152     while (numLines > 1) {
-1153       var newlineEnd = text.indexOf('\n', pos) + 1;
-1154       exports.assert(newlineEnd > 0, "newlineEnd <= 0 in splitAttributionLines");
-1155       op.chars = newlineEnd - pos;
-1156       op.lines = 1;
-1157       appendOp(op);
-1158       numChars -= op.chars;
-1159       numLines -= op.lines;
-1160     }
-1161     if (numLines == 1) {
-1162       op.chars = numChars;
-1163       op.lines = 1;
-1164     }
-1165     appendOp(op);
-1166   }
-1167 
-1168   return lines;
-1169 };
-1170 
-1171 exports.splitTextLines = function (text) {
-1172   return text.match(/[^\n]*(?:\n|[^\n]$)/g);
-1173 };
-1174 
-1175 exports.compose = function (cs1, cs2, pool) {
-1176   var unpacked1 = exports.unpack(cs1);
-1177   var unpacked2 = exports.unpack(cs2);
-1178   var len1 = unpacked1.oldLen;
-1179   var len2 = unpacked1.newLen;
-1180   exports.assert(len2 == unpacked2.oldLen, "mismatched composition");
-1181   var len3 = unpacked2.newLen;
-1182   var bankIter1 = exports.stringIterator(unpacked1.charBank);
-1183   var bankIter2 = exports.stringIterator(unpacked2.charBank);
-1184   var bankAssem = exports.stringAssembler();
-1185 
-1186   var newOps = exports.applyZip(unpacked1.ops, 0, unpacked2.ops, 0, function (op1, op2, opOut) {
-1187     //var debugBuilder = exports.stringAssembler();
-1188     //debugBuilder.append(exports.opString(op1));
-1189     //debugBuilder.append(',');
-1190     //debugBuilder.append(exports.opString(op2));
-1191     //debugBuilder.append(' / ');
-1192     var op1code = op1.opcode;
-1193     var op2code = op2.opcode;
-1194     if (op1code == '+' && op2code == '-') {
-1195       bankIter1.skip(Math.min(op1.chars, op2.chars));
-1196     }
-1197     exports._slicerZipperFunc(op1, op2, opOut, pool);
-1198     if (opOut.opcode == '+') {
-1199       if (op2code == '+') {
-1200         bankAssem.append(bankIter2.take(opOut.chars));
-1201       } else {
-1202         bankAssem.append(bankIter1.take(opOut.chars));
-1203       }
-1204     }
-1205 
-1206     //debugBuilder.append(exports.opString(op1));
-1207     //debugBuilder.append(',');
-1208     //debugBuilder.append(exports.opString(op2));
-1209     //debugBuilder.append(' -> ');
-1210     //debugBuilder.append(exports.opString(opOut));
-1211     //print(debugBuilder.toString());
-1212   });
-1213 
-1214   return exports.pack(len1, len3, newOps, bankAssem.toString());
-1215 };
-1216 
-1217 exports.attributeTester = function (attribPair, pool) {
-1218   // returns a function that tests if a string of attributes
-1219   // (e.g. *3*4) contains a given attribute key,value that
-1220   // is already present in the pool.
-1221   if (!pool) {
-1222     return never;
-1223   }
-1224   var attribNum = pool.putAttrib(attribPair, true);
-1225   if (attribNum < 0) {
-1226     return never;
-1227   } else {
-1228     var re = new RegExp('\\*' + exports.numToString(attribNum) + '(?!\\w)');
-1229     return function (attribs) {
-1230       return re.test(attribs);
-1231     };
-1232   }
-1233 
-1234   function never(attribs) {
-1235     return false;
-1236   }
-1237 };
-1238 
-1239 exports.identity = function (N) {
-1240   return exports.pack(N, N, "", "");
-1241 };
-1242 
-1243 exports.makeSplice = function (oldFullText, spliceStart, numRemoved, newText, optNewTextAPairs, pool) {
-1244   var oldLen = oldFullText.length;
-1245 
-1246   if (spliceStart >= oldLen) {
-1247     spliceStart = oldLen - 1;
-1248   }
-1249   if (numRemoved > oldFullText.length - spliceStart - 1) {
-1250     numRemoved = oldFullText.length - spliceStart - 1;
-1251   }
-1252   var oldText = oldFullText.substring(spliceStart, spliceStart + numRemoved);
-1253   var newLen = oldLen + newText.length - oldText.length;
-1254 
-1255   var assem = exports.smartOpAssembler();
-1256   assem.appendOpWithText('=', oldFullText.substring(0, spliceStart));
-1257   assem.appendOpWithText('-', oldText);
-1258   assem.appendOpWithText('+', newText, optNewTextAPairs, pool);
-1259   assem.endDocument();
-1260   return exports.pack(oldLen, newLen, assem.toString(), newText);
-1261 };
-1262 
-1263 exports.toSplices = function (cs) {
-1264   // get a list of splices, [startChar, endChar, newText]
-1265   var unpacked = exports.unpack(cs);
-1266   var splices = [];
-1267 
-1268   var oldPos = 0;
-1269   var iter = exports.opIterator(unpacked.ops);
-1270   var charIter = exports.stringIterator(unpacked.charBank);
-1271   var inSplice = false;
-1272   while (iter.hasNext()) {
-1273     var op = iter.next();
-1274     if (op.opcode == '=') {
-1275       oldPos += op.chars;
-1276       inSplice = false;
-1277     } else {
-1278       if (!inSplice) {
-1279         splices.push([oldPos, oldPos, ""]);
-1280         inSplice = true;
-1281       }
-1282       if (op.opcode == '-') {
-1283         oldPos += op.chars;
-1284         splices[splices.length - 1][1] += op.chars;
-1285       } else if (op.opcode == '+') {
-1286         splices[splices.length - 1][2] += charIter.take(op.chars);
-1287       }
-1288     }
-1289   }
-1290 
-1291   return splices;
-1292 };
-1293 
-1294 exports.characterRangeFollow = function (cs, startChar, endChar, insertionsAfter) {
-1295   var newStartChar = startChar;
-1296   var newEndChar = endChar;
-1297   var splices = exports.toSplices(cs);
-1298   var lengthChangeSoFar = 0;
-1299   for (var i = 0; i < splices.length; i++) {
-1300     var splice = splices[i];
-1301     var spliceStart = splice[0] + lengthChangeSoFar;
-1302     var spliceEnd = splice[1] + lengthChangeSoFar;
-1303     var newTextLength = splice[2].length;
-1304     var thisLengthChange = newTextLength - (spliceEnd - spliceStart);
-1305 
-1306     if (spliceStart <= newStartChar && spliceEnd >= newEndChar) {
-1307       // splice fully replaces/deletes range
-1308       // (also case that handles insertion at a collapsed selection)
-1309       if (insertionsAfter) {
-1310         newStartChar = newEndChar = spliceStart;
-1311       } else {
-1312         newStartChar = newEndChar = spliceStart + newTextLength;
-1313       }
-1314     } else if (spliceEnd <= newStartChar) {
-1315       // splice is before range
-1316       newStartChar += thisLengthChange;
-1317       newEndChar += thisLengthChange;
-1318     } else if (spliceStart >= newEndChar) {
-1319       // splice is after range
-1320     } else if (spliceStart >= newStartChar && spliceEnd <= newEndChar) {
-1321       // splice is inside range
-1322       newEndChar += thisLengthChange;
-1323     } else if (spliceEnd < newEndChar) {
-1324       // splice overlaps beginning of range
-1325       newStartChar = spliceStart + newTextLength;
-1326       newEndChar += thisLengthChange;
-1327     } else {
-1328       // splice overlaps end of range
-1329       newEndChar = spliceStart;
-1330     }
-1331 
-1332     lengthChangeSoFar += thisLengthChange;
-1333   }
-1334 
-1335   return [newStartChar, newEndChar];
-1336 };
-1337 
-1338 exports.moveOpsToNewPool = function (cs, oldPool, newPool) {
-1339   // works on exports or attribution string
-1340   var dollarPos = cs.indexOf('$');
-1341   if (dollarPos < 0) {
-1342     dollarPos = cs.length;
-1343   }
-1344   var upToDollar = cs.substring(0, dollarPos);
-1345   var fromDollar = cs.substring(dollarPos);
-1346   // order of attribs stays the same
-1347   return upToDollar.replace(/\*([0-9a-z]+)/g, function (_, a) {
-1348     var oldNum = exports.parseNum(a);
-1349     var pair = oldPool.getAttrib(oldNum);
-1350     var newNum = newPool.putAttrib(pair);
-1351     return '*' + exports.numToString(newNum);
-1352   }) + fromDollar;
-1353 };
-1354 
-1355 exports.makeAttribution = function (text) {
-1356   var assem = exports.smartOpAssembler();
-1357   assem.appendOpWithText('+', text);
-1358   return assem.toString();
-1359 };
-1360 
-1361 // callable on a exports, attribution string, or attribs property of an op
-1362 exports.eachAttribNumber = function (cs, func) {
-1363   var dollarPos = cs.indexOf('$');
-1364   if (dollarPos < 0) {
-1365     dollarPos = cs.length;
-1366   }
-1367   var upToDollar = cs.substring(0, dollarPos);
-1368 
-1369   upToDollar.replace(/\*([0-9a-z]+)/g, function (_, a) {
-1370     func(exports.parseNum(a));
-1371     return '';
-1372   });
-1373 };
-1374 
-1375 // callable on a exports, attribution string, or attribs property of an op,
-1376 // though it may easily create adjacent ops that can be merged.
-1377 exports.filterAttribNumbers = function (cs, filter) {
-1378   return exports.mapAttribNumbers(cs, filter);
-1379 };
-1380 
-1381 exports.mapAttribNumbers = function (cs, func) {
-1382   var dollarPos = cs.indexOf('$');
-1383   if (dollarPos < 0) {
-1384     dollarPos = cs.length;
-1385   }
-1386   var upToDollar = cs.substring(0, dollarPos);
-1387 
-1388   var newUpToDollar = upToDollar.replace(/\*([0-9a-z]+)/g, function (s, a) {
-1389     var n = func(exports.parseNum(a));
-1390     if (n === true) {
-1391       return s;
-1392     } else if ((typeof n) === "number") {
-1393       return '*' + exports.numToString(n);
-1394     } else {
-1395       return '';
-1396     }
-1397   });
-1398 
-1399   return newUpToDollar + cs.substring(dollarPos);
-1400 };
-1401 
-1402 exports.makeAText = function (text, attribs) {
-1403   return {
-1404     text: text,
-1405     attribs: (attribs || exports.makeAttribution(text))
-1406   };
-1407 };
-1408 
-1409 exports.applyToAText = function (cs, atext, pool) {
-1410   return {
-1411     text: exports.applyToText(cs, atext.text),
-1412     attribs: exports.applyToAttribution(cs, atext.attribs, pool)
-1413   };
-1414 };
-1415 
-1416 exports.cloneAText = function (atext) {
-1417   return {
-1418     text: atext.text,
-1419     attribs: atext.attribs
-1420   };
-1421 };
-1422 
-1423 exports.copyAText = function (atext1, atext2) {
-1424   atext2.text = atext1.text;
-1425   atext2.attribs = atext1.attribs;
-1426 };
-1427 
-1428 exports.appendATextToAssembler = function (atext, assem) {
-1429   // intentionally skips last newline char of atext
-1430   var iter = exports.opIterator(atext.attribs);
-1431   var op = exports.newOp();
-1432   while (iter.hasNext()) {
-1433     iter.next(op);
-1434     if (!iter.hasNext()) {
-1435       // last op, exclude final newline
-1436       if (op.lines <= 1) {
-1437         op.lines = 0;
-1438         op.chars--;
-1439         if (op.chars) {
-1440           assem.append(op);
-1441         }
-1442       } else {
-1443         var nextToLastNewlineEnd =
-1444         atext.text.lastIndexOf('\n', atext.text.length - 2) + 1;
-1445         var lastLineLength = atext.text.length - nextToLastNewlineEnd - 1;
-1446         op.lines--;
-1447         op.chars -= (lastLineLength + 1);
-1448         assem.append(op);
-1449         op.lines = 0;
-1450         op.chars = lastLineLength;
-1451         if (op.chars) {
-1452           assem.append(op);
-1453         }
-1454       }
-1455     } else {
-1456       assem.append(op);
-1457     }
-1458   }
-1459 };
-1460 
-1461 exports.prepareForWire = function (cs, pool) {
-1462   var newPool = AttributePoolFactory.createAttributePool();;
-1463   var newCs = exports.moveOpsToNewPool(cs, pool, newPool);
-1464   return {
-1465     translated: newCs,
-1466     pool: newPool
-1467   };
-1468 };
-1469 
-1470 exports.isIdentity = function (cs) {
-1471   var unpacked = exports.unpack(cs);
-1472   return unpacked.ops == "" && unpacked.oldLen == unpacked.newLen;
-1473 };
-1474 
-1475 exports.opAttributeValue = function (op, key, pool) {
-1476   return exports.attribsAttributeValue(op.attribs, key, pool);
-1477 };
-1478 
-1479 exports.attribsAttributeValue = function (attribs, key, pool) {
-1480   var value = '';
-1481   if (attribs) {
-1482     exports.eachAttribNumber(attribs, function (n) {
-1483       if (pool.getAttribKey(n) == key) {
-1484         value = pool.getAttribValue(n);
-1485       }
-1486     });
-1487   }
-1488   return value;
-1489 };
-1490 
-1491 exports.builder = function (oldLen) {
-1492   var assem = exports.smartOpAssembler();
-1493   var o = exports.newOp();
-1494   var charBank = exports.stringAssembler();
-1495 
-1496   var self = {
-1497     // attribs are [[key1,value1],[key2,value2],...] or '*0*1...' (no pool needed in latter case)
-1498     keep: function (N, L, attribs, pool) {
-1499       o.opcode = '=';
-1500       o.attribs = (attribs && exports.makeAttribsString('=', attribs, pool)) || '';
-1501       o.chars = N;
-1502       o.lines = (L || 0);
-1503       assem.append(o);
-1504       return self;
-1505     },
-1506     keepText: function (text, attribs, pool) {
-1507       assem.appendOpWithText('=', text, attribs, pool);
-1508       return self;
-1509     },
-1510     insert: function (text, attribs, pool) {
-1511       assem.appendOpWithText('+', text, attribs, pool);
-1512       charBank.append(text);
-1513       return self;
-1514     },
-1515     remove: function (N, L) {
-1516       o.opcode = '-';
-1517       o.attribs = '';
-1518       o.chars = N;
-1519       o.lines = (L || 0);
-1520       assem.append(o);
-1521       return self;
-1522     },
-1523     toString: function () {
-1524       assem.endDocument();
-1525       var newLen = oldLen + assem.getLengthChange();
-1526       return exports.pack(oldLen, newLen, assem.toString(), charBank.toString());
-1527     }
-1528   };
-1529 
-1530   return self;
-1531 };
-1532 
-1533 exports.makeAttribsString = function (opcode, attribs, pool) {
-1534   // makeAttribsString(opcode, '*3') or makeAttribsString(opcode, [['foo','bar']], myPool) work
-1535   if (!attribs) {
-1536     return '';
-1537   } else if ((typeof attribs) == "string") {
-1538     return attribs;
-1539   } else if (pool && attribs && attribs.length) {
-1540     if (attribs.length > 1) {
-1541       attribs = attribs.slice();
-1542       attribs.sort();
-1543     }
-1544     var result = [];
-1545     for (var i = 0; i < attribs.length; i++) {
-1546       var pair = attribs[i];
-1547       if (opcode == '=' || (opcode == '+' && pair[1])) {
-1548         result.push('*' + exports.numToString(pool.putAttrib(pair)));
-1549       }
-1550     }
-1551     return result.join('');
-1552   }
-1553 };
-1554 
-1555 // like "substring" but on a single-line attribution string
-1556 exports.subattribution = function (astr, start, optEnd) {
-1557   var iter = exports.opIterator(astr, 0);
-1558   var assem = exports.smartOpAssembler();
-1559   var attOp = exports.newOp();
-1560   var csOp = exports.newOp();
-1561   var opOut = exports.newOp();
-1562 
-1563   function doCsOp() {
-1564     if (csOp.chars) {
-1565       while (csOp.opcode && (attOp.opcode || iter.hasNext())) {
-1566         if (!attOp.opcode) iter.next(attOp);
-1567 
-1568         if (csOp.opcode && attOp.opcode && csOp.chars >= attOp.chars && attOp.lines > 0 && csOp.lines <= 0) {
-1569           csOp.lines++;
-1570         }
-1571 
-1572         exports._slicerZipperFunc(attOp, csOp, opOut, null);
-1573         if (opOut.opcode) {
-1574           assem.append(opOut);
-1575           opOut.opcode = '';
-1576         }
-1577       }
-1578     }
-1579   }
-1580 
-1581   csOp.opcode = '-';
-1582   csOp.chars = start;
-1583 
-1584   doCsOp();
-1585 
-1586   if (optEnd === undefined) {
-1587     if (attOp.opcode) {
-1588       assem.append(attOp);
-1589     }
-1590     while (iter.hasNext()) {
-1591       iter.next(attOp);
-1592       assem.append(attOp);
-1593     }
-1594   } else {
-1595     csOp.opcode = '=';
-1596     csOp.chars = optEnd - start;
-1597     doCsOp();
-1598   }
-1599 
-1600   return assem.toString();
-1601 };
-1602 
-1603 exports.inverse = function (cs, lines, alines, pool) {
-1604   // lines and alines are what the exports is meant to apply to.
-1605   // They may be arrays or objects with .get(i) and .length methods.
-1606   // They include final newlines on lines.
-1607 
-1608   function lines_get(idx) {
-1609     if (lines.get) {
-1610       return lines.get(idx);
-1611     } else {
-1612       return lines[idx];
-1613     }
-1614   }
-1615 
-1616   function lines_length() {
-1617     if ((typeof lines.length) == "number") {
-1618       return lines.length;
-1619     } else {
-1620       return lines.length();
-1621     }
-1622   }
-1623 
-1624   function alines_get(idx) {
-1625     if (alines.get) {
-1626       return alines.get(idx);
-1627     } else {
-1628       return alines[idx];
-1629     }
-1630   }
-1631 
-1632   function alines_length() {
-1633     if ((typeof alines.length) == "number") {
-1634       return alines.length;
-1635     } else {
-1636       return alines.length();
-1637     }
-1638   }
-1639 
-1640   var curLine = 0;
-1641   var curChar = 0;
-1642   var curLineOpIter = null;
-1643   var curLineOpIterLine;
-1644   var curLineNextOp = exports.newOp('+');
-1645 
-1646   var unpacked = exports.unpack(cs);
-1647   var csIter = exports.opIterator(unpacked.ops);
-1648   var builder = exports.builder(unpacked.newLen);
-1649 
-1650   function consumeAttribRuns(numChars, func /*(len, attribs, endsLine)*/ ) {
-1651 
-1652     if ((!curLineOpIter) || (curLineOpIterLine != curLine)) {
-1653       // create curLineOpIter and advance it to curChar
-1654       curLineOpIter = exports.opIterator(alines_get(curLine));
-1655       curLineOpIterLine = curLine;
-1656       var indexIntoLine = 0;
-1657       var done = false;
-1658       while (!done) {
-1659         curLineOpIter.next(curLineNextOp);
-1660         if (indexIntoLine + curLineNextOp.chars >= curChar) {
-1661           curLineNextOp.chars -= (curChar - indexIntoLine);
-1662           done = true;
-1663         } else {
-1664           indexIntoLine += curLineNextOp.chars;
-1665         }
-1666       }
-1667     }
-1668 
-1669     while (numChars > 0) {
-1670       if ((!curLineNextOp.chars) && (!curLineOpIter.hasNext())) {
-1671         curLine++;
-1672         curChar = 0;
-1673         curLineOpIterLine = curLine;
-1674         curLineNextOp.chars = 0;
-1675         curLineOpIter = exports.opIterator(alines_get(curLine));
-1676       }
-1677       if (!curLineNextOp.chars) {
-1678         curLineOpIter.next(curLineNextOp);
-1679       }
-1680       var charsToUse = Math.min(numChars, curLineNextOp.chars);
-1681       func(charsToUse, curLineNextOp.attribs, charsToUse == curLineNextOp.chars && curLineNextOp.lines > 0);
-1682       numChars -= charsToUse;
-1683       curLineNextOp.chars -= charsToUse;
-1684       curChar += charsToUse;
-1685     }
-1686 
-1687     if ((!curLineNextOp.chars) && (!curLineOpIter.hasNext())) {
-1688       curLine++;
-1689       curChar = 0;
-1690     }
-1691   }
-1692 
-1693   function skip(N, L) {
-1694     if (L) {
-1695       curLine += L;
-1696       curChar = 0;
-1697     } else {
-1698       if (curLineOpIter && curLineOpIterLine == curLine) {
-1699         consumeAttribRuns(N, function () {});
-1700       } else {
-1701         curChar += N;
-1702       }
-1703     }
-1704   }
-1705 
-1706   function nextText(numChars) {
-1707     var len = 0;
-1708     var assem = exports.stringAssembler();
-1709     var firstString = lines_get(curLine).substring(curChar);
-1710     len += firstString.length;
-1711     assem.append(firstString);
-1712 
-1713     var lineNum = curLine + 1;
-1714     while (len < numChars) {
-1715       var nextString = lines_get(lineNum);
-1716       len += nextString.length;
-1717       assem.append(nextString);
-1718       lineNum++;
-1719     }
-1720 
-1721     return assem.toString().substring(0, numChars);
-1722   }
-1723 
-1724   function cachedStrFunc(func) {
-1725     var cache = {};
-1726     return function (s) {
-1727       if (!cache[s]) {
-1728         cache[s] = func(s);
-1729       }
-1730       return cache[s];
-1731     };
-1732   }
-1733 
-1734   var attribKeys = [];
-1735   var attribValues = [];
-1736   while (csIter.hasNext()) {
-1737     var csOp = csIter.next();
-1738     if (csOp.opcode == '=') {
-1739       if (csOp.attribs) {
-1740         attribKeys.length = 0;
-1741         attribValues.length = 0;
-1742         exports.eachAttribNumber(csOp.attribs, function (n) {
-1743           attribKeys.push(pool.getAttribKey(n));
-1744           attribValues.push(pool.getAttribValue(n));
-1745         });
-1746         var undoBackToAttribs = cachedStrFunc(function (attribs) {
-1747           var backAttribs = [];
-1748           for (var i = 0; i < attribKeys.length; i++) {
-1749             var appliedKey = attribKeys[i];
-1750             var appliedValue = attribValues[i];
-1751             var oldValue = exports.attribsAttributeValue(attribs, appliedKey, pool);
-1752             if (appliedValue != oldValue) {
-1753               backAttribs.push([appliedKey, oldValue]);
-1754             }
-1755           }
-1756           return exports.makeAttribsString('=', backAttribs, pool);
-1757         });
-1758         consumeAttribRuns(csOp.chars, function (len, attribs, endsLine) {
-1759           builder.keep(len, endsLine ? 1 : 0, undoBackToAttribs(attribs));
-1760         });
-1761       } else {
-1762         skip(csOp.chars, csOp.lines);
-1763         builder.keep(csOp.chars, csOp.lines);
-1764       }
-1765     } else if (csOp.opcode == '+') {
-1766       builder.remove(csOp.chars, csOp.lines);
-1767     } else if (csOp.opcode == '-') {
-1768       var textBank = nextText(csOp.chars);
-1769       var textBankIndex = 0;
-1770       consumeAttribRuns(csOp.chars, function (len, attribs, endsLine) {
-1771         builder.insert(textBank.substr(textBankIndex, len), attribs);
-1772         textBankIndex += len;
-1773       });
-1774     }
-1775   }
-1776 
-1777   return exports.checkRep(builder.toString());
-1778 };
-1779 
-1780 // %CLIENT FILE ENDS HERE%
-1781 exports.follow = function (cs1, cs2, reverseInsertOrder, pool) {
-1782   var unpacked1 = exports.unpack(cs1);
-1783   var unpacked2 = exports.unpack(cs2);
-1784   var len1 = unpacked1.oldLen;
-1785   var len2 = unpacked2.oldLen;
-1786   exports.assert(len1 == len2, "mismatched follow");
-1787   var chars1 = exports.stringIterator(unpacked1.charBank);
-1788   var chars2 = exports.stringIterator(unpacked2.charBank);
-1789 
-1790   var oldLen = unpacked1.newLen;
-1791   var oldPos = 0;
-1792   var newLen = 0;
-1793 
-1794   var hasInsertFirst = exports.attributeTester(['insertorder', 'first'], pool);
-1795 
-1796   var newOps = exports.applyZip(unpacked1.ops, 0, unpacked2.ops, 0, function (op1, op2, opOut) {
-1797     if (op1.opcode == '+' || op2.opcode == '+') {
-1798       var whichToDo;
-1799       if (op2.opcode != '+') {
-1800         whichToDo = 1;
-1801       } else if (op1.opcode != '+') {
-1802         whichToDo = 2;
-1803       } else {
-1804         // both +
-1805         var firstChar1 = chars1.peek(1);
-1806         var firstChar2 = chars2.peek(1);
-1807         var insertFirst1 = hasInsertFirst(op1.attribs);
-1808         var insertFirst2 = hasInsertFirst(op2.attribs);
-1809         if (insertFirst1 && !insertFirst2) {
-1810           whichToDo = 1;
-1811         } else if (insertFirst2 && !insertFirst1) {
-1812           whichToDo = 2;
-1813         }
-1814         // insert string that doesn't start with a newline first so as not to break up lines
-1815         else if (firstChar1 == '\n' && firstChar2 != '\n') {
-1816           whichToDo = 2;
-1817         } else if (firstChar1 != '\n' && firstChar2 == '\n') {
-1818           whichToDo = 1;
-1819         }
-1820         // break symmetry:
-1821         else if (reverseInsertOrder) {
-1822           whichToDo = 2;
-1823         } else {
-1824           whichToDo = 1;
-1825         }
-1826       }
-1827       if (whichToDo == 1) {
-1828         chars1.skip(op1.chars);
-1829         opOut.opcode = '=';
-1830         opOut.lines = op1.lines;
-1831         opOut.chars = op1.chars;
-1832         opOut.attribs = '';
-1833         op1.opcode = '';
-1834       } else {
-1835         // whichToDo == 2
-1836         chars2.skip(op2.chars);
-1837         exports.copyOp(op2, opOut);
-1838         op2.opcode = '';
-1839       }
-1840     } else if (op1.opcode == '-') {
-1841       if (!op2.opcode) {
-1842         op1.opcode = '';
-1843       } else {
-1844         if (op1.chars <= op2.chars) {
-1845           op2.chars -= op1.chars;
-1846           op2.lines -= op1.lines;
-1847           op1.opcode = '';
-1848           if (!op2.chars) {
-1849             op2.opcode = '';
-1850           }
-1851         } else {
-1852           op1.chars -= op2.chars;
-1853           op1.lines -= op2.lines;
-1854           op2.opcode = '';
-1855         }
-1856       }
-1857     } else if (op2.opcode == '-') {
-1858       exports.copyOp(op2, opOut);
-1859       if (!op1.opcode) {
-1860         op2.opcode = '';
-1861       } else if (op2.chars <= op1.chars) {
-1862         // delete part or all of a keep
-1863         op1.chars -= op2.chars;
-1864         op1.lines -= op2.lines;
-1865         op2.opcode = '';
-1866         if (!op1.chars) {
-1867           op1.opcode = '';
-1868         }
-1869       } else {
-1870         // delete all of a keep, and keep going
-1871         opOut.lines = op1.lines;
-1872         opOut.chars = op1.chars;
-1873         op2.lines -= op1.lines;
-1874         op2.chars -= op1.chars;
-1875         op1.opcode = '';
-1876       }
-1877     } else if (!op1.opcode) {
-1878       exports.copyOp(op2, opOut);
-1879       op2.opcode = '';
-1880     } else if (!op2.opcode) {
-1881       exports.copyOp(op1, opOut);
-1882       op1.opcode = '';
-1883     } else {
-1884       // both keeps
-1885       opOut.opcode = '=';
-1886       opOut.attribs = exports.followAttributes(op1.attribs, op2.attribs, pool);
-1887       if (op1.chars <= op2.chars) {
-1888         opOut.chars = op1.chars;
-1889         opOut.lines = op1.lines;
-1890         op2.chars -= op1.chars;
-1891         op2.lines -= op1.lines;
-1892         op1.opcode = '';
-1893         if (!op2.chars) {
-1894           op2.opcode = '';
-1895         }
-1896       } else {
-1897         opOut.chars = op2.chars;
-1898         opOut.lines = op2.lines;
-1899         op1.chars -= op2.chars;
-1900         op1.lines -= op2.lines;
-1901         op2.opcode = '';
-1902       }
-1903     }
-1904     switch (opOut.opcode) {
-1905     case '=':
-1906       oldPos += opOut.chars;
-1907       newLen += opOut.chars;
-1908       break;
-1909     case '-':
-1910       oldPos += opOut.chars;
-1911       break;
-1912     case '+':
-1913       newLen += opOut.chars;
-1914       break;
-1915     }
-1916   });
-1917   newLen += oldLen - oldPos;
-1918 
-1919   return exports.pack(oldLen, newLen, newOps, unpacked2.charBank);
-1920 };
-1921 
-1922 exports.followAttributes = function (att1, att2, pool) {
-1923   // The merge of two sets of attribute changes to the same text
-1924   // takes the lexically-earlier value if there are two values
-1925   // for the same key.  Otherwise, all key/value changes from
-1926   // both attribute sets are taken.  This operation is the "follow",
-1927   // so a set of changes is produced that can be applied to att1
-1928   // to produce the merged set.
-1929   if ((!att2) || (!pool)) return '';
-1930   if (!att1) return att2;
-1931   var atts = [];
-1932   att2.replace(/\*([0-9a-z]+)/g, function (_, a) {
-1933     atts.push(pool.getAttrib(exports.parseNum(a)));
-1934     return '';
-1935   });
-1936   att1.replace(/\*([0-9a-z]+)/g, function (_, a) {
-1937     var pair1 = pool.getAttrib(exports.parseNum(a));
-1938     for (var i = 0; i < atts.length; i++) {
-1939       var pair2 = atts[i];
-1940       if (pair1[0] == pair2[0]) {
-1941         if (pair1[1] <= pair2[1]) {
-1942           // winner of merge is pair1, delete this attribute
-1943           atts.splice(i, 1);
-1944         }
-1945         break;
-1946       }
-1947     }
-1948     return '';
-1949   });
-1950   // we've only removed attributes, so they're already sorted
-1951   var buf = exports.stringAssembler();
-1952   for (var i = 0; i < atts.length; i++) {
-1953     buf.append('*');
-1954     buf.append(exports.numToString(pool.putAttrib(atts[i])));
-1955   }
-1956   return buf.toString();
-1957 };
-1958 
\ No newline at end of file diff --git a/doc/jsdoc/symbols/src/node_MessageHandler.js.html b/doc/jsdoc/symbols/src/node_MessageHandler.js.html deleted file mode 100644 index aba4471d0..000000000 --- a/doc/jsdoc/symbols/src/node_MessageHandler.js.html +++ /dev/null @@ -1,508 +0,0 @@ -
  1 /**
-  2  * Copyright 2009 Google Inc., 2011 Peter 'Pita' Martischka
-  3  *
-  4  * Licensed under the Apache License, Version 2.0 (the "License");
-  5  * you may not use this file except in compliance with the License.
-  6  * You may obtain a copy of the License at
-  7  *
-  8  *      http://www.apache.org/licenses/LICENSE-2.0
-  9  *
- 10  * Unless required by applicable law or agreed to in writing, software
- 11  * distributed under the License is distributed on an "AS-IS" BASIS,
- 12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 13  * See the License for the specific language governing permissions and
- 14  * limitations under the License.
- 15  */
- 16 
- 17 var padManager = require("./PadManager");
- 18 var Changeset = require("./Changeset");
- 19 var AttributePoolFactory = require("./AttributePoolFactory");
- 20 var authorManager = require("./AuthorManager");
- 21 
- 22 /**
- 23  * A associative array that translates a session to a pad
- 24  */
- 25 var session2pad = {};
- 26 /**
- 27  * A associative array that saves which sessions belong to a pad
- 28  */
- 29 var pad2sessions = {};
- 30 
- 31 /**
- 32  * A associative array that saves some general informations about a session
- 33  * key = sessionId
- 34  * values = author, rev
- 35  *   rev = That last revision that was send to this client
- 36  *   author = the author name of this session
- 37  */
- 38 var sessioninfos = {};
- 39 
- 40 /**
- 41  * Saves the Socket class we need to send and recieve data from the client
- 42  */
- 43 var socketio;
- 44 
- 45 /**
- 46  * This Method is called by server.js to tell the message handler on which socket it should send
- 47  * @param socket_io The Socket
- 48  */
- 49 exports.setSocketIO = function(socket_io)
- 50 {
- 51   socketio=socket_io;
- 52 }
- 53 
- 54 /**
- 55  * Handles the connection of a new user
- 56  * @param client the new client
- 57  */
- 58 exports.handleConnect = function(client)
- 59 {
- 60   //check if all ok
- 61   throwExceptionIfClientOrIOisInvalid(client);
- 62   
- 63   //Initalize session2pad and sessioninfos for this new session
- 64   session2pad[client.sessionId]=null;  
- 65   sessioninfos[client.sessionId]={};
- 66 }
- 67 
- 68 /**
- 69  * Handles the disconnection of a user
- 70  * @param client the client that leaves
- 71  */
- 72 exports.handleDisconnect = function(client)
- 73 {
- 74   //check if all ok
- 75   throwExceptionIfClientOrIOisInvalid(client);
- 76   
- 77   //save the padname of this session
- 78   var sessionPad=session2pad[client.sessionId];
- 79   
- 80   //Go trough all sessions of this pad, search and destroy the entry of this client
- 81   for(i in pad2sessions[sessionPad])
- 82   {
- 83     if(pad2sessions[sessionPad][i] == client.sessionId)
- 84     {
- 85       delete pad2sessions[sessionPad][i];  
- 86       break;
- 87     }
- 88   }
- 89   
- 90   //Delete the session2pad and sessioninfos entrys of this session
- 91   delete session2pad[client.sessionId]; 
- 92   delete sessioninfos[client.sessionId]; 
- 93 }
- 94 
- 95 /**
- 96  * Handles a message from a user
- 97  * @param client the client that send this message
- 98  * @param message the message from the client
- 99  */
-100 exports.handleMessage = function(client, message)
-101 { 
-102   //check if all ok
-103   throwExceptionIfClientOrIOisInvalid(client);
-104   
-105   if(message == null)
-106   {
-107     throw "Message is null!";
-108   }
-109   //Etherpad sometimes send JSON and sometimes a JSONstring...
-110   if(typeof message == "string")
-111   {
-112     message = JSON.parse(message);
-113   }
-114   if(!message.type)
-115   {
-116     throw "Message have no type attribute!";
-117   }
-118   
-119   //Check what type of message we get and delegate to the other methodes
-120   if(message.type == "CLIENT_READY")
-121   {
-122     handleClientReady(client, message);
-123   }
-124   else if(message.type == "COLLABROOM" && 
-125           message.data.type == "USER_CHANGES")
-126   {
-127     console.error(JSON.stringify(message));
-128     handleUserChanges(client, message);
-129   }
-130   else if(message.type == "COLLABROOM" && 
-131           message.data.type == "USERINFO_UPDATE")
-132   {
-133     console.error(JSON.stringify(message));
-134     handleUserInfoUpdate(client, message);
-135   }
-136   //if the message type is unkown, throw an exception
-137   else
-138   {
-139     console.error(message);
-140     throw "unkown Message Type: '" + message.type + "'";
-141   }
-142 }
-143 
-144 /**
-145  * Handles a USERINFO_UPDATE, that means that a user have changed his color or name. Anyway, we get both informations
-146  * @param client the client that send this message
-147  * @param message the message from the client
-148  */
-149 function handleUserInfoUpdate(client, message)
-150 {
-151   //check if all ok
-152   if(message.data.userInfo.name == null)
-153   {
-154     throw "USERINFO_UPDATE Message have no name!";
-155   }
-156   if(message.data.userInfo.colorId == null)
-157   {
-158     throw "USERINFO_UPDATE Message have no colorId!";
-159   }
-160   
-161   //Find out the author name of this session
-162   var author = sessioninfos[client.sessionId].author;
-163   
-164   //Tell the authorManager about the new attributes
-165   authorManager.setAuthorColorId(author, message.data.userInfo.colorId);
-166   authorManager.setAuthorName(author, message.data.userInfo.name);
-167 }
-168 
-169 /**
-170  * Handles a USERINFO_UPDATE, that means that a user have changed his color or name. Anyway, we get both informations
-171  * This Method is nearly 90% copied out of the Etherpad Source Code. So I can't tell you what happens here exactly
-172  * Look at https://github.com/ether/pad/blob/master/etherpad/src/etherpad/collab/collab_server.js in the function applyUserChanges()
-173  * @param client the client that send this message
-174  * @param message the message from the client
-175  */
-176 function handleUserChanges(client, message)
-177 {
-178   //check if all ok
-179   if(message.data.baseRev == null)
-180   {
-181     throw "USER_CHANGES Message have no baseRev!";
-182   }
-183   if(message.data.apool == null)
-184   {
-185     throw "USER_CHANGES Message have no apool!";
-186   }
-187   if(message.data.changeset == null)
-188   {
-189     throw "USER_CHANGES Message have no changeset!";
-190   }
-191   
-192   //get all Vars we need
-193   var baseRev = message.data.baseRev;
-194   var wireApool = (AttributePoolFactory.createAttributePool()).fromJsonable(message.data.apool);
-195   var changeset = message.data.changeset;
-196   var pad = padManager.getPad(session2pad[client.sessionId], false);
-197   
-198   //ex. _checkChangesetAndPool
-199   
-200   //Copied from Etherpad, don't know what it does exactly
-201   Changeset.checkRep(changeset);
-202   Changeset.eachAttribNumber(changeset, function(n) {
-203     if (! wireApool.getAttrib(n)) {
-204       throw "Attribute pool is missing attribute "+n+" for changeset "+changeset;
-205     }
-206   });
-207   
-208   //ex. adoptChangesetAttribs
-209   
-210   //Afaik, it copies the new attributes from the changeset, to the global Attribute Pool
-211   Changeset.moveOpsToNewPool(changeset, wireApool, pad.pool());
-212   
-213   //ex. applyUserChanges
-214   
-215   var apool = pad.pool();
-216   var r = baseRev;
-217   
-218   while (r < pad.getHeadRevisionNumber()) {
-219     r++;
-220     var c = pad.getRevisionChangeset(r);
-221     changeset = Changeset.follow(c, changeset, false, apool);
-222   }
-223   
-224   var prevText = pad.text();
-225   if (Changeset.oldLen(changeset) != prevText.length) {
-226     throw "Can't apply USER_CHANGES "+changeset+" with oldLen " 
-227     + Changeset.oldLen(changeset) + " to document of length " + prevText.length;
-228   }
-229   
-230   var thisAuthor = sessioninfos[client.sessionId].author;
-231   
-232   pad.appendRevision(changeset, thisAuthor);
-233   
-234   var correctionChangeset = _correctMarkersInPad(pad.atext(), pad.pool());
-235   if (correctionChangeset) {
-236     pad.appendRevision(correctionChangeset);
-237   }
-238   
-239   if (pad.text().lastIndexOf("\n\n") != pad.text().length-2) {
-240     var nlChangeset = Changeset.makeSplice(
-241       pad.text(), pad.text().length-1, 0, "\n");
-242     pad.appendRevision(nlChangeset);
-243   }
-244   
-245   console.error(JSON.stringify(pad.pool()));
-246   
-247   //ex. updatePadClients
-248   
-249   for(i in pad2sessions[pad.id])
-250   {
-251     var session = pad2sessions[pad.id][i];
-252     var lastRev = sessioninfos[session].rev;
-253     
-254     while (lastRev < pad.getHeadRevisionNumber()) 
-255     {
-256       var r = ++lastRev;
-257       var author = pad.getRevisionAuthor(r);
-258       
-259       if(author == sessioninfos[session].author)
-260       {
-261         socketio.clients[session].send({"type":"COLLABROOM","data":{type:"ACCEPT_COMMIT", newRev:r}});
-262       }
-263       else
-264       {
-265         var forWire = Changeset.prepareForWire(pad.getRevisionChangeset(r), pad.pool());
-266         var wireMsg = {"type":"COLLABROOM","data":{type:"NEW_CHANGES", newRev:r,
-267                    changeset: forWire.translated,
-268                    apool: forWire.pool,
-269                    author: author}};
-270         socketio.clients[session].send(wireMsg);
-271       }
-272     }
-273     
-274     sessioninfos[session].rev = pad.getHeadRevisionNumber();
-275   }
-276 }
-277 
-278 /**
-279  * Copied from the Etherpad Source Code. Don't know what this methode does excatly...
-280  */
-281 function _correctMarkersInPad(atext, apool) {
-282   var text = atext.text;
-283 
-284   // collect char positions of line markers (e.g. bullets) in new atext
-285   // that aren't at the start of a line
-286   var badMarkers = [];
-287   var iter = Changeset.opIterator(atext.attribs);
-288   var offset = 0;
-289   while (iter.hasNext()) {
-290     var op = iter.next();
-291     var listValue = Changeset.opAttributeValue(op, 'list', apool);
-292     if (listValue) {
-293       for(var i=0;i<op.chars;i++) {
-294         if (offset > 0 && text.charAt(offset-1) != '\n') {
-295           badMarkers.push(offset);
-296         }
-297         offset++;
-298       }
-299     }
-300     else {
-301       offset += op.chars;
-302     }
-303   }
-304 
-305   if (badMarkers.length == 0) {
-306     return null;
-307   }
-308 
-309   // create changeset that removes these bad markers
-310   offset = 0;
-311   var builder = Changeset.builder(text.length);
-312   badMarkers.forEach(function(pos) {
-313     builder.keepText(text.substring(offset, pos));
-314     builder.remove(1);
-315     offset = pos+1;
-316   });
-317   return builder.toString();
-318 }
-319 
-320 /**
-321  * Handles a CLIENT_READY. A CLIENT_READY is the first message from the client to the server. The Client sends his token 
-322  * and the pad it wants to enter. The Server answers with the inital values (clientVars) of the pad
-323  * @param client the client that send this message
-324  * @param message the message from the client
-325  */
-326 function handleClientReady(client, message)
-327 {
-328   //check if all ok
-329   if(!message.token)
-330   {
-331     throw "CLIENT_READY Message have no token!";
-332   }
-333   if(!message.padId)
-334   {
-335     throw "CLIENT_READY Message have no padId!";
-336   }
-337   if(!message.protocolVersion)
-338   {
-339     throw "CLIENT_READY Message have no protocolVersion!";
-340   }
-341   if(message.protocolVersion != 1)
-342   {
-343     throw "CLIENT_READY Message have a unkown protocolVersion '" + protocolVersion + "'!";
-344   }
-345 
-346   //Ask the author Manager for a authorname of this token. 
-347   var author = authorManager.getAuthor4Token(message.token);
-348   
-349   //Save in session2pad that this session belonges to this pad
-350   var sessionId=String(client.sessionId);
-351   session2pad[sessionId] = message.padId;
-352   
-353   //check if there is already a pad2sessions entry, if not, create one
-354   if(!pad2sessions[message.padId])
-355   {
-356     pad2sessions[message.padId] = [];
-357   }
-358   
-359   //Saves in pad2sessions that this session belongs to this pad
-360   pad2sessions[message.padId].push(sessionId);
-361    
-362   //Tell the PadManager that it should ensure that this Pad exist
-363   padManager.ensurePadExists(message.padId);
-364   
-365   //Ask the PadManager for a function Wrapper for this Pad
-366   var pad = padManager.getPad(message.padId, false);
-367   
-368   //prepare all values for the wire
-369   atext = pad.atext();
-370   var attribsForWire = Changeset.prepareForWire(atext.attribs, pad.pool());
-371   var apool = attribsForWire.pool.toJsonable();
-372   atext.attribs = attribsForWire.translated;
-373   
-374   var clientVars = {
-375     "accountPrivs": {
-376         "maxRevisions": 100
-377     },
-378     "initialRevisionList": [],
-379     "initialOptions": {
-380         "guestPolicy": "deny"
-381     },
-382     "collab_client_vars": {
-383         "initialAttributedText": atext,
-384         "clientIp": client.request.connection.remoteAddress,
-385         //"clientAgent": "Anonymous Agent",
-386         "padId": message.padId,
-387         "historicalAuthorData": {},
-388         "apool": apool,
-389         "rev": pad.getHeadRevisionNumber(),
-390         "globalPadId": message.padId
-391     },
-392     "colorPalette": ["#ffc7c7", "#fff1c7", "#e3ffc7", "#c7ffd5", "#c7ffff", "#c7d5ff", "#e3c7ff", "#ffc7f1", "#ff8f8f", "#ffe38f", "#c7ff8f", "#8fffab", "#8fffff", "#8fabff", "#c78fff", "#ff8fe3", "#d97979", "#d9c179", "#a9d979", "#79d991", "#79d9d9", "#7991d9", "#a979d9", "#d979c1", "#d9a9a9", "#d9cda9", "#c1d9a9", "#a9d9b5", "#a9d9d9", "#a9b5d9", "#c1a9d9", "#d9a9cd"],
-393     "clientIp": client.request.connection.remoteAddress,
-394     "userIsGuest": true,
-395     "userColor": authorManager.getAuthorColorId(author),
-396     "padId": message.padId,
-397     "initialTitle": "Pad: " + message.padId,
-398     "opts": {},
-399     "chatHistory": {
-400         "start": 0,
-401         "historicalAuthorData": {},
-402         "end": 0,
-403         "lines": []
-404     },
-405     "numConnectedUsers": pad2sessions[message.padId].length,
-406     "isProPad": false,
-407     "serverTimestamp": new Date().getTime(),
-408     "globalPadId": message.padId,
-409     "userId": author,
-410     "cookiePrefsToSet": {
-411         "fullWidth": false,
-412         "hideSidebar": false
-413     },
-414     "hooks": {}
-415   }
-416   
-417   //Add a username to the clientVars if one avaiable
-418   if(authorManager.getAuthorName(author) != null)
-419   {
-420     clientVars.userName = authorManager.getAuthorName(author);
-421   }
-422   
-423   //Add all authors that worked on this pad, to the historicalAuthorData on clientVars
-424   var allAuthors = pad.getAllAuthors();
-425   for(i in allAuthors)
-426   {
-427     clientVars.collab_client_vars.historicalAuthorData[allAuthors[i]] = {};
-428     if(authorManager.getAuthorName(author) != null)
-429       clientVars.collab_client_vars.historicalAuthorData[allAuthors[i]].name = authorManager.getAuthorName(author);
-430     clientVars.collab_client_vars.historicalAuthorData[allAuthors[i]].colorId = authorManager.getAuthorColorId(author);
-431   }
-432   
-433   //Send the clientVars to the Client
-434   client.send(clientVars);
-435   
-436   //Save the revision and the author id in sessioninfos
-437   sessioninfos[client.sessionId].rev = pad.getHeadRevisionNumber();
-438   sessioninfos[client.sessionId].author = author;
-439   
-440   //prepare the notification for the other users on the pad, that this user joined
-441   var messageToTheOtherUsers = {
-442     "type": "COLLABROOM",
-443     "data": {
-444       type: "USER_NEWINFO",
-445       userInfo: {
-446         "ip": "127.0.0.1",
-447         "colorId": authorManager.getAuthorColorId(author),
-448         "userAgent": "Anonymous",
-449         "userId": author
-450       }
-451     }
-452   };
-453   
-454   //Add the authorname of this new User, if avaiable
-455   if(authorManager.getAuthorName(author) != null)
-456   {
-457     messageToTheOtherUsers.data.userInfo.name = authorManager.getAuthorName(author);
-458   }
-459   
-460   //
-461   for(i in pad2sessions[message.padId])
-462   {
-463     if(pad2sessions[message.padId][i] != client.sessionId)
-464     {
-465       socketio.clients[pad2sessions[message.padId][i]].send(messageToTheOtherUsers);
-466     
-467       var messageToNotifyTheClientAboutTheOthers = {
-468         "type": "COLLABROOM",
-469         "data": {
-470           type: "USER_NEWINFO",
-471           userInfo: {
-472             "ip": "127.0.0.1",
-473             "colorId": authorManager.getAuthorColorId(sessioninfos[pad2sessions[message.padId][i]].author),
-474             "userAgent": "Anonymous",
-475             "userId": sessioninfos[pad2sessions[message.padId][i]].author
-476           }
-477         }
-478       };
-479       
-480       client.send(messageToNotifyTheClientAboutTheOthers);
-481     }
-482   }
-483   
-484   
-485 }
-486 
-487 /**
-488  * A internal function that simply checks if client or socketio is null and throws a exception if yes
-489  */
-490 function throwExceptionIfClientOrIOisInvalid(client)
-491 {
-492   if(client == null)
-493   {
-494     throw "Client is null!";
-495   }
-496   if(socketio == null)
-497   {
-498     throw "SocketIO is not set or null! Please use setSocketIO(io) to set it";
-499   }
-500 }
-501 
\ No newline at end of file diff --git a/doc/jsdoc/symbols/src/node_PadManager.js.html b/doc/jsdoc/symbols/src/node_PadManager.js.html deleted file mode 100644 index 3ef715785..000000000 --- a/doc/jsdoc/symbols/src/node_PadManager.js.html +++ /dev/null @@ -1,272 +0,0 @@ -
  1 /**
-  2  * 2011 Peter 'Pita' Martischka
-  3  *
-  4  * Licensed under the Apache License, Version 2.0 (the "License");
-  5  * you may not use this file except in compliance with the License.
-  6  * You may obtain a copy of the License at
-  7  *
-  8  *      http://www.apache.org/licenses/LICENSE-2.0
-  9  *
- 10  * Unless required by applicable law or agreed to in writing, software
- 11  * distributed under the License is distributed on an "AS-IS" BASIS,
- 12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 13  * See the License for the specific language governing permissions and
- 14  * limitations under the License.
- 15  */
- 16 
- 17 /*
- 18 The Pad Module trys to simulate the pad object from EtherPad. You can find the original code in /etherpad/src/etherpad/pad/model.js
- 19 see https://github.com/ether/pad/blob/master/etherpad/src/etherpad/pad/model.js
- 20 */
- 21 
- 22 var Changeset = require("./Changeset");
- 23 var AttributePoolFactory = require("./AttributePoolFactory");
- 24 
- 25 /**
- 26  * The initial Text of a Pad
- 27  */
- 28 exports.startText = "Hello World\nGoodbye Etherpad";
- 29 
- 30 /**
- 31  * A Array with all known Pads
- 32  */
- 33 globalPads = [];
- 34 
- 35 /**
- 36  * Return a Function Wrapper to work with the Pad
- 37  * @param id A String with the id of the pad
- 38  * @param createIfNotExist A Boolean which says the function if it should create the Pad if it not exist
- 39  */
- 40 exports.getPad = function(id, createIfNotExist)
- 41 {  
- 42   if(!globalPads[id] && createIfNotExist == true)
- 43   {
- 44     createPad(id);
- 45   }
- 46   
- 47   if(!globalPads[id])
- 48     return null;
- 49   
- 50   globalPads[id].timestamp = new Date().getTime();
- 51   
- 52   var functionWrapper = {};
- 53   
- 54   functionWrapper.id = id;
- 55   functionWrapper.appendRevision = function (theChangeset, author) {return appendRevision(id, theChangeset, author)};
- 56   functionWrapper.text = function () {return text(id)};
- 57   functionWrapper.atext = function () {return atext(id)};
- 58   functionWrapper.pool = function () {return pool(id)};
- 59   functionWrapper.getHeadRevisionNumber = function () {return getHeadRevisionNumber(id)};
- 60   functionWrapper.getRevisionChangeset = function (revNum) {return getRevisionChangeset(id, revNum)};
- 61   functionWrapper.getRevisionAuthor = function (revNum) {return getRevisionAuthor(id, revNum)};
- 62   functionWrapper.getAllAuthors = function () {return getAllAuthors(id)};
- 63   
- 64   return functionWrapper;
- 65 }
- 66 
- 67 /**
- 68  * Ensures that the Pad exists
- 69  * @param id The Pad id
- 70  */
- 71 exports.ensurePadExists = function(id)
- 72 {
- 73   if(!globalPads[id])
- 74   {
- 75     createPad(id);
- 76   }
- 77 }
- 78 
- 79 /**
- 80  * Creates an empty pad
- 81  * @param id The Pad id
- 82  */
- 83 function createPad(id)
- 84 {
- 85   var pad = {};
- 86   globalPads[id] = pad;
- 87   
- 88   pad.id = id;
- 89   pad.rev = [];
- 90   pad.head = -1;
- 91   pad.atext = Changeset.makeAText("\n");
- 92   pad.apool = AttributePoolFactory.createAttributePool();
- 93   pad.authors = [];
- 94   
- 95   var firstChangeset = Changeset.makeSplice("\n", 0, 0,
- 96                         exports.cleanText(exports.startText));                      
- 97   appendRevision(id, firstChangeset, '');
- 98 }
- 99 
-100 /**
-101  * Append a changeset to a pad
-102  * @param id The Pad id
-103  * @param theChangeset the changeset which should apply to the text
-104  * @param The author of the revision, can be null
-105  */
-106 function appendRevision(id, theChangeset, author)
-107 {
-108   throwExceptionIfPadDontExist(id);
-109 
-110   if(!author)
-111     author = '';
-112 
-113   var atext = globalPads[id].atext;
-114   var apool = globalPads[id].apool;
-115   var newAText = Changeset.applyToAText(theChangeset, atext, apool);
-116   Changeset.copyAText(newAText, atext);
-117   
-118   var newRev = ++globalPads[id].head;
-119   globalPads[id].rev[newRev] = {};
-120   globalPads[id].rev[newRev].changeset = theChangeset;
-121   globalPads[id].rev[newRev].meta = {};
-122   globalPads[id].rev[newRev].meta.author = author;
-123   globalPads[id].rev[newRev].meta.timestamp = new Date().getTime();
-124   
-125   //ex. getNumForAuthor
-126   apool.putAttrib(['author',author||'']);
-127   
-128   if(newRev%100==0)
-129   {
-130     globalPads[id].rev[newRev].meta.atext=atext;
-131   }
-132 }
-133 
-134 /**
-135  * Returns all Authors of a Pad
-136  * @param id The Pad id
-137  */
-138 function getAllAuthors(id)
-139 {
-140   var authors = [];
-141   
-142   for(key in globalPads[id].apool.numToAttrib)
-143   {
-144     if(globalPads[id].apool.numToAttrib[key][0] == "author" && globalPads[id].apool.numToAttrib[key][1] != "")
-145     {
-146       authors.push(globalPads[id].apool.numToAttrib[key][1]);
-147     }
-148   }
-149   
-150   return authors;
-151 }
-152 
-153 /**
-154  * Returns the plain text of a pad
-155  * @param id The Pad id
-156  */
-157  
-158 function text(id)
-159 {
-160   throwExceptionIfPadDontExist(id);
-161   
-162   return globalPads[id].atext.text;
-163 }
-164 
-165 /**
-166  * Returns the Attributed Text of a pad
-167  * @param id The Pad id
-168  */
-169 function atext(id)
-170 {
-171   throwExceptionIfPadDontExist(id);
-172   
-173   return globalPads[id].atext;
-174 }
-175 
-176 /**
-177  * Returns the Attribute Pool whichs the Pad is using
-178  * @param id The Pad id
-179  */
-180 function pool(id)
-181 {
-182   throwExceptionIfPadDontExist(id);
-183   
-184   return globalPads[id].apool;
-185 }
-186 
-187 /**
-188  * Returns the latest Revision Number of the Pad
-189  * @param id The Pad id
-190  */
-191 function getHeadRevisionNumber(id)
-192 {
-193   throwExceptionIfPadDontExist(id);
-194   
-195   return globalPads[id].head;
-196 }
-197 
-198 /**
-199  * Returns the changeset of a specific revision
-200  * @param id The Pad id
-201  * @param revNum The Revision Number
-202  */
-203 function getRevisionChangeset(id, revNum)
-204 {
-205   throwExceptionIfPadDontExist(id);
-206   throwExceptionIfRevDontExist(id, revNum);
-207   
-208   return globalPads[id].rev[revNum].changeset;
-209 }
-210 
-211 /**
-212  * Returns the author of a specific revision
-213  * @param id The Pad id
-214  * @param revNum The Revision Number
-215  */
-216 function getRevisionAuthor(id, revNum)
-217 {
-218   throwExceptionIfPadDontExist(id);
-219   throwExceptionIfRevDontExist(id, revNum);
-220   
-221   return globalPads[id].rev[revNum].meta.author;
-222 }
-223 
-224 /**
-225  * Check if the ID is a valid Pad ID and trows an Exeption if not
-226  * @param id The Pad id
-227  */
-228 function throwExceptionIfPadDontExist(id)
-229 {
-230   if(id == null)
-231   {
-232     throw "Padname is null!";
-233   }
-234   if(!globalPads[id])
-235   {
-236     throw "Pad don't exist!'";
-237   }
-238 }
-239 
-240 /**
-241  * Check if the Revision of a Pad is valid and throws an Exeption if not
-242  * @param id The Pad id
-243  */
-244 function throwExceptionIfRevDontExist(id, revNum)
-245 {
-246   if(revNum == null)
-247     throw "revNum is null";
-248 
-249   if((typeof revNum) != "number")
-250     throw revNum + " is no Number";
-251     
-252   if(revNum < 0 || revNum > globalPads[id].head)
-253     throw "The Revision " + revNum + " don't exist'";
-254 }
-255 
-256 /**
-257  * Copied from the Etherpad source code, don't know what its good for
-258  * @param txt
-259  */
-260 exports.cleanText = function (txt) {
-261   return txt.replace(/\r\n/g,'\n').replace(/\r/g,'\n').replace(/\t/g, '        ').replace(/\xa0/g, ' ');
-262 }
-263 
-264 
-265 
\ No newline at end of file diff --git a/doc/jsdoc/symbols/src/node_easysync_tests.js.html b/doc/jsdoc/symbols/src/node_easysync_tests.js.html deleted file mode 100644 index 50f30a007..000000000 --- a/doc/jsdoc/symbols/src/node_easysync_tests.js.html +++ /dev/null @@ -1,950 +0,0 @@ -
  1 /**
-  2  * Copyright 2009 Google Inc., 2011 Peter 'Pita' Martischka
-  3  *
-  4  * Licensed under the Apache License, Version 2.0 (the "License");
-  5  * you may not use this file except in compliance with the License.
-  6  * You may obtain a copy of the License at
-  7  *
-  8  *      http://www.apache.org/licenses/LICENSE-2.0
-  9  *
- 10  * Unless required by applicable law or agreed to in writing, software
- 11  * distributed under the License is distributed on an "AS-IS" BASIS,
- 12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 13  * See the License for the specific language governing permissions and
- 14  * limitations under the License.
- 15  */
- 16 
- 17 var Changeset = require('./Changeset');
- 18 var AttributePoolFactory = require("./AttributePoolFactory");
- 19 
- 20 function random() {
- 21   this.nextInt = function (maxValue) {
- 22     return Math.floor(Math.random() * maxValue);
- 23   }
- 24 
- 25   this.nextDouble = function (maxValue) {
- 26     return Math.random();
- 27   }
- 28 }
- 29 
- 30 function runTests() {
- 31 
- 32   function print(str) {
- 33     console.log(str);
- 34   }
- 35 
- 36   function assert(code, optMsg) {
- 37     if (!eval(code)) throw new Error("FALSE: " + (optMsg || code));
- 38   }
- 39 
- 40   function literal(v) {
- 41     if ((typeof v) == "string") {
- 42       return '"' + v.replace(/[\\\"]/g, '\\$1').replace(/\n/g, '\\n') + '"';
- 43     } else
- 44     return JSON.stringify(v);
- 45   }
- 46 
- 47   function assertEqualArrays(a, b) {
- 48     assert("JSON.stringify(" + literal(a) + ") == JSON.stringify(" + literal(b) + ")");
- 49   }
- 50 
- 51   function assertEqualStrings(a, b) {
- 52     assert(literal(a) + " == " + literal(b));
- 53   }
- 54 
- 55   function throughIterator(opsStr) {
- 56     var iter = Changeset.opIterator(opsStr);
- 57     var assem = Changeset.opAssembler();
- 58     while (iter.hasNext()) {
- 59       assem.append(iter.next());
- 60     }
- 61     return assem.toString();
- 62   }
- 63 
- 64   function throughSmartAssembler(opsStr) {
- 65     var iter = Changeset.opIterator(opsStr);
- 66     var assem = Changeset.smartOpAssembler();
- 67     while (iter.hasNext()) {
- 68       assem.append(iter.next());
- 69     }
- 70     assem.endDocument();
- 71     return assem.toString();
- 72   }
- 73 
- 74   (function () {
- 75     print("> throughIterator");
- 76     var x = '-c*3*4+6|3=az*asdf0*1*2*3+1=1-1+1*0+1=1-1+1|c=c-1';
- 77     assert("throughIterator(" + literal(x) + ") == " + literal(x));
- 78   })();
- 79 
- 80   (function () {
- 81     print("> throughSmartAssembler");
- 82     var x = '-c*3*4+6|3=az*asdf0*1*2*3+1=1-1+1*0+1=1-1+1|c=c-1';
- 83     assert("throughSmartAssembler(" + literal(x) + ") == " + literal(x));
- 84   })();
- 85 
- 86   function applyMutations(mu, arrayOfArrays) {
- 87     arrayOfArrays.forEach(function (a) {
- 88       var result = mu[a[0]].apply(mu, a.slice(1));
- 89       if (a[0] == 'remove' && a[3]) {
- 90         assertEqualStrings(a[3], result);
- 91       }
- 92     });
- 93   }
- 94 
- 95   function mutationsToChangeset(oldLen, arrayOfArrays) {
- 96     var assem = Changeset.smartOpAssembler();
- 97     var op = Changeset.newOp();
- 98     var bank = Changeset.stringAssembler();
- 99     var oldPos = 0;
-100     var newLen = 0;
-101     arrayOfArrays.forEach(function (a) {
-102       if (a[0] == 'skip') {
-103         op.opcode = '=';
-104         op.chars = a[1];
-105         op.lines = (a[2] || 0);
-106         assem.append(op);
-107         oldPos += op.chars;
-108         newLen += op.chars;
-109       } else if (a[0] == 'remove') {
-110         op.opcode = '-';
-111         op.chars = a[1];
-112         op.lines = (a[2] || 0);
-113         assem.append(op);
-114         oldPos += op.chars;
-115       } else if (a[0] == 'insert') {
-116         op.opcode = '+';
-117         bank.append(a[1]);
-118         op.chars = a[1].length;
-119         op.lines = (a[2] || 0);
-120         assem.append(op);
-121         newLen += op.chars;
-122       }
-123     });
-124     newLen += oldLen - oldPos;
-125     assem.endDocument();
-126     return Changeset.pack(oldLen, newLen, assem.toString(), bank.toString());
-127   }
-128 
-129   function runMutationTest(testId, origLines, muts, correct) {
-130     print("> runMutationTest#" + testId);
-131     var lines = origLines.slice();
-132     var mu = Changeset.textLinesMutator(lines);
-133     applyMutations(mu, muts);
-134     mu.close();
-135     assertEqualArrays(correct, lines);
-136 
-137     var inText = origLines.join('');
-138     var cs = mutationsToChangeset(inText.length, muts);
-139     lines = origLines.slice();
-140     Changeset.mutateTextLines(cs, lines);
-141     assertEqualArrays(correct, lines);
-142 
-143     var correctText = correct.join('');
-144     //print(literal(cs));
-145     var outText = Changeset.applyToText(cs, inText);
-146     assertEqualStrings(correctText, outText);
-147   }
-148 
-149   runMutationTest(1, ["apple\n", "banana\n", "cabbage\n", "duffle\n", "eggplant\n"], [
-150     ['remove', 1, 0, "a"],
-151     ['insert', "tu"],
-152     ['remove', 1, 0, "p"],
-153     ['skip', 4, 1],
-154     ['skip', 7, 1],
-155     ['insert', "cream\npie\n", 2],
-156     ['skip', 2],
-157     ['insert', "bot"],
-158     ['insert', "\n", 1],
-159     ['insert', "bu"],
-160     ['skip', 3],
-161     ['remove', 3, 1, "ge\n"],
-162     ['remove', 6, 0, "duffle"]
-163   ], ["tuple\n", "banana\n", "cream\n", "pie\n", "cabot\n", "bubba\n", "eggplant\n"]);
-164 
-165   runMutationTest(2, ["apple\n", "banana\n", "cabbage\n", "duffle\n", "eggplant\n"], [
-166     ['remove', 1, 0, "a"],
-167     ['remove', 1, 0, "p"],
-168     ['insert', "tu"],
-169     ['skip', 11, 2],
-170     ['insert', "cream\npie\n", 2],
-171     ['skip', 2],
-172     ['insert', "bot"],
-173     ['insert', "\n", 1],
-174     ['insert', "bu"],
-175     ['skip', 3],
-176     ['remove', 3, 1, "ge\n"],
-177     ['remove', 6, 0, "duffle"]
-178   ], ["tuple\n", "banana\n", "cream\n", "pie\n", "cabot\n", "bubba\n", "eggplant\n"]);
-179 
-180   runMutationTest(3, ["apple\n", "banana\n", "cabbage\n", "duffle\n", "eggplant\n"], [
-181     ['remove', 6, 1, "apple\n"],
-182     ['skip', 15, 2],
-183     ['skip', 6],
-184     ['remove', 1, 1, "\n"],
-185     ['remove', 8, 0, "eggplant"],
-186     ['skip', 1, 1]
-187   ], ["banana\n", "cabbage\n", "duffle\n"]);
-188 
-189   runMutationTest(4, ["15\n"], [
-190     ['skip', 1],
-191     ['insert', "\n2\n3\n4\n", 4],
-192     ['skip', 2, 1]
-193   ], ["1\n", "2\n", "3\n", "4\n", "5\n"]);
-194 
-195   runMutationTest(5, ["1\n", "2\n", "3\n", "4\n", "5\n"], [
-196     ['skip', 1],
-197     ['remove', 7, 4, "\n2\n3\n4\n"],
-198     ['skip', 2, 1]
-199   ], ["15\n"]);
-200 
-201   runMutationTest(6, ["123\n", "abc\n", "def\n", "ghi\n", "xyz\n"], [
-202     ['insert', "0"],
-203     ['skip', 4, 1],
-204     ['skip', 4, 1],
-205     ['remove', 8, 2, "def\nghi\n"],
-206     ['skip', 4, 1]
-207   ], ["0123\n", "abc\n", "xyz\n"]);
-208 
-209   runMutationTest(7, ["apple\n", "banana\n", "cabbage\n", "duffle\n", "eggplant\n"], [
-210     ['remove', 6, 1, "apple\n"],
-211     ['skip', 15, 2, true],
-212     ['skip', 6, 0, true],
-213     ['remove', 1, 1, "\n"],
-214     ['remove', 8, 0, "eggplant"],
-215     ['skip', 1, 1, true]
-216   ], ["banana\n", "cabbage\n", "duffle\n"]);
-217 
-218   function poolOrArray(attribs) {
-219     if (attribs.getAttrib) {
-220       return attribs; // it's already an attrib pool
-221     } else {
-222       // assume it's an array of attrib strings to be split and added
-223       var p = AttributePoolFactory.createAttributePool();
-224       attribs.forEach(function (kv) {
-225         p.putAttrib(kv.split(','));
-226       });
-227       return p;
-228     }
-229   }
-230 
-231   function runApplyToAttributionTest(testId, attribs, cs, inAttr, outCorrect) {
-232     print("> applyToAttribution#" + testId);
-233     var p = poolOrArray(attribs);
-234     var result = Changeset.applyToAttribution(
-235     Changeset.checkRep(cs), inAttr, p);
-236     assertEqualStrings(outCorrect, result);
-237   }
-238 
-239   // turn c<b>a</b>ctus\n into a<b>c</b>tusabcd\n
-240   runApplyToAttributionTest(1, ['bold,', 'bold,true'], "Z:7>3-1*0=1*1=1=3+4$abcd", "+1*1+1|1+5", "+1*1+1|1+8");
-241 
-242   // turn "david\ngreenspan\n" into "<b>david\ngreen</b>\n"
-243   runApplyToAttributionTest(2, ['bold,', 'bold,true'], "Z:g<4*1|1=6*1=5-4$", "|2+g", "*1|1+6*1+5|1+1");
-244 
-245   (function () {
-246     print("> mutatorHasMore");
-247     var lines = ["1\n", "2\n", "3\n", "4\n"];
-248     var mu;
-249 
-250     mu = Changeset.textLinesMutator(lines);
-251     assert(mu.hasMore() + ' == true');
-252     mu.skip(8, 4);
-253     assert(mu.hasMore() + ' == false');
-254     mu.close();
-255     assert(mu.hasMore() + ' == false');
-256 
-257     // still 1,2,3,4
-258     mu = Changeset.textLinesMutator(lines);
-259     assert(mu.hasMore() + ' == true');
-260     mu.remove(2, 1);
-261     assert(mu.hasMore() + ' == true');
-262     mu.skip(2, 1);
-263     assert(mu.hasMore() + ' == true');
-264     mu.skip(2, 1);
-265     assert(mu.hasMore() + ' == true');
-266     mu.skip(2, 1);
-267     assert(mu.hasMore() + ' == false');
-268     mu.insert("5\n", 1);
-269     assert(mu.hasMore() + ' == false');
-270     mu.close();
-271     assert(mu.hasMore() + ' == false');
-272 
-273     // 2,3,4,5 now
-274     mu = Changeset.textLinesMutator(lines);
-275     assert(mu.hasMore() + ' == true');
-276     mu.remove(6, 3);
-277     assert(mu.hasMore() + ' == true');
-278     mu.remove(2, 1);
-279     assert(mu.hasMore() + ' == false');
-280     mu.insert("hello\n", 1);
-281     assert(mu.hasMore() + ' == false');
-282     mu.close();
-283     assert(mu.hasMore() + ' == false');
-284 
-285   })();
-286 
-287   function runMutateAttributionTest(testId, attribs, cs, alines, outCorrect) {
-288     print("> runMutateAttributionTest#" + testId);
-289     var p = poolOrArray(attribs);
-290     var alines2 = Array.prototype.slice.call(alines);
-291     var result = Changeset.mutateAttributionLines(
-292     Changeset.checkRep(cs), alines2, p);
-293     assertEqualArrays(outCorrect, alines2);
-294 
-295     print("> runMutateAttributionTest#" + testId + ".applyToAttribution");
-296 
-297     function removeQuestionMarks(a) {
-298       return a.replace(/\?/g, '');
-299     }
-300     var inMerged = Changeset.joinAttributionLines(alines.map(removeQuestionMarks));
-301     var correctMerged = Changeset.joinAttributionLines(outCorrect.map(removeQuestionMarks));
-302     var mergedResult = Changeset.applyToAttribution(cs, inMerged, p);
-303     assertEqualStrings(correctMerged, mergedResult);
-304   }
-305 
-306   // turn 123\n 456\n 789\n into 123\n 4<b>5</b>6\n 789\n
-307   runMutateAttributionTest(1, ["bold,true"], "Z:c>0|1=4=1*0=1$", ["|1+4", "|1+4", "|1+4"], ["|1+4", "+1*0+1|1+2", "|1+4"]);
-308 
-309   // make a document bold
-310   runMutateAttributionTest(2, ["bold,true"], "Z:c>0*0|3=c$", ["|1+4", "|1+4", "|1+4"], ["*0|1+4", "*0|1+4", "*0|1+4"]);
-311 
-312   // clear bold on document
-313   runMutateAttributionTest(3, ["bold,", "bold,true"], "Z:c>0*0|3=c$", ["*1+1+1*1+1|1+1", "+1*1+1|1+2", "*1+1+1*1+1|1+1"], ["|1+4", "|1+4", "|1+4"]);
-314 
-315   // add a character on line 3 of a document with 5 blank lines, and make sure
-316   // the optimization that skips purely-kept lines is working; if any attribution string
-317   // with a '?' is parsed it will cause an error.
-318   runMutateAttributionTest(4, ['foo,bar', 'line,1', 'line,2', 'line,3', 'line,4', 'line,5'], "Z:5>1|2=2+1$x", ["?*1|1+1", "?*2|1+1", "*3|1+1", "?*4|1+1", "?*5|1+1"], ["?*1|1+1", "?*2|1+1", "+1*3|1+1", "?*4|1+1", "?*5|1+1"]);
-319 
-320   var testPoolWithChars = (function () {
-321     var p = AttributePoolFactory.createAttributePool();
-322     p.putAttrib(['char', 'newline']);
-323     for (var i = 1; i < 36; i++) {
-324       p.putAttrib(['char', Changeset.numToString(i)]);
-325     }
-326     p.putAttrib(['char', '']);
-327     return p;
-328   })();
-329 
-330   // based on runMutationTest#1
-331   runMutateAttributionTest(5, testPoolWithChars, "Z:11>7-2*t+1*u+1|2=b|2+a=2*b+1*o+1*t+1*0|1+1*b+1*u+1=3|1-3-6$" + "tucream\npie\nbot\nbu", ["*a+1*p+2*l+1*e+1*0|1+1", "*b+1*a+1*n+1*a+1*n+1*a+1*0|1+1", "*c+1*a+1*b+2*a+1*g+1*e+1*0|1+1", "*d+1*u+1*f+2*l+1*e+1*0|1+1", "*e+1*g+2*p+1*l+1*a+1*n+1*t+1*0|1+1"], ["*t+1*u+1*p+1*l+1*e+1*0|1+1", "*b+1*a+1*n+1*a+1*n+1*a+1*0|1+1", "|1+6", "|1+4", "*c+1*a+1*b+1*o+1*t+1*0|1+1", "*b+1*u+1*b+2*a+1*0|1+1", "*e+1*g+2*p+1*l+1*a+1*n+1*t+1*0|1+1"]);
-332 
-333   // based on runMutationTest#3
-334   runMutateAttributionTest(6, testPoolWithChars, "Z:11<f|1-6|2=f=6|1-1-8$", ["*a|1+6", "*b|1+7", "*c|1+8", "*d|1+7", "*e|1+9"], ["*b|1+7", "*c|1+8", "*d+6*e|1+1"]);
-335 
-336   // based on runMutationTest#4
-337   runMutateAttributionTest(7, testPoolWithChars, "Z:3>7=1|4+7$\n2\n3\n4\n", ["*1+1*5|1+2"], ["*1+1|1+1", "|1+2", "|1+2", "|1+2", "*5|1+2"]);
-338 
-339   // based on runMutationTest#5
-340   runMutateAttributionTest(8, testPoolWithChars, "Z:a<7=1|4-7$", ["*1|1+2", "*2|1+2", "*3|1+2", "*4|1+2", "*5|1+2"], ["*1+1*5|1+2"]);
-341 
-342   // based on runMutationTest#6
-343   runMutateAttributionTest(9, testPoolWithChars, "Z:k<7*0+1*10|2=8|2-8$0", ["*1+1*2+1*3+1|1+1", "*a+1*b+1*c+1|1+1", "*d+1*e+1*f+1|1+1", "*g+1*h+1*i+1|1+1", "?*x+1*y+1*z+1|1+1"], ["*0+1|1+4", "|1+4", "?*x+1*y+1*z+1|1+1"]);
-344 
-345   runMutateAttributionTest(10, testPoolWithChars, "Z:6>4=1+1=1+1|1=1+1=1*0+1$abcd", ["|1+3", "|1+3"], ["|1+5", "+2*0+1|1+2"]);
-346 
-347 
-348   runMutateAttributionTest(11, testPoolWithChars, "Z:s>1|1=4=6|1+1$\n", ["*0|1+4", "*0|1+8", "*0+5|1+1", "*0|1+1", "*0|1+5", "*0|1+1", "*0|1+1", "*0|1+1", "|1+1"], ["*0|1+4", "*0+6|1+1", "*0|1+2", "*0+5|1+1", "*0|1+1", "*0|1+5", "*0|1+1", "*0|1+1", "*0|1+1", "|1+1"]);
-349 
-350   function randomInlineString(len, rand) {
-351     var assem = Changeset.stringAssembler();
-352     for (var i = 0; i < len; i++) {
-353       assem.append(String.fromCharCode(rand.nextInt(26) + 97));
-354     }
-355     return assem.toString();
-356   }
-357 
-358   function randomMultiline(approxMaxLines, approxMaxCols, rand) {
-359     var numParts = rand.nextInt(approxMaxLines * 2) + 1;
-360     var txt = Changeset.stringAssembler();
-361     txt.append(rand.nextInt(2) ? '\n' : '');
-362     for (var i = 0; i < numParts; i++) {
-363       if ((i % 2) == 0) {
-364         if (rand.nextInt(10)) {
-365           txt.append(randomInlineString(rand.nextInt(approxMaxCols) + 1, rand));
-366         } else {
-367           txt.append('\n');
-368         }
-369       } else {
-370         txt.append('\n');
-371       }
-372     }
-373     return txt.toString();
-374   }
-375 
-376   function randomStringOperation(numCharsLeft, rand) {
-377     var result;
-378     switch (rand.nextInt(9)) {
-379     case 0:
-380       {
-381         // insert char
-382         result = {
-383           insert: randomInlineString(1, rand)
-384         };
-385         break;
-386       }
-387     case 1:
-388       {
-389         // delete char
-390         result = {
-391           remove: 1
-392         };
-393         break;
-394       }
-395     case 2:
-396       {
-397         // skip char
-398         result = {
-399           skip: 1
-400         };
-401         break;
-402       }
-403     case 3:
-404       {
-405         // insert small
-406         result = {
-407           insert: randomInlineString(rand.nextInt(4) + 1, rand)
-408         };
-409         break;
-410       }
-411     case 4:
-412       {
-413         // delete small
-414         result = {
-415           remove: rand.nextInt(4) + 1
-416         };
-417         break;
-418       }
-419     case 5:
-420       {
-421         // skip small
-422         result = {
-423           skip: rand.nextInt(4) + 1
-424         };
-425         break;
-426       }
-427     case 6:
-428       {
-429         // insert multiline;
-430         result = {
-431           insert: randomMultiline(5, 20, rand)
-432         };
-433         break;
-434       }
-435     case 7:
-436       {
-437         // delete multiline
-438         result = {
-439           remove: Math.round(numCharsLeft * rand.nextDouble() * rand.nextDouble())
-440         };
-441         break;
-442       }
-443     case 8:
-444       {
-445         // skip multiline
-446         result = {
-447           skip: Math.round(numCharsLeft * rand.nextDouble() * rand.nextDouble())
-448         };
-449         break;
-450       }
-451     case 9:
-452       {
-453         // delete to end
-454         result = {
-455           remove: numCharsLeft
-456         };
-457         break;
-458       }
-459     case 10:
-460       {
-461         // skip to end
-462         result = {
-463           skip: numCharsLeft
-464         };
-465         break;
-466       }
-467     }
-468     var maxOrig = numCharsLeft - 1;
-469     if ('remove' in result) {
-470       result.remove = Math.min(result.remove, maxOrig);
-471     } else if ('skip' in result) {
-472       result.skip = Math.min(result.skip, maxOrig);
-473     }
-474     return result;
-475   }
-476 
-477   function randomTwoPropAttribs(opcode, rand) {
-478     // assumes attrib pool like ['apple,','apple,true','banana,','banana,true']
-479     if (opcode == '-' || rand.nextInt(3)) {
-480       return '';
-481     } else if (rand.nextInt(3)) {
-482       if (opcode == '+' || rand.nextInt(2)) {
-483         return '*' + Changeset.numToString(rand.nextInt(2) * 2 + 1);
-484       } else {
-485         return '*' + Changeset.numToString(rand.nextInt(2) * 2);
-486       }
-487     } else {
-488       if (opcode == '+' || rand.nextInt(4) == 0) {
-489         return '*1*3';
-490       } else {
-491         return ['*0*2', '*0*3', '*1*2'][rand.nextInt(3)];
-492       }
-493     }
-494   }
-495 
-496   function randomTestChangeset(origText, rand, withAttribs) {
-497     var charBank = Changeset.stringAssembler();
-498     var textLeft = origText; // always keep final newline
-499     var outTextAssem = Changeset.stringAssembler();
-500     var opAssem = Changeset.smartOpAssembler();
-501     var oldLen = origText.length;
-502 
-503     var nextOp = Changeset.newOp();
-504 
-505     function appendMultilineOp(opcode, txt) {
-506       nextOp.opcode = opcode;
-507       if (withAttribs) {
-508         nextOp.attribs = randomTwoPropAttribs(opcode, rand);
-509       }
-510       txt.replace(/\n|[^\n]+/g, function (t) {
-511         if (t == '\n') {
-512           nextOp.chars = 1;
-513           nextOp.lines = 1;
-514           opAssem.append(nextOp);
-515         } else {
-516           nextOp.chars = t.length;
-517           nextOp.lines = 0;
-518           opAssem.append(nextOp);
-519         }
-520         return '';
-521       });
-522     }
-523 
-524     function doOp() {
-525       var o = randomStringOperation(textLeft.length, rand);
-526       if (o.insert) {
-527         var txt = o.insert;
-528         charBank.append(txt);
-529         outTextAssem.append(txt);
-530         appendMultilineOp('+', txt);
-531       } else if (o.skip) {
-532         var txt = textLeft.substring(0, o.skip);
-533         textLeft = textLeft.substring(o.skip);
-534         outTextAssem.append(txt);
-535         appendMultilineOp('=', txt);
-536       } else if (o.remove) {
-537         var txt = textLeft.substring(0, o.remove);
-538         textLeft = textLeft.substring(o.remove);
-539         appendMultilineOp('-', txt);
-540       }
-541     }
-542 
-543     while (textLeft.length > 1) doOp();
-544     for (var i = 0; i < 5; i++) doOp(); // do some more (only insertions will happen)
-545     var outText = outTextAssem.toString() + '\n';
-546     opAssem.endDocument();
-547     var cs = Changeset.pack(oldLen, outText.length, opAssem.toString(), charBank.toString());
-548     Changeset.checkRep(cs);
-549     return [cs, outText];
-550   }
-551 
-552   function testCompose(randomSeed) {
-553     var rand = new random();
-554     print("> testCompose#" + randomSeed);
-555 
-556     var p = AttributePoolFactory.createAttributePool();
-557 
-558     var startText = randomMultiline(10, 20, rand) + '\n';
-559 
-560     var x1 = randomTestChangeset(startText, rand);
-561     var change1 = x1[0];
-562     var text1 = x1[1];
-563 
-564     var x2 = randomTestChangeset(text1, rand);
-565     var change2 = x2[0];
-566     var text2 = x2[1];
-567 
-568     var x3 = randomTestChangeset(text2, rand);
-569     var change3 = x3[0];
-570     var text3 = x3[1];
-571 
-572     //print(literal(Changeset.toBaseTen(startText)));
-573     //print(literal(Changeset.toBaseTen(change1)));
-574     //print(literal(Changeset.toBaseTen(change2)));
-575     var change12 = Changeset.checkRep(Changeset.compose(change1, change2, p));
-576     var change23 = Changeset.checkRep(Changeset.compose(change2, change3, p));
-577     var change123 = Changeset.checkRep(Changeset.compose(change12, change3, p));
-578     var change123a = Changeset.checkRep(Changeset.compose(change1, change23, p));
-579     assertEqualStrings(change123, change123a);
-580 
-581     assertEqualStrings(text2, Changeset.applyToText(change12, startText));
-582     assertEqualStrings(text3, Changeset.applyToText(change23, text1));
-583     assertEqualStrings(text3, Changeset.applyToText(change123, startText));
-584   }
-585 
-586   for (var i = 0; i < 30; i++) testCompose(i);
-587 
-588   (function simpleComposeAttributesTest() {
-589     print("> simpleComposeAttributesTest");
-590     var p = AttributePoolFactory.createAttributePool();
-591     p.putAttrib(['bold', '']);
-592     p.putAttrib(['bold', 'true']);
-593     var cs1 = Changeset.checkRep("Z:2>1*1+1*1=1$x");
-594     var cs2 = Changeset.checkRep("Z:3>0*0|1=3$");
-595     var cs12 = Changeset.checkRep(Changeset.compose(cs1, cs2, p));
-596     assertEqualStrings("Z:2>1+1*0|1=2$x", cs12);
-597   })();
-598 
-599   (function followAttributesTest() {
-600     var p = AttributePoolFactory.createAttributePool();
-601     p.putAttrib(['x', '']);
-602     p.putAttrib(['x', 'abc']);
-603     p.putAttrib(['x', 'def']);
-604     p.putAttrib(['y', '']);
-605     p.putAttrib(['y', 'abc']);
-606     p.putAttrib(['y', 'def']);
-607 
-608     function testFollow(a, b, afb, bfa, merge) {
-609       assertEqualStrings(afb, Changeset.followAttributes(a, b, p));
-610       assertEqualStrings(bfa, Changeset.followAttributes(b, a, p));
-611       assertEqualStrings(merge, Changeset.composeAttributes(a, afb, true, p));
-612       assertEqualStrings(merge, Changeset.composeAttributes(b, bfa, true, p));
-613     }
-614 
-615     testFollow('', '', '', '', '');
-616     testFollow('*0', '', '', '*0', '*0');
-617     testFollow('*0', '*0', '', '', '*0');
-618     testFollow('*0', '*1', '', '*0', '*0');
-619     testFollow('*1', '*2', '', '*1', '*1');
-620     testFollow('*0*1', '', '', '*0*1', '*0*1');
-621     testFollow('*0*4', '*2*3', '*3', '*0', '*0*3');
-622     testFollow('*0*4', '*2', '', '*0*4', '*0*4');
-623   })();
-624 
-625   function testFollow(randomSeed) {
-626     var rand = new random();
-627     print("> testFollow#" + randomSeed);
-628 
-629     var p = AttributePoolFactory.createAttributePool();
-630 
-631     var startText = randomMultiline(10, 20, rand) + '\n';
-632 
-633     var cs1 = randomTestChangeset(startText, rand)[0];
-634     var cs2 = randomTestChangeset(startText, rand)[0];
-635 
-636     var afb = Changeset.checkRep(Changeset.follow(cs1, cs2, false, p));
-637     var bfa = Changeset.checkRep(Changeset.follow(cs2, cs1, true, p));
-638 
-639     var merge1 = Changeset.checkRep(Changeset.compose(cs1, afb));
-640     var merge2 = Changeset.checkRep(Changeset.compose(cs2, bfa));
-641 
-642     assertEqualStrings(merge1, merge2);
-643   }
-644 
-645   for (var i = 0; i < 30; i++) testFollow(i);
-646 
-647   function testSplitJoinAttributionLines(randomSeed) {
-648     var rand = new random();
-649     print("> testSplitJoinAttributionLines#" + randomSeed);
-650 
-651     var doc = randomMultiline(10, 20, rand) + '\n';
-652 
-653     function stringToOps(str) {
-654       var assem = Changeset.mergingOpAssembler();
-655       var o = Changeset.newOp('+');
-656       o.chars = 1;
-657       for (var i = 0; i < str.length; i++) {
-658         var c = str.charAt(i);
-659         o.lines = (c == '\n' ? 1 : 0);
-660         o.attribs = (c == 'a' || c == 'b' ? '*' + c : '');
-661         assem.append(o);
-662       }
-663       return assem.toString();
-664     }
-665 
-666     var theJoined = stringToOps(doc);
-667     var theSplit = doc.match(/[^\n]*\n/g).map(stringToOps);
-668 
-669     assertEqualArrays(theSplit, Changeset.splitAttributionLines(theJoined, doc));
-670     assertEqualStrings(theJoined, Changeset.joinAttributionLines(theSplit));
-671   }
-672 
-673   for (var i = 0; i < 10; i++) testSplitJoinAttributionLines(i);
-674 
-675   (function testMoveOpsToNewPool() {
-676     print("> testMoveOpsToNewPool");
-677 
-678     var pool1 = AttributePoolFactory.createAttributePool();
-679     var pool2 = AttributePoolFactory.createAttributePool();
-680 
-681     pool1.putAttrib(['baz', 'qux']);
-682     pool1.putAttrib(['foo', 'bar']);
-683 
-684     pool2.putAttrib(['foo', 'bar']);
-685 
-686     assertEqualStrings(Changeset.moveOpsToNewPool('Z:1>2*1+1*0+1$ab', pool1, pool2), 'Z:1>2*0+1*1+1$ab');
-687     assertEqualStrings(Changeset.moveOpsToNewPool('*1+1*0+1', pool1, pool2), '*0+1*1+1');
-688   })();
-689 
-690 
-691   (function testMakeSplice() {
-692     print("> testMakeSplice");
-693 
-694     var t = "a\nb\nc\n";
-695     var t2 = Changeset.applyToText(Changeset.makeSplice(t, 5, 0, "def"), t);
-696     assertEqualStrings("a\nb\ncdef\n", t2);
-697 
-698   })();
-699 
-700   (function testToSplices() {
-701     print("> testToSplices");
-702 
-703     var cs = Changeset.checkRep('Z:z>9*0=1=4-3+9=1|1-4-4+1*0+a$123456789abcdefghijk');
-704     var correctSplices = [
-705       [5, 8, "123456789"],
-706       [9, 17, "abcdefghijk"]
-707     ];
-708     assertEqualArrays(correctSplices, Changeset.toSplices(cs));
-709   })();
-710 
-711   function testCharacterRangeFollow(testId, cs, oldRange, insertionsAfter, correctNewRange) {
-712     print("> testCharacterRangeFollow#" + testId);
-713 
-714     var cs = Changeset.checkRep(cs);
-715     assertEqualArrays(correctNewRange, Changeset.characterRangeFollow(cs, oldRange[0], oldRange[1], insertionsAfter));
-716 
-717   }
-718 
-719   testCharacterRangeFollow(1, 'Z:z>9*0=1=4-3+9=1|1-4-4+1*0+a$123456789abcdefghijk', [7, 10], false, [14, 15]);
-720   testCharacterRangeFollow(2, "Z:bc<6|x=b4|2-6$", [400, 407], false, [400, 401]);
-721   testCharacterRangeFollow(3, "Z:4>0-3+3$abc", [0, 3], false, [3, 3]);
-722   testCharacterRangeFollow(4, "Z:4>0-3+3$abc", [0, 3], true, [0, 0]);
-723   testCharacterRangeFollow(5, "Z:5>1+1=1-3+3$abcd", [1, 4], false, [5, 5]);
-724   testCharacterRangeFollow(6, "Z:5>1+1=1-3+3$abcd", [1, 4], true, [2, 2]);
-725   testCharacterRangeFollow(7, "Z:5>1+1=1-3+3$abcd", [0, 6], false, [1, 7]);
-726   testCharacterRangeFollow(8, "Z:5>1+1=1-3+3$abcd", [0, 3], false, [1, 2]);
-727   testCharacterRangeFollow(9, "Z:5>1+1=1-3+3$abcd", [2, 5], false, [5, 6]);
-728   testCharacterRangeFollow(10, "Z:2>1+1$a", [0, 0], false, [1, 1]);
-729   testCharacterRangeFollow(11, "Z:2>1+1$a", [0, 0], true, [0, 0]);
-730 
-731   (function testOpAttributeValue() {
-732     print("> testOpAttributeValue");
-733 
-734     var p = AttributePoolFactory.createAttributePool();
-735     p.putAttrib(['name', 'david']);
-736     p.putAttrib(['color', 'green']);
-737 
-738     assertEqualStrings("david", Changeset.opAttributeValue(Changeset.stringOp('*0*1+1'), 'name', p));
-739     assertEqualStrings("david", Changeset.opAttributeValue(Changeset.stringOp('*0+1'), 'name', p));
-740     assertEqualStrings("", Changeset.opAttributeValue(Changeset.stringOp('*1+1'), 'name', p));
-741     assertEqualStrings("", Changeset.opAttributeValue(Changeset.stringOp('+1'), 'name', p));
-742     assertEqualStrings("green", Changeset.opAttributeValue(Changeset.stringOp('*0*1+1'), 'color', p));
-743     assertEqualStrings("green", Changeset.opAttributeValue(Changeset.stringOp('*1+1'), 'color', p));
-744     assertEqualStrings("", Changeset.opAttributeValue(Changeset.stringOp('*0+1'), 'color', p));
-745     assertEqualStrings("", Changeset.opAttributeValue(Changeset.stringOp('+1'), 'color', p));
-746   })();
-747 
-748   function testAppendATextToAssembler(testId, atext, correctOps) {
-749     print("> testAppendATextToAssembler#" + testId);
-750 
-751     var assem = Changeset.smartOpAssembler();
-752     Changeset.appendATextToAssembler(atext, assem);
-753     assertEqualStrings(correctOps, assem.toString());
-754   }
-755 
-756   testAppendATextToAssembler(1, {
-757     text: "\n",
-758     attribs: "|1+1"
-759   }, "");
-760   testAppendATextToAssembler(2, {
-761     text: "\n\n",
-762     attribs: "|2+2"
-763   }, "|1+1");
-764   testAppendATextToAssembler(3, {
-765     text: "\n\n",
-766     attribs: "*x|2+2"
-767   }, "*x|1+1");
-768   testAppendATextToAssembler(4, {
-769     text: "\n\n",
-770     attribs: "*x|1+1|1+1"
-771   }, "*x|1+1");
-772   testAppendATextToAssembler(5, {
-773     text: "foo\n",
-774     attribs: "|1+4"
-775   }, "+3");
-776   testAppendATextToAssembler(6, {
-777     text: "\nfoo\n",
-778     attribs: "|2+5"
-779   }, "|1+1+3");
-780   testAppendATextToAssembler(7, {
-781     text: "\nfoo\n",
-782     attribs: "*x|2+5"
-783   }, "*x|1+1*x+3");
-784   testAppendATextToAssembler(8, {
-785     text: "\n\n\nfoo\n",
-786     attribs: "|2+2*x|2+5"
-787   }, "|2+2*x|1+1*x+3");
-788 
-789   function testMakeAttribsString(testId, pool, opcode, attribs, correctString) {
-790     print("> testMakeAttribsString#" + testId);
-791 
-792     var p = poolOrArray(pool);
-793     var str = Changeset.makeAttribsString(opcode, attribs, p);
-794     assertEqualStrings(correctString, str);
-795   }
-796 
-797   testMakeAttribsString(1, ['bold,'], '+', [
-798     ['bold', '']
-799   ], '');
-800   testMakeAttribsString(2, ['abc,def', 'bold,'], '=', [
-801     ['bold', '']
-802   ], '*1');
-803   testMakeAttribsString(3, ['abc,def', 'bold,true'], '+', [
-804     ['abc', 'def'],
-805     ['bold', 'true']
-806   ], '*0*1');
-807   testMakeAttribsString(4, ['abc,def', 'bold,true'], '+', [
-808     ['bold', 'true'],
-809     ['abc', 'def']
-810   ], '*0*1');
-811 
-812   function testSubattribution(testId, astr, start, end, correctOutput) {
-813     print("> testSubattribution#" + testId);
-814 
-815     var str = Changeset.subattribution(astr, start, end);
-816     assertEqualStrings(correctOutput, str);
-817   }
-818 
-819   testSubattribution(1, "+1", 0, 0, "");
-820   testSubattribution(2, "+1", 0, 1, "+1");
-821   testSubattribution(3, "+1", 0, undefined, "+1");
-822   testSubattribution(4, "|1+1", 0, 0, "");
-823   testSubattribution(5, "|1+1", 0, 1, "|1+1");
-824   testSubattribution(6, "|1+1", 0, undefined, "|1+1");
-825   testSubattribution(7, "*0+1", 0, 0, "");
-826   testSubattribution(8, "*0+1", 0, 1, "*0+1");
-827   testSubattribution(9, "*0+1", 0, undefined, "*0+1");
-828   testSubattribution(10, "*0|1+1", 0, 0, "");
-829   testSubattribution(11, "*0|1+1", 0, 1, "*0|1+1");
-830   testSubattribution(12, "*0|1+1", 0, undefined, "*0|1+1");
-831   testSubattribution(13, "*0+2+1*1+3", 0, 1, "*0+1");
-832   testSubattribution(14, "*0+2+1*1+3", 0, 2, "*0+2");
-833   testSubattribution(15, "*0+2+1*1+3", 0, 3, "*0+2+1");
-834   testSubattribution(16, "*0+2+1*1+3", 0, 4, "*0+2+1*1+1");
-835   testSubattribution(17, "*0+2+1*1+3", 0, 5, "*0+2+1*1+2");
-836   testSubattribution(18, "*0+2+1*1+3", 0, 6, "*0+2+1*1+3");
-837   testSubattribution(19, "*0+2+1*1+3", 0, 7, "*0+2+1*1+3");
-838   testSubattribution(20, "*0+2+1*1+3", 0, undefined, "*0+2+1*1+3");
-839   testSubattribution(21, "*0+2+1*1+3", 1, undefined, "*0+1+1*1+3");
-840   testSubattribution(22, "*0+2+1*1+3", 2, undefined, "+1*1+3");
-841   testSubattribution(23, "*0+2+1*1+3", 3, undefined, "*1+3");
-842   testSubattribution(24, "*0+2+1*1+3", 4, undefined, "*1+2");
-843   testSubattribution(25, "*0+2+1*1+3", 5, undefined, "*1+1");
-844   testSubattribution(26, "*0+2+1*1+3", 6, undefined, "");
-845   testSubattribution(27, "*0+2+1*1|1+3", 0, 1, "*0+1");
-846   testSubattribution(28, "*0+2+1*1|1+3", 0, 2, "*0+2");
-847   testSubattribution(29, "*0+2+1*1|1+3", 0, 3, "*0+2+1");
-848   testSubattribution(30, "*0+2+1*1|1+3", 0, 4, "*0+2+1*1+1");
-849   testSubattribution(31, "*0+2+1*1|1+3", 0, 5, "*0+2+1*1+2");
-850   testSubattribution(32, "*0+2+1*1|1+3", 0, 6, "*0+2+1*1|1+3");
-851   testSubattribution(33, "*0+2+1*1|1+3", 0, 7, "*0+2+1*1|1+3");
-852   testSubattribution(34, "*0+2+1*1|1+3", 0, undefined, "*0+2+1*1|1+3");
-853   testSubattribution(35, "*0+2+1*1|1+3", 1, undefined, "*0+1+1*1|1+3");
-854   testSubattribution(36, "*0+2+1*1|1+3", 2, undefined, "+1*1|1+3");
-855   testSubattribution(37, "*0+2+1*1|1+3", 3, undefined, "*1|1+3");
-856   testSubattribution(38, "*0+2+1*1|1+3", 4, undefined, "*1|1+2");
-857   testSubattribution(39, "*0+2+1*1|1+3", 5, undefined, "*1|1+1");
-858   testSubattribution(40, "*0+2+1*1|1+3", 1, 5, "*0+1+1*1+2");
-859   testSubattribution(41, "*0+2+1*1|1+3", 2, 6, "+1*1|1+3");
-860   testSubattribution(42, "*0+2+1*1+3", 2, 6, "+1*1+3");
-861 
-862   function testFilterAttribNumbers(testId, cs, filter, correctOutput) {
-863     print("> testFilterAttribNumbers#" + testId);
-864 
-865     var str = Changeset.filterAttribNumbers(cs, filter);
-866     assertEqualStrings(correctOutput, str);
-867   }
-868 
-869   testFilterAttribNumbers(1, "*0*1+1+2+3*1+4*2+5*0*2*1*b*c+6", function (n) {
-870     return (n % 2) == 0;
-871   }, "*0+1+2+3+4*2+5*0*2*c+6");
-872   testFilterAttribNumbers(2, "*0*1+1+2+3*1+4*2+5*0*2*1*b*c+6", function (n) {
-873     return (n % 2) == 1;
-874   }, "*1+1+2+3*1+4+5*1*b+6");
-875 
-876   function testInverse(testId, cs, lines, alines, pool, correctOutput) {
-877     print("> testInverse#" + testId);
-878 
-879     pool = poolOrArray(pool);
-880     var str = Changeset.inverse(Changeset.checkRep(cs), lines, alines, pool);
-881     assertEqualStrings(correctOutput, str);
-882   }
-883 
-884   // take "FFFFTTTTT" and apply "-FT--FFTT", the inverse of which is "--F--TT--"
-885   testInverse(1, "Z:9>0=1*0=1*1=1=2*0=2*1|1=2$", null, ["+4*1+5"], ['bold,', 'bold,true'], "Z:9>0=2*0=1=2*1=2$");
-886 
-887   function testMutateTextLines(testId, cs, lines, correctLines) {
-888     print("> testMutateTextLines#" + testId);
-889 
-890     var a = lines.slice();
-891     Changeset.mutateTextLines(cs, a);
-892     assertEqualArrays(correctLines, a);
-893   }
-894 
-895   testMutateTextLines(1, "Z:4<1|1-2-1|1+1+1$\nc", ["a\n", "b\n"], ["\n", "c\n"]);
-896   testMutateTextLines(2, "Z:4>0|1-2-1|2+3$\nc\n", ["a\n", "b\n"], ["\n", "c\n", "\n"]);
-897 
-898   function testInverseRandom(randomSeed) {
-899     var rand = new random();
-900     print("> testInverseRandom#" + randomSeed);
-901 
-902     var p = poolOrArray(['apple,', 'apple,true', 'banana,', 'banana,true']);
-903 
-904     var startText = randomMultiline(10, 20, rand) + '\n';
-905     var alines = Changeset.splitAttributionLines(Changeset.makeAttribution(startText), startText);
-906     var lines = startText.slice(0, -1).split('\n').map(function (s) {
-907       return s + '\n';
-908     });
-909 
-910     var stylifier = randomTestChangeset(startText, rand, true)[0];
-911 
-912     //print(alines.join('\n'));
-913     Changeset.mutateAttributionLines(stylifier, alines, p);
-914     //print(stylifier);
-915     //print(alines.join('\n'));
-916     Changeset.mutateTextLines(stylifier, lines);
-917 
-918     var changeset = randomTestChangeset(lines.join(''), rand, true)[0];
-919     var inverseChangeset = Changeset.inverse(changeset, lines, alines, p);
-920 
-921     var origLines = lines.slice();
-922     var origALines = alines.slice();
-923 
-924     Changeset.mutateTextLines(changeset, lines);
-925     Changeset.mutateAttributionLines(changeset, alines, p);
-926     //print(origALines.join('\n'));
-927     //print(changeset);
-928     //print(inverseChangeset);
-929     //print(origLines.map(function(s) { return '1: '+s.slice(0,-1); }).join('\n'));
-930     //print(lines.map(function(s) { return '2: '+s.slice(0,-1); }).join('\n'));
-931     //print(alines.join('\n'));
-932     Changeset.mutateTextLines(inverseChangeset, lines);
-933     Changeset.mutateAttributionLines(inverseChangeset, alines, p);
-934     //print(lines.map(function(s) { return '3: '+s.slice(0,-1); }).join('\n'));
-935     assertEqualArrays(origLines, lines);
-936     assertEqualArrays(origALines, alines);
-937   }
-938 
-939   for (var i = 0; i < 30; i++) testInverseRandom(i);
-940 }
-941 
-942 runTests();
-943 
\ No newline at end of file diff --git a/doc/jsdoc/symbols/src/node_server.js.html b/doc/jsdoc/symbols/src/node_server.js.html deleted file mode 100644 index 74f7a3866..000000000 --- a/doc/jsdoc/symbols/src/node_server.js.html +++ /dev/null @@ -1,150 +0,0 @@ -
  1 /**
-  2  * 2011 Peter 'Pita' Martischka
-  3  *
-  4  * Licensed under the Apache License, Version 2.0 (the "License");
-  5  * you may not use this file except in compliance with the License.
-  6  * You may obtain a copy of the License at
-  7  *
-  8  *      http://www.apache.org/licenses/LICENSE-2.0
-  9  *
- 10  * Unless required by applicable law or agreed to in writing, software
- 11  * distributed under the License is distributed on an "AS-IS" BASIS,
- 12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- 13  * See the License for the specific language governing permissions and
- 14  * limitations under the License.
- 15  */
- 16 
- 17 var http = require('http')
- 18   , url = require('url')
- 19   , fs = require('fs')
- 20   , io = require('socket.io')
- 21   , sys = require('sys')
- 22   , server;
- 23 
- 24 server = http.createServer(function(req, res){
- 25   var path = url.parse(req.url).pathname;
- 26   
- 27   if(path.substring(0,"/static".length) == "/static" || path.substring(0,"/p/".length) == "/p/")
- 28   {
- 29     if(path.substring(0,"/p/".length) == "/p/")
- 30     {
- 31       if(path.length < 7)
- 32         send404(res, path);
- 33     
- 34       path = "/static/padhtml";
- 35     }
- 36     
- 37     sendFile(res, path, __dirname + "/.." + path);
- 38   }
- 39   else if(path == "/")
- 40   {
- 41     sendRedirect(res, path, "/p/test");
- 42   }
- 43   else if(path == "/newpad")
- 44   {
- 45     sendRedirect(res, path, "/p/" + randomPadName());
- 46   }
- 47   else if(path == "/ep/pad/reconnect")
- 48   {
- 49     if(req.headers.referer != null)
- 50       sendRedirect(res, path, req.headers.referer);
- 51     else
- 52       send404(res, path);
- 53   }
- 54   else
- 55   {
- 56     send404(res, path);
- 57   }
- 58 });
- 59 server.listen(9001);
- 60 
- 61 function randomPadName() {
- 62 	var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
- 63 	var string_length = 10;
- 64 	var randomstring = '';
- 65 	for (var i=0; i<string_length; i++) {
- 66 		var rnum = Math.floor(Math.random() * chars.length);
- 67 		randomstring += chars.substring(rnum,rnum+1);
- 68 	}
- 69 	return randomstring;
- 70 }
- 71 
- 72 function sendFile(res, reqPath, path)
- 73 {
- 74   fs.readFile(path, function(err, data){
- 75     if (err){
- 76       send404(res, reqPath);
- 77     } else {
- 78       var contentType = "text/html";
- 79     
- 80       if (path.substring(path.length -3, path.length) == ".js")
- 81         contentType = "text/javascript";
- 82       else if (path.substring(path.length -4, path.length) == ".css")
- 83         contentType = "text/css";
- 84       else if (path.substring(path.length -4, path.length) == ".gif")
- 85         contentType = "image/gif";
- 86     
- 87       res.writeHead(200, {'Content-Type': contentType});
- 88       res.write(data, 'utf8');
- 89       res.end();
- 90       
- 91       requestLog(200, reqPath, "-> " + path);
- 92     }
- 93   });
- 94 }
- 95 
- 96 function send404(res, reqPath)
- 97 {
- 98   res.writeHead(404);
- 99   res.write("404 - Not Found");
-100   res.end();
-101   
-102   requestLog(404, reqPath, "NOT FOUND!");
-103 }
-104 
-105 function sendRedirect(res, reqPath, location)
-106 {
-107   res.writeHead(302, {'Location': location});
-108   res.end();
-109   
-110   requestLog(302, reqPath, "-> " + location);
-111 }
-112 
-113 function requestLog(code, path, desc)
-114 {
-115   console.log(code +", " + path + ", " + desc);
-116 }
-117 
-118 var io = io.listen(server);
-119 var messageHandler = require("./MessageHandler");
-120 messageHandler.setSocketIO(io);
-121 
-122 io.on('connection', function(client){
-123   try{
-124     messageHandler.handleConnect(client);
-125   }catch(e){console.error(e);}
-126   
-127   client.on('message', function(message){
-128     try{
-129       messageHandler.handleMessage(client, message);
-130     }catch(e){console.error(e);}
-131   });
-132 
-133   client.on('disconnect', function(){
-134     try{
-135       messageHandler.handleDisconnect(client);
-136     }catch(e){console.error(e);}
-137   });
-138 });
-139 
-140 
-141 
-142 
-143 
\ No newline at end of file