From 629a09aeb02dce06c406a638b4ece39adc83d2e3 Mon Sep 17 00:00:00 2001 From: Dan Vanderkam Date: Mon, 9 May 2011 07:15:18 -0700 Subject: [PATCH] can generate jsdoc; private methods marked as such --- dygraph.js | 469 +- jsdoc-toolkit/README.txt | 183 + jsdoc-toolkit/app/frame.js | 33 + jsdoc-toolkit/app/frame/Chain.js | 102 + jsdoc-toolkit/app/frame/Dumper.js | 144 + jsdoc-toolkit/app/frame/Hash.js | 84 + jsdoc-toolkit/app/frame/Link.js | 173 + jsdoc-toolkit/app/frame/Namespace.js | 10 + jsdoc-toolkit/app/frame/Opt.js | 134 + jsdoc-toolkit/app/frame/Reflection.js | 26 + jsdoc-toolkit/app/frame/String.js | 93 + jsdoc-toolkit/app/frame/Testrun.js | 129 + jsdoc-toolkit/app/handlers/FOODOC.js | 26 + jsdoc-toolkit/app/handlers/XMLDOC.js | 26 + jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js | 159 + jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js | 16 + jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js | 292 ++ jsdoc-toolkit/app/lib/JSDOC.js | 106 + jsdoc-toolkit/app/lib/JSDOC/DocComment.js | 204 + jsdoc-toolkit/app/lib/JSDOC/DocTag.js | 294 ++ jsdoc-toolkit/app/lib/JSDOC/JsDoc.js | 140 + jsdoc-toolkit/app/lib/JSDOC/JsPlate.js | 109 + jsdoc-toolkit/app/lib/JSDOC/Lang.js | 144 + jsdoc-toolkit/app/lib/JSDOC/Parser.js | 146 + jsdoc-toolkit/app/lib/JSDOC/PluginManager.js | 33 + jsdoc-toolkit/app/lib/JSDOC/Symbol.js | 644 +++ jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js | 243 ++ jsdoc-toolkit/app/lib/JSDOC/TextStream.js | 41 + jsdoc-toolkit/app/lib/JSDOC/Token.js | 18 + jsdoc-toolkit/app/lib/JSDOC/TokenReader.js | 332 ++ jsdoc-toolkit/app/lib/JSDOC/TokenStream.js | 133 + jsdoc-toolkit/app/lib/JSDOC/Util.js | 32 + jsdoc-toolkit/app/lib/JSDOC/Walker.js | 507 +++ jsdoc-toolkit/app/main.js | 111 + jsdoc-toolkit/app/plugins/commentSrcJson.js | 20 + jsdoc-toolkit/app/plugins/frameworkPrototype.js | 16 + jsdoc-toolkit/app/plugins/functionCall.js | 10 + jsdoc-toolkit/app/plugins/publishSrcHilite.js | 62 + jsdoc-toolkit/app/plugins/symbolLink.js | 10 + jsdoc-toolkit/app/plugins/tagParamConfig.js | 31 + jsdoc-toolkit/app/plugins/tagSynonyms.js | 43 + jsdoc-toolkit/app/run.js | 348 ++ jsdoc-toolkit/app/t/TestDoc.js | 144 + jsdoc-toolkit/app/t/runner.js | 13 + jsdoc-toolkit/app/test.js | 342 ++ jsdoc-toolkit/app/test/addon.js | 24 + jsdoc-toolkit/app/test/anon_inner.js | 14 + jsdoc-toolkit/app/test/augments.js | 31 + jsdoc-toolkit/app/test/augments2.js | 26 + jsdoc-toolkit/app/test/borrows.js | 46 + jsdoc-toolkit/app/test/borrows2.js | 23 + jsdoc-toolkit/app/test/config.js | 22 + jsdoc-toolkit/app/test/constructs.js | 18 + jsdoc-toolkit/app/test/encoding.js | 10 + jsdoc-toolkit/app/test/encoding_other.js | 12 + jsdoc-toolkit/app/test/event.js | 54 + jsdoc-toolkit/app/test/exports.js | 14 + jsdoc-toolkit/app/test/functions_anon.js | 39 + jsdoc-toolkit/app/test/functions_nested.js | 33 + jsdoc-toolkit/app/test/global.js | 13 + jsdoc-toolkit/app/test/globals.js | 25 + jsdoc-toolkit/app/test/ignore.js | 10 + jsdoc-toolkit/app/test/inner.js | 16 + jsdoc-toolkit/app/test/jsdoc_test.js | 477 +++ jsdoc-toolkit/app/test/lend.js | 33 + jsdoc-toolkit/app/test/memberof.js | 19 + jsdoc-toolkit/app/test/memberof2.js | 38 + jsdoc-toolkit/app/test/memberof3.js | 33 + jsdoc-toolkit/app/test/memberof_constructor.js | 17 + jsdoc-toolkit/app/test/module.js | 17 + jsdoc-toolkit/app/test/multi_methods.js | 25 + jsdoc-toolkit/app/test/name.js | 19 + jsdoc-toolkit/app/test/namespace_nested.js | 23 + jsdoc-toolkit/app/test/nocode.js | 13 + jsdoc-toolkit/app/test/oblit_anon.js | 20 + jsdoc-toolkit/app/test/overview.js | 20 + jsdoc-toolkit/app/test/param_inline.js | 37 + jsdoc-toolkit/app/test/params_optional.js | 8 + jsdoc-toolkit/app/test/prototype.js | 17 + jsdoc-toolkit/app/test/prototype_nested.js | 9 + jsdoc-toolkit/app/test/prototype_oblit.js | 13 + .../app/test/prototype_oblit_constructor.js | 24 + jsdoc-toolkit/app/test/public.js | 10 + jsdoc-toolkit/app/test/scripts/code.js | 5 + jsdoc-toolkit/app/test/scripts/notcode.txt | 5 + jsdoc-toolkit/app/test/shared.js | 42 + jsdoc-toolkit/app/test/shared2.js | 2 + jsdoc-toolkit/app/test/shortcuts.js | 22 + jsdoc-toolkit/app/test/static_this.js | 13 + jsdoc-toolkit/app/test/synonyms.js | 31 + jsdoc-toolkit/app/test/tosource.js | 23 + jsdoc-toolkit/app/test/variable_redefine.js | 14 + jsdoc-toolkit/changes.txt | 124 + jsdoc-toolkit/conf/sample.conf | 31 + jsdoc-toolkit/java/build.xml | 36 + jsdoc-toolkit/java/build_1.4.xml | 36 + jsdoc-toolkit/java/classes/js.jar | Bin 0 -> 819369 bytes jsdoc-toolkit/java/src/JsDebugRun.java | 21 + jsdoc-toolkit/java/src/JsRun.java | 21 + jsdoc-toolkit/jsdebug.jar | Bin 0 -> 1307 bytes jsdoc-toolkit/jsrun.jar | Bin 0 -> 1303 bytes jsdoc-toolkit/jsrun.sh | 52 + jsdoc-toolkit/out/jsdoc/files.html | 255 ++ jsdoc-toolkit/out/jsdoc/index.html | 218 + jsdoc-toolkit/out/jsdoc/symbols/Dygraph.html | 2586 +++++++++++ jsdoc-toolkit/out/jsdoc/symbols/_global_.html | 251 ++ .../out/jsdoc/symbols/src/dygraph.js.html | 4530 ++++++++++++++++++++ jsdoc-toolkit/templates/jsdoc/allclasses.tmpl | 17 + jsdoc-toolkit/templates/jsdoc/allfiles.tmpl | 56 + jsdoc-toolkit/templates/jsdoc/class.tmpl | 649 +++ jsdoc-toolkit/templates/jsdoc/index.tmpl | 39 + jsdoc-toolkit/templates/jsdoc/publish.js | 201 + jsdoc-toolkit/templates/jsdoc/static/default.css | 162 + jsdoc-toolkit/templates/jsdoc/static/header.html | 2 + jsdoc-toolkit/templates/jsdoc/static/index.html | 19 + jsdoc-toolkit/templates/jsdoc/symbol.tmpl | 35 + 116 files changed, 17055 insertions(+), 120 deletions(-) create mode 100644 jsdoc-toolkit/README.txt create mode 100644 jsdoc-toolkit/app/frame.js create mode 100644 jsdoc-toolkit/app/frame/Chain.js create mode 100644 jsdoc-toolkit/app/frame/Dumper.js create mode 100644 jsdoc-toolkit/app/frame/Hash.js create mode 100644 jsdoc-toolkit/app/frame/Link.js create mode 100644 jsdoc-toolkit/app/frame/Namespace.js create mode 100644 jsdoc-toolkit/app/frame/Opt.js create mode 100644 jsdoc-toolkit/app/frame/Reflection.js create mode 100644 jsdoc-toolkit/app/frame/String.js create mode 100644 jsdoc-toolkit/app/frame/Testrun.js create mode 100644 jsdoc-toolkit/app/handlers/FOODOC.js create mode 100755 jsdoc-toolkit/app/handlers/XMLDOC.js create mode 100755 jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js create mode 100755 jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js create mode 100755 jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js create mode 100644 jsdoc-toolkit/app/lib/JSDOC.js create mode 100644 jsdoc-toolkit/app/lib/JSDOC/DocComment.js create mode 100644 jsdoc-toolkit/app/lib/JSDOC/DocTag.js create mode 100644 jsdoc-toolkit/app/lib/JSDOC/JsDoc.js create mode 100644 jsdoc-toolkit/app/lib/JSDOC/JsPlate.js create mode 100644 jsdoc-toolkit/app/lib/JSDOC/Lang.js create mode 100644 jsdoc-toolkit/app/lib/JSDOC/Parser.js create mode 100644 jsdoc-toolkit/app/lib/JSDOC/PluginManager.js create mode 100644 jsdoc-toolkit/app/lib/JSDOC/Symbol.js create mode 100644 jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js create mode 100644 jsdoc-toolkit/app/lib/JSDOC/TextStream.js create mode 100644 jsdoc-toolkit/app/lib/JSDOC/Token.js create mode 100644 jsdoc-toolkit/app/lib/JSDOC/TokenReader.js create mode 100644 jsdoc-toolkit/app/lib/JSDOC/TokenStream.js create mode 100644 jsdoc-toolkit/app/lib/JSDOC/Util.js create mode 100644 jsdoc-toolkit/app/lib/JSDOC/Walker.js create mode 100644 jsdoc-toolkit/app/main.js create mode 100644 jsdoc-toolkit/app/plugins/commentSrcJson.js create mode 100644 jsdoc-toolkit/app/plugins/frameworkPrototype.js create mode 100644 jsdoc-toolkit/app/plugins/functionCall.js create mode 100644 jsdoc-toolkit/app/plugins/publishSrcHilite.js create mode 100644 jsdoc-toolkit/app/plugins/symbolLink.js create mode 100644 jsdoc-toolkit/app/plugins/tagParamConfig.js create mode 100644 jsdoc-toolkit/app/plugins/tagSynonyms.js create mode 100644 jsdoc-toolkit/app/run.js create mode 100644 jsdoc-toolkit/app/t/TestDoc.js create mode 100644 jsdoc-toolkit/app/t/runner.js create mode 100644 jsdoc-toolkit/app/test.js create mode 100644 jsdoc-toolkit/app/test/addon.js create mode 100644 jsdoc-toolkit/app/test/anon_inner.js create mode 100644 jsdoc-toolkit/app/test/augments.js create mode 100644 jsdoc-toolkit/app/test/augments2.js create mode 100644 jsdoc-toolkit/app/test/borrows.js create mode 100644 jsdoc-toolkit/app/test/borrows2.js create mode 100644 jsdoc-toolkit/app/test/config.js create mode 100644 jsdoc-toolkit/app/test/constructs.js create mode 100644 jsdoc-toolkit/app/test/encoding.js create mode 100644 jsdoc-toolkit/app/test/encoding_other.js create mode 100644 jsdoc-toolkit/app/test/event.js create mode 100644 jsdoc-toolkit/app/test/exports.js create mode 100644 jsdoc-toolkit/app/test/functions_anon.js create mode 100644 jsdoc-toolkit/app/test/functions_nested.js create mode 100644 jsdoc-toolkit/app/test/global.js create mode 100644 jsdoc-toolkit/app/test/globals.js create mode 100644 jsdoc-toolkit/app/test/ignore.js create mode 100644 jsdoc-toolkit/app/test/inner.js create mode 100644 jsdoc-toolkit/app/test/jsdoc_test.js create mode 100644 jsdoc-toolkit/app/test/lend.js create mode 100644 jsdoc-toolkit/app/test/memberof.js create mode 100644 jsdoc-toolkit/app/test/memberof2.js create mode 100644 jsdoc-toolkit/app/test/memberof3.js create mode 100644 jsdoc-toolkit/app/test/memberof_constructor.js create mode 100644 jsdoc-toolkit/app/test/module.js create mode 100644 jsdoc-toolkit/app/test/multi_methods.js create mode 100644 jsdoc-toolkit/app/test/name.js create mode 100644 jsdoc-toolkit/app/test/namespace_nested.js create mode 100644 jsdoc-toolkit/app/test/nocode.js create mode 100644 jsdoc-toolkit/app/test/oblit_anon.js create mode 100644 jsdoc-toolkit/app/test/overview.js create mode 100644 jsdoc-toolkit/app/test/param_inline.js create mode 100644 jsdoc-toolkit/app/test/params_optional.js create mode 100644 jsdoc-toolkit/app/test/prototype.js create mode 100644 jsdoc-toolkit/app/test/prototype_nested.js create mode 100644 jsdoc-toolkit/app/test/prototype_oblit.js create mode 100644 jsdoc-toolkit/app/test/prototype_oblit_constructor.js create mode 100644 jsdoc-toolkit/app/test/public.js create mode 100644 jsdoc-toolkit/app/test/scripts/code.js create mode 100644 jsdoc-toolkit/app/test/scripts/notcode.txt create mode 100644 jsdoc-toolkit/app/test/shared.js create mode 100644 jsdoc-toolkit/app/test/shared2.js create mode 100644 jsdoc-toolkit/app/test/shortcuts.js create mode 100644 jsdoc-toolkit/app/test/static_this.js create mode 100644 jsdoc-toolkit/app/test/synonyms.js create mode 100644 jsdoc-toolkit/app/test/tosource.js create mode 100644 jsdoc-toolkit/app/test/variable_redefine.js create mode 100644 jsdoc-toolkit/changes.txt create mode 100644 jsdoc-toolkit/conf/sample.conf create mode 100644 jsdoc-toolkit/java/build.xml create mode 100644 jsdoc-toolkit/java/build_1.4.xml create mode 100644 jsdoc-toolkit/java/classes/js.jar create mode 100755 jsdoc-toolkit/java/src/JsDebugRun.java create mode 100644 jsdoc-toolkit/java/src/JsRun.java create mode 100644 jsdoc-toolkit/jsdebug.jar create mode 100644 jsdoc-toolkit/jsrun.jar create mode 100644 jsdoc-toolkit/jsrun.sh create mode 100644 jsdoc-toolkit/out/jsdoc/files.html create mode 100644 jsdoc-toolkit/out/jsdoc/index.html create mode 100644 jsdoc-toolkit/out/jsdoc/symbols/Dygraph.html create mode 100644 jsdoc-toolkit/out/jsdoc/symbols/_global_.html create mode 100644 jsdoc-toolkit/out/jsdoc/symbols/src/dygraph.js.html create mode 100644 jsdoc-toolkit/templates/jsdoc/allclasses.tmpl create mode 100644 jsdoc-toolkit/templates/jsdoc/allfiles.tmpl create mode 100644 jsdoc-toolkit/templates/jsdoc/class.tmpl create mode 100644 jsdoc-toolkit/templates/jsdoc/index.tmpl create mode 100644 jsdoc-toolkit/templates/jsdoc/publish.js create mode 100644 jsdoc-toolkit/templates/jsdoc/static/default.css create mode 100644 jsdoc-toolkit/templates/jsdoc/static/header.html create mode 100644 jsdoc-toolkit/templates/jsdoc/static/index.html create mode 100644 jsdoc-toolkit/templates/jsdoc/symbol.tmpl diff --git a/dygraph.js b/dygraph.js index 794b796..78f933d 100644 --- a/dygraph.js +++ b/dygraph.js @@ -41,13 +41,18 @@ */ /** - * An interactive, zoomable graph - * @param {String | Function} file A file containing CSV data or a function that - * returns this data. The expected format for each line is - * YYYYMMDD,val1,val2,... or, if attrs.errorBars is set, - * YYYYMMDD,val1,stddev1,val2,stddev2,... + * Creates an interactive, zoomable chart. + * + * @constructor + * @param {div | String} div A div or the id of a div into which to construct + * the chart. + * @param {String | Function} file A file containing CSV data or a function + * that returns this data. The most basic expected format for each line is + * "YYYY/MM/DD,val1,val2,...". For more information, see + * http://dygraphs.com/data.html. * @param {Object} attrs Various other attributes, e.g. errorBars determines - * whether the input data contains error ranges. + * whether the input data contains error ranges. For a complete list of + * options, see http://dygraphs.com/options.html. */ Dygraph = function(div, data, opts) { if (arguments.length > 0) { @@ -68,6 +73,10 @@ Dygraph.VERSION = "1.2"; Dygraph.__repr__ = function() { return "[" + this.NAME + " " + this.VERSION + "]"; }; + +/** + * Returns information about the Dygraph class. + */ Dygraph.toString = function() { return this.__repr__(); }; @@ -80,6 +89,9 @@ Dygraph.AXIS_LINE_WIDTH = 0.3; Dygraph.LOG_SCALE = 10; Dygraph.LN_TEN = Math.log(Dygraph.LOG_SCALE); +/** + * @private + */ Dygraph.log10 = function(x) { return Math.log(x) / Dygraph.LN_TEN; } @@ -162,6 +174,7 @@ Dygraph.VERTICAL = 2; Dygraph.addedAnnotationCSS = false; /** + * @private * Return the 2d context for a dygraph canvas. * * This method is only exposed for the sake of replacing the function in @@ -307,12 +320,26 @@ Dygraph.prototype.isZoomed = function(axis) { throw "axis parameter to Dygraph.isZoomed must be missing, 'x' or 'y'."; }; +/** + * Returns information about the Dygraph object, including its containing ID. + */ Dygraph.prototype.toString = function() { var maindiv = this.maindiv_; var id = (maindiv && maindiv.id) ? maindiv.id : maindiv return "[Dygraph " + id + "]"; } +/** + * @private + * Returns the value of an option. This may be set by the user (either in the + * constructor or by calling updateOptions) or by dygraphs, and may be set to a + * per-series value. + * @param { String } name The name of the option, e.g. 'rollPeriod'. + * @param { String } [seriesName] The name of the series to which the option + * will be applied. If no per-series value of this option is available, then + * the global value is returned. This is optional. + * @return { ... } The value of the option. + */ Dygraph.prototype.attr_ = function(name, seriesName) { // if (typeof(Dygraph.OPTIONS_REFERENCE) === 'undefined') { @@ -339,6 +366,12 @@ Dygraph.prototype.attr_ = function(name, seriesName) { }; // TODO(danvk): any way I can get the line numbers to be this.warn call? +/** + * @private + * Log an error on the JS console at the given severity. + * @param { Integer } severity One of Dygraph.{DEBUG,INFO,WARNING,ERROR} + * @param { String } The message to log. + */ Dygraph.prototype.log = function(severity, message) { if (typeof(console) != 'undefined') { switch (severity) { @@ -356,16 +389,28 @@ Dygraph.prototype.log = function(severity, message) { break; } } -} +}; + +/** + * @private + */ Dygraph.prototype.info = function(message) { this.log(Dygraph.INFO, message); -} +}; + +/** + * @private + */ Dygraph.prototype.warn = function(message) { this.log(Dygraph.WARNING, message); -} +}; + +/** + * @private + */ Dygraph.prototype.error = function(message) { this.log(Dygraph.ERROR, message); -} +}; /** * Returns the current rolling period, as set by the user or an option. @@ -551,6 +596,10 @@ Dygraph.prototype.toDataYCoord = function(y, axis) { * * If y is null, this returns null. * if axis is null, this uses the first axis. + * + * @param { Number } y The data y-coordinate. + * @param { Number } [axis] The axis number on which the data coordinate lives. + * @return { Number } A fraction in [0, 1] where 0 = the top edge. */ Dygraph.prototype.toPercentYCoord = function(y, axis) { if (y == null) { @@ -584,6 +633,8 @@ Dygraph.prototype.toPercentYCoord = function(y, axis) { * values can fall outside the canvas. * * If x is null, this returns null. + * @param { Number } x The data x-coordinate. + * @return { Number } A fraction in [0, 1] where 0 = the left edge. */ Dygraph.prototype.toPercentXCoord = function(x) { if (x == null) { @@ -592,10 +643,11 @@ Dygraph.prototype.toPercentXCoord = function(x) { var xRange = this.xAxisRange(); return (x - xRange[0]) / (xRange[1] - xRange[0]); -} +}; /** * Returns the number of columns (including the independent variable). + * @return { Integer } The number of columns. */ Dygraph.prototype.numColumns = function() { return this.rawData_[0].length; @@ -603,6 +655,7 @@ Dygraph.prototype.numColumns = function() { /** * Returns the number of rows (excluding any header/label row). + * @return { Integer } The number of rows, less any header. */ Dygraph.prototype.numRows = function() { return this.rawData_.length; @@ -612,6 +665,11 @@ Dygraph.prototype.numRows = function() { * Returns the value in the given row and column. If the row and column exceed * the bounds on the data, returns null. Also returns null if the value is * missing. + * @param { Number} row The row number of the data (0-based). Row 0 is the + * first row of data, not a header row. + * @param { Number} col The column number of the data (0-based) + * @return { Number } The value in the specified cell or null if the row/col + * were out of range. */ Dygraph.prototype.getValue = function(row, col) { if (row < 0 || row > this.rawData_.length) return null; @@ -620,6 +678,15 @@ Dygraph.prototype.getValue = function(row, col) { return this.rawData_[row][col]; }; +/** + * @private + * Add an event handler. This smooths a difference between IE and the rest of + * the world. + * @param { DOM element } el The element to add the event to. + * @param { String } evt The name of the event, e.g. 'click' or 'mousemove'. + * @param { Function } fn The function to call on the event. The function takes + * one parameter: the event object. + */ Dygraph.addEvent = function(el, evt, fn) { var normed_fn = function(e) { if (!e) var e = window.event; @@ -633,8 +700,14 @@ Dygraph.addEvent = function(el, evt, fn) { }; -// Based on the article at -// http://www.switchonthecode.com/tutorials/javascript-tutorial-the-scroll-wheel +/** + * @private + * Cancels further processing of an event. This is useful to prevent default + * browser actions, e.g. highlighting text on a double-click. + * Based on the article at + * http://www.switchonthecode.com/tutorials/javascript-tutorial-the-scroll-wheel + * @param { Event } e The event whose normal behavior should be canceled. + */ Dygraph.cancelEvent = function(e) { e = e ? e : window.event; if (e.stopPropagation) { @@ -647,7 +720,7 @@ Dygraph.cancelEvent = function(e) { e.cancel = true; e.returnValue = false; return false; -} +}; /** @@ -742,8 +815,9 @@ Dygraph.prototype.destroy = function() { }; /** - * Creates the canvas containing the PlotKit graph. Only plotkit ever draws on - * this particular canvas. All Dygraph work is done on this.canvas_. + * Creates the canvas on which the chart will be drawn. Only the Renderer ever + * draws on this particular canvas. All Dygraph work (i.e. drawing hover dots + * or the zoom rectangles) is done on this.canvas_. * @param {Object} canvas The Dygraph canvas over which to overlay the plot * @return {Object} The newly-created canvas * @private @@ -763,7 +837,16 @@ Dygraph.prototype.createPlotKitCanvas_ = function(canvas) { return h; }; -// Taken from MochiKit.Color +/** + * Convert hsv values to an rgb(r,g,b) string. Taken from MochiKit.Color. This + * is used to generate default series colors which are evenly spaced on the + * color wheel. + * @param { Number } hue Range is 0.0-1.0. + * @param { Number } saturation Range is 0.0-1.0. + * @param { Number } value Range is 0.0-1.0. + * @return { String } "rgb(r,g,b)" where r, g and b range from 0-255. + * @private + */ Dygraph.hsvToRGB = function (hue, saturation, value) { var red; var green; @@ -832,11 +915,11 @@ Dygraph.prototype.setColors_ = function() { Dygraph.update(this.plotter_.options, this.renderOptions_); Dygraph.update(this.layoutOptions_, this.user_attrs_); Dygraph.update(this.layoutOptions_, this.attrs_); -} +}; /** * Return the list of colors. This is either the list of colors passed in the - * attributes, or the autogenerated list of rgb(r,g,b) strings. + * attributes or the autogenerated list of rgb(r,g,b) strings. * @return {Array} The list of colors. */ Dygraph.prototype.getColors = function() { @@ -846,6 +929,10 @@ Dygraph.prototype.getColors = function() { // The following functions are from quirksmode.org with a modification for Safari from // http://blog.firetree.net/2005/07/04/javascript-find-position/ // http://www.quirksmode.org/js/findpos.html + +/** + * @private + */ Dygraph.findPosX = function(obj) { var curleft = 0; if(obj.offsetParent) @@ -861,6 +948,10 @@ Dygraph.findPosX = function(obj) { return curleft; }; + +/** + * @private + */ Dygraph.findPosY = function(obj) { var curtop = 0; if(obj.offsetParent) @@ -877,7 +968,6 @@ Dygraph.findPosY = function(obj) { }; - /** * Create the div that contains information on the selected point(s) * This goes in the top right of the canvas, unless an external div has already @@ -918,6 +1008,7 @@ Dygraph.prototype.createStatusMessage_ = function() { * Position the labels div so that: * - its right edge is flush with the right edge of the charting area * - its top edge is flush with the top edge of the charting area + * @private */ Dygraph.prototype.positionLabelsDiv_ = function() { // Don't touch a user-specified labelsDiv. @@ -963,7 +1054,12 @@ Dygraph.prototype.createRollInterface_ = function() { this.roller_.onchange = function() { dygraph.adjustRoll(dygraph.roller_.value); }; }; -// These functions are taken from MochiKit.Signal +/** + * @private + * Returns the x-coordinate of the event in a coordinate system where the + * top-left corner of the page (not the window) is (0,0). + * Taken from MochiKit.Signal + */ Dygraph.pageX = function(e) { if (e.pageX) { return (!e.pageX || e.pageX < 0) ? 0 : e.pageX; @@ -976,6 +1072,12 @@ Dygraph.pageX = function(e) { } }; +/** + * @private + * Returns the y-coordinate of the event in a coordinate system where the + * top-left corner of the page (not the window) is (0,0). + * Taken from MochiKit.Signal + */ Dygraph.pageY = function(e) { if (e.pageY) { return (!e.pageY || e.pageY < 0) ? 0 : e.pageY; @@ -988,21 +1090,37 @@ Dygraph.pageY = function(e) { } }; +/** + * @private + * Converts page the x-coordinate of the event to pixel x-coordinates on the + * canvas (i.e. DOM Coords). + */ Dygraph.prototype.dragGetX_ = function(e, context) { return Dygraph.pageX(e) - context.px }; +/** + * @private + * Converts page the y-coordinate of the event to pixel y-coordinates on the + * canvas (i.e. DOM Coords). + */ Dygraph.prototype.dragGetY_ = function(e, context) { return Dygraph.pageY(e) - context.py }; -// Called in response to an interaction model operation that -// should start the default panning behavior. -// -// It's used in the default callback for "mousedown" operations. -// Custom interaction model builders can use it to provide the default -// panning behavior. -// +/** + * Called in response to an interaction model operation that + * should start the default panning behavior. + * + * It's used in the default callback for "mousedown" operations. + * Custom interaction model builders can use it to provide the default + * panning behavior. + * + * @param { Event } event the event object which led to the startPan call. + * @param { Dygraph} g The dygraph on which to act. + * @param { Object} context The dragging context object (with + * dragStartX/dragStartY/etc. properties). This function modifies the context. + */ Dygraph.startPan = function(event, g, context) { context.isPanning = true; var xRange = g.xAxisRange(); @@ -1061,13 +1179,19 @@ Dygraph.startPan = function(event, g, context) { } }; -// Called in response to an interaction model operation that -// responds to an event that pans the view. -// -// It's used in the default callback for "mousemove" operations. -// Custom interaction model builders can use it to provide the default -// panning behavior. -// +/** + * Called in response to an interaction model operation that + * responds to an event that pans the view. + * + * It's used in the default callback for "mousemove" operations. + * Custom interaction model builders can use it to provide the default + * panning behavior. + * + * @param { Event } event the event object which led to the movePan call. + * @param { Dygraph} g The dygraph on which to act. + * @param { Object} context The dragging context object (with + * dragStartX/dragStartY/etc. properties). This function modifies the context. + */ Dygraph.movePan = function(event, g, context) { context.dragEndX = g.dragGetX_(event, context); context.dragEndY = g.dragGetY_(event, context); @@ -1122,15 +1246,21 @@ Dygraph.movePan = function(event, g, context) { } g.drawGraph_(); -} +}; -// Called in response to an interaction model operation that -// responds to an event that ends panning. -// -// It's used in the default callback for "mouseup" operations. -// Custom interaction model builders can use it to provide the default -// panning behavior. -// +/** + * Called in response to an interaction model operation that + * responds to an event that ends panning. + * + * It's used in the default callback for "mouseup" operations. + * Custom interaction model builders can use it to provide the default + * panning behavior. + * + * @param { Event } event the event object which led to the startZoom call. + * @param { Dygraph} g The dygraph on which to act. + * @param { Object} context The dragging context object (with + * dragStartX/dragStartY/etc. properties). This function modifies the context. + */ Dygraph.endPan = function(event, g, context) { // TODO(konigsberg): Clear the context data from the axis. // TODO(konigsberg): mouseup should just delete the @@ -1142,26 +1272,38 @@ Dygraph.endPan = function(event, g, context) { context.valueRange = null; context.boundedDates = null; context.boundedValues = null; -} +}; -// Called in response to an interaction model operation that -// responds to an event that starts zooming. -// -// It's used in the default callback for "mousedown" operations. -// Custom interaction model builders can use it to provide the default -// zooming behavior. -// +/** + * Called in response to an interaction model operation that + * responds to an event that starts zooming. + * + * It's used in the default callback for "mousedown" operations. + * Custom interaction model builders can use it to provide the default + * zooming behavior. + * + * @param { Event } event the event object which led to the startZoom call. + * @param { Dygraph} g The dygraph on which to act. + * @param { Object} context The dragging context object (with + * dragStartX/dragStartY/etc. properties). This function modifies the context. + */ Dygraph.startZoom = function(event, g, context) { context.isZooming = true; -} +}; -// Called in response to an interaction model operation that -// responds to an event that defines zoom boundaries. -// -// It's used in the default callback for "mousemove" operations. -// Custom interaction model builders can use it to provide the default -// zooming behavior. -// +/** + * Called in response to an interaction model operation that + * responds to an event that defines zoom boundaries. + * + * It's used in the default callback for "mousemove" operations. + * Custom interaction model builders can use it to provide the default + * zooming behavior. + * + * @param { Event } event the event object which led to the moveZoom call. + * @param { Dygraph} g The dygraph on which to act. + * @param { Object} context The dragging context object (with + * dragStartX/dragStartY/etc. properties). This function modifies the context. + */ Dygraph.moveZoom = function(event, g, context) { context.dragEndX = g.dragGetX_(event, context); context.dragEndY = g.dragGetY_(event, context); @@ -1185,17 +1327,24 @@ Dygraph.moveZoom = function(event, g, context) { context.prevEndX = context.dragEndX; context.prevEndY = context.dragEndY; context.prevDragDirection = context.dragDirection; -} +}; -// Called in response to an interaction model operation that -// responds to an event that performs a zoom based on previously defined -// bounds.. -// -// It's used in the default callback for "mouseup" operations. -// Custom interaction model builders can use it to provide the default -// zooming behavior. -// +/** + * Called in response to an interaction model operation that + * responds to an event that performs a zoom based on previously defined + * bounds.. + * + * It's used in the default callback for "mouseup" operations. + * Custom interaction model builders can use it to provide the default + * zooming behavior. + * + * @param { Event } event the event object which led to the endZoom call. + * @param { Dygraph} g The dygraph on which to end the zoom. + * @param { Object} context The dragging context object (with + * dragStartX/dragStartY/etc. properties). This function modifies the context. + */ Dygraph.endZoom = function(event, g, context) { + // TODO(konigsberg): Refactor or rename this fn -- it deals with clicks, too. context.isZooming = false; context.dragEndX = g.dragGetX_(event, context); context.dragEndY = g.dragGetY_(event, context); @@ -1241,8 +1390,17 @@ Dygraph.endZoom = function(event, g, context) { } context.dragStartX = null; context.dragStartY = null; -} +}; +/** + * Default interation model for dygraphs. You can refer to specific elements of + * this when constructing your own interaction model, e.g.: + * g.updateOptions( { + * interactionModel: { + * mousedown: Dygraph.defaultInteractionModel.mousedown + * } + * } ); + */ Dygraph.defaultInteractionModel = { // Track the beginning of drag events mousedown: function(event, g, context) { @@ -1632,11 +1790,25 @@ Dygraph.prototype.idxToRow_ = function(idx) { return -1; }; +/** + * @private + * @param { Number } x The number to consider. + * @return { Boolean } Whether the number is zero or NaN. + */ // TODO(danvk): rename this function to something like 'isNonZeroNan'. Dygraph.isOK = function(x) { return x && !isNaN(x); }; +/** + * @private + * Generates HTML for the legend which is displayed when hovering over the + * chart. If no selected points are specified, a default legend is returned + * (this may just be the empty string). + * @param { Number } [x] The x-value of the selected points. + * @param { [Object] } [sel_points] List of selected points for the given + * x-value. Should have properties like 'name', 'yval' and 'canvasy'. + */ Dygraph.prototype.generateLegendHTML_ = function(x, sel_points) { // If no points are selected, we display a default legend. Traditionally, // this has been blank. But a better default would be a conventional legend, @@ -1678,6 +1850,14 @@ Dygraph.prototype.generateLegendHTML_ = function(x, sel_points) { return html; }; +/** + * @private + * Displays information about the selected points in the legend. If there is no + * selection, the legend will be cleared. + * @param { Number } [x] The x-value of the selected points. + * @param { [Object] } [sel_points] List of selected points for the given + * x-value. Should have properties like 'name', 'yval' and 'canvasy'. + */ Dygraph.prototype.setLegendHTML_ = function(x, sel_points) { var html = this.generateLegendHTML_(x, sel_points); var labelsDiv = this.attr_("labelsDiv"); @@ -1738,10 +1918,11 @@ Dygraph.prototype.updateSelection_ = function() { }; /** - * Set manually set selected dots, and display information about them - * @param int row number that should by highlighted - * false value clears the selection - * @public + * Manually set the selected points and display information about them in the + * legend. The selection can be cleared using clearSelection() and queried + * using getSelection(). + * @param { Integer } row number that should be highlighted (i.e. appear with + * hover dots on the chart). Set to false to clear any selection. */ Dygraph.prototype.setSelection = function(row) { // Extract the points we've selected @@ -1792,8 +1973,8 @@ Dygraph.prototype.mouseOut_ = function(event) { }; /** - * Remove all selection from the canvas - * @public + * Clears the current selection (i.e. points that were highlighted by moving + * the mouse over the chart). */ Dygraph.prototype.clearSelection = function() { // Get rid of the overlay data @@ -1804,9 +1985,9 @@ Dygraph.prototype.clearSelection = function() { } /** - * Returns the number of the currently selected row - * @return int row number, of -1 if nothing is selected - * @public + * Returns the number of the currently selected row. To get data for this row, + * you can use the getValue method. + * @return { Integer } row number, or -1 if nothing is selected */ Dygraph.prototype.getSelection = function() { if (!this.selPoints_ || this.selPoints_.length < 1) { @@ -1864,6 +2045,7 @@ Dygraph.floatFormat = function(x, opt_precision) { }; /** + * @private * Return a string version of a number. This respects the digitsAfterDecimal * and maxNumberWidth options. * @param {Number} x The number to be formatted @@ -1890,6 +2072,10 @@ Dygraph.numberFormatter = function(x, g) { } }; +/** + * @private + * Converts '9' to '09' (useful for dates) + */ Dygraph.zeropad = function(x) { if (x < 10) return "0" + x; else return "" + x; }; @@ -2043,11 +2229,11 @@ Dygraph.SHORT_SPACINGS[Dygraph.SIX_HOURLY] = 1000 * 3600 * 6; Dygraph.SHORT_SPACINGS[Dygraph.DAILY] = 1000 * 86400; Dygraph.SHORT_SPACINGS[Dygraph.WEEKLY] = 1000 * 604800; -// NumXTicks() -// -// If we used this time granularity, how many ticks would there be? -// This is only an approximation, but it's generally good enough. -// +/** + * @private + * If we used this time granularity, how many ticks would there be? + * This is only an approximation, but it's generally good enough. + */ Dygraph.prototype.NumXTicks = function(start_time, end_time, granularity) { if (granularity < Dygraph.MONTHLY) { // Generate one tick mark for every fixed interval of time. @@ -2068,13 +2254,14 @@ Dygraph.prototype.NumXTicks = function(start_time, end_time, granularity) { } }; -// GetXAxis() -// -// Construct an x-axis of nicely-formatted times on meaningful boundaries -// (e.g. 'Jan 09' rather than 'Jan 22, 2009'). -// -// Returns an array containing {v: millis, label: label} dictionaries. -// +/** + * @private + * + * Construct an x-axis of nicely-formatted times on meaningful boundaries + * (e.g. 'Jan 09' rather than 'Jan 22, 2009'). + * + * Returns an array containing {v: millis, label: label} dictionaries. + */ Dygraph.prototype.GetXAxis = function(start_time, end_time, granularity) { var formatter = this.attr_("xAxisLabelFormatter"); var ticks = []; @@ -2162,10 +2349,12 @@ Dygraph.prototype.GetXAxis = function(start_time, end_time, granularity) { * Add ticks to the x-axis based on a date range. * @param {Number} startDate Start of the date window (millis since epoch) * @param {Number} endDate End of the date window (millis since epoch) - * @return {Array.} Array of {label, value} tuples. + * @param {Dygraph} self The dygraph object + * @return { [Object] } Array of {label, value} tuples. * @public */ Dygraph.dateTicker = function(startDate, endDate, self) { + // TODO(danvk): why does this take 'self' as a param? var chosen = -1; for (var i = 0; i < Dygraph.NUM_GRANULARITIES; i++) { var num_ticks = self.NumXTicks(startDate, endDate, i); @@ -2182,10 +2371,13 @@ Dygraph.dateTicker = function(startDate, endDate, self) { } }; -// This is a list of human-friendly values at which to show tick marks on a log -// scale. It is k * 10^n, where k=1..9 and n=-39..+39, so: -// ..., 1, 2, 3, 4, 5, ..., 9, 10, 20, 30, ..., 90, 100, 200, 300, ... -// NOTE: this assumes that Dygraph.LOG_SCALE = 10. +/** + * @private + * This is a list of human-friendly values at which to show tick marks on a log + * scale. It is k * 10^n, where k=1..9 and n=-39..+39, so: + * ..., 1, 2, 3, 4, 5, ..., 9, 10, 20, 30, ..., 90, 100, 200, 300, ... + * NOTE: this assumes that Dygraph.LOG_SCALE = 10. + */ Dygraph.PREFERRED_LOG_TICK_VALUES = function() { var vals = []; for (var power = -39; power <= 39; power++) { @@ -2198,12 +2390,18 @@ Dygraph.PREFERRED_LOG_TICK_VALUES = function() { return vals; }(); -// val is the value to search for -// arry is the value over which to search -// if abs > 0, find the lowest entry greater than val -// if abs < 0, find the highest entry less than val -// if abs == 0, find the entry that equals val. -// Currently does not work when val is outside the range of arry's values. +/** + * @private + * Implementation of binary search over an array. + * Currently does not work when val is outside the range of arry's values. + * @param { Integer } val the value to search for + * @param { Integer[] } arry is the value over which to search + * @param { Integer } abs If abs > 0, find the lowest entry greater than val + * If abs < 0, find the highest entry less than val. + * if abs == 0, find the entry that equals val. + * @param { Integer } [low] The first index in arry to consider (optional) + * @param { Integer } [high] The last index in arry to consider (optional) + */ Dygraph.binarySearch = function(val, arry, abs, low, high) { if (low == null || high == null) { low = 0; @@ -2245,16 +2443,15 @@ Dygraph.binarySearch = function(val, arry, abs, low, high) { } }; +// TODO(konigsberg): Update comment. /** * Add ticks when the x axis has numbers on it (instead of dates) - * TODO(konigsberg): Update comment. * * @param {Number} minV minimum value * @param {Number} maxV maximum value * @param self * @param {function} attribute accessor function. - * @return {Array.} Array of {label, value} tuples. - * @public + * @return {[Object]} Array of {label, value} tuples. */ Dygraph.numericTicks = function(minV, maxV, self, axis_props, vals) { var attr = function(k) { @@ -2391,10 +2588,13 @@ Dygraph.numericTicks = function(minV, maxV, self, axis_props, vals) { return ticks; }; -// Computes the range of the data series (including confidence intervals). -// series is either [ [x1, y1], [x2, y2], ... ] or -// [ [x1, [y1, dev_low, dev_high]], [x2, [y2, dev_low, dev_high]], ... -// Returns [low, high] +/** + * @private + * Computes the range of the data series (including confidence intervals). + * @param { [Array] } series either [ [x1, y1], [x2, y2], ... ] or + * [ [x1, [y1, dev_low, dev_high]], [x2, [y2, dev_low, dev_high]], ... + * @return [low, high] + */ Dygraph.prototype.extremeValues_ = function(series) { var minY = null, maxY = null; @@ -2432,6 +2632,7 @@ Dygraph.prototype.extremeValues_ = function(series) { }; /** + * @private * This function is called once when the chart's data is changed or the options * dictionary is updated. It is _not_ called when the user pans or zooms. The * idea is that values derived from the chart's data can be computed here, @@ -2627,6 +2828,7 @@ Dygraph.prototype.drawGraph_ = function() { }; /** + * @private * Determine properties of the y-axes which are independent of the data * currently being displayed. This includes things like the number of axes and * the style of the axes. It does not include the range of each axis and its @@ -2730,6 +2932,7 @@ Dygraph.prototype.numAxes = function() { }; /** + * @private * Determine the value range and tick marks for each axis. * @param {Object} extremes A mapping from seriesName -> [low, high] * This fills in the valueRange and ticks fields in each entry of this.axes_. @@ -2843,6 +3046,7 @@ Dygraph.prototype.computeYAxisRanges_ = function(extremes) { }; /** + * @private * Calculates the rolling average of a data set. * If originalData is [label, val], rolls the average of those. * If originalData is [label, [, it's interpreted as [value, stddev] @@ -2979,12 +3183,12 @@ Dygraph.prototype.rollingAverage = function(originalData, rollPeriod) { }; /** + * @private * Parses a date, returning the number of milliseconds since epoch. This can be * passed in as an xValueParser in the Dygraph constructor. * TODO(danvk): enumerate formats that this understands. * @param {String} A date in YYYYMMDD format. * @return {Number} Milliseconds since epoch. - * @public */ Dygraph.dateParser = function(dateStr, self) { var dateStrSlashed; @@ -3078,15 +3282,15 @@ Dygraph.prototype.parseFloat_ = function(x, opt_line_no, opt_line) { }; /** + * @private * Parses a string in a special csv format. We expect a csv file where each * line is a date point, and the first field in each line is the date string. * We also expect that all remaining fields represent series. * if the errorBars attribute is set, then interpret the fields as: * date, series1, stddev1, series2, stddev2, ... - * @param {Array.} data See above. - * @private + * @param {[Object]} data See above. * - * @return Array. An array with one entry for each row. These entries + * @return [Object] An array with one entry for each row. These entries * are an array of cells in that row. The first entry is the parsed x-value for * the row. The second, third, etc. are the y-values. These can take on one of * three forms, depending on the CSV and constructor parameters: @@ -3220,11 +3424,12 @@ Dygraph.prototype.parseCSV_ = function(data) { }; /** + * @private * The user has provided their data as a pre-packaged JS array. If the x values * are numeric, this is the same as dygraphs' internal format. If the x values * are dates, we need to convert them from Date objects to ms since epoch. - * @param {Array.} data - * @return {Array.} data with numeric x values. + * @param {[Object]} data + * @return {[Object]} data with numeric x values. */ Dygraph.prototype.parseArray_ = function(data) { // Peek at the first x value to see if it's numeric. @@ -3282,7 +3487,7 @@ Dygraph.prototype.parseArray_ = function(data) { * number. All subsequent columns must be numbers. If there is a clear mismatch * between this.xValueParser_ and the type of the first column, it will be * fixed. Fills out rawData_. - * @param {Array.} data See above. + * @param {[Object]} data See above. * @private */ Dygraph.prototype.parseDataTable_ = function(data) { @@ -3402,14 +3607,22 @@ Dygraph.prototype.parseDataTable_ = function(data) { } } -// This is identical to JavaScript's built-in Date.parse() method, except that -// it doesn't get replaced with an incompatible method by aggressive JS -// libraries like MooTools or Joomla. +/** + * @private + * This is identical to JavaScript's built-in Date.parse() method, except that + * it doesn't get replaced with an incompatible method by aggressive JS + * libraries like MooTools or Joomla. + * @param { String } str The date string, e.g. "2011/05/06" + * @return { Integer } millis since epoch + */ Dygraph.dateStrToMillis = function(str) { return new Date(str).getTime(); }; // These functions are all based on MochiKit. +/** + * @private + */ Dygraph.update = function (self, o) { if (typeof(o) != 'undefined' && o !== null) { for (var k in o) { @@ -3421,6 +3634,9 @@ Dygraph.update = function (self, o) { return self; }; +/** + * @private + */ Dygraph.isArrayLike = function (o) { var typ = typeof(o); if ( @@ -3435,6 +3651,9 @@ Dygraph.isArrayLike = function (o) { return true; }; +/** + * @private + */ Dygraph.isDateLike = function (o) { if (typeof(o) != "object" || o === null || typeof(o.getTime) != 'function') { @@ -3443,6 +3662,9 @@ Dygraph.isDateLike = function (o) { return true; }; +/** + * @private + */ Dygraph.clone = function(o) { // TODO(danvk): figure out how MochiKit's version works var r = []; @@ -3551,8 +3773,8 @@ Dygraph.prototype.updateOptions = function(attrs) { * This is far more efficient than destroying and re-instantiating a * Dygraph, since it doesn't have to reparse the underlying data. * - * @param {Number} width Width (in pixels) - * @param {Number} height Height (in pixels) + * @param {Number} [width] Width (in pixels) + * @param {Number} [height] Height (in pixels) */ Dygraph.prototype.resize = function(width, height) { if (this.resize_lock) { @@ -3656,6 +3878,12 @@ Dygraph.prototype.indexFromSetName = function(name) { return null; }; +/** + * @private + * Adds a default style for the annotation CSS classes to the document. This is + * only executed when annotations are actually used. It is designed to only be + * called once -- all calls after the first will return immediately. + */ Dygraph.addAnnotationRule = function() { if (Dygraph.addedAnnotationCSS) return; @@ -3692,6 +3920,7 @@ Dygraph.addAnnotationRule = function() { } /** + * @private * Create a new canvas element. This is more complex than a simple * document.createElement("canvas") because of IE and excanvas. */ diff --git a/jsdoc-toolkit/README.txt b/jsdoc-toolkit/README.txt new file mode 100644 index 0000000..3782da8 --- /dev/null +++ b/jsdoc-toolkit/README.txt @@ -0,0 +1,183 @@ +====================================================================== + +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/jsdoc-toolkit/app/frame.js b/jsdoc-toolkit/app/frame.js new file mode 100644 index 0000000..1beb405 --- /dev/null +++ b/jsdoc-toolkit/app/frame.js @@ -0,0 +1,33 @@ +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/jsdoc-toolkit/app/frame/Chain.js b/jsdoc-toolkit/app/frame/Chain.js new file mode 100644 index 0000000..506469d --- /dev/null +++ b/jsdoc-toolkit/app/frame/Chain.js @@ -0,0 +1,102 @@ +/**@constructor*/ +function ChainNode(object, link) { + this.value = object; + this.link = link; // describes this node's relationship to the previous node +} + +/**@constructor*/ +function Chain(valueLinks) { + this.nodes = []; + this.cursor = -1; + + if (valueLinks && valueLinks.length > 0) { + this.push(valueLinks[0], "//"); + for (var i = 1, l = valueLinks.length; i < l; i+=2) { + this.push(valueLinks[i+1], valueLinks[i]); + } + } +} + +Chain.prototype.push = function(o, link) { + if (this.nodes.length > 0 && link) this.nodes.push(new ChainNode(o, link)); + else this.nodes.push(new ChainNode(o)); +} + +Chain.prototype.unshift = function(o, link) { + if (this.nodes.length > 0 && link) this.nodes[0].link = link; + this.nodes.unshift(new ChainNode(o)); + this.cursor++; +} + +Chain.prototype.get = function() { + if (this.cursor < 0 || this.cursor > this.nodes.length-1) return null; + return this.nodes[this.cursor]; +} + +Chain.prototype.first = function() { + this.cursor = 0; + return this.get(); +} + +Chain.prototype.last = function() { + this.cursor = this.nodes.length-1; + return this.get(); +} + +Chain.prototype.next = function() { + this.cursor++; + return this.get(); +} + +Chain.prototype.prev = function() { + this.cursor--; + return this.get(); +} + +Chain.prototype.toString = function() { + var string = ""; + for (var i = 0, l = this.nodes.length; i < l; i++) { + if (this.nodes[i].link) string += " -("+this.nodes[i].link+")-> "; + string += this.nodes[i].value.toString(); + } + return string; +} + +Chain.prototype.joinLeft = function() { + var result = ""; + for (var i = 0, l = this.cursor; i < l; i++) { + if (result && this.nodes[i].link) result += this.nodes[i].link; + result += this.nodes[i].value.toString(); + } + return result; +} + + +/* USAGE: + +var path = "one/two/three.four/five-six"; +var pathChain = new Chain(path.split(/([\/.-])/)); +print(pathChain); + +var lineage = new Chain(); +lineage.push("Port"); +lineage.push("Les", "son"); +lineage.push("Dawn", "daughter"); +lineage.unshift("Purdie", "son"); + +print(lineage); + +// walk left +for (var node = lineage.last(); node !== null; node = lineage.prev()) { + print("< "+node.value); +} + +// walk right +var node = lineage.first() +while (node !== null) { + print(node.value); + node = lineage.next(); + if (node && node.link) print("had a "+node.link+" named"); +} + +*/ \ No newline at end of file diff --git a/jsdoc-toolkit/app/frame/Dumper.js b/jsdoc-toolkit/app/frame/Dumper.js new file mode 100644 index 0000000..d8b007b --- /dev/null +++ b/jsdoc-toolkit/app/frame/Dumper.js @@ -0,0 +1,144 @@ +/** + * @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/jsdoc-toolkit/app/frame/Hash.js b/jsdoc-toolkit/app/frame/Hash.js new file mode 100644 index 0000000..62cfad6 --- /dev/null +++ b/jsdoc-toolkit/app/frame/Hash.js @@ -0,0 +1,84 @@ +/** + @constructor + @example + var _index = new Hash(); + _index.set("a", "apple"); + _index.set("b", "blue"); + _index.set("c", "coffee"); + + for (var p = _index.first(); p; p = _index.next()) { + print(p.key+" is for "+p.value); + } + + */ +var Hash = function() { + this._map = {}; + this._keys = []; + this._vals = []; + this.reset(); +} + +Hash.prototype.set = function(k, v) { + if (k != "") { + this._keys.push(k); + this._map["="+k] = this._vals.length; + this._vals.push(v); + } +} + +Hash.prototype.replace = function(k, k2, v) { + if (k == k2) return; + + var offset = this._map["="+k]; + this._keys[offset] = k2; + if (typeof v != "undefined") this._vals[offset] = v; + this._map["="+k2] = offset; + delete(this._map["="+k]); +} + +Hash.prototype.drop = function(k) { + if (k != "") { + var offset = this._map["="+k]; + this._keys.splice(offset, 1); + this._vals.splice(offset, 1); + delete(this._map["="+k]); + for (var p in this._map) { + if (this._map[p] >= offset) this._map[p]--; + } + if (this._cursor >= offset && this._cursor > 0) this._cursor--; + } +} + +Hash.prototype.get = function(k) { + if (k != "") { + return this._vals[this._map["="+k]]; + } +} + +Hash.prototype.keys = function() { + return this._keys; +} + +Hash.prototype.hasKey = function(k) { + if (k != "") { + return (typeof this._map["="+k] != "undefined"); + } +} + +Hash.prototype.values = function() { + return this._vals; +} + +Hash.prototype.reset = function() { + this._cursor = 0; +} + +Hash.prototype.first = function() { + this.reset(); + return this.next(); +} + +Hash.prototype.next = function() { + if (this._cursor++ < this._keys.length) + return {key: this._keys[this._cursor-1], value: this._vals[this._cursor-1]}; +} \ No newline at end of file diff --git a/jsdoc-toolkit/app/frame/Link.js b/jsdoc-toolkit/app/frame/Link.js new file mode 100644 index 0000000..1e6241b --- /dev/null +++ b/jsdoc-toolkit/app/frame/Link.js @@ -0,0 +1,173 @@ +/** Handle the creation of HTML links to documented symbols. + @constructor +*/ +function Link() { + this.alias = ""; + this.src = ""; + this.file = ""; + this.text = ""; + this.innerName = ""; + this.classLink = false; + this.targetName = ""; + + this.target = function(targetName) { + if (defined(targetName)) this.targetName = targetName; + return this; + } + this.inner = function(inner) { + if (defined(inner)) this.innerName = inner; + return this; + } + this.withText = function(text) { + if (defined(text)) this.text = text; + return this; + } + this.toSrc = function(filename) { + if (defined(filename)) this.src = filename; + return this; + } + this.toSymbol = function(alias) { + if (defined(alias)) this.alias = new String(alias); + return this; + } + this.toClass = function(alias) { + this.classLink = true; + return this.toSymbol(alias); + } + this.toFile = function(file) { + if (defined(file)) this.file = file; + return this; + } + + this.toString = function() { + var linkString; + var thisLink = this; + + if (this.alias) { + linkString = this.alias.replace(/(^|[^a-z$0-9_#.:^-])([|a-z$0-9_#.:^-]+)($|[^a-z$0-9_#.:^-])/i, + function(match, prematch, symbolName, postmatch) { + var symbolNames = symbolName.split("|"); + var links = []; + for (var i = 0, l = symbolNames.length; i < l; i++) { + thisLink.alias = symbolNames[i]; + links.push(thisLink._makeSymbolLink(symbolNames[i])); + } + return prematch+links.join("|")+postmatch; + } + ); + } + else if (this.src) { + linkString = thisLink._makeSrcLink(this.src); + } + else if (this.file) { + linkString = thisLink._makeFileLink(this.file); + } + + return linkString; + } +} + +/** prefixed for hashes */ +Link.hashPrefix = ""; + +/** Appended to the front of relative link paths. */ +Link.base = ""; + +Link.symbolNameToLinkName = function(symbol) { + var linker = "", + ns = ""; + + if (symbol.isStatic) linker = "."; + else if (symbol.isInner) linker = "-"; + + if (symbol.isEvent && !/^event:/.test(symbol.name)) { + ns = "event:"; + } + return Link.hashPrefix+linker+ns+symbol.name; +} + +Link.getSymbol= function(alias) { + var symbol= Link.symbolSet.getSymbol(alias); + + if (symbol) + return symbol; + + if ('#'!==alias.charAt(0) || !Link.currentSymbol) + return null; + + // resolve relative name + var container= Link.currentSymbol; + + while (container) + { + symbol= Link.symbolSet.getSymbol(container.alias + alias); + if (symbol) + return symbol; + + // No superclass + if (!container.augments.length) + return null; + + container= Link.symbolSet.getSymbol(container.augments[0].desc); + } + + return null; +} + +/** Create a link to another symbol. */ +Link.prototype._makeSymbolLink = function(alias) { + var linkBase = Link.base+publish.conf.symbolsDir; + var linkTo = Link.getSymbol(alias); + var linkPath; + var target = (this.targetName)? " target=\""+this.targetName+"\"" : ""; + + // if there is no symbol by that name just return the name unaltered + if (!linkTo) + return this.text || alias; + + // it's a symbol in another file + else { + if (!linkTo.is("CONSTRUCTOR") && !linkTo.isNamespace) { // it's a method or property + linkPath= (Link.filemap) ? Link.filemap[linkTo.memberOf] : + escape(linkTo.memberOf) || "_global_"; + linkPath += publish.conf.ext + "#" + Link.symbolNameToLinkName(linkTo); + } + else { + linkPath = (Link.filemap)? Link.filemap[linkTo.alias] : escape(linkTo.alias); + linkPath += publish.conf.ext;// + (this.classLink? "":"#" + Link.hashPrefix + "constructor"); + } + linkPath = linkBase + linkPath + } + + var linkText= this.text || alias; + + var link = {linkPath: linkPath, linkText: linkText, linkInner: (this.innerName? "#"+this.innerName : "")}; + + if (typeof JSDOC.PluginManager != "undefined") { + JSDOC.PluginManager.run("onSymbolLink", link); + } + + return ""+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/jsdoc-toolkit/app/frame/Namespace.js b/jsdoc-toolkit/app/frame/Namespace.js new file mode 100644 index 0000000..fa1e41d --- /dev/null +++ b/jsdoc-toolkit/app/frame/Namespace.js @@ -0,0 +1,10 @@ +_global_ = this; + +function Namespace(name, f) { + var n = name.split("."); + for (var o = _global_, i = 0, l = n.length; i < l; i++) { + o = o[n[i]] = o[n[i]] || {}; + } + + if (f) f(); +} \ No newline at end of file diff --git a/jsdoc-toolkit/app/frame/Opt.js b/jsdoc-toolkit/app/frame/Opt.js new file mode 100644 index 0000000..352f159 --- /dev/null +++ b/jsdoc-toolkit/app/frame/Opt.js @@ -0,0 +1,134 @@ +/** @namespace */ +Opt = { + /** + * Get commandline option values. + * @param {Array} args Commandline arguments. Like ["-a=xml", "-b", "--class=new", "--debug"] + * @param {object} optNames Map short names to long names. Like {a:"accept", b:"backtrace", c:"class", d:"debug"}. + * @return {object} Short names and values. Like {a:"xml", b:true, c:"new", d:true} + */ + get: function(args, optNames) { + var opt = {"_": []}; // the unnamed option allows multiple values + for (var i = 0; i < args.length; i++) { + var arg = new String(args[i]); + var name; + var value; + if (arg.charAt(0) == "-") { + if (arg.charAt(1) == "-") { // it's a longname like --foo + arg = arg.substring(2); + var m = arg.split("="); + name = m.shift(); + value = m.shift(); + if (typeof value == "undefined") value = true; + + for (var n in optNames) { // convert it to a shortname + if (name == optNames[n]) { + name = n; + } + } + } + else { // it's a shortname like -f + arg = arg.substring(1); + var m = arg.split("="); + name = m.shift(); + value = m.shift(); + if (typeof value == "undefined") value = true; + + for (var n in optNames) { // find the matching key + if (name == n || name+'[]' == n) { + name = n; + break; + } + } + } + if (name.match(/(.+)\[\]$/)) { // it's an array type like n[] + name = RegExp.$1; + if (!opt[name]) opt[name] = []; + } + + if (opt[name] && opt[name].push) { + opt[name].push(value); + } + else { + opt[name] = value; + } + } + else { // not associated with any optname + opt._.push(args[i]); + } + } + return opt; + } +} + +/*t: + plan(11, "Testing Opt."); + + is( + typeof Opt, + "object", + "Opt is an object." + ); + + is( + typeof Opt.get, + "function", + "Opt.get is a function." + ); + + var optNames = {a:"accept", b:"backtrace", c:"class", d:"debug", "e[]":"exceptions"}; + var t_options = Opt.get(["-a=xml", "-b", "--class=new", "--debug", "-e=one", "-e=two", "foo", "bar"], optNames); + + is( + t_options.a, + "xml", + "an option defined with a short name can be accessed by its short name." + ); + + is( + t_options.b, + true, + "an option defined with a short name and no value are true." + ); + + is( + t_options.c, + "new", + "an option defined with a long name can be accessed by its short name." + ); + + is( + t_options.d, + true, + "an option defined with a long name and no value are true." + ); + + is( + typeof t_options.e, + "object", + "an option that can accept multiple values is defined." + ); + + is( + t_options.e.length, + 2, + "an option that can accept multiple values can have more than one value." + ); + + is( + t_options.e[1], + "two", + "an option that can accept multiple values can be accessed as an array." + ); + + is( + typeof t_options._, + "object", + "the property '_' is defined for unnamed options." + ); + + is( + t_options._[0], + "foo", + "the property '_' can be accessed as an array." + ); + */ \ No newline at end of file diff --git a/jsdoc-toolkit/app/frame/Reflection.js b/jsdoc-toolkit/app/frame/Reflection.js new file mode 100644 index 0000000..0968f1c --- /dev/null +++ b/jsdoc-toolkit/app/frame/Reflection.js @@ -0,0 +1,26 @@ +/**@constructor*/ +function Reflection(obj) { + this.obj = obj; +} + +Reflection.prototype.getConstructorName = function() { + if (this.obj.constructor.name) return this.obj.constructor.name; + var src = this.obj.constructor.toSource(); + var name = src.substring(name.indexOf("function")+8, src.indexOf('(')).replace(/ /g,''); + return name; +} + +Reflection.prototype.getMethod = function(name) { + for (var p in this.obj) { + if (p == name && typeof(this.obj[p]) == "function") return this.obj[p]; + } + return null; +} + +Reflection.prototype.getParameterNames = function() { + var src = this.obj.toSource(); + src = src.substring( + src.indexOf("(", 8)+1, src.indexOf(")") + ); + return src.split(/, ?/); +} diff --git a/jsdoc-toolkit/app/frame/String.js b/jsdoc-toolkit/app/frame/String.js new file mode 100644 index 0000000..c183c27 --- /dev/null +++ b/jsdoc-toolkit/app/frame/String.js @@ -0,0 +1,93 @@ +/** + @name String + @class Additions to the core string object. +*/ + +/** @author Steven Levithan, released as public domain. */ +String.prototype.trim = function() { + var str = this.replace(/^\s+/, ''); + for (var i = str.length - 1; i >= 0; i--) { + if (/\S/.test(str.charAt(i))) { + str = str.substring(0, i + 1); + break; + } + } + return str; +} +/*t: + plan(6, "Testing String.prototype.trim."); + + var s = " a bc ".trim(); + is(s, "a bc", "multiple spaces front and back are trimmed."); + + s = "a bc\n\n".trim(); + is(s, "a bc", "newlines only in back are trimmed."); + + s = "\ta bc".trim(); + is(s, "a bc", "tabs only in front are trimmed."); + + s = "\n \t".trim(); + is(s, "", "an all-space string is trimmed to empty."); + + s = "a b\nc".trim(); + is(s, "a b\nc", "a string with no spaces in front or back is trimmed to itself."); + + s = "".trim(); + is(s, "", "an empty string is trimmed to empty."); + +*/ + +String.prototype.balance = function(open, close) { + var i = 0; + while (this.charAt(i) != open) { + if (i == this.length) return [-1, -1]; + i++; + } + + var j = i+1; + var balance = 1; + while (j < this.length) { + if (this.charAt(j) == open) balance++; + if (this.charAt(j) == close) balance--; + if (balance == 0) break; + j++; + if (j == this.length) return [-1, -1]; + } + + return [i, j]; +} +/*t: + plan(16, "Testing String.prototype.balance."); + + var s = "{abc}".balance("{","}"); + is(s[0], 0, "opener in first is found."); + is(s[1], 4, "closer in last is found."); + + s = "ab{c}de".balance("{","}"); + is(s[0], 2, "opener in middle is found."); + is(s[1], 4, "closer in middle is found."); + + s = "a{b{c}de}f".balance("{","}"); + is(s[0], 1, "nested opener is found."); + is(s[1], 8, "nested closer is found."); + + s = "{}".balance("{","}"); + is(s[0], 0, "opener with no content is found."); + is(s[1], 1, "closer with no content is found."); + + s = "".balance("{","}"); + is(s[0], -1, "empty string opener is -1."); + is(s[1], -1, "empty string closer is -1."); + + s = "{abc".balance("{","}"); + is(s[0], -1, "opener with no closer returns -1."); + is(s[1], -1, "no closer returns -1."); + + s = "abc".balance("{","}"); + is(s[0], -1, "no opener or closer returns -1 for opener."); + is(s[1], -1, "no opener or closer returns -1 for closer."); + + s = "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/jsdoc-toolkit/app/handlers/FOODOC.js b/jsdoc-toolkit/app/handlers/FOODOC.js new file mode 100644 index 0000000..b208f55 --- /dev/null +++ b/jsdoc-toolkit/app/handlers/FOODOC.js @@ -0,0 +1,26 @@ +/** + 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/jsdoc-toolkit/app/handlers/XMLDOC.js b/jsdoc-toolkit/app/handlers/XMLDOC.js new file mode 100755 index 0000000..40f87b3 --- /dev/null +++ b/jsdoc-toolkit/app/handlers/XMLDOC.js @@ -0,0 +1,26 @@ +/** + * 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/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js b/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js new file mode 100755 index 0000000..240563d --- /dev/null +++ b/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js @@ -0,0 +1,159 @@ +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/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js b/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js new file mode 100755 index 0000000..e9b3e3c --- /dev/null +++ b/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js @@ -0,0 +1,16 @@ +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/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js b/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js new file mode 100755 index 0000000..78e8f45 --- /dev/null +++ b/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js @@ -0,0 +1,292 @@ +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/jsdoc-toolkit/app/lib/JSDOC.js b/jsdoc-toolkit/app/lib/JSDOC.js new file mode 100644 index 0000000..5de7b9e --- /dev/null +++ b/jsdoc-toolkit/app/lib/JSDOC.js @@ -0,0 +1,106 @@ +/** + @overview + @date $Date: 2010-06-13 22:02:44 +0100 (Sun, 13 Jun 2010) $ + @version $Revision: 837 $ + @location $HeadURL: https://jsdoc-toolkit.googlecode.com/svn/tags/jsdoc_toolkit-2.4.0/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", + m: "multiple", + 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.4.0"; + +/** 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(" -m or --multiples\n Don't warn about symbols being documented more than once.\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/jsdoc-toolkit/app/lib/JSDOC/DocComment.js b/jsdoc-toolkit/app/lib/JSDOC/DocComment.js new file mode 100644 index 0000000..4b21cd7 --- /dev/null +++ b/jsdoc-toolkit/app/lib/JSDOC/DocComment.js @@ -0,0 +1,204 @@ +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}); +} + +JSDOC.DocComment.prototype.deleteTag = function(/**String*/tagTitle) { + this.tags = 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/jsdoc-toolkit/app/lib/JSDOC/DocTag.js b/jsdoc-toolkit/app/lib/JSDOC/DocTag.js new file mode 100644 index 0000000..77ec07c --- /dev/null +++ b/jsdoc-toolkit/app/lib/JSDOC/DocTag.js @@ -0,0 +1,294 @@ +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/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js b/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js new file mode 100644 index 0000000..02275a6 --- /dev/null +++ b/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js @@ -0,0 +1,140 @@ +/** + @constructor + @param [opt] Used to override the commandline options. Useful for testing. + @version $Id: JsDoc.js 831 2010-03-09 14:24:56Z 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 param = JSDOC.opt.D[i]; + // remove first and last character if both == " + if ( + param.length > 1 + && param.charAt(0) == '"' + && param.charAt(param.length-1) == '"' + ) { + param = param.substr(1, param.length-2); + } + var defineParts = param.split(":"); + if (defineParts && defineParts.length > 1) { + for ( var dpIdx = 2; dpIdx < defineParts.length; dpIdx++ ) { + defineParts[1] += ':' + defineParts[dpIdx]; + } + 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/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js b/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js new file mode 100644 index 0000000..bcaebc9 --- /dev/null +++ b/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js @@ -0,0 +1,109 @@ +/** + @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/jsdoc-toolkit/app/lib/JSDOC/Lang.js b/jsdoc-toolkit/app/lib/JSDOC/Lang.js new file mode 100644 index 0000000..62919d7 --- /dev/null +++ b/jsdoc-toolkit/app/lib/JSDOC/Lang.js @@ -0,0 +1,144 @@ +/** + @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/jsdoc-toolkit/app/lib/JSDOC/Parser.js b/jsdoc-toolkit/app/lib/JSDOC/Parser.js new file mode 100644 index 0000000..e489c61 --- /dev/null +++ b/jsdoc-toolkit/app/lib/JSDOC/Parser.js @@ -0,0 +1,146 @@ +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; + + // 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); + } + + symbol.alias = symbol.alias.replace(/^exports\./, fileNS + '.'); + symbol.name = symbol.name.replace(/^exports\./, ''); + symbol.memberOf = fileNS; + symbol.isStatic = true; + } + } + + // if a symbol alias is documented more than once the first 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 (JSDOC.opt.m) return; + if (symbol.comment.isUserComment) { // old and new are both documented + LOG.warn("The symbol '"+symbol.alias+"' is documented more than once."); + return; + } + 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/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js b/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js new file mode 100644 index 0000000..9c91193 --- /dev/null +++ b/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js @@ -0,0 +1,33 @@ +/** + @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/jsdoc-toolkit/app/lib/JSDOC/Symbol.js b/jsdoc-toolkit/app/lib/JSDOC/Symbol.js new file mode 100644 index 0000000..1aa44da --- /dev/null +++ b/jsdoc-toolkit/app/lib/JSDOC/Symbol.js @@ -0,0 +1,644 @@ +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+"*/")); + // TODO: shouldn't the following happen in the addProperty method of Symbol? + if (properties[i].type) property.type = properties[i].type; + if (properties[i].defaultValue) property.defaultValue = properties[i].defaultValue; + this.addProperty(property); + if (!JSDOC.Parser.symbols.getSymbolByName(property.name)) + 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/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js b/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js new file mode 100644 index 0000000..8e3a2eb --- /dev/null +++ b/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js @@ -0,0 +1,243 @@ +/** @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 (JSDOC.opt.a && this.hasSymbol(symbol.alias)) { + LOG.warn("Overwriting symbol documentation for: " + symbol.alias + "."); + this.deleteSymbol(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/jsdoc-toolkit/app/lib/JSDOC/TextStream.js b/jsdoc-toolkit/app/lib/JSDOC/TextStream.js new file mode 100644 index 0000000..ccc48a8 --- /dev/null +++ b/jsdoc-toolkit/app/lib/JSDOC/TextStream.js @@ -0,0 +1,41 @@ + +/** + @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/jsdoc-toolkit/app/lib/JSDOC/Token.js b/jsdoc-toolkit/app/lib/JSDOC/Token.js new file mode 100644 index 0000000..fb7f9d9 --- /dev/null +++ b/jsdoc-toolkit/app/lib/JSDOC/Token.js @@ -0,0 +1,18 @@ +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/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js b/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js new file mode 100644 index 0000000..9f658fb --- /dev/null +++ b/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js @@ -0,0 +1,332 @@ +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/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js b/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js new file mode 100644 index 0000000..1eeb44c --- /dev/null +++ b/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js @@ -0,0 +1,133 @@ +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/jsdoc-toolkit/app/lib/JSDOC/Util.js b/jsdoc-toolkit/app/lib/JSDOC/Util.js new file mode 100644 index 0000000..6d7edb3 --- /dev/null +++ b/jsdoc-toolkit/app/lib/JSDOC/Util.js @@ -0,0 +1,32 @@ +/** + * @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/jsdoc-toolkit/app/lib/JSDOC/Walker.js b/jsdoc-toolkit/app/lib/JSDOC/Walker.js new file mode 100644 index 0000000..6ecaea8 --- /dev/null +++ b/jsdoc-toolkit/app/lib/JSDOC/Walker.js @@ -0,0 +1,507 @@ +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."; + + if (doc.getTag("memberOf").length > 0) { + virtualName = (doc.getTag("memberOf")[0] + "." + virtualName) + .replace(/([#.])\./, "$1"); + doc.deleteTag("memberOf"); + } + + 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; + + if (doc && doc.getTag("memberOf").length > 0) { + name = (doc.getTag("memberOf")[0]+"."+name).replace("#.", "#"); + doc.deleteTag("memberOf"); + } + else { + name = this.namescope.last().alias+"-"+name; + if (!this.namescope.last().is("GLOBAL")) isInner = true; + } + + 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 constructs; + var isConstructor = false; + if (doc && (constructs = doc.getTag("constructs")) && constructs.length) { + if (constructs[0].desc) { + name = constructs[0].desc; + isConstructor = true; + } + } + + var isInner; + if (this.ts.look(-1).is("VAR") || this.isInner) { + if (doc && doc.getTag("memberOf").length > 0) { + name = (doc.getTag("memberOf")[0]+"."+name).replace("#.", "#"); + doc.deleteTag("memberOf"); + } + else { + name = this.namescope.last().alias+"-"+name; + if (!this.namescope.last().is("GLOBAL")) isInner = true; + } + 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 (isConstructor) symbol.isa = "CONSTRUCTOR"; + + 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/jsdoc-toolkit/app/main.js b/jsdoc-toolkit/app/main.js new file mode 100644 index 0000000..f9008c8 --- /dev/null +++ b/jsdoc-toolkit/app/main.js @@ -0,0 +1,111 @@ +/** + * @version $Id: main.js 818 2009-11-08 14:51:41Z 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 && SYS.slash != JSDOC.opt.t.slice(-1)) { + 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/jsdoc-toolkit/app/plugins/commentSrcJson.js b/jsdoc-toolkit/app/plugins/commentSrcJson.js new file mode 100644 index 0000000..e826b57 --- /dev/null +++ b/jsdoc-toolkit/app/plugins/commentSrcJson.js @@ -0,0 +1,20 @@ +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/jsdoc-toolkit/app/plugins/frameworkPrototype.js b/jsdoc-toolkit/app/plugins/frameworkPrototype.js new file mode 100644 index 0000000..9c41751 --- /dev/null +++ b/jsdoc-toolkit/app/plugins/frameworkPrototype.js @@ -0,0 +1,16 @@ +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/jsdoc-toolkit/app/plugins/functionCall.js b/jsdoc-toolkit/app/plugins/functionCall.js new file mode 100644 index 0000000..6f87705 --- /dev/null +++ b/jsdoc-toolkit/app/plugins/functionCall.js @@ -0,0 +1,10 @@ +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/jsdoc-toolkit/app/plugins/publishSrcHilite.js b/jsdoc-toolkit/app/plugins/publishSrcHilite.js new file mode 100644 index 0000000..65514f2 --- /dev/null +++ b/jsdoc-toolkit/app/plugins/publishSrcHilite.js @@ -0,0 +1,62 @@ +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/jsdoc-toolkit/app/plugins/symbolLink.js b/jsdoc-toolkit/app/plugins/symbolLink.js new file mode 100644 index 0000000..c87f1ca --- /dev/null +++ b/jsdoc-toolkit/app/plugins/symbolLink.js @@ -0,0 +1,10 @@ +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/jsdoc-toolkit/app/plugins/tagParamConfig.js b/jsdoc-toolkit/app/plugins/tagParamConfig.js new file mode 100644 index 0000000..3ea8a1b --- /dev/null +++ b/jsdoc-toolkit/app/plugins/tagParamConfig.js @@ -0,0 +1,31 @@ +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/jsdoc-toolkit/app/plugins/tagSynonyms.js b/jsdoc-toolkit/app/plugins/tagSynonyms.js new file mode 100644 index 0000000..49a874f --- /dev/null +++ b/jsdoc-toolkit/app/plugins/tagSynonyms.js @@ -0,0 +1,43 @@ +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/jsdoc-toolkit/app/run.js b/jsdoc-toolkit/app/run.js new file mode 100644 index 0000000..1f875cd --- /dev/null +++ b/jsdoc-toolkit/app/run.js @@ -0,0 +1,348 @@ +/** + * @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/jsdoc-toolkit/app/t/TestDoc.js b/jsdoc-toolkit/app/t/TestDoc.js new file mode 100644 index 0000000..c0768b7 --- /dev/null +++ b/jsdoc-toolkit/app/t/TestDoc.js @@ -0,0 +1,144 @@ +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/jsdoc-toolkit/app/t/runner.js b/jsdoc-toolkit/app/t/runner.js new file mode 100644 index 0000000..3f9fb4c --- /dev/null +++ b/jsdoc-toolkit/app/t/runner.js @@ -0,0 +1,13 @@ +// 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/jsdoc-toolkit/app/test.js b/jsdoc-toolkit/app/test.js new file mode 100644 index 0000000..8b2dc8b --- /dev/null +++ b/jsdoc-toolkit/app/test.js @@ -0,0 +1,342 @@ +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/memberof2.js"]}); + + is('symbols.getSymbol("Foo#bar").alias', "Foo#bar", 'An inner function can be documented as an instance method.'); + is('symbols.getSymbol("Foo.zip").alias', "Foo.zip", 'An inner function can be documented as a static method.'); + is('symbols.getSymbol("Foo.Fiz").alias', "Foo.Fiz", 'An inner function can be documented as a static constructor.'); + is('symbols.getSymbol("Foo.Fiz#fipple").alias', "Foo.Fiz#fipple", 'An inner function can be documented as a static constructor with a method.'); + is('symbols.getSymbol("Foo#blat").alias', "Foo#blat", 'An global function can be documented as an instance method.'); + } + , + function() { + symbolize({a:true, p: true, _: [SYS.pwd+"test/memberof3.js"]}); + + is('symbols.getSymbol("Foo#bar").alias', "Foo#bar", 'A virtual field can be documented as an instance method.'); + is('symbols.getSymbol("Foo2#bar").alias', "Foo2#bar", 'A virtual field with the same name can be documented as an instance method.'); + } + , + 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/jsdoc-toolkit/app/test/addon.js b/jsdoc-toolkit/app/test/addon.js new file mode 100644 index 0000000..8886205 --- /dev/null +++ b/jsdoc-toolkit/app/test/addon.js @@ -0,0 +1,24 @@ +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/jsdoc-toolkit/app/test/anon_inner.js b/jsdoc-toolkit/app/test/anon_inner.js new file mode 100644 index 0000000..227eeee --- /dev/null +++ b/jsdoc-toolkit/app/test/anon_inner.js @@ -0,0 +1,14 @@ +/** + * @name bar + * @namespace + */ + +new function() { + /** + * @name bar-foo + * @function + * @param {number} x + */ + function foo(x) { + } +} \ No newline at end of file diff --git a/jsdoc-toolkit/app/test/augments.js b/jsdoc-toolkit/app/test/augments.js new file mode 100644 index 0000000..12e706e --- /dev/null +++ b/jsdoc-toolkit/app/test/augments.js @@ -0,0 +1,31 @@ +/** +@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/jsdoc-toolkit/app/test/augments2.js b/jsdoc-toolkit/app/test/augments2.js new file mode 100644 index 0000000..e8388f0 --- /dev/null +++ b/jsdoc-toolkit/app/test/augments2.js @@ -0,0 +1,26 @@ +/** +@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/jsdoc-toolkit/app/test/borrows.js b/jsdoc-toolkit/app/test/borrows.js new file mode 100644 index 0000000..a5d8ea4 --- /dev/null +++ b/jsdoc-toolkit/app/test/borrows.js @@ -0,0 +1,46 @@ +/** +@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/jsdoc-toolkit/app/test/borrows2.js b/jsdoc-toolkit/app/test/borrows2.js new file mode 100644 index 0000000..c0d5ea2 --- /dev/null +++ b/jsdoc-toolkit/app/test/borrows2.js @@ -0,0 +1,23 @@ +// 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/jsdoc-toolkit/app/test/config.js b/jsdoc-toolkit/app/test/config.js new file mode 100644 index 0000000..0748a21 --- /dev/null +++ b/jsdoc-toolkit/app/test/config.js @@ -0,0 +1,22 @@ +/** + * @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/jsdoc-toolkit/app/test/constructs.js b/jsdoc-toolkit/app/test/constructs.js new file mode 100644 index 0000000..cca5dbd --- /dev/null +++ b/jsdoc-toolkit/app/test/constructs.js @@ -0,0 +1,18 @@ +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/jsdoc-toolkit/app/test/encoding.js b/jsdoc-toolkit/app/test/encoding.js new file mode 100644 index 0000000..ba64219 --- /dev/null +++ b/jsdoc-toolkit/app/test/encoding.js @@ -0,0 +1,10 @@ + +/** + * @Constructor + * @desc 配置文件 + * @class 什么也不返回 + */ +function Test(conf) { + // do something; +} + diff --git a/jsdoc-toolkit/app/test/encoding_other.js b/jsdoc-toolkit/app/test/encoding_other.js new file mode 100644 index 0000000..b144da4 --- /dev/null +++ b/jsdoc-toolkit/app/test/encoding_other.js @@ -0,0 +1,12 @@ + +/** + * @Constructor + * @desc ðïîÛ + * @class ßàáâãäåæçèçìëêíîï °±²³´µ¡¶·¸¹ + */ +function Test(conf) { + // do something; +} + +// run with commanline option -e=iso-8859-5 + diff --git a/jsdoc-toolkit/app/test/event.js b/jsdoc-toolkit/app/test/event.js new file mode 100644 index 0000000..7e41d6f --- /dev/null +++ b/jsdoc-toolkit/app/test/event.js @@ -0,0 +1,54 @@ +/** + * @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/jsdoc-toolkit/app/test/exports.js b/jsdoc-toolkit/app/test/exports.js new file mode 100644 index 0000000..63a87cb --- /dev/null +++ b/jsdoc-toolkit/app/test/exports.js @@ -0,0 +1,14 @@ +/** @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/jsdoc-toolkit/app/test/functions_anon.js b/jsdoc-toolkit/app/test/functions_anon.js new file mode 100644 index 0000000..e9dd6c1 --- /dev/null +++ b/jsdoc-toolkit/app/test/functions_anon.js @@ -0,0 +1,39 @@ +/** 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/jsdoc-toolkit/app/test/functions_nested.js b/jsdoc-toolkit/app/test/functions_nested.js new file mode 100644 index 0000000..f044faf --- /dev/null +++ b/jsdoc-toolkit/app/test/functions_nested.js @@ -0,0 +1,33 @@ +/** @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/jsdoc-toolkit/app/test/global.js b/jsdoc-toolkit/app/test/global.js new file mode 100644 index 0000000..5ea4894 --- /dev/null +++ b/jsdoc-toolkit/app/test/global.js @@ -0,0 +1,13 @@ +/** ecks */ +var x = [1, 2, 4]; + +var y = { + foo: function(){ + } +} + +bar = function() { +} + +function zop() { +} diff --git a/jsdoc-toolkit/app/test/globals.js b/jsdoc-toolkit/app/test/globals.js new file mode 100644 index 0000000..3f83fb1 --- /dev/null +++ b/jsdoc-toolkit/app/test/globals.js @@ -0,0 +1,25 @@ +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/jsdoc-toolkit/app/test/ignore.js b/jsdoc-toolkit/app/test/ignore.js new file mode 100644 index 0000000..d3fac9e --- /dev/null +++ b/jsdoc-toolkit/app/test/ignore.js @@ -0,0 +1,10 @@ +/** + * A test constructor. + * @constructor + * @ignore + */ +function Ignored() { + /** a method */ + this.bar = function() { + } +} \ No newline at end of file diff --git a/jsdoc-toolkit/app/test/inner.js b/jsdoc-toolkit/app/test/inner.js new file mode 100644 index 0000000..37cfa9d --- /dev/null +++ b/jsdoc-toolkit/app/test/inner.js @@ -0,0 +1,16 @@ +/** + * @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/jsdoc-toolkit/app/test/jsdoc_test.js b/jsdoc-toolkit/app/test/jsdoc_test.js new file mode 100644 index 0000000..0817712 --- /dev/null +++ b/jsdoc-toolkit/app/test/jsdoc_test.js @@ -0,0 +1,477 @@ +/** + * @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/jsdoc-toolkit/app/test/lend.js b/jsdoc-toolkit/app/test/lend.js new file mode 100644 index 0000000..92b15d5 --- /dev/null +++ b/jsdoc-toolkit/app/test/lend.js @@ -0,0 +1,33 @@ + /** @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/jsdoc-toolkit/app/test/memberof.js b/jsdoc-toolkit/app/test/memberof.js new file mode 100644 index 0000000..883bbde --- /dev/null +++ b/jsdoc-toolkit/app/test/memberof.js @@ -0,0 +1,19 @@ +/** @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/jsdoc-toolkit/app/test/memberof2.js b/jsdoc-toolkit/app/test/memberof2.js new file mode 100644 index 0000000..bc3d9d8 --- /dev/null +++ b/jsdoc-toolkit/app/test/memberof2.js @@ -0,0 +1,38 @@ +/** + * @constructor + */ +function Foo() { + /** + @memberOf Foo.prototype + */ + function bar(a, b) { + } + + /** + @memberOf Foo + */ + var zip = function(p, q) { + } + + /** + @memberOf Foo + */ + function zop( x,y ) { + } + + /** + @memberOf Foo + @constructor + */ + function Fiz() { + /** A method of Foo#Fiz. */ + this.fipple = function(fop){} + } +} + +/** + @memberOf Foo# + */ +var blat = function() { + +} \ No newline at end of file diff --git a/jsdoc-toolkit/app/test/memberof3.js b/jsdoc-toolkit/app/test/memberof3.js new file mode 100644 index 0000000..8c25942 --- /dev/null +++ b/jsdoc-toolkit/app/test/memberof3.js @@ -0,0 +1,33 @@ +/** +* @name Foo +* @class +*/ + +/**#@+ +* @memberOf Foo# +* @field +*/ + +/** +* @name bar +* @type Object[] +*/ + +/**#@-*/ + +/** +* @name Foo2 +* @class +*/ + +/**#@+ +* @memberOf Foo2# +* @field +*/ + +/** +* @name bar +* @type Object[] +*/ + +/**#@-*/ \ No newline at end of file diff --git a/jsdoc-toolkit/app/test/memberof_constructor.js b/jsdoc-toolkit/app/test/memberof_constructor.js new file mode 100644 index 0000000..80fde73 --- /dev/null +++ b/jsdoc-toolkit/app/test/memberof_constructor.js @@ -0,0 +1,17 @@ +/** @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/jsdoc-toolkit/app/test/module.js b/jsdoc-toolkit/app/test/module.js new file mode 100644 index 0000000..5b3fe42 --- /dev/null +++ b/jsdoc-toolkit/app/test/module.js @@ -0,0 +1,17 @@ +/** @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/jsdoc-toolkit/app/test/multi_methods.js b/jsdoc-toolkit/app/test/multi_methods.js new file mode 100644 index 0000000..bab35c7 --- /dev/null +++ b/jsdoc-toolkit/app/test/multi_methods.js @@ -0,0 +1,25 @@ + +/** + Get the entire flavor. + @name flavor^3 + @function + @returns {Object} The entire flavor hash. +*/ +/** + Get a named flavor. + @name flavor^2 + @function + @param {String} name The name of the flavor to get. + @returns {String} The value of that flavor. +*/ +/** + Set the flavor. + @param {String} name The name of the flavor to set. + @param {String} value The value of the flavor. + @returns {String} The value of that flavor. +*/ +function flavor(name, value) { + if (arguments.length > 1) flavor[name] = value; + else if (arguments.length == 1) return flavor[name]; + else return flavor; +} \ No newline at end of file diff --git a/jsdoc-toolkit/app/test/name.js b/jsdoc-toolkit/app/test/name.js new file mode 100644 index 0000000..e88a51a --- /dev/null +++ b/jsdoc-toolkit/app/test/name.js @@ -0,0 +1,19 @@ +/** + @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/jsdoc-toolkit/app/test/namespace_nested.js b/jsdoc-toolkit/app/test/namespace_nested.js new file mode 100644 index 0000000..46cafa2 --- /dev/null +++ b/jsdoc-toolkit/app/test/namespace_nested.js @@ -0,0 +1,23 @@ +/** + @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/jsdoc-toolkit/app/test/nocode.js b/jsdoc-toolkit/app/test/nocode.js new file mode 100644 index 0000000..1cf99bc --- /dev/null +++ b/jsdoc-toolkit/app/test/nocode.js @@ -0,0 +1,13 @@ +/**#nocode+*/ + /** + @name star + @function + */ + function blahblah() { + + } +/**#nocode-*/ + +function yaddayadda() { + +} \ No newline at end of file diff --git a/jsdoc-toolkit/app/test/oblit_anon.js b/jsdoc-toolkit/app/test/oblit_anon.js new file mode 100644 index 0000000..8d9e941 --- /dev/null +++ b/jsdoc-toolkit/app/test/oblit_anon.js @@ -0,0 +1,20 @@ +/** 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/jsdoc-toolkit/app/test/overview.js b/jsdoc-toolkit/app/test/overview.js new file mode 100644 index 0000000..1dfc09b --- /dev/null +++ b/jsdoc-toolkit/app/test/overview.js @@ -0,0 +1,20 @@ +/** + * @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/jsdoc-toolkit/app/test/param_inline.js b/jsdoc-toolkit/app/test/param_inline.js new file mode 100644 index 0000000..09845b2 --- /dev/null +++ b/jsdoc-toolkit/app/test/param_inline.js @@ -0,0 +1,37 @@ +/** + @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/jsdoc-toolkit/app/test/params_optional.js b/jsdoc-toolkit/app/test/params_optional.js new file mode 100644 index 0000000..18bf598 --- /dev/null +++ b/jsdoc-toolkit/app/test/params_optional.js @@ -0,0 +1,8 @@ + +/** + * @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/jsdoc-toolkit/app/test/prototype.js b/jsdoc-toolkit/app/test/prototype.js new file mode 100644 index 0000000..1147008 --- /dev/null +++ b/jsdoc-toolkit/app/test/prototype.js @@ -0,0 +1,17 @@ +/** @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/jsdoc-toolkit/app/test/prototype_nested.js b/jsdoc-toolkit/app/test/prototype_nested.js new file mode 100644 index 0000000..e8ca1ce --- /dev/null +++ b/jsdoc-toolkit/app/test/prototype_nested.js @@ -0,0 +1,9 @@ +/** @constructor */ +function Word() { +} + +Word.prototype.reverse = function() { +} + +Word.prototype.reverse.utf8 = function() { +} \ No newline at end of file diff --git a/jsdoc-toolkit/app/test/prototype_oblit.js b/jsdoc-toolkit/app/test/prototype_oblit.js new file mode 100644 index 0000000..6cfc39c --- /dev/null +++ b/jsdoc-toolkit/app/test/prototype_oblit.js @@ -0,0 +1,13 @@ +/** @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/jsdoc-toolkit/app/test/prototype_oblit_constructor.js b/jsdoc-toolkit/app/test/prototype_oblit_constructor.js new file mode 100644 index 0000000..9248248 --- /dev/null +++ b/jsdoc-toolkit/app/test/prototype_oblit_constructor.js @@ -0,0 +1,24 @@ +/** @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/jsdoc-toolkit/app/test/public.js b/jsdoc-toolkit/app/test/public.js new file mode 100644 index 0000000..35d34f6 --- /dev/null +++ b/jsdoc-toolkit/app/test/public.js @@ -0,0 +1,10 @@ +/**@constructor*/ +function Foo() { + /** + @public + @static + @field + */ + var bar = function(x) { + } +} \ No newline at end of file diff --git a/jsdoc-toolkit/app/test/scripts/code.js b/jsdoc-toolkit/app/test/scripts/code.js new file mode 100644 index 0000000..e9d7ed2 --- /dev/null +++ b/jsdoc-toolkit/app/test/scripts/code.js @@ -0,0 +1,5 @@ +/** + @class + */ +function thisiscode() { +} \ No newline at end of file diff --git a/jsdoc-toolkit/app/test/scripts/notcode.txt b/jsdoc-toolkit/app/test/scripts/notcode.txt new file mode 100644 index 0000000..fcd737e --- /dev/null +++ b/jsdoc-toolkit/app/test/scripts/notcode.txt @@ -0,0 +1,5 @@ +(This is not code) +function foo(){{{{ +( +! +@ \ No newline at end of file diff --git a/jsdoc-toolkit/app/test/shared.js b/jsdoc-toolkit/app/test/shared.js new file mode 100644 index 0000000..e1c277a --- /dev/null +++ b/jsdoc-toolkit/app/test/shared.js @@ -0,0 +1,42 @@ + +/** + * 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/jsdoc-toolkit/app/test/shared2.js b/jsdoc-toolkit/app/test/shared2.js new file mode 100644 index 0000000..3f7736a --- /dev/null +++ b/jsdoc-toolkit/app/test/shared2.js @@ -0,0 +1,2 @@ +startOver = function(){ +} \ No newline at end of file diff --git a/jsdoc-toolkit/app/test/shortcuts.js b/jsdoc-toolkit/app/test/shortcuts.js new file mode 100644 index 0000000..f738f1e --- /dev/null +++ b/jsdoc-toolkit/app/test/shortcuts.js @@ -0,0 +1,22 @@ +// /**#=+ +// * { +// * '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/jsdoc-toolkit/app/test/static_this.js b/jsdoc-toolkit/app/test/static_this.js new file mode 100644 index 0000000..9407b20 --- /dev/null +++ b/jsdoc-toolkit/app/test/static_this.js @@ -0,0 +1,13 @@ +/** 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/jsdoc-toolkit/app/test/synonyms.js b/jsdoc-toolkit/app/test/synonyms.js new file mode 100644 index 0000000..09066b9 --- /dev/null +++ b/jsdoc-toolkit/app/test/synonyms.js @@ -0,0 +1,31 @@ +/** + @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/jsdoc-toolkit/app/test/tosource.js b/jsdoc-toolkit/app/test/tosource.js new file mode 100644 index 0000000..706d476 --- /dev/null +++ b/jsdoc-toolkit/app/test/tosource.js @@ -0,0 +1,23 @@ +/** + * @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/jsdoc-toolkit/app/test/variable_redefine.js b/jsdoc-toolkit/app/test/variable_redefine.js new file mode 100644 index 0000000..2c07da0 --- /dev/null +++ b/jsdoc-toolkit/app/test/variable_redefine.js @@ -0,0 +1,14 @@ +/** @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/jsdoc-toolkit/changes.txt b/jsdoc-toolkit/changes.txt new file mode 100644 index 0000000..b0acbab --- /dev/null +++ b/jsdoc-toolkit/changes.txt @@ -0,0 +1,124 @@ +== 2.4.0 == + + * Fixed bug that added mutiple symbols with the same name to docs. + * Added support for the -m option to suppress warnings for multiple docs. + * Added patch by brownsea42 to support quoted user variables on the command line. ( issue #281 ) + * Fixed bug that sometimes caused links to events to be incorrect. ( issue #292 ) + +== 2.3.3 == + + * Fixed bug that made all fields declared with the @property tag static. ( issue #262 ) + * Minor fix to better handle trailing slash on path to template (from jwmetrocat). ( issue #237 ) + * Fix for @memberOf when applied to inner members. ( issue #264 ) + * Fix for @memberOf when applied to symbols documented with @name. ( issue #260 ) + * Applied patch from kunhualqk, fix for bug where @link to borrowed member did not resolve to parent class. ( issue #218 ) + * Fix for @requires not linking back to the required class + * Added experimental support for @constructs to have an argument, the class name, when applied to a function assignment. + +== 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/jsdoc-toolkit/conf/sample.conf b/jsdoc-toolkit/conf/sample.conf new file mode 100644 index 0000000..ad0f08e --- /dev/null +++ b/jsdoc-toolkit/conf/sample.conf @@ -0,0 +1,31 @@ +/* + 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/jsdoc-toolkit/java/build.xml b/jsdoc-toolkit/java/build.xml new file mode 100644 index 0000000..bb845ce --- /dev/null +++ b/jsdoc-toolkit/java/build.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jsdoc-toolkit/java/build_1.4.xml b/jsdoc-toolkit/java/build_1.4.xml new file mode 100644 index 0000000..ab408a4 --- /dev/null +++ b/jsdoc-toolkit/java/build_1.4.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jsdoc-toolkit/java/classes/js.jar b/jsdoc-toolkit/java/classes/js.jar new file mode 100644 index 0000000000000000000000000000000000000000..0352cb180c120868ddbc31b4f8e7319d2f26ea62 GIT binary patch literal 819369 zcmbTdRd8Ivk_9M>nVFfHnI&7y%*@PevD7WHn3cWkogG=3r%q-o%RxZGgZ<+{it*(Ae_#Ij0S5*NrXZy*#w4RC&GIn;2B!Q^C@dJ_ zU#OJLl4J5;X!GBN`FH&rR6$HpMp{ZuomoLzVY&f+fE6hOg3cWD4Knq}wt zfo-7rSwk&;i-1Tdezw97tr^ay^U&~aOo+~Wf%qxuVfRSB!0abj6o0bK!&F2*>DfLE z9~3=9#a6>SRwe1~uLH{Wl;N00|LO%882o>781k5d~NLQP5uic z&VNGMns}PHnYr3HyZ^gQ|M(gI;{NR+`up~eFYvGC|J^2cCntNi|6(ikf49}#!qmgc z%EI-(u)+2}wqfq%VBqiA1WU`r0vq+FbAOr|6$Qu3j>_=)x}vvoy1t zH*fETy|WKn0-pf~Okgl~H^k**GHdZ&kZ@KZbH3KDsaap!$D?WM+iAtqjPof$Zmd4$ zP$qJ;2ZTKF0A7~;kf>40$EM6#w@)ZXW?5K}3!2h5*aH{G9@_nJ(%i&bD#7W_JhVG| zR3q#=EW^$*IU|crqa;>99q<{t&Oa&3iEVFl%Re&fq}?YFK{)sZ@SGb)*+VjfLivs= zVmjU!hI4yB8i+om6za_ul_&Ge7uXLlM8A`RJGeZnYY*a!GI9%283KII0#sVi`FPBz zyKVS!aAzw7<4C=-ouG@$vnJaW$A$&fbpxhkp*7G>Ai#g$ zUz2G)vtU(?l{kZY%D>TCuoMekHt|VEM~z{9{DmXaafzpSg--Zfy|T0{6j7m7d%yBo z<2V>>o$;boQ=KNe;j z$IKBtqn=}9luT7eFc-GoQ;|<~7`Vs}VB;p*QATO|nbsK0pdZwer@_&BlkWVw$oEm$ zKcciOs`oX%$V^BNOiLI3hz)bVg<>$NOjY4-s!VYnY?IVayu<&XJn)!;$F0er+tek? zSYZST=6SVornp!Qrun25Ac1~Q7m$G7%ahZK9b?*g4x>)SzRl2H$Sq}hsEl*UR@xZl zPw7ibjo?>i*D>VU>Ipf~7(B(}S*kQxbOn19iW88_&$Fr#aR1b4zK?Fq)tGqU_^n>b zjCN;*=hQfkHwA}lGrDT8;xaoT+EiNlt08VS8xg9^LVgbyMmAfvd0m&m^q#kcUa(V(MkD(UX7uhmNnV7MR>8?J(NVwA@87WR zj8w-Elmnh4V}eX&`mp1Kv=|1i2rSzi(uv%yuK&>P6XD(L17a8%@cdcKT=}SD5{%*B zfzV};TN~rk4WMjuX6;tpY6C;e&sy%cGd@dcxb_Ugup)~^b&sDt-1s(r9-Zkfv*uS* z@&r01`TRHM-L{H!IN!!wqx?uX#jN#EOa$NKBDMsazMksWN15zA=eBBTG@V=85wvt@ z=Hxu~_ob{>fWz?nzHEoe%Z9Xq&dOoh?&t`uOMXR=cnH~HgKJO+nxOseLu4pa9 zI^F(}onVzrt`*`VsK%VDnPX+YU@)=7`Z!`4E8bD=7qyf45MFFf!skejxQ1r)_6yVI zKv#M?Rbjg47ED95iEG()?C92Irh6w_3H8L#wsp0Q4+ax|7x&yguC>`Y{E({*Avw%D zGW_s?D^BQ9ia{*@#+W3)ZjnRs!0+s>2Y77YPqaMp)FC8fxU?&uPUjEUu*pQq&!QAn zazEvQwL9&E{9vQJ690{wpH(o=<^ENoXY%%IBr^qStWm^ipWkV1PL17VA(|a#Et$5| ztSu4yiFm}A(8}6{AI5^I7h_V~2oKneSMX1`)1sc;8*rR}yD9m{KIq#n1ZFh#;*SFQ z*5U)6IkoUEa5lq!1&)H6<}#imgttPh$C7sjTp6epG+q6#pZoZ&;n4KBl=H?=o2&H) zwwKW0CZFg013;5ce9uyFkZ5&Cfkq=&m|lJS0<5gi_FC;PI`}LMA6{P~5?yH{>-43o zO4FxDc++O?0Xsi@yG#Z2B*<^j z?>$^w=U8?H$h$`a5-OF8hA5lcVShNWFD#tvyDxAJ+<(}uoxC`sqjZXvBBm`V310>b zV~H%O65bA>tkPk-a$uACC(2qnBZ~_-Z zq=Se_+CwD43)QGRJf8VwCOW0A;2-?cT+C>PmeTjOJM06(;;u@D0| zry{@0b}f>z$@z1Q6Xlxs3Bb^?JvP*j0U?4dz7+_V$z#X$9aPNTrRCJ@F_T^T;dwcw zMh1BFS*j#6WLE;a`%baEAby6*_VdNmnq_+u$$F6x6W=p+hxK@$Uc)1^2yQb~zu$=5 z&5inqum2n^K=?rUS26<&hVYkdti?2%Z+rm*8-f4>6Z-G!^S@CB2`5K)3vYKV8^^ze zpOTG|?Vp8OO~GkV6gA+Ym`l+BAHHOcyBP{1PHhc3jQ4v&-}x6zO5`YF-j3fBI?mmx z-7l!0@N`i9UtEsAl8tbu@P^50-cQY3Pi@|HWf=ALeuB-77C<4a$~7#DBWz+bn~sXZ z@aV1$=SKg*N^iH>Plby#u_2^X9H{>lcuR&0<6mqs5I;h`454HF1Mm(v*hoAvaF*3R z4F>&YA$t;tju}piON^pU{Gj$rhFYdiE}4AFqO?Pkp3a+6QQC#k^}0$OSRtHhQ%tSc zI}|{#R*}cn<$*Kw9JI3Sg{WX86=LF{+VK`mZ;sD#+3BIqI9I{Q&%}!P z{egC@c?^%32~yqx6w=R`++CgFkDPZZ4b(q-j_d#469oRRLG!QN?m~?~1M`z<-F&c7P}Zkr zS-5CG96uil(^iGpp`uGSLD!#o911(tV2b(6MUn6)>}&Vn$xQmvJRVH%X-rVKQMSuS zU7+UdI;ALTgt(>awb04OHQ!0D*8Qf4$U9^{#BTBdI&?ZBJDw@~)FE_Imb@byo(kHa z!%laFDW)0y2wSPK_%P*2VSCX&bE&$zY38_|yd~z=!7m5uC#mk3XE|Oswc;T4G z&$zv!eZ;A6pCnejy$`ExC+bsV6^SLu;04Bp{UKrHyL^Y#X;QKwoD2o*W*ZGYlWbRK zQj5~FCR?W=?QRoo?3R_D-FM|6`=EX($~S0ss@S$RNeZ}V2y87?I=rA~%67vS zUy7VXKR>o>{|u|OdNi5y@NWR^Hf1OOoPn>^i90e%yR~|V<|M>i4h{7ty-yDoh&YxI zUty;ZBX(C47w7GuO`Jr>&w_9s(0@8}VW_I5AQS=9qyb(sF{Gf!g#rEQ$t7TZ@WnoY;;)!tUaFm4RXGj(1RclfT!Y}9_ej)M!DFPSi0nuC%X#L{1$i@`>M z*5zuxV~(4|N1tlt*bG*LX0h>xV`0!Qc=ScJs8{EA&zt)OPj~Gn965`pwwR( z5udQK*S}gH5fkBI|IOQESMC9iq(#t(H)N0GAUHzlwjwMSLtU|&LOKW1wiGRL32CGB z1TNm_E+b-A$Id++-(>ocP6G+XN^MZWzhF-e$p~bJRJW&L8;0>B&IfO3mt}5j>L^25 zaWg}bdTxqHsm~Y8)%mNsyH)L3U$elnwB?hpa>v)xf010PV)+8u zHaBEoVL#3J#rtC(mP4(=#>*p_T7RHIm7*Of>*hE=?X7c)tML!@UlHhr7Pep-&fnTRhhqDxDtQ}ohA};>{dE_F+_0gBx%%g0$(67=CI$UWg{K1}m~7<6 zX=C9oIesoz@P;9E|8~&l)g@NNttZO$^;by&_|noXD!gWfT_LFx%a{!# z6oUfm0(yZHPN$3=$`!N<_USd7Zc{=`E8|3rH#V6>T2lg&P`1?C9EFY~qQSU0+oLtM z$^qR35_q}N{U<{E$pd_eOPEdpr?G!zBO(3BMqv1RSh_OuM*9}i-JXd1*d8IdKv`uBbYEGxURaeWk+{E=9t@a#{Em2dOP`cRZitoX<^d#*e z6(7OhmSH!SLNf22=kE_FC45wF>k5Zmr?f!hR?_raue`^N9;^}8s-IX9-v)_FwHxk8 zQV>;Tl~IO;}VwggUsRp{5<=P3AqQihI zaRXt>!0)7(oam^SA+vH`j1s8^3kL9a+d-y#>qD9cp?B*>AfVC*%t4NVg9B|u{rC=t zo7+u>z{$?k)2>kuIPT~oE%QMfC!S5?!s$ZHHx7IW9#^)l@B&jt={pQI`2pqQK+)l17`dUD(lP9Sd&BKR_E#=0!zwlX|^ ze3Jvj?rE{CT055XlH>a5Ag_z&i|QNh-wq&-N3JGFLm%QhT4AgtVzYEz7da`j*#HLn zO-}PJE!yaS-P<$y+4|?-Vhv+*(mNjhfrq`=aYw|mA$TCzpj1%6u{dIlx^=+WgSXxh zPi@w=Y1E+sFi9H9%W2o6{a{uPyA3yjT`bjv_!XKZNu+!c6Pbl++#!Lm&Z>Lg&r#>t zgNYAn^Veyy#`R5mD&Q+VG;0kA`jv}vuBZSFeuZEpH2}4Z6 z;mvED5x^%<{cZ(Ajw+D-qxH=_2(M5|5j>^*+X8cvgL|zZyMpCs(A)T&BIOH_iC!76 ztq^sbWK~8{q2M(Opt1fNL7VaGfQNM>J8+$;`1Hpqbw{0O^r*$#7xB#RU~jhR)h{-f z;Ke!xZ4~mKV9;~|QdMwa`RK?O6j-bQ%^?Z7RixE46j+jv=6X;LzN!_X^CDt@P`iW? zdDzq^jVO9xO$3#dO83He|`_8v7Qj6b9jOrmz{ zf;H))-Oq-_5bj9@AWLQ?YkD((4ny5yX_CPcuGmwf*S-B7^`|*xw%mHu3hE(0BofnK zaTs5PJ7gAN7zb0Z+7zOPb}&s{FoXr>4vXxw(mqH5mLvt#PujzL-%B>gWAU6C;#9Q; zxPb+EVfiabrTu&kjGB)hzic24B)yFkd;exlqH$}6CG;Fk8bseT3V|bpe4;cwd+P?( zt2|EwkL^quWd#485@J+^JLH7RX$T99F!A| zX`;}ULJ$|D%TuyoL*d%(GB-x!T2W2Zz{HRf&l@&q$-E$tIsyBYModN z#2mdhp_(G>@`rk^*8;UkK@i%lMM-FPM@p(#w< zEU&rTV5+yuPn!$Z6%fp(;?iNJV~Ezz6YSIYNGd?F?FxerxBf_VqXfLM^oUpleEte4 zXM@o89K4hTfuR?{v$J-^szN6HOF9B>73OU&WAtnIHk?{TK1<3>U7NV*p#Jo%6O|RI zFve`Qb*?TjmL+RpE>|K=tIh}<&@g_uO|Y~=vvQGC^IDA@+7xjs1_eG7+8K~ueajN@ zr!Kl;)sAx|zg00icUIY=YPjO!sk?6JyeppOSbgHmoOR07OtFQ2ISn00gMCXx+FnU6 zO14|4YLTThf3$sG$^5!Ia@k8YL%drJcdl!5_IV;l7FQQyn|jrD)|k$jyUrDMtZs!u zfoCkgq)1*f9Nb9#ufWzYl30S^95^xt2t{LgFuN_*Y3eft}(7VzHZ>fw8sw!SNlsMRupUv9$+X)S(fWvewB%4qP;5;pbr%9G(@| z>O0))d|PM_rQMsjN9IPS9?i}DcNZ;ggwkam5$UFtsbwBQIICvnh{7uc)f|aiczR{? z&Pn6Ccx4nbVU&zmpb8M0Uth9IT?&(VTiRPs-HYtkV3S2pwXkU$$BJiDL_TkpP<{i8 z$>zx{B{BLC0-askplW^@BNjE@7=NP%1I|r$TXXGIQToAeJ?NaoC-DNbE0qQC!=)wD z5SK~-j7B{63z7uw=HP_EY0=!Dh_$Tu~?S7&1`4h-@n);;#l;DZ=ekoUHvWn`)>|G4ndr znBUgeIj{ckB|52?{fVysi)S`rsOj6NG@N~ZD>KgnW9?`+M+{$uPgKz|SIa(Y#r_VO zm6WwpTpqu4iY3dT+i&wJ;i?4Ob>ZA2L{|~slbLJV!HnS$eG3>t1w|*}^^{6EMMpj< zWu9}=6HU&A%KedwF~uq}q3TGP<- zqPBp+$z!HX>xldahm6~nPwdc27FUqmQvb`??6a3uec^aV9eM6$6n`U+u6)4akyOV~R6kDR{dy(4}fk9p9%(+D$3t2!oB@V9pgucXJObR(=Y4-#O< zd(G5FZZf zbQZ!q8pBz&U3}4kNfRuNTw8K`Oz4fW6gqUJb&VoMx77;vfvDD)G&TmWk!ohEbwIxg zjeS(7Xi@qe%b)f{5t^huD88y_Y=Cw_(_oT7x2j}proO!X{t!lU>UBDcg9k!@?6%p1 z+@ZaZUN2V+Rv)lb(p>s+RBw3NcwQYexGZH)w@*Hr2>g{$H<8#%C$}Le*NWV#V62D6 zmg_a{?}sL!n?dS{C;)695@0?iJdqO7ty_&eApEq+T^pACIgsY7IVO1BaBaN8-ngOR z`{xdE;UZkT@!QkIuQ*?S=B%CR(MLpA*|W>~ZK+F>cVZ(rKPYZc6RewnC{E+j!d==l8njx)P(Hhe=esc#yq0{lyha z$pvSV0> z{^zY%NgIcM)n8-fRsPXkpUjdyLES=ozy117D-ik$iu8`CWoRj~E2#u?_nXHmb)vj7WCppcmt6=Y$Y7wg}D|1=A2p|Snwsu?m7zodmY9?BqqLD7) zr!De-F`wp9V;u2sxEP}AP{p-!99^TmUm6+6Iv%s>5O;JufXw>{&d8idmcnlT0sz2w;he1VBn_`or#sym$EU4weYq9xd(o@B5xZfexjwfyU9L$9Imgfs(;K#Vn!G0+8OF?fov$a3;*0lMo9>3bG3PiM z5*DxBY!+=&T5xWW~4Bt8)wYw0A6wDJ7I^dK+mvx@ zr*IC5;P@8l133uc&49WK;ukvz78M*a3%*sQ*IdW}pU-J5p?>k3g>%d)ILlrfK*_&# zUYr=<0G02-WyV8NDpwCO4e-y(=xIJASi*#Olan%mtA0&*l`sheSPg7R%iNLv7Ips9 z4hdV(3kcc{W<@csALz|`2YxS*18W60#--5svI1_5ISZAq@mL^?Di~g(3<6f-VZV&B z8V>85qnH&A_``crwoX$F$a(|)+%Yr1iG)1-yCIE#B%b`XLG4>;FfdcB|IIc1ABXbq zl2LYb^7i?cBiW+;Vnir~{fRAqYGR$3;4RH#D#YCq?$dBEdYT^$&_c-vCJC5JPo{r(hWorJP|s zu?XAYUD1||)91Y&oZHbUc+p4l2HL;&cbjaDuDxX(d?6-|*&`F2>LrfeQxPoPn?+k9 zFWPgV_791q@$m-Od{pi^p;eD^Xn14KvK`;Re-!NH!RKn-ItAZ1|GqJpOt6xj?10z-x7x_ANM3_-2o2*QFmGeN2_=3#mcUG!IF#GO0bbRaPW5Acs$a6s zj^H@Icmd@nIMzy^n9$J-)drP|q`GA>R3*$eU~Ps_XVN5U$tjL95#8w53LiRQ?If7C z^;Yiv1I-&0Rpo|tRwOT=D7kJ({P=74p=e|ZHP7T#HeG!KtzV=?W7*X&vGb~H?kxyn zsAxdr)=`DvmdQnCRnlh~BV*Q@rnkKi|L}xK&u#v-V_OR&o{za0+VD!rZnWZAH+RCk zA5~_TPP*YaHO;JWe#TkMj)_HNOw2KU>bgyax%#U-0oP~x@{NYGI+(k7Vrj)D5#F?m z``5kH#8$t%W{+uC4su=k5&=a6J2jvv6)1^kV+Dj3{Df%Vq0h2B3xfl zA(QW59aG(UMITYK0NX z;sYVq6BwNcp_&V*YLFVXv{#)U8BA%Hl@j2tY!B&I)GsSc=|>W@ALbH7We%oJq1Ok7 z;HbaDd}`bl0@7|9L$uVp0IQHII1OwWM2+@ZZC-j32CwzGCcy&gU2#0>UD0irF_qo~ zS*L}EQ_X>8Ca(AJ86AizaX{eMmW+?N_RU;+sc(?*_A0w~6~ODZ7Vvc213 z#m}xT;tVL>N+X76>EX6##o;Gjy88RoO%`RZ*W{l}!!J5}_lrpmtE#mY@k<_faaC%D zC8iv24+~P}4yC}f1P!Q_+#Pa$XgVF^$M+JPc0PU)jHyw|P*pWF4Z{qya--%WD4vd3 zr+ZO4kFs*I-oh&d9SMG-S`&(z%`2dAs@vNARfyy~vNTTA7aRlCW_^+scD{4f_w+2O zZH7I)`&P)qaku*b} zla5#Mb%u$VEe3HeBae0J$5>yuTgG0kK6|*KQiy`NqzXg>(y>^x**&k9rmF4)^_!hHO)}d3=?G2wL_f3PIieXLz!K3k|S=Zc&a63lCvjLG zYwLd{@}fO;k*axAEehAImLNQ`7NubR3Td%r0?w(HL}z6ydbD*uy_7f6F`ZT6mg4ra zt!I5uEmY18=}+NxN^amLZ0GlU*G#P;Y85PCyhN-4Z``@rUJ&?dA%zkxy)qfxCyqee zxz`bUV5;et@E+QL>Xm{UvRB20C$;RT!AFgVA;{Dlg5i_GEKv`521V17rwd3;cz2%c z5dPTAo@Yu;k5K}6JS~g^3N|`BaI07fP5|K-ERuuEwy_ML2qe>1+Z2Fbi}66q-5>20ouS}2kqE`j5#1K8w=-RP0g-x7-T2$(VyjvkxwHXDRw zj*g^O#$n0oE9t2gnHe)pvB;gk(-GD|U-dJuY1XT5%pH$AuF#en#AM!F_lBPwTH{=K zYDlv!N|$t>!f=7;6h!lf))|t5BF9(EH{62?i<2>lRg03@W)S;&E*gkCUk8 z6T<2!?({`WCpSNcFvX0x|C$`qB+nS-w=X0Yr`ulIe1(QT)SI&#X;Ap=Zsdp0`)I?I z(N4S`c&fyW-((v$n$h*cZp0?U^W^)HKt2>Bg2?U9=kIg19tR1OMqk}fo_lFgKrH1$ zzL|NY9cc0UMp!A&A$u$;F9`pU+v3{EB2E9DrC|Hp8W;W_tKI)7qtYIZX6`mlj%rRG zu4WehQcG*pw&gaJF+aBhOQJJcb$QyB6)v=rbVFDrm7xb6P-!p4P=DhdaOul9QOZdD z$?{jO$HZ(M?f)nTb+pv72Fx`IX2<)v2A*W^g5E#e{y_BM+e1jHBb}x%-_D3)H}Q9O zX_+cU`ye6Ur{cy?o(~Co9f=j2WW49}3WuJ_jvrjj$)V@6R<{-MI&aKpz)H;WJ;rqp z#Sg2T7pq`W&j{~cKz@nOnJw(*4O=&#Ly^obW+LN*aKm$5uuI}wSH)F49q(J0F(ZR` zZL6m${wBiSd|s5|MpCHzQ{7Eqqb!ra!)}SL(F5pPhuRkkj<1Q^=luHV8wfpzk7R8M zk41Hk*g}?05FvOwpyV=V7h3Lb}~-xX!CRN zuqH8$LdfbV!RBLN4XJV0Z|qMqfx+RGEe_Pr^>9zPU-LqsBhn`MOgh0g_!ppxeL4#3<#bpg~p(nVA&GovgaKk(aE}Uye|NUcd)N>WEmN~3v|>MaR@S3y(M_L^%dyFOV{w07 z2r9Vh$btgQWrQpWZZ-MMcI@(<2%Kz9&jtndBJSbVzTV+0GBhLJTYT$x%m(>6-C1al zL;;#`k66t7@zU;EL%b4{^Y;z#F#I0`+cF+OVIic6geM^}PngXvKp=Z5uI}iJQM#f5 zkqkA>NCZtCvQZarw(0GZzDdHwuq~Y#TeJMuw_W+sOLsDYtjc89@Jp~zWu|q+{`JI^ z4@x0BJ&cYJ4NK*m*ca1U<$|`-4qGy{aV!KiWXvnbQJzay>uB+Q`ka=qwjTN z$d>j?V#gKoe47wiXai}uLrudMn4WrC-VB<$hO*wByh`dG;TXv;TXGpFo>T*MiS~A- zyg_#6IoEfpY_s{CkI@7AKS1iM+=SI6?&wJNv`kcrAXP2e3nDI&)mYwDZ z2fxF-qp~5E@pMZtiL0QBG42I{WAlN-Y~_UN4qs(LWF17Gb@dGR~-nQ*=}u6LBN>x(ujt`WK)ydK}ll) z%kFY9hHLgsegpG-KBG~SRNgI`+&!zKsVWFRAKdDvpRACm9 zB6-RwHVxK6*EeodEr{c!LMm#DQ1{T=yDQ^lPU_xh_f(lO1cfu$5 z(qg&J_V3#fT4|jg6*p}Dh-zHX%b%|~&BSUe!)3BtH0gocvrHm1azRG=Y{@vc1QYi} z))7iieu*Ay5#*1h^3&>49QiQcI=;wbhp0BWqwu&)q9npY@6hfUr+^c(ilR==DE|d+DVaF{ z#sMxE%K*DB<0I-ih~9NF!aStn6n@s`yQ}K!eq}*V{`cjhO6Jz;B)D&_Kx^TH5_pO;_7QhCHUOf_%`kK;c3pn?4>Da{*7 zn8;aYxHdi?kv+$&gro4BM;K6^F^C@dLf&ZAb_U3`G*=3TFl%k^S5jSjyaZRFQ0$-U zReTksw5Ub-#RVq#F7A#rBl`VYqsS|)y-&T+z_8FW5g#q0M>9*`UT56L=3YkwvZ>S_ zQBx+uwl=eN*@c5r)I*y;&a{5SX))sp8GO|pk%53q;?@Jk_K&$X>+aA}8f&@mZ1Hmj zGMXr8_)Ykubf9ajGG$_sUcv2PMf-F07x6PrKBcS0ePtp;lQGo1)q;_3N~9avQ3$K+ z9m(w5eMzOQUn`M;tDEg|IzwW)-qh{YOq}2jIHh*P`zP_VpjYamSwBr;^iuhxoik_m zp&!=J3Uz0ut!Ra5#VqJo*E%74&YPD-yo$9No&7bK(ail#l_FAi4vv^Bc>#b~iDz zlXf+6_-7rT*3#4ZJK^?MrXqrk#Aa;W2yqCOh^L#1))h|6Ty>LQXvsCB)`A)PVK^jmH3AeMyX3BesiMA$q=mzDbI7Wz=ax@DWCYY$w zI9sZ*S`aC6fXtN$FY2;fMHsr4>f!+lb4(u7naYe((wWpFZ8VfoVYOAq-n!#QOW9%l zp=NDAovm{+^%uq}(KqPH_%DDh_GwPMOm zm-F|xTp^71^zV}?oXSNY!c+1Z5WA_9p%C<3$$WKROS+f=*ir8q1gjRRR(fp9i&W&b z$}1@S=m~yQtEIp7iYP}uPcc`WKH4~dXuyrMq8ne9Q5&BNoYk0`Gn`K$`pO{PdLXB4 z=*^0qB(@$FHvRdP$@ey9kq#}2jCn5D4cw|DnvCHVToKM6Qf-fO1BxFF%^R)`_Rtv4 zy+DsNUMBb<3Vv(A0nZMci{Am0yjG30;AMpYf%DkFS!JWGEW?mBNuCs?+W=0dj7L*;1#|lDqmQl))QU(Ii+M<+a!g%hJ zs3#}qg)52a)0^Q|74U|1RXSsdHHkjx{8jL#(NAD&ex#cuok;od2!+{&_dq(=Ndm_) zK5X9B1w)`Vxu+|CTAq=1l{fRsG2{u}qLHXxbfxn12lf}E&=su^R2V*87 z5Z|z@SQxnaTlr1yJWgo2C()M>;|LOS`Pa<79%YSfH>7*R|Ic3};h=*AU<8qfDIBSa{?*t8@d+Sf`_{Vu< z7D7J%-L%g?WJDY^3n7`mlRn(yU|=l&8(RBME=z#mowWQbdy_IK@gterAt5=kYbdcf z`Mw+#HC&Z-4W@NiRax$v1c6LaW-;t}Htk}x+KGGTD=t6DcD9-*oK$JK{MuWIUvHi; z4^Nq!Th=z;)8{9rjhcPc{_30H$(Gyf!_M2NQ_s`kBA7B+Zgaodnsr%WwBALBhj3eF zM@uje``Ynvg_@ap?>gLbY!KMKT)Agi`$yj%M4oS)MMSvao&c=TZ+4sSmx>zKuioPp zz%)z$%72C1Pm5z9=mm$v#=PHAkA$&xe!Su-U_T_+v1T%yqixZ{f zy;pYSjJ;zzI=ffn*@YxhwRgqc1tDTJOw6z|UhcJi=hzjA_tq8ScU6zgVybzgaVspa zw2z|=|KxV@#ZhRiCbIpsMS>&n2j7P(vv7=&<}DiZGdxZ_{j)an_23_ULgS5iy*s!F zp)siiKxF&1+HE}%c$YC)-l1uH$k)rc+J;*VN3@Ev_P|VFk^DIxbMBEvu9vaiE=RyYRHYypa9OKU?Jx~$&iN1dJ$rj5wy$L`D<;`Q=ok;`C-j<93*;y zwIqSMBpC$dd$2>5*@xme4%wlm6h-u2+z@@xK)kUY*7;)%P|EAF*wakySLe#>Llpt) zTqJ88=>c32rAv><7SR+L3k<}V)~fm}M3nJz{R)qZ5or{cD>Y1iS7U+iaK{!KS$ZYU zGi6jpTYYUopoH8-<$21*>Kwms+sN1AbJT3#-pU@&oVwD^mWImywpzIUf_SaG-a=|F zUKtX5d)wRP8k=8S=hh6GE9w;4g|jPl`g#V-OB?ESgJkk!*#$G5=MkmY$8#ad349lN z%VQYuSKNCjk!=a0XxK}VW>-f!^ONGB`rdcbPtPDhR0I#I35^6O^6o)82;O0+81QNMu$y5pGE8tyHtRW$94EELg__VfCqN}`(ghn+ z!)u0vDnVHdkC%xBfowEcRhUB|SN6IMrPgU9Py?0o_c<0!iK;s*V)xFeQ|rmGk%jVo zDFPS8Co2})gD^jo1*h>=14Yjv;uMk}WZpdHwaY{ZI~mtng|Vf}@w@MvqAUf`4AGDY z^vK?R$7f!bs*o!yBS{XLz%N!<=#2;Ae|5kb{H_MCjRt(-(xOKU3;n=#Q0cVPN>;^n zXsjP3u|a@=8JU6mVbB`G8G#5mx;a=+L@8@ErB75g1sKYbk>3ZpkZnIxB_f`inI+@7 zKz5q3O~l~A`OA!3%eyJVm$k1ZF!T4TlrHR?37svQ46OKg$~ zKOS0!VXk)jHj|O&`NB|)tZ-!92dxn;-Mfy<9x7{EEfK3Mc9k4AKrWJ&BHUV2$Bg!h zvU<%L9ODeauO&*UsBV9PMOlgSG#b2j1jCq$VEHH%NkUQXDyY(K6IWv_$K$6~5Oa@b z&2mjin3M*!i~Gf)n&uu0tWC$5s9MJS4G({#nB|cSgP4bp#Vt8r(Hb*^Hp*5+LRa$y z=nd@UCDIgI-Uf|7L(ASV)fTQ|cED|Jg-Cw%2jS9$VU``@(04%uDc^Bs*9_craA8RZt=Tn2aMXE86+?* zJ6bDmS)SYA|K@WN=0JpAHIRcLFUl(#b_^&{Rv)em{xkfO&NPHx5pB3KT@p$$-(b%? zyU>(PQFYi{j0pz2(zKFS18Z@}U1JKBJr? zNVhxL9aeZ$CD9fABngM(rVheZLsgW?`z6)ciE#)a7DO}XjY?heBAqZ}Q!q5M6#PSz zg@uQQD1> zt4;JNXOD>DV(quZ){(-TMQgboo2gq>DMq#73`&NE>|stb<0Rou+UB=G2GgtU9CurV zn*4orK`axHHnV!yk0y1OR_y{nN}()Pm2&}o<*;odWP>!;39M?9Qnlugu0}S4?I{@V z%3LKtSEUT#+rU4F#<@&qnnOQBVTOTJsDh?{j9yDRWom*8mju!8P=0nN_72qGjx{12ybHIZ$J> zE_8{n8wpD|n0gxX%>3%!aE6*vQI^BQ_EfFc-}IdAXwmJ}?%X4`M%)Jq)v(aeG$hmL znbFv=W`~aGyTlxkgF<_&ZmHiTuw1BFxu&V16%%c+zv_DeuPWP&2uUTx1|^tD*4Wb!1^CU|uRreMdr@v-E;x0IEplut$aR2tEU- zL@>{nO4w)xm@JfgJBogHtXv3D zV9tB9ym;!%uOEg^7Wn5FA@D$PL*t|mYF8&QAh!DN$U%0-YkTf^B;S&5h`=}Bu0v91 zzO$QicY=Jo%ngRl91R)=pdXC4RsY5zjqF zkKV5lPtbXBpqn16`Yhi?v7v&rg$q4-F&K{%{T#zINwsRO!xwh>_!qB3u~p-vFT~Rs zt?e=GxZXg*R-y(xb}G#kwGtZf&!SmFl#f4FB?aMO6A5;7Q{$*w^g9*ex`vw?RtQ~; zDUt}U?;G|+Lcsjh7s}j8sh2gs48(2yQYZ!=N$=V#ST4(_ zX@Md%9gYF=K@n-#rLZzC83(VKhjs$00ELA-uuRsp+()ho%GL4oaVZSJ6kkL)be2SQ ze=>el(Xn&TUfxwYM%Q-f~bV#Q(%1HJ0`dLDC_#sXplsi4-I8k(jN z2wqE5+-pa24YkSDRHLyoZN}S^=5CfZ-F>Wvqp^pQoG<%4qN~b?7*q!Vtlt#9uE-b^ z?UPf_#4J1t3B?z6!93G@hHq)iz1!DP)>B_7T0J9MjOic{-niJSur;;HxD*D?8$Ij6 z@2!lBi5m*eoMAlJZz2hi`|U|K(Nwv2SKgZ-aH6a3y28Mcg!Ad|cy!$RA#DPnsSO6j znRibc2;GG%xY4kPI;>_oxr^7(%(Zoq8Q+atTqgVBqgjuN!LH9}fBW|jLyIU&0Pj6% zo-XXg6|Q!%VpglFDmzOZo!%Z>lz}FL@>(`rbn=mqKXg-n;Ista;ihFx=`5h%8h+zl zUP@kSBUqi-jcP0#EbzNp%%Jlqj+-$yMR@( zlY`O$3P`8+I8z6@6Kz2!fwzIGy)2CyUW#^K1WmOYt3Z4aBDN0TOr^ zsP|RC^Yota9Hczh9lbp(jb$|yC!M}RHEnw-gd-;O7%)WAD-pt$$h&-!Iu1qf zX_z%^xIwa87&IaY8&x1Fd9*_%inOX|HYUt*QAFO}I|J_TofK|!n97S@6x#j>GUk#n zlc_UiY;MBvFq zC;uI0@fWT9+fegcOdgtVCSMPlZ~UKS`k!U;pJn!E=|va*PP6!{r|`XM@ppG_*KXgf z;jhD%(2g~jXTtI%|G;BJ-%Q750DPBBqPk1Z} zj4>R`n9qdfSxsrlV=(eXxU(JCm`}3u&8N4T<*{Ksw6CAcr>i++^XfsOa_~*(0HZya zlQ~IfvTH6|%RqIfF3&v(m)rrh!=MB}2Oip}x-n%>;iPJbc|CM89a| znh_^dF>2+Y0XsNLX$!)%R-PNz zocoy}!EW=G+}U?Mo{<>5&XVg*7qbO3>w#THR!|H!<2rQ))Y@_>7{>w8^oT%iv(Kkn zHf6#A?358joczMykC484pa?4vvbqGd%7lEUF!E~gVCuuW1ZDbr{ZJi0jgl7-YMd2~ zgEGlJH0&#}uB|jJGnORdVJG@cDSE%eVo*#UgU;I&G1W^(Y_A$M?F>G98;r_Qrf*%DTN;%&TC?it|?$H0LrW&Zs3Nx;c!3^Z*C36q9tov^~vK*e`983$?MLU84FP zv4*3L@JkM~%HpZ0xr)iIcxpRr7F|M{clE4xF?|{u*J}lt{aoI1170gFNu5$g#!=4S z8JAV%!&V-#Rt;hAX8EbZ-r3AHt`t6Xva)sBvsN<|O`J7b)@xFj3|uu5=8qfNEyT{9smm6pEmQB&cH4_Moft@E zN}~B9;72VdgsEJ)?Hp$p3415ekfUARCBtfi57^#5ZYys=%N@^a$L=mwTu?0GC|gkE z9JY`Uq_Wz#eZH)kw{oE@olapbo3_}2Vv@`$9-K~j{`8Rj_$zxvf&KA=0HmjoxI{0nKF#ypG;E5TKiav?P-N8DId z0I|c8y8{8)!})1-WuYVO@wwM>0_BM0keb0#ambWc& zuzOPY{hd9-t;l%D%G9pA5{#1L?%J{Q6x^Y?ho`2a6z#q%mG@N`v6h6aq+f^ZU9a%G zLo-bS6f?v!%`w@U46KD8e4q}?8#&}R8SC$`EaT}c^5KSLlFSl$vPo{cV{Sb)QE#7y z_UI;OAEx@Q(Yd89gF0%mVaibt&K2tc!+ta=YAU1URKyjS>ENcYFJ2S!Zom_>VFg9@ zRV;Qk-oiubz7S5?jG1lch$Ozg9hk)KEMl)mx5oM{!s;ajxz)6+;sQz`kIyEA)|tLx z&IOzWfON|gpC3&-a6M{FIB2O}-uIwrt#V+0r*fbGx@@hCsf*q`k1z%um9$A4 zX>>_zQWtuvR74YH^TG}O1y30YUfcqMlUHq>Gxv>B^O&)?4iJRJ9yKV904|Cbnp%G6 z&Yrzq{3aD~JzDcU)7m5vr^NwGHlp2BC@TSz{=nD=o?G7+!04j;t-O^?xp7KQyM0Zt zflNa3xIvy4AN1mBQ@C)=ybCdF#hYFAQCHlT=3n)?*D2L$2mf6{TQ%v5-eVrfoTdts z))TMu&aTWf<6_He?euF+L?Q4a5gry8gc1Ixji9L3LCos|uUIxrn?bAMWvR{K=oyC1v9gDZ> zChvodE1J1J>=}K4)u$ z!&`Dg9CrZRaNN@X;#H_4@y8|cZ<6)?OSK6n*Du^d&e)aYOJAhk*^0U;= zGz2cE>js@bcSqv^4yV8DZ&W|he7N{K)ssT`JP^G*)2x^bvthhGY1}zMf4aEqxVK-f z|H3liwjzQ=_j^Uq86*cD7ctmi>6$UwD3j-O{0i*_Wcg?J+@* zpk%8cK#=FDKyc%ZBE4c8<(bhJ^o8$dN3!30(+%OjanBlxtYjKTl?FmlvhG7C(NU6D ztOZh(s@K#hsNR9FQ+n<(-mV=n2W6m}X0VO2o?xU?((Xq^`$W{!F}*?tk!3t12bE!P z51#9(+*0f1M(ul~zG-6Xi6!*2rGLtR(viC>^h-hZl5P9{dGi-Gk zrFK`FZIZBEK%tf-;bgGTthmebXE5u`x*mfh3RTDFJWnaQN*_mvThkbyR0n1k@jC)m z@?52qbsG$}lh579TV&|w_4QAMJ#Dj)!k@K5C04gJ2;+hjW@yKr*~C7U;#?FH>8POs zXEI60%y5>99b9GLFC`kFG!o?sf%;gTi*WQ-CqjlqYtT`d6(5=4B|QX1zcw%=^6==H zj1$t0{z&)Nza(3Gpv9fRD3q2mXuseoOE2`8;6tN*rtc%Gy)3hXS)Z{KD*w$2WH?^ch}FbMjPf zqcFc@u-UNPkdOw#>Z37O#DLUx#soH6uxVvZg@*;Yw-#cWHj|kv{RK*Ua*h(6+8(z zcgy=#y+?=nHBtH%+H3U+_C;a;ofC7o7p=f4!-4BiEReLE{$9`Nvw5z7Sr|q@a|V8? z>BoOAcvtvnsT|;3YGtmHVrA{=s4;~+?>)_J^(%}-^H-O(KDg_yhoP1S%B~8q)U8U68B`= zxFV2g=iDVUg2&P<^My{kLXF;#u~))Ew)sM}0_dB?G^anV z)nOe^M9m_K1W6z|VVgsh-|o$hgAfKrcHxc5K zc4xOV)`jdFac&oE@zM}2!;tnAUoeI2c;rHAYYp+EvmE)>= z;-|<{4e1HH@vr4bURLaxz;;k5?gb*;W0t;xSG|%hlL%uGzo!qGqkQa$%{p9{=yeGp zbcgx0DAnH>1#hJ0vLi2V7F{Xdc%jwN+=`M|YVvFSMJ#@lq)e#T6Ir>0+SU!wN;Ay+ zO;pOpw6oWQd#mzT4PDD7S)+@P#0QAvgDrJfZG7=#8XKNKSmtzVSmD4fB^!z18PJo9{Ixmfz4<J+Sf=SGI_qAlDEUNnv1^W z@}njC_P^M`|AN`3n?fzG{7`*hf4sY_|Eo{wzesui@;T%v|0}l`N=-d<6#pSFAOcO$ zrk%S7K)@eQ1ZdbF#S+ZW+?Em3iNyaMLDzF{okFXkcm#Kg_G(4#g;*~52VlGM>iVta z=6W5kx5o#JKDwEF!+ukkIui16H6O)+2F5&*o&h~1f=eOLMkbUQV}+DRGhmE-q|$*c z(yQ%v0@$*9`CE}?v=y(xL45=nX)Yr(@PJ!eC+%n7-Ji)vW}qyyav4uXdF@JIPstGq^+s_|s;)}RP%W3q>ZzgmJJ1u%)paR82yLQ8@ zy0y|T<=Mta$w~0XU8%*?B-Gl1%>m>@ z)Y1fF^Tm-5*L^iGooxDZXVUNVSU5MN>hgm}pKj7A%_-Cz)^SwhC~kGV`}Jkbo7`TLdvPZ(&3dv=~(af;pZi< z`r(=G;pSW54rfe{gO8NBAJ@g{C_@(qI$?E9Dr(^yNZneeTq{{bHQ;v<0q`zS5hL&L zFn9`8FoN2={Cb7;cg#!9{-wf3P7sl)1*r{cpa0E1`A^aLH?22_|0fE8^>bTT{#Q4} z#lYF_Ke*2+3Z0TbKjbSmQriYn%tI>PNN`jMYEV3#A<{^6MEE8Dqao5h9G z*V@{W3rE)xFK+fH6EUWmWURUta~B-3*J=ls$B!yO^zFplrOn`&gLvRDv<0WNq|7z5rI5bDx|e)a$uv8GKXRr?xmLE6g>V}bI>WkTNp$9i6OoVOv+ zXV?-loC3ctDr70Ymm+<~2I+8yB9@3`i22w`h9J>4fh3i-gnkL78hl&b0Pi;l=Y|cj z>bL~QH-I~|IUYo}@ENxM*$04crTt?0A#rQ}^a20=pO>hGwTZaN57_%Z_eAy04@(W< zyOzd6?INW+v0DN~P~1WYWn93<9F34IWK9ASjElkHFkY~nZKJvCPLrysY7JrzReaJX zZ(lk|Q7C|4k~$4j^SWs3h;sDiR;_rdTD1X@D-Uk|q{zdmC&PouZim+WZkT~|cVrI$BZ)rUO$~#xYm#?tEe!pmE;??n z2%2|f@9^>*iIA7#K#7o-hX1L$(uN&Lb-8i-et&-(F!(PZqLA(SLrepo0XqxT`@!pR zRP#wJ3{<#UW$H=Hnn@ILL~5D!D5qhXjGJuVGeWE8#B4{I%_ze?S@aLZrg{T~@20c% z@JQyuy+*mA@~xXD3jm>A4L zn%X1mD%|RT7O~?WBnFn<@_?k(m*>ZlAjna@@>1~*>SOT9-wHjyQwN>g5&>wfO?vNS zHBOdv*-d}E2@GO8M1{(IJx`(4MB=f3G58Yd`@km}#hlJ^mPtZa4y8Yg0{%Udy#h zSr=uIe!yIrwqjFNA~>zV3a|B8C9WN=tuz5|djP$j_9;No>AGUGCE=&m_|i?IQ)O&) zAz?6`Pc2+cE@fN==a{~pb6+YvCieui)hcme!J%B3@v*wIz@Cr&pzdV80(;2?O%%k& zl@qe133n_Z3OlPzYa>j&VeL@zPsM=MX<@nIZ#>*^XV$~6(!MV{tMmdm3AbS^F;U%g z!k%vrd$I-S<0I@VXLdMWMXmityRmVxsh z^oHbQlJ3=4P25#5@=a4~Y6C}1*mo!yxR3r2UFKtF5$UlAR6=QUZebIbVP!i00kO8f zECOJrL=N}cXk9{>S0u{Qp9;VTXal5Tt2>T4EQ?0d-TYrS%KRM_mp}cJlN$)d#H(ZARc*#e? zy7lY|xYc^Hg$$5Nt6*z**lSrR5OtYwu~I_Vj+JI*9*w^S1GqaW2A`98s4iBO zAWLhYgFaEgkq&n(;rmGg@D32nL5U!&UPNToMz)^U!uyI4ImWvC9)+xL0FmrqLVT*DoKaLjEwlSUT#rT%e7$}6Z zo23Mes40icykTkX!cyZ}ik9g2JTdO|r8Xc*55b(mVd+lRqN3(+Of`xKH8y*Rl=HFH zy9Z6V!%thju&BwlAi;Ir(`7|ZJiDTaQlUVFNTQObiu*qx zb-I#LiF?wL>`BO|y63 zP--)Jg`w_=yxFJ@Qgei045-f*gr^<{ES)DZGzz(z?2;EW28Ya8ZR?#H=UJ;32w}ED zi?4G}FF3tDr#-2s0FD$3oU&RsW4r+hnoyPRdm7O7jX6{a*x+8R^Re?WnoILWn$gId zGXxmSve8&(`T?}sVpPJP{|&kQ&wvlo8yM6-KeZ9?4+iDmha&#-A(pqZcd?f-v32=Z zBN3yxZTUk6{UXg`wb)YDl4;6ps{bO%I#=(yB_v!zHjsiGwk&2FXu>!+H#J?)u_@dm zdZpKG0sz75quL#0yA|ZlA~zQ458*JI<=B0Do0&?(!{Y;51E$Llr{Yk)FGr2e{-Q;-~Z zDT&f43X6{VQc}TFIPe?jiXtf=ixr#M#(IyH!RA9Tm(ysR`6Lj5V&%wi(?BXHn@lz1t)m&B7NwA1hQOQv%9H7w5{0O zDq5M*Sp9oh7#b#Rw23uWRGPDP%75WQBt};(K{qL6Qhi8cZf0ykKZ2MBVq7ir6nc1~ zP5d5F!)r_tw(csrKU;1Ln_A1r7|vCW;l;biBl4|+>4nXV_v(}WOwecndhxtUnMcZV zy&_w`zalq(kC|$jVMe6kqxzg0j<=7aa;iMMg}tHU0m&!(+ZpJ5~Nv`J}%7Ua$RWYU&*yJ+rA7xZPk ztrs4SoO}Sc#|rwHF`Pb}5uTCL{U&+7Bp=xm;kh6yp#KyXqZAN|0rUf7&3e!va}s|h z-wp76j?O4Q+#C$unJPU7EaMse;f2Z_Jr4OGKTzy0J#h3+m>~Dh-wHwQ=?^Bz++hOH z*>QI2Lk|ow<1YL|5ezyBa@XJ*E77bvoNY$8C7VS2WvO&^tBlyH4BITzp^)#J{=~0) zKG|=HAzp|mEb30CEhC&c7$K;eMNbwo!wUwsOU=~%;37l2u12M`eVPse*K^aQb1j;F zyhg*j^k5S<{H-a%n1Sdd?|#hfrEQmDeD}lSlU9k_WlaSEPi%wmaH$u4oT3!*v~XuO zvYadoYkePsnpv1AU4xE&QL5|kY46A6avpEHmXO16^LI_F(}e3wm&P;5tlvn9tG?Su zo5D9Mf-5X?EsUwLwqzg;3c}U6^QBzxxQn~f-{t_Rej3A^TLlLwU6ltcU9|@=T@o47ZH>c>6%CR_CYrL+QN%U4 zN_VKSRqj}1%3VQjDoY1EC^v_}!HRNAbL690A4G&B234=W@FdA6Y50AzXx|M}uPWIi z;*7nk4dL_3*@yR(vP&b68afMiVeFO)VN``57&BIA{$DZ%6pG#f6^a@9PgqIWdIS~4 zj6>)oKAxfYKr1_qo&rg;u_Vj*FCdoo?3dn<8)J`}0|X!ZuIs+4T~o*kju9_Ln#yN* zp7Ce(0oq&R5oBwU=d?&))W;4j~lQ5Kgs=7aFw_^EzoHsxeQtjekDzTaP2LFmNnhx=V8lMT(5tkh`v#WF9;) zBP9mG%S_{VY(gVs2+sWUrBJ zgKQ&ha5gzP!&x|pF1iFzQADeTqHf1g-35^>~ zp;+~Br{?+dFx3{|J z!@d_pOW2iV+vRu_GP59&hbP2mA}6*~@Zuk*Qw^gh0C<9aC7XY-P?9{PxG(j8CR&U; zv^VzzL|SFcUQ%{Ku{7tzA%iQVLaw~OlE_a7ukuFep&~E8Wq}#!oe)z6OjDRx11_z; zS9_f;j23vy#pKMHqRdcQ%q2xA;XY@3&KA-rCk?2uKrLbL;1m*=$rq*(f@l}>V_}$< zg76tsw4Ej4CNta!1g4BFSc1x#Nof)nQsJEAVnPHsFpCJB3nZ8lU%Z)^t5SNTz|9%R zl(0&@;jVm$Kdzm$mwWsq(9Trmd7nzB71 z&KZ^&x0!)ICZ)Hd*}X?<%RqFKQrdCUE06TlZ;y+*_zeM!lv^{vtP!{74adu>V^r;(zF<|40!(Oz2u- zE0Z@4hb{KBoMV4^4OK#LF{lV3q%e38E{8)PY(Qrk9;&Qr*WqhQ*2jDrHk!wL5bXTN ze3rQ;5`PmxO-P;vK{@jRw+}173%@xzvz=P+;+ZnmckjoYDKDqltPGzAzTaJtdx)P* z5whx>l21*W62f~+i;AX?E5y$OCQFO^WD0SRbfa&!%n_{7XKgVSwkJnM)MtlX-hpXy z_v<*)?-j(fePtMbr4ii@YKdL~5AF@FqL*(!ku`s$*wK>T%)jpM*GhXFp#a z#?jp02pfGP(!xC67#qDq3dGz!lt+yutVh`K^284uxcldls1K{4d6xZu?_WUs1l7Ee zYCSk3?hdpfrHk)j^mwoaoH%=njY{C`F3Bap18wV2+ghQJ`SBrr~d+Vxg*m}HuyNQ~}Yl+>~-D8#dLu1#0nyv~w zYGL|0CX?04dNKYnJ2ESc!)s{%&S&7G)B%RjY;)nN0eUtmHIxqh_C*l%puG#0)`4HM+da;*a#0{~89ZUR%)jpssBtkb^M+5qc1 zq6M4dSQ7*FUDQnYw~Vk5*~cc~X<7E_d#1XwhbRGm+41c|Nxpx1;P4^4qwpDq{DwgH z_J;RSMvVGRnR?gJ7pJi(XRkgu@qi45l$fjQ9n3jpNF}#d_L|YBq3au~2j11+0Eu5A zvhqplOYx6NG8oBm-kGhqUQZDP*xPRh;yXIiOLEKVOLq&#>k$Uh9mRM4n$(x4A&npg z{52q(fj)Pq7SQYPT%?1dr(&PM_~8aUw|LINtw%eNbs^Ka7j3D|G&+%eCAG?0%~PvD z=wWr@^Ydd+6!BIb;w^peNM*op7Gecd<^Z=&|D9+#ezRo9b@q#l{XOAsVu^~95@Z9d zrHEpIGmV=@o>@WVoYit^^w>8BzD(O3YhbG@J*l>YiL48oiLrb~U>n{+H5tkoq1skM zT}N&OtB^;s>?4M~3Wwc6{?v;*y;-h0E94&Td%1E16>~9#CBHv6eiJlPJ_@A#t`n<5 zu^voKVmy~zWYUoMk`aDil;}pZW$k$(uCfUwF3V7oS0voeEY!!B z2?tr$Q|oG3b)LP!UL$q78wZd`FFpr51YhD~)d5-4c}UGUgU^`k3o+k8G33dJlT zU1ZfViqd&!Q^dPR4FhXPK%>_g+BHDs{2ei?Gr<14Jx{AHXSH zwlLJTopB~5YY6_jgF@y$B`^P*bp3%VDS^>qKmbDSX+eM*(g>)oWD`#P!1K!5qWDmY z61G+z|0OaQ(_#`wRO-~l8uyP=cC{`ePXa~Da%bUZgrYUa73NjMUVXJUZ*e{cwjwrk z-Y70Ce^(H$vYfte>QvXO@E&wPny?%E5~hdbxTT43H3=9XSZglQO~RS74Y;0&)a&cQ znJVm+wj<^qfk&vfnbQiGsJ16&ngw`rLd#@IJS(7O_ObJpY7(YvbHZdWpd$#$pCFco zB6ie79h6WvsP^}QTA@iR+ottLdeHfi9{zpskm%2tum2=e{U>TRM@dI+i65EA&86hz!d^;8=fILoFMm58ygbAwc$cm#jiL(ZUX3b9TP2`fhriKW5Zo<1(AgC z*>MBIMMWI;{b-8nu|KkWvnCWP$uleOoGufmBr|%dn(eK@t9LSxOkV!TS=pN zk`^^n;4$ulYVhL;NcZxVWV~aCDsVGOBdRW%=vB^N3LQF0Anuq3$cqS~@SaQ1^hgG% zvxH4^(YM%62)g*kPP%>*D}VsO<~mjywa5^0<`7D0VBTpYV6v&f!xwA>)_>`Ovc$Y^ zUwoRG_sYecX<2o~XQ;SyYb`IYhWOA;&YjNOS>^(QRv`o|o33uWbP}0OR5Z7*2@O6( zDfJkZP0-vL7M_w-xIkKKhBvQpGrc3i-guR|uS-mn_uY^YE*!Gv*?)JFT~6isbDEWV z2l;`!(Yqo%BobAA=49}RJjoP&y;6~4tZ?oMJpQ=Fxyy46&Equ%a%^J!61~h{7qm&) zcl-aZ_w3%s->M!z$Kl}Tl}_Z}ex>^#$3e!<#mPk6z}DFMKVOJ)6vt%;>EV4!=lH?p z$-N4!d6J*^PzfA<1>^(PCsVz|tM|iSQo2GOSiOP}vpVbny^;qb^@F4UH5*%)ax?kb z?Rb0lbOV(aG5b@CTC0z(qYtOYaF5tX>n{u>hiC*=_v}?F6RF!xkms-7$A%S1(QUU> zb%nPwFDr&dzF%^~0;0|X(S8Q0yJt$(Tb#GH?RjSD7j4M|Ei(n~gg#;fIMEmlV-md7 zrpw7wvnAm!bsJqq$0`|{*1Eeg- z!RqXXQ8T9dwu=eYl_PXWGKk2Z0^6^;X>m%-BqKR8`6c3`L#E5Vu^MN;mL7!bUwxND zSg$^$E0%api+e2OAfI*FRdoE|1V+8;S1JbHU=08#(lH2ma?vpGSuE$8s5Q4Bvh64PdW+oklMZm_k=x1N zi=k9po1M-|zc)p(>(^50g0VX}<8t@J%KDr^-zhn8?cxgMa{s~wxlySPb+H@C+3NZM z>HG*Byyb>Gu#F0M2gieuyoGy3T`6%DZBTe>4s6%^^9U)=uMi-4%J$0r>HaH5Xxi-} zt&XM6<{Ks&3l?lHt0}eo-BdV2Y;IDcEY=qtwK9N)Reja2n~pr&_pTSF0;0(ukx{C- z9Uig##=#JPG20)H2s}3DEAkzyPS957Is9wP+H(3Wy{`0ExcH8qR%{3s45>*#AqCSQ zLix>`uAvJaAMpm6o|*l&D-5CCO=g>=S zl9p=O)57eDxdET5+7Pl^sh4povy~X(7L0J?I`OY{Op&Q?=+NWbDupjnlvnct+{E6bXc z&&To!^}S*b`8|KD_bE4sPXolR_GkL}YmIWZo@1-TR3ALH6T(T)Sw=$MXT zq5Nt}PFNgK7fvZSFC5Jr&JKZAnNCr6z7>;)xpahBUv3)fBrh3d^;m+UlD|0r&>%YT z?8IO$xl$_y<4Mb=a=O5joXR+0md!!jtA=1u#r!ix7&nZ9}5LXdiE-Z%HS9+66sH3V@v? zwX**!e_$kqlka2FmT}swEEP^Fum1fslI*iu(f9%Gx2u+uZ%JNAf{$-TR`dYLVqqQR zUgLC?PtbxS@%pk#i(?rPSjpj-_HPGqRi>QUXkI0p0IySuc)CA8r__Yj^f3fcIIUr= zJL7F{DwZ^IY-{*>c)h%ViWGHqfT(kx&Qf@kWbtvuh3giJwnBe?1uQ9bgI7j8lBO#b zL?pTtUytjI#3yX>4_XGGc-7F*E6~i1OOz$;;IuGFx)8!|C*VDc29fX<(7vmXZTR=9 z9?f`1XAZoAL+PfO15h( zZZiIEcLR+njc3Bumv`0YXI*0`cJaZpkPKJUxvJ1z!s1>pb4m(^Yu73|>v3tc zJ0w@3c$79qQrC5_#5g@SJ83j?D|S75d#ta1MNO}+m_6W=*)*){*o&CacE0H%bO7w4z zh$mk1hQH!{PRItFzN)H2BUe<{qlqXYO<)Q26*PiLvC9gg4&=!59>LHOhm_T$p!vL@ zI6x$erb!lE2qeo3e5wsOzcl_x`h%W>gmH4!bT!*7(Tbo$QG~TDxWfeQ>ab*;5m0QDIBd0HgN&@0#!zvu}!| zgWrJJ7N{ucjGIGsHD06wrpUnSs-tK7fyGbMc|wrOz;oSnA=oj;xE&i#*A_YtGPEpa zEG^*5H}nx@HG$7w^!zj~OPXI~V^i7Htk{U1H82c%^J#=gh$fkJpB8;r0nQgcN-UDn z^&~(%JG%MFeqv5rj%ePwO_4}ZB16sdS_}z6{>}`#=DW$Uu}*KhTirtaD*!xgn1Ola zc$$gcngFXE`w0S<1G;lfYYp)kttA?0K!p)`T}ad8z6v=*2!@M%uDT$60PX*jmj9Uh z@_Wh1rhYah`KOEI`?ohmQc2=xXtblPf%VTM4<|colmF97{_~8D&XZKVZQQu=x>%0V zyrJ%<h)NKQO88Wn7_}qg7B)TRTy`mKbSL8tT|nu%5A-U3(3+KxD$D@I<=uNS zlo9>@YnF6AHqn+VbJQKORfL=&Qd& zSp(unLpnej!s)z)QA8tm^retG9@x8vb1aM6J_nSfRdmDzxUSspIE%qr)UI%V5X44b zVSHMyVcQ80){w`}f*@N8?a-toi0kwrdW4aNl)=UO+3j8ht)d>KS6^N!fCDq^xuk*U> zAYMCk)MQ)KeLTC}X8NakN%Xy#My}MsU4;DHBfCEnxxfyEm$U z0o8SrSgd7Z1{Z|!474yl)_@~Y&f>g0N{z$t;*(<#Uj0mTqVn(kscsWmT%F)*w*XsS z^Jd9_@$#u10Wrr+;xa*RG;sG5oPM`ldAHabL-yc7_3>HtvF{D=CGb<+?T*1ynN#T( z1{BNZefLD(!O~pma#5Kpz^WAPz+)A(?|%cr{c})sZgJ+hehvx$&y)4PKV1C(b5Q=% zHhre}&$t&*L{{1;{Cs`nyCL{OD)*E?FwrG^ab$shC-ITCf7zyYhsbV!o0TV0;`N0! zT#hTCQ_7co6q$9LT;yKoem$?=;PC-K8;uJimqBN<&I5a)Js(Ezz*sRD?o~qook%n0 ztsVphM3HJbXiyblGL;Ua(9~wOg;XSD?sw`@i03;u2;Y^z!20#yVhh1oJW1rNTl zchh|hI2>yTahS)xMLju5i$^4|P(?&1-zv z@fvk$@19a~kH5O1A+L?pGK z*ONz2r9~Y;+0+>KLSlsk+XWKpK{(rX2$g6 zrM93A5#4RQ{ndzyYZ$w~5X)vdtjLgt#2X?mLE=5Wef~5WhS8^AQjF}oa3p{ah?7m} z5j=_tYQG=|9fW#-&RnN&fFOsSnIvMeR}o_7Zo3~cC@ps#>eoUe|9Ka*t2zYWGCtc-&Z$2kLtJi|FS|OU(^0r1x1^!Sji{ zD!(M7%UXv>1B;Ha?pbHa8(&_fnGA2t4wrB}QjL@H)Ly+?M2bOQDb>>#!GCq-e;sLJ z#o9H%5W{ia0;`sfx^@turAcjJ1RuvOm|@BZ+|h(g2qxiR=SdHovT!-jHZ?p z_qTtW4E%Ga$_9}UqI}+`)1N2vKfhDujjbIh{@v>(TV>K=;d26*D4E?>QWS+ z*kB&S6`A~qVmh-yBp-h1gc#!*g9^1tm?fR!y)K%SMF#*WC5-;e&sg33fgfAUcNYrJ z!^q$(f^Kn}ZJ00m)+^z=oDe;O%=ZJ>J$}-q@};vR)M56#S?F)B`lo7zH)D?X5qpU| zVMfMil0ajW4g2j2Z=$#h7W;OI&%e#E|tYT`2(b>!P%P#V_#kb z-x?-P!n;{wC45HkK~#Wbao-P9BDy_s2!yu$z53v9bsYR0C(796qB3h=_4d}1k4PP* zfnk%?I*PD|KlWY%*+cs?{(eP#fjejwOrO_z$gA}w8pPvpoyvdU>)Ld@t$7fwXY(k2 zB}wTL-S7L;GsKHz2MuSIPaejX7WM^Cp2H)p@a;93U-Ggb6=!6TdjR9TP;kCOYz^)5 z8?5^|#*~iWcM#6mBnZnPj+;(R(b+{P{w+;V+@{qkn?(PO(~PwujhIC<@>7hu`dX@} zM}%*1>dygg(>|(u`p``IQA9^U*(qu==;3pj~V!C_ib|j9D#&wFw389BK^XJvyCRXpHaZ@=W%g9uWt{6=-0*kjVRFYn`V`f#T`>Y1Z zw>s!lH@t~lW?kh*Y?5~ja7dAt-nMSJkQ~MtWINVYEev*WZ1X-EB2A+cmLP50UI!c< zzt$GbMpbWt;~~OH)(bBkL`+uP_&CqgH6%2=t;ZAqtSJ3@*XpWLAEwU3g%? z2^nDsX?kiXQ6UEff89e0)?LS%)L27;Tc5s{r`FuMn|kvIB)QK?7wzc&QlzAyn|UX) zAvzPP9T3bwkUD4S5mzEMGslp~j}!*u?Wr(aa~jbVdL*sT>jdwuI`Ec6+Vr`r>GZ-Q z%SAY^lv+RLE%HrOBUZspqb=o0+H)3&xaYHYF{$+R_n9@PkAeK!KDj2%u}!AEvVqF_+>^sx~{YG^u3YDH1jhpjU)VC?U{(LKhAF6A@5j_Al%!X_g7R>qVQu1&Y zohSf(Bin1hU9Vu4R2^;@H=mpCw??!Kw@&_2KSY-RH$Ka?CWl1=Nm(RA5#yM}hu(#P zrWoGL<|Na@r}hB$BB;qZ)P@X)JM~rd_p`FDooqt1( z5Z-|0&v-r*RWE*y*qJ;P1=t&E1cSx29=oiVj{BCZ0W~0OFUgTk+HKP#1*+?PLQDw$ zKS7ou^bOJDOt<+_bk509wW6xGpD6H%qZ%SsBDb&S7%Hz-c+ z4V8HOIq_5Pm5KImRBw43fo9n=pJ2)@T%(YHcE^RWG0rUmkfSJm=ffz~o}2c!N$6Y6 zsf?|bSJ<3RU2}|8qSFkGT2AQUH-A*KH`U?ZoAju_eKt5txn<=6W-$r2gs=K5E-(ch z0zJPe^l+LGoc5~?%6|kr70efyamlkn?Ka(7o{z2Cnk&=fppE`3^x16b183@h{B?@G zbL9pK_oi+loJap6qGFm_HJ|t#O)72sFAq^o$JCC$2~JBT*PLn_wtq0wCTgxtH+y<{ zh4WKB1*4**%FRw0v*}5aF%?MDu4_tL=w9XE3&?r&6EJ{7Wl~G88d6ePm}RE(eCiwV zr<^aJzSCW&-HG$81*L?q!1ytb!Ma(t!LKO`rGLa96cq{IRb*W(7Y(iK!iH*D=c28b z6h3?wS-4oCX;_0hf?1}x0Vwk4Fl6DVQL*`Zum`DqLTIn?4;07q)N@*j)Gy+WnFczg8|G}J;>hU9e0d-`TFz#AvP8|k2+ZQ!S95ZE>0 z5tn%%^oZ*#u}pH}@)!?Dv3w*l$>yA=m`s9^^LzM_2EH(wht`&;=fIuCi)ln5;E@a-VdRt7^LqNIRKBR-4t=sBa^I(j6EPje|oY?S~`tq%QQoVCN z`XRyD?j&6p2J=!=4;@=y4-F3nR*4P<#`d3I-k-#D6XXBh6Vrt8!#~9Q$mO_d^lMR+NfL{t0b<=G4LWVo z3TJXV+eB1TG<=#B9Gd78puWsVl@3YMxP{IOoVcyC;%_45i%G*Nby($h7KbRDlob2U zO22MU#N=W-$HHs{Izc<^@4fRAnB85HPVGW;y_4YoCdK@8JC%af zPqTQF^mY#l58?Nd+x<$lL*o>2+$qBDr?=}6JP1y?O}Mvb1)JL^;P;y)*ca*wy)9Qd zw`v&T8N>F~4K}ym()*bJ85tOH`-0LF6fWY0V`$dSRQ}AG`HV@_GeH#~zkA;G0xcV; zI!sQAxUWOhLwRGL(>plmxt1vD{Y+HYQwxHj4JZRi!ao4gf8n(&vl))9FOT*4Kuw6l zpZ&3`+{H;@vpI;e$h+SqT-jP>^H=&#VasD7Xqe@epy6;GWU7D>(RM0h+B&E2*3f>X z>^fC{Z;N5|QlL&s&U*A4^gLps(O)6&5zys3u$?-67~=rM8o67OF5RfV)XUd}kIj6! zTFj{$hE>5TFdx}wv(gcVl09%%-GVyuG#nB`gLC|qIZ{*9Y-}@?^%wzP5EC<717&1S)*C*;a@kFMsc zZod3jU(x#FF28t8ZBEBQR&5Ef`7DNg_DHs96>~eDIsNvPPsrGUTCm#TC`Le`wSA*0 z>#AAB45GFerXqg)!P1q=*4^9{`qSaZd!C;1EIJW)kcCTYSeODYE049#tyfk-Z}SPGunm`-IblYc^a9mJUZbDCxTJ))OD&+! zqHyO9WFv_uAo6t+%*`HhXPmf~AyZ#SQ}x2|YK9n*g!&aZ-eSlx z^@~yvg53Y=4KiunGTqW4DekV&1{Cf|ziA9!-}siieeb9FXpA`-k$Td#t2D3q%YGmX z^M<-YttB{l{Zz0_Rw*9>1*p}U@{m;wndZ&u%cWNHcOyq+^!%u!$4T~$m=5;Ft(m*A zd=nowJc=Q_g^Tsk8wp6Xzt*uef0a+1cbZ8PKxI;5VJ<-1 zZ3z?ElwIIgdK1fon=#WnY6Q>QBYrN83bcOa`dheXO`v&dK?A>5vv{*>%JkbLx8j+D zGN@9WvW%vJjJ;R`PC4e7)|+!ILq!r-gT2^574HT^zyCX*V~f|ain)zUVS%lTR-_Ud zmO+^NupOhQv{DMSY&k>g4Os=vBz4e)%W|hkq_qtCx4QF#40O#Qj}RIE(*hUW(F4^A zj}Uq74o$2b6hpe5=MKOrqRvsMz4_>K&l3wv8e6rqWoZ&_UZ3)gRC=PscAjpnk#_PC zOCPgOAi-0Tps&e5-HA##T*uAsg5qr11X=_73#?SF>^bP@Tc&k#$qC1rcj~o?D-*8O zHS1Q7PQCsbFEg{@IDKLgyOiR{RMzRs=AsX{c8j|Km%Kx7LdSkai|p2FiPUJ?V0Tk< z6w}gM-oARn(xt?t4opQfdv@DO=dTHX82#gRytj6tT&5=G4}#_)9YE2ANx+mI^*N82 z=S{jmM$({M3ZBBKv|!75V^)t+3o|w=tq{EFhV=gUgUHfKdwt!>Ap^aS_p$oSSYMto z?mqp*Fmo*~hdR8Br{szH6t8w-Y*dFLHB`WS3pM_r_X0t_Y*SaknPs{|xuwfP8vC>& zTd#;epM9p_>2llftRQg2JyDKQN6Ki6j(q1*3H&Y0dGy4QsEU%dA7$k zE-RJP?$}VAt`{7nzqa9*kmZe2Y+0m{lUzZ=1E0;zQ*w!!hpfr;Z8aX< zZM#YB*$;{uGI{U5Ckk*anS0Yq$-E|FQTbO`zwo_WUFdbbujFOhFdUcB5o+tiF`&SNM^iK8_@p3z|QQ-d|^>cz5xoVIE~A&;lN}QRWh*OTIWO=lCl)vQzJXE!LyL}FOuGws(6(|t8gMk1=1UjsQ|@PtvMR#lTk!K%PbD$ z`_MS41k#m7bjtW{{gb#|fc|+eXY?VLHWZ+d@Jw{@}M36_Rh5)12B^@JWz<$d7HNU?Do#Q}fu0oc&v zwTfhAvN5BZQfKihAI`M~3h7oS$G|2vuHe za)$Vlzjbo;A?s4Tg-2H-p`h zxsIv2X|c8DTf&X>-f(Z4Mk`_3i+fqS*{IJd+1=8*K8pV|atT37SYwM@BTvV-EbB;H z5S?a3o_AkK(Dqyk$OgsM~88Oxf;lGJ1=fqcRiObYv>g` z8VNW7SUg&2=Vw*DbHLYTyr-ij!1X%13s-#|c|$hQo-!Ob8pB$V{5b3Tn}>!(AS~IK zfy$+6<{d3KrcDH*@T`B+*3UW>rNBnoh9<{Lli2^8v5#n!t;-inmaH`SY>HEoB3MvM z_Cn`CZOkt6<1isjMikCEmA^9AeJK^Qc~1PE`0OlAU{03$J?)OaHwNvj)I0hbV9}F9 zspo^9;kBeU5KYvFE2>W?>%}r`bo9JmBPTrJ6pk=8P7rif+URG#Cb?DkKjl+iaM-_t ze-0jT|A7SlFUm?+S7S?aF>7NxM@vl?V<)HoW}5v_k#}4WM)BX^-d;^hnC-BqEX2`VrCVvaVECTpx*xkp2mUxkSuG5LxsiOv?sGt_knuGt zUYhFi4q$8CzZUBCgSY{kq+-ms0MV9Em&hkY^=WL!L~2jb)H;Chj%aFB=}}HDnZFK; z0uuHeP^|*y_aU3RauIXx`7OT$qBT&%!LHA|68TQ^bE4$rUX)5tnbzwVp+-YEs+t)S z=mk}^>tfOCm9!Zfqsl_EeYg-2UtHZy4ajdcIN^IzU+J`k|G^??!$3mNoTbo`Zs^-k z+y*KS@fXK?HZo)8NF`7|`S=}^zf3)cTecp57Ecq7`2t4dYs*_;+*HJ9uE4XU$VK%Jmf1=>^3>n(6nSZB?~86hIMJe*6$>wb1;IwjQ`M=cec+A9?$ zDhcMmBt-Xdf5R1tvMR2ONrZ3AQ7O0h|H38zp}ZX;GQ1Cd;*$2C@%5iC*2+7&nE%&W ziR-@*Nqa>M7L))V&xX1xm#DjfQX-#;ZB$hS^xixwAPS|3iHM6>Z}OH!t&UE^rE|aG zz9F+R#s79{i&2erG$La^y;wM%a z;v3Khvg~NqG*8{w4W>ZtG#e%@f7(v{889zizu(lYB>Z(alSgef&Sg*2nmm3vTmAD7 zf_YNl@C|==Xy7LaP`A0=EJA29d3w4oe@J2dTKdGqV;(a z4QKK72LC`eWMW&c5xBGPG%Nxf(XKH7D+7*b&lwAbtD)sigFoj1D%-JoE z6X(CL4?PBFg4BRj|3k?!%`osgo)OKvq_;#HYdrCUjJ2Cgpmp9R8yB~7KOmt@Bw#V@ zHS4IJD2)(!UE*!?1na14y2~YmO4Y%u5xOh)^yAFJ`dV!`^l&*IfwV9<`Ap<6#n~?K zS_}wRh1ORV!mlaL6&<4tbmCP&D-_KjR3Pm`1b{8vWH(XO5$#fDfa8BL*lQN1>!VtR z^(`D_vVBK6bS{BsybE+c?TK59D|9`t+AviUEo;)F!y+EUfwPfYIYNv|ON{uv4wlt2i3^{XO;Y^{u z(Zf!c;#kJgx_^Ec{H^G<$3eTZhqZ@l5iUq4nk(@K9zAhK2_dkrv;P3IqS%#?ppL~Y z$8-fgcd5=F=@r|~!K!@U0WN3U+$-?kFtC48#d$aqdebL7k&5zvg@OGmApV;i3*$wg ziTXEpJx9Y(JGZRu%fWO}*Ln9?gqP}PXIF*A;l*6G#9aYZ?DkrJzQ<;O+9mbPmxqvp{ znQ~S48sjj+W8&Eq{KXc1aIs zI@1DLncp>_998RK94$eF{9TFRp5<-0*BbT6*T#k0mAn453j6Qyf_b|k@PZV1NNYTr zMDx{6G=yY-7-V_3O0GKQF|AyRO;3)>-1G)pVt+ruMtlk8*lIcS={Wq1U4><$u8*Vh zr4PMo_(cUa(LD2;Ho@v|a$6G=68xietoq;_C3`;LwjteXp?snjLwzJH)@*1$VO)X2 zfATKP(6s*)ebQh7{SFf>C0(Ka&|sw|Z}q6ivxlS%07d8er-WnPIreZ>OiRQKaD~Ng zbd=NJRaba}tXahfhVk~HvJ9vNgs9f`l?kcXFN zV24adHF9s!wmdv0T8a+cn>FA;;yx3Fl{hIgp_gXnI!3bbby-yXLw~{M`3R}=$<+mt z6KXoU3;kP#@Af+Q%=qrojEgUETNCJ#W9SH)I=l6ac16D0RC{^jeKi#uBmuG$42N?d z?n@_0VdlBjZuN7p-H_wO8ii_+&nM9+4ocp#AhqslKoPIpz->~^c9CI2abn;59E9eu z32fsQL?b-R-0#|Yk<~2K1+n2djCKL|*y%xu@PfsA3Vu3++MC6@pN&KGFY9OitK}Q0 z&BDEC?$SNkHc6xFiv7m!Hl4L7CfjHD9@@J6p}6=Y)6Ao~PiE|<>|g)>iP_)c8D7w5XuOmLb60(xzp@vjQ7G;>Db|JM97d=MV3P-Ik`5D7Na zsTbiXFB-P@lvGA~;_+!w;ltfmF(9toRL^*H>(D!Gxn~E0lcCs+NnO|3`}!?`&uM9Y z!D{K4XfQI;2KJyD^vJ+-w6SQ^$Gmi%;lyRie34zk6ecrM5w32s#FdgxU@g8nAU9b4 zQ9hmX)AgzW;MBV^VP0J5iUR+&dNmJ=ue{T*w7aB8=XSI2gatmC(z2Uh)kwdp4a$Ho zAd6Q{Q<^u7|8BH#Fq0OW_AK-CApw*?H* zO(PqYf~QBaD78!aI&0~=hSCAV`6Ewm>Rea5@ASyxU^-r(Qi^Y<@ z0O>R(hh|YFsAzk|GO=|D11$Ji)PG$zJ;~erM+!HMCMAK}#*g60?{cSnzjOoY~F;Ol8=)6qyscbD5v?{LxK-mXad%S3qqFa zIC(-o{ZO_(JWy=i`+)Qu&wf9OG~3f_Y6Gstp1C_;1xmkfof^S0+#lmXslWGIE!_w-*YZlKeC(Wbck&| zU$s`Wv8y`?&!H4ZCn}?%{OnHD3YwLNM@JSue1nE7{Kd2#f5gelE%?FxieAl%iH6cU z+iwuJlV)}NlA74o5K%pDQD2LT%xIJuCwaj0?7867w@Rdr=g04Y$~QJ3=`K+aFFuqo z2kX6c7E#4j#m9te~u&CN>xc-bc~2b8eVe=ods#Nta2@q@Cxmyb8HL_0t~`C6TLd1^V}%9&J~FkU!%bHML|v-E)Q zfO6$5%BOqgcOei~;>96b2UxJ$SW_W(Y8@V=7Whm5yZ-D<$rj1B=B{3-u9yZ;x?Apj zX)DdOQ82VIa&$k6zU#x!fNWKw?G)9p19kptWk=dRo%E-h{TlB1S?FIq!#_}mp>6=r z(q~m@{aFnB=jzz<-fG4scINVqX6APPRS6`k>AG&Hq5M^#*NrW}F?H#8*GWK&xm;9F zaFI_Gc9L@*hss!-b*Z!?)^j(bAs@FtWkcp?egh-I0m2L*@)xmH^Fgq6c>sI+YIl*r zd}A?J5}!$zRxLFxJ$v6ho=)B#udf5awS@HtDX_v>f)Qv9=1@+1x@c2YKwkP6U8E^o z`&v=^1xl$LRYvMoj@DlIwu4?Ult|~)wiu5!T8xp00>;&4ZB-zDV9_su$)?K9dxn*E z9c@daR9p$!nthlObT#?T>B5)f%iNE@rOybWUH!I~N5w6}%)NU)@`Z=njdmOC4(YA( zy;s`4!KiIDm-zGb;{v9~v4;^6(TL=4S2?5p@e`I(_7Nn7gjy}ihmU=aW0W4cW)!w| zYc5qr$$KJK*64?oh%)2$PC&6l7|Iog)~tjL4{)Fqqai6-lmBox`qhu$SuImoP(O}o zUl_SI+%iTKc2Sv~Wwin#H$2*np)97UMy+a8#tkiJVTCB3gA8XrI141Xv1+fv{lN}yEi;N=WrW1GL2{6%<0_ z*{#4vmFrxKiZvK($?0o)5rRTL4SyUvjiI)X zF_-!q*ed2H6wxptl=k1S6QW|dW%UCPVyZSU&MGDan$t2@qB`1#gmxnp_ z^i7e^RxpF%L_7zgao!1lal0c;>&*D9PDP1Va7&f-?=}ZPgrRd#Q;&zS5wM3SF9cEf z_F+z;_Qn;_dIUlIbYAAXv&dq>D$?cQ)-!{!`8}l)qf!B$9SDz?U}cU+yg2$QkVZP` zXC(0|sZ!^=>BLS^9^phJGzPiFTPLPv1M~?cg#+!g-)&^tQCm(W&EhX`557mkO7%3;*tj;!ip?XaM~Oho5K&os@m|(@dp4Y9ufBdxAGF#JEwAcgP_Q zp#LBM8U`l~5xCZa8A>Q7lQ*9no1YGM+6J`0jBSOD;0#V@`CMt6zC+7MPoX>$!e)B+ zKU}W`FUCilyy1keLTcTZ$>X&nW|31>eX@n&;5x;jQGB%9a8uX+T?zwJTu8<4GV3_; zRX5e5iG>s;VooJ*Grs1bgHZZ>=u&6lGRAy8gV8;iqw}7=wQ-qrX&PraZ+)awIT(KM zhxCHo5>lKv)Y)K9R>p5cReJ$yhT6u!UOAt+5kaWR+orx5zStsr{-ol4y5AkLIvs9B zweT0%O-mP}iVPz!Oea96GrBegK7M^}2DX{wY@-0Gay-F^C+Bcpn`qm(?4s6eH_s z$?{pRAG_-n%@E32qF>vudKdr5Z*rGl#&v9m=9x$cwyL9>z=MG3SB$V5o;S8tJHkpX z^kmP6@sR}1+;8dTz3#5|!Oemp9YfSvYo9 z5fvVPX0M&$@P==WP9->PB6kBh_p#og6N(m-=M&6ijT~mQ`^WBns6WHib%%b+`*&B3 zYkQ`5$~U^Hc7Qihdx!Pbo1@dR8EnDH&&+w06k#f^V=cAUsZBi$rb(-?EO-3%qfNl@Rt#LJ!*PGY`a`*q&>_U?^|Nn6*KgjRGMt_HC@VM&Fql zhc=pN*{?4jUxRtP;im<*1XCx1!X6^@q!o>PSm)TDzYidzs)vRv%bhQ2i8?VjS43)x zwXx5$gWt04o>vXNZvKsXQ2UA^h>t6-%!GjX0RTg#?3Rz8gpJ8_gX~vMdX$h*+U~D9 z)D9(sv@pwO&K{oX(@v74t!yldSTtJ3X-r5hEHe>bFONiVsy+A5FOW2*r$&x_#gg z_keNRyag+pk9QprFbA^$_Nq#LoSJ&vvQ1~NhKZQ<#8n91XGp&>Ok?V-=DTs51?)yQ zDS;$i{3=IzW{2+&V|JI-uT+IRX9}CNDrrHN=|kjm1f%M5&Rx+61lZ0B{dnQA?y)!$ z++RGz`t`p;m;+TG9hkgIDpSQxI!S129MTD>%4)wE`VlYWIADZL&nDK{PZCAw9!5FL z_Jc`6;S+G4JaQ8-^2f@*B$;CP3O_GbiV9wkNcRVxlkI0R zXT`Axwoc%zq1P}#Oy={m@nY_r0-F+|xdKO2_Qa&nmV>VNsg32SRmT-I)q^4eCE zDQ+8WT(yOIGq4%8%?q~mPURMfq{wDP@SBs<1$ot15Gq3!MinP;9OI34a1q`38)aj6 zR3^P<*$iKJlvZx$rHIU0lBSN2dP=$-T-mk;_rzSYKQLmC!RcX-er7H}$sp7#^S~4D z;GRMf?|^z-6zPr`by_!2ksSL@a$(t!X-Nam=dX>uhGUyyFfJ+Iy;9_0e1(eqtQR zDtx0SLh3~LZcC8w89U#IN*X60ENw7I{iM!uL_Q$?)yV!sxCj2$yaRmZtAfwxKL@{5 zO&y)gKQoty_5Y*r&iClJA_xr)Eeh@70j=Qy%_#vL`>>d>d+-KOlYmx7lFxlBaC_f; ztC-5l5__*2Y8V0?6iflo-i?@((~=TxrpJt8M3toj0u<^4WNcKdeSB=<1y>h?3f>x~ zk`~D%puhZ-dCwZ^a`XQvs#-ii%R7ugltU!x8ygtwo9Y8M0skLMWY8Sk2JD}xarS4I z{-5jCt9n{HSbpw-{x_tTtRk=asg-*njg=A_3>ivd!cJzz8ES_j^rbyWryf91cDFk& z&uYine6c$tHX8^U4zc{|!>r+b1M^%+zhlR(l!EPHyFIn&_T;t+sAw(YJ0HvJQin~0SO37D?TSd5rS_Ep|0BNzw zC1(Opq38XHLQNLD2boV1y6J!>!7(@%6Ei57KJnK?Cuxx7Nt=yjgfilp0{NW{rlw(q zQR=bM2i$jB&C2^u%Ex9}{UZXg?wiM6LE!{(H);ED@QCF(pj9xMneHNb7->)fjb!pf zvW_Cp!Q$anN7D!x^mYUp>UC(2iU5@LCvVa0~ zTYH{l>KJDxD%&E#vS-*wh6}xD9^cm7M$JC@;7Ep5t8@?}bnXb0nm+_CYfn@$wquUTIfxd@aK2>PBiIuo%`mq-XQG0YsAqOrWA@fdINGeCXeN>t&&UP zM=`v)UsOhmR~fNKn_QFOXxAGn1{9Y3;JS$i6bkElDyN~+HqreR}2QdVSWPD z#8X!nK<~c}*gumZ9wkF}-cJmX^fMO!f5ai{|CtjhPs%{BU3D)1@T`!9VvDTvnT zkLgf@q!AD8KywqA3AHxMN|Ig&1X5B*Aqe%wp*fZ?Zn6J7pm^HM^mXY86zl~fFfE0K zkw?a)_thGRidM&F079`Pbr3Q`LL`5ClNOj{M|v^khI3DvjNg+eSG(8Zk4Y3ec=Mob zJg}kvMg62_F|Ws*<#8l0*kj<4-=NG|b59XJ;}w3a&@29^Il$E`RU7Bxnp45}0jHc3qsmEW&p2cVpU|AU0+U zH}=Rk#B4*+l-jcjgDHkAe>{k!Pmo8Av{9?kIt+z&uBt#nz&ljuQw-kV=?1ClPwYIx zg^^b1$EbE;_t;qvz(0@QG)bv+iF5~Fs}(ci5CioM{Qvzonutl;frMaS%AX6!|9P4A z-&x_m{zWk_oR`|t((xuA+x6kJtQ0r|A_WR22L<{7*%vfOQe!x(FGwgM1&HaXW@fDD zmchFQ!#3yh9gA3Yl`8fft5`a$-&LzU=B|9Jx2o)$eJ^{~bpE-Leo0mF$mlyoJU}B67ogeux@7_W-1-N3h^5HQE$A z$V+6|x39E6eqnsQ2Ov$oxAh=_XMCbR4EygheLMTaZC=Tpf$TSm z&z3n)*ueMX=-$(3Poxjyz9stH%G+GtztQJ`uD5vP{J(|+y{-b0E-cRQZ``S#gsyV( zQotC0KBEJ46WUN}z-c#uH?ThtvZKL?nA>hx3$OQ5#;e2Awjnlsf{v7f{R@6dMoTf9 zz_&)F3rAAPNXHGS<-C%Flscaqi$06NWyhsmVX_U$F~0HhMz5t;N3)71Me}Utvz=mL z7PWy88E1;fF)VRSa=158jw4*#%h-qfl!xnV^da4p3!|YZkd!Aw5WJmGO&N}^&=_av zf+XsbbgF_I#R#)=wMwE7fm)al7EJXJECT!S^Y3&SpdPV!q8EtJ~ z0gUTNUdnb$L!9zXR326!6?wgq$ZY7hj5LhYXgb7tSxBVkj@9aDM)^=g zFLf;_HMc~(C?bQx)J|i@ngbK$T$Lddf3gYjDU^2*t^82;O@8I4NDs_a{oe+CZo zZs@9I#5>4FU#~FQ*4>#fvC9CR%WIC@!HmNvn$cl?c)EkTPqfwPR>R;#gVAAOXakWR z%kdcGp}(0Q&Bx)K%D9~$?TL4S?&<0r$9P4ljtOMES{UkdbM9pvi%gDwa{68fgXAp5 z-^Uujl)LjsYu14F=DSAj(>drnk#7WPoGr*$o?v+h1|h(vTxF!U@%tE;qy$-|u+4Q|;0cN1UEZFul~ zeBF#5OL`GlwN;)&L}##paYarrhzI*^#f{SXOQW#u%-{zCb|904A``oM@Kjb@7QI`XsYU9ih+6QnjI^0x6s1;Rl$;3OL5iC5a-Z! zX%(wxRGd`FW!9^QdO3&Yy{{pWT0zR>*UhFv5P0Eo`-{y$nzG0J25p*i> zg%B!Z%|p4=vD^ZD9g z`sH4mQM@1#E&g%&s$Xcz@Mx#$PONE(l7VPl|N3t2fD{D{ z2p6p5%k;?Y)gF(A&=jY|`5|(O$=_ymws8s2NL-SI8eJ@CauoEeL71g^miH2;Wyw)q z#d@d;zZ#b;a8!&D^wZghm`qDK`I>$*Jh@Lmh1z}knNSXB>JnC;2^IW$ao8Zy75fjQ<{RvO!*x8(#s{S`f!B>Ym>jasq z(`UnKZVCf!rX!fKGB-{rKN5L<8!+)mu;XXwya{lbc4LwTc*B*@s5wa&abNpG9#emLawh5f+S8_+L3mbD%H6i% zun(i_#Y8A(f}}6RQ1HiuFwHb4n!J(bcM-i+`6&fWqe_R_N}lPlbN4~_dVb&eWpj+C zI_$s?;QX|qbnv6YtGr~L0%N2FzV%o|F-0<=o7!VY`*7T1Qr)Xhpx`B&s8+Z&G|dei zwhd@2##5cw6=a<^kohASuUP}l3)&+sS}WHuwRaO1q~vHc4m=U2Kr8ZklV{IJDk5E2 zwfIbY$ye#Cq32R>EetD~X`oCy3I`X6@$K9Bap@7cE)-o9tegy*nZivBxm$+YOI1mI zyQu4kYa5Vni5F38I_M7wN@XuO(u|rw-#m&qf;a;t2^vkL;>R*K7 z^h^F0;kJRs09A<7nMoz)y_hCo*t8d`mxU#wljBxb^)2@JE$7w%HE=*frzikIfmI6L_>fqG& z=~Ioc7)J$01ZLp$r_uZ!mi^G}DvA6^1NFwd@M3@LgCO%|^Gs8v7K=zgZQ3&Ena+tc z`t0Hz!_lyo$2p9)>X++AWt7X9YFAw6B}L(g+BRN=RPL%+Qlg0lsu>NlN#c5P#!r^U zX;~sz%C&1TvK)H5l+&Cau&OeCD<8*nNvArO zUn9}XxbwShpwditY5p{!n1yTicJ)|*ZFHU4D3Dd=ZWoe_wLQ?0=geq`{AHP~=Qx4n z*5y)Y$9YKQpg*?RdLyXAVmSTQwhVIA%5ON@g=CI1NoR93&Xt+>S?fn929lO7 z(E9>@ljAdt)0nrz2gdXXADpTVse~C_LrK|PD}*3(cM+-IiR_}SwX)|FY^zB$^WA59iuA?w{+pE zRBYR}Rk4j7+qPM;ZD+@}ZC6sUZQD-e=JY+?xBL9+@816Q7<-Sk#~Ne(Snr&3&3DZQ zro~yts-QH_U2<%|%5Sm%5F2oU%X5SkMltmmp)&wgosIoLGlT ztafS45xlC>00*T)UEzc>cV%xy{WZng>o_*>1soUry&ViFNi){VoohI_aK%bvCst!P z>&s>gi(*k?)y7aeq56alu<-fIAg8RynJ6!WIDAc4Eud}D9Q9r78bT6jCsc}Mk0(1t zRrj!Zgq}QWi8RQcN_KGn5p3YwRnT{w4L&P6;L36(557>m0yEsBk}J|KM9FaYICmI95@|V=674%8k98RYThAv=bPFw+O}!HP zK~=J!vEqjgvD$-(+!g02McF`WYb>WkptJR8SvVQG`fe~Z&A4RB&Kb&b4K=aF8 z@XRlJ!rR8Gx`!J~s~DL&=n(mry7T)S=ofu)ELxYz*n}i^M<+M802>7oHv@hp>_?WO zDxlGVn=&Pt$bd(@gV)vI$b8)%+#b&#_w)QXG;)LBjwf!9xpjv{#zza)E|9yx16?2V z7N$mHvB8H#?^bD2^M_)4M&z@Tu!dkH3NqZkBd|o3UJa%8vqzQ(h+UIvlg0W8K}R;@ z7gcHZW~6*8xXKB~QFX+`lddC+!{F8pswbd7cV>YI!E2IgI8@@(UY+#imCznH)^x7kOi!ueDQ zVlm6oMv6XstG`8d?>{XTN5xg5Y$z;N^I9pMP8nIYj_BTwpvb7#T=vh?^3q}UNG$jy z6?H1JgD4+h6nt{V%a1tYMpX3^vi4Y>hd0|y@aVD&K2NctP+W?t-#v@EZ{)8-Q{{R` zn_9;Ql4bMyJPs#0hW%9!@=s}2LAg6wW4T9DH7B{ki?n|~i3jEwowqOrc@&)51>XAZ z(_?do(?jVXjZLxeD*+UOk<*l7{*KknXW5b;z);M0Xe8c|G2Z!q;Zd!`Kjp&RtC#M{ z(bz_wk`6!a38LaQj9c`8D&pM_mj)VZSfXx>Xp*J|bB=bl@JV5^6YZ7jdcg7DSv-dv z6iRn~HZ(g3`IAckJ^I&-n5st(xd__y*pkUA{qfeS%jUw7E$Vt|)wI0rT$!5j2EgNC z@~2USO~sxrsB^u_gGy|M7fPdV%ucWuI3^TrUM+^6kN!NNSc{f1=n*ix0TL-GkxF_*<{ zD?UH;MVCwa*@6DwE58qdF@l*I(9st@5`RN%#q{IXuW-eqS9);N&O7zA20Tdd=q*&( zHk6ehK?!Uk|oiNx`2;H&g~4cbX#CzjNu&6a>!)S zh7R}}C_9oVxD|uvF+BnMO169gdu7k5t;hBY6WWX*Xo2Sn6Sc?yx+x-7aFmr&c7PSU zV|Lr=^hCSFVEFi4(7p-3sEAr0jEbw;3b`3{~hA4m`@WH4C=Owe!dB-s!>WE67}3vbSu0Y_Lz;{NQDuHu|CBf?vm& z3g1v2h{Kj1vXyMp)DU3ZMj&I=bz+DCQrr74_DE;$04QW>vr1Ajno^po0$ngu$Si`v6N^371ub6Po8Sf_QdP3?HEVdv%@} zbf|I}K5zGX@O;J>63F#;BU1mNTv^!6GNUzCKxC;4lFgZ6b&24c!}1|V>jco2A_#u> zK7r_%RNd?(hE=;fgj<@SA=GX5`asxz2=d%eHQ+%PyQ}|7cEA?#K^N?(RypK zZ1e__#lOcb@dpnFP8lsxOiXpshoMT@3yY&d(~SRH_e!;nGqZPSpO)wZtBBSQabQsg zqp?z7L*K+>q>ovZI`%8KxtUs1Ld>8V*qBb^h)7ptXpC_EX4R61SN83|^&h{f0g?>8 zU+_GE*Rnk+Aan??=B)mu(+=1xsCVFA0GPXowcA!H3;0DriWZO`8X9b&AhA2Ltw* zvYSKv8TP-oC2m`JTT%`9{oNbT512On-mVQ0|J8U ziN5R(k936)XXiLa9C7ia=!u#)egccfbRLfd(4#Kp^1E ztqhN#+G*`Jt(=^Pi#pYkFAsu~fpf64!$Qqv;k0x4N44w#L^(mIIB1kBKAHduesK?i zqkX4*9$r!O@wAxcD<7tx);2puD+SX*+Pl>3CUH4NeS_0@*v8g_f7F8Z*ejd*K&YzH zE0G5-pY{QENG#%YL16&(l)DTbD;uBc)s7f8-z3FtI9GI$@8H!iEAGL!TS@2(zKs&R z;yH(x-=E&)-F|!16R3bvPphmYyZKC?hzReYIs7k0g^-xKpE&HDq)BWio-8Z|VH9!E zI(iw!{oQ zqQkPNg009m;NH{Em~KC`gvZx(lF20h%GB;eR*`~N>KHuI-jcee`}DnQ4ORNpu_G=j z{}&!^BsA?~(C%I~jlBjJ`kXVwc_$9IsiK`osa@AM>8g>PKgMj?vu2P7G#1a6p<7P4 z-G^=jWo|TVy(EKcj>rDG&+X-J+c*(TAMOu9&T1C(99sJ?CJXX-AtwtaNvU3EgfGDQ zA#r#}kSnXREqLH@Peb~ z!ntjf2T3lC{QUAb-B>kQ~wS=kajLp@k8<3$PY-{u&K;{YLwvm=eQ|O zzQBNVuQNfKt`Q#JA6asjizq=YTt}2!?WC6Lg7hd7xAOh!-)Mx4^h3_nb4!4Em(`kZ zc($Q=iP}Qy^TgnIubzVKPq$H-|LZMA_bD)@ZbQSSh3V*=GU$j@hE}l%tMX&qpXC_x z1>gS1=5eKlpcS+4oY?llB=r>IdmWoV%%1#rDHi6`h!$g5d{u5-`k(N=d=e*KE`HC? ze+YqJ?=kuh(?p(qA38vUuQ_@uOdcDdVt?EjO&))j@(#j=`}t}Q zl{Ln%S)LO}HL{aq@vH{(*5o_w`niGa4z9}$sRSZFU==&y8|P&XcXI8!W|{53gdk)w zF?Y??AYA(ir}%`$>44Y?%8MjHLg{mjuA8&yP4lr4(ehI*o*;pSzKBaFOUxRr0z@hP zp2Q2%6d+x$O4OuHtvpqME!Kh;K?UXx&I^(E`^poWcOkZbTpw@=ZJ#gC;?iab(8b-3 z1bNb)w}Q5pn&RbnI0f;#*v=01O#a^86ogQ2m6#&t4R|$Q00Cp6Z0Hv}A@w-7@lUNR}p*371gwHgDBR7>DTxYD4+TNNqQ{I@x_|uGQH-P36dwcw&%#myB9P}N~ z6z!fVlrk3MEVae-`s!)5<2&3CJ`J^fn%%fXxo`OjjTN>LcF&rvZ9tfz4pV@-${*P>W z7iSwrPh<-**4-7S&|%q`>JL~$PWa!e+~L_alHfeOHzD*P9QJi&6c&|n)3IWpseBCC zRDv6ixU#6->#GR|ibp~6r*(3ddA4~4y$xghl`R4(z#*u3qKg}0e*5SnoMnz_LMzjD zt;x+OOPQLPQ8Uq$7+1GSDJu4wYhkFeW9PD2~*8Y8)9n)V^_Q@}_ z2lsy)ey3{SXz?F}jDLrG6e<0&Mfn=F%aOZq!N&0^Lg(}Rn2^S%1{H!Xrxt}2wKPyj zf}=4T&X74+O&&4mL%4?f2(?xRkfMj#zEBQkNh(CPOVh1%^F3MQoNf8~yo1&TKN54Q zdMhg&sqeKO6hyfY;M+Q_?<{Y(j?``sTP(T{UmGqhlk%|UC>4pg6Y_=A)}O?~WHC|0 z82!v34R725EGtJPt+UiA^Fm*9EtIX9x-S4}gsgsVKS&yH$N%I(PAQx?w7n#t&P%-h zI2I7AcEhrO!?f+5iD%X*PvkurCO>Q?*#3?WaqU1S;0G>zvF@~`!EB<=6$-v8Nlnv> z!UIQPG_SRPMf&mTV^K8Qi(o2SVVn}@q{+19&+TgZ(J(2r#z%; z8G}ytS>mnMd6e3QX`u}}YvtYP2^-?bQsQwCwS{0BXKrMoXRK`ULA=D`18rJS<|>>= zUT;sKe^ed}(6fJqhmF*4(%dAxSCC@;p-piQ{xvq4MC#di0bl$ZGpn{Ahz-}olG$Rc zkk_^JQ}hM%Y(vR?q%^5GOOMjcB0HD)0=+#VHE8EGUr>zpFGRlB|7D>3d)UZ*@p%3>B%n(9OVk#C$eYO8 zY^8l`o+kivfE1S4$SIr06M<-{8V{{QC>jtEoTv?^HXLIe3dY~daSdi2DWV8P3cBWl zYG{iuWkHS3sylv@g_ZNm^zs@1p2;7o2IdQsHW33wBDPPs~#t%Z&B$v3^)spx2sjBVQsZQkePI zy3aOk>`-BR_kV<4A0a2=l`Hd%*Ea#j-_DET+im0kPpPfkW!hQMID3`ey}VA1%5-c+ z>)1fY{|vP{+?SA-d#Q!Jj5u^xm~iFJpHe2H&0O$3uzMFrYMtbekEki&G^{^)M^B`f z7Qf^#0NE989e;$bNm(W^lR<}PQlfN4qN#Kh)FUKFfWsrVbs}c6Meh#qA-aKby1k%4 z&WZnkKUg4|k6Ii!@2z;UuZAFD8Og?xN3aMyi-IOX;5#K>uncBt(@1 zhzOdHBR4!(Cp?s1wrR1LutrjtP(&a!pg8b<#5^$fc0jG7r8%(%sh~;%-HF05$T~@P zOrUBc+*SP6OVl$QWz;&xE2aJ<8I-Cjs#$9_fq^pXj4}2oBNWEc7)c4KMQP`c)UlGZ zL=SaQh^uR>(7MVeHu887CU0h59-kn^;Ywtx(lc3S&pPW!*4Ag$H6l^$q!rsz)SuSP zXv;MrdvIlmh}%(;i-+}fX809@?OrT|oaCCP7nA5u8OA|cFTqZ%5cOi%oRb_Ep0(=C zdRb1W?eC3zL zFk%?SghP{B)y557Ukt4JMpN$cK8szVD2j8GqI{^Q zx-(8O?7kLiBPIZ6!KIaE0|jcB$83^);$W1--NAz0(}9;MLgB4v&umB~*J0T(Hyx@{ z&wW}<_TtS`T~44wLiH7C>|{XCS7|M1>l6#z0}o=garwFmDcGeQ#nphgVo`GH5d5 zDTv|Bu=wo`gQ5)YRM2JSY!7HM?u?ehy4u!(GBfE6eKPU#Loo3gBq}bzmHTD`BSb7dg@D0)QXM1>5I0X&N=nJlOruX>%_w_^u ze*Tw2H88OV#FakEX_3d^xHv(j!Pemc{TXK28KEV6$dyY4eSM_VFEA#(XZIXmr*vi* z>=OpSn@R6z_ua|6Y*A|rTFt%0a!o2GtFl6D5^J|-k7#H&1EY+A)GRorJ*CJP_tLc9 zw8XPLv3N(lc(Pscvg5mnu?QPwMuj==)V?!Uy#ZMwQ3o6yU6LzvU7Bh7*lN+nGAE#% zwPjstq5~-neygma;@%ikbsyz9i;GW0!FlN1k<$j%6ucHW9fY38 zL@(zwv1Ls%LfK<}FjOzp3$J+?X8Dt1L!FlN<;X5CyPK~dw=$TZY5m*DTT9BXTy79!nTb2GMu?*$f}eX86C*K%PNrkfduGwH-m7X=LH^Qkw&s=0Q3%cJ>O2L zPUufG&|8Y;{0(k}v+t^dK7uP(*D#6q$Z7ZY%?2GMEh&&pj>~g*I@Ygn-IMC?)P&TuIL5YmdRqnA5g7EnX=+w8I@Q`9rNPX>k`dr3uW-Mo}Fa!l(B&3^Sz|uz(H=QIq$ITUhj9BN!oR z5B�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%0D0}ve&kyVxrmLD3a%OoJGjT)4!e~>YoAf7U8CGl< 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

jQEKzki`gN5I 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

+j_OKf5Frx{1q8pDOzco2Ak#w2%D2lmQBepw2U* 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 FTg!>M1}ulmZfUl#<@|mVSC@c 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

E_ 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

6Z3{z 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

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/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl b/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl new file mode 100644 index 0000000..4c7de1c --- /dev/null +++ b/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl @@ -0,0 +1,56 @@ + + + + + {! 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/jsdoc-toolkit/templates/jsdoc/class.tmpl b/jsdoc-toolkit/templates/jsdoc/class.tmpl new file mode 100644 index 0000000..1b32e4a --- /dev/null +++ b/jsdoc-toolkit/templates/jsdoc/class.tmpl @@ -0,0 +1,649 @@ + + + + + + {! 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:
+ +
{+ new Link().toSymbol(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/jsdoc-toolkit/templates/jsdoc/index.tmpl b/jsdoc-toolkit/templates/jsdoc/index.tmpl new file mode 100644 index 0000000..a5dc115 --- /dev/null +++ b/jsdoc-toolkit/templates/jsdoc/index.tmpl @@ -0,0 +1,39 @@ + + + + + + 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/jsdoc-toolkit/templates/jsdoc/publish.js b/jsdoc-toolkit/templates/jsdoc/publish.js new file mode 100644 index 0000000..42300f4 --- /dev/null +++ b/jsdoc-toolkit/templates/jsdoc/publish.js @@ -0,0 +1,201 @@ +/** 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 + + Link.currentSymbol= symbol; + 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/jsdoc-toolkit/templates/jsdoc/static/default.css b/jsdoc-toolkit/templates/jsdoc/static/default.css new file mode 100644 index 0000000..97e021e --- /dev/null +++ b/jsdoc-toolkit/templates/jsdoc/static/default.css @@ -0,0 +1,162 @@ +/* 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/jsdoc-toolkit/templates/jsdoc/static/header.html b/jsdoc-toolkit/templates/jsdoc/static/header.html new file mode 100644 index 0000000..353b735 --- /dev/null +++ b/jsdoc-toolkit/templates/jsdoc/static/header.html @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/jsdoc-toolkit/templates/jsdoc/static/index.html b/jsdoc-toolkit/templates/jsdoc/static/index.html new file mode 100644 index 0000000..661f6f6 --- /dev/null +++ b/jsdoc-toolkit/templates/jsdoc/static/index.html @@ -0,0 +1,19 @@ + + + + + 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/jsdoc-toolkit/templates/jsdoc/symbol.tmpl b/jsdoc-toolkit/templates/jsdoc/symbol.tmpl new file mode 100644 index 0000000..f8f4bd1 --- /dev/null +++ b/jsdoc-toolkit/templates/jsdoc/symbol.tmpl @@ -0,0 +1,35 @@ + + {+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+} + + + -- 2.7.4

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%0D4w-iZ4XS=zBA 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 literal 0 HcmV?d00001 diff --git a/jsdoc-toolkit/java/src/JsDebugRun.java b/jsdoc-toolkit/java/src/JsDebugRun.java new file mode 100755 index 0000000..319a5c6 --- /dev/null +++ b/jsdoc-toolkit/java/src/JsDebugRun.java @@ -0,0 +1,21 @@ +/** + * 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/jsdoc-toolkit/java/src/JsRun.java b/jsdoc-toolkit/java/src/JsRun.java new file mode 100644 index 0000000..25f519a --- /dev/null +++ b/jsdoc-toolkit/java/src/JsRun.java @@ -0,0 +1,21 @@ +/** + * 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/jsdoc-toolkit/jsdebug.jar b/jsdoc-toolkit/jsdebug.jar new file mode 100644 index 0000000000000000000000000000000000000000..a0ac7daa6bfa2633f1e2d27696b8afa8577e986b GIT binary patch literal 1307 zcmWIWW@h1H0D;(^G7B&RN^ml;F!;KLIO=-(x#|Bq#lR2%Rm#B-15_Gh=^Z)&sB{?+ zivTfPsjs7-r<-eVh@P*T@0pE!O$H*Z5BGZBf7s?J9KC|AJ+Gr%P373Zt1%C?1ay4! z4L`nZJ^S^yzhCRRY9aU1#Ru-b(2LaT^9st^7=T_lsq$iQI1#K0f`^nq8gOKMVSdQfSeUUE)iadB?oX}?1b zBDT(rPHVY39z=hf=+J1g%QbR^G{+GaA)!adn0$kSZY|SQ`w^bkknx87N8mBZgD!HL zccec%cXIFZdB4B@eaF1xNNa=XkxG?{9L@&<{R$@wX17jhFezhslhl9QuAjN-!`8f4 zaWflEKbysJ(0cXipcmS^JSUv8yIOUsTS>ZWeUC&qk4`XQtNg9% zGShSOd#ytyQynaSbUJkZX1Fe;JcFZGVA>9CDfb7`TleVyJU=C1`VJ=bpTaJmVjMqx zeiJrB!D?-{JZiMm3U6pj0Y-}fFj~05(Skch1iisA@`8)WaAHf#j*U*us!MZkB{kJQ zW$QRr*C3xdN6_bqVRv=fJKLS#&+Lr9|K6^Fdk$xW;~e*<<82IlA2}xRm`8eWdL(-v zFe|Hg^XY~%NBqlW@1}BCXx>)fxEGb%>*Rmcw`t0kfVZpkS0$}Tb6;8Amsi$xvyDS= zHOt1ILXK5-rI)YwZhLm&TkE^69kntY7Doj8dpeTme6SGR*eBt*;?ceDXJ;-e_m5rs zG_Z43Zg$%21q!->nw&6s01TzTcq0cCEWWsI0r}7M*Gbh5zyv6N7d1 zJ*UnreLn4SVAZwNc@nD*S>&C*nCt&h=X8PS_ef)&rEa;dY&q_4SR7_dHCcBte2&sW ziAnAX`TJWmjMJmmDfonQOlg|WVX~9I;H+R%=LLbpnY))1a_oyc`*YKO4^GpWr;9h) zyQv(1nreSM@2BCS$@_jV26!_vi7?|X5`ZxR1Og0i9YHia*Fy>jm{#mX1V{r2ENRpR zl5nj^1qQ-$hzaOf6s#R=!doDTo?+2-qo*Ws{n6SHjpF>5PkvDf-E2& E061^!ZU6uP literal 0 HcmV?d00001 diff --git a/jsdoc-toolkit/jsrun.jar b/jsdoc-toolkit/jsrun.jar new file mode 100644 index 0000000000000000000000000000000000000000..49c03f4c6f71d4e24f3897794d40585ffc7c20fe GIT binary patch literal 1303 zcmWIWW@h1H00GaQG7B&RN^ml;F!;KLIO=-(x#|Bq#lR2%Rm#EO0aUu9Ei0@CsB|F^ zivTfPsjs7-r<-eVh@P*T?-@hxLk0q@4{Rs=FDMBz@LYUFG5YP200H)J%U7PkSyDwS zAMD?LSLXhAx%EdM#2<;gtGRK06Z2|s%~v1POOLEmkI2#N-!*BGXUoiaufD{7pQn1V898}Z(mUA<;|J`%+l4kt zM)1#AGT{+B!u24J{&~7cCX+A_uVR5~2Gb*zDit}L4+Q!ZP8Q5=ozh@Z#_}eq|F~U0bJK^dd9UJT zHk^Joi{+s8>eWFnw0C(QuLqbl1w0yyq|auAP$IC9u&?Ao`DzhyJoW_FWf4 zWux}p*ezJtp)7dZ;^9QW!Y*UE=SpUR$^xt2?Y$+J(a&7G?vwNGE-cT}pWdN3X!N9okav52Uy5(f@gVO2G6TOzJ;{T|UJ)e){|- zY=(l>+HQH&XsH$6(3S#>76V|kaD$@-cZ>*ngJa|c7n9+{mX;kGotjmb=H5zbs(;GX zajdREK6Q?u&lAJ$>a=&ZJHMaV8Grx1T?6+V&Irdj?oG$r82CPNOyV(*^x*VJ_C8=% zR`KT34P}n_m&@Kw<*?Aat-x_FD!13k|Eh1(lrI5qSLv@xT9M|yvbry?tm|eQhu~_K zjX#APtL#cIU+>-a?83L!cUwDZWjZX52=@1MB+vO^A-b_o!g0l;d*9E_TvqNMyY^{d z=c?T7wAl+3bOSd}nAN8v4L4oaBcY#n@ciAmE)eZ{(*#w< zomu*P+U3BiYpe4lRvog)JAE-0*oy~{1`t@%s0}3H zT9FD1gykIIvIsqkg0+K9cnKuYGc3Ap^pu3q-2hBmUd8Zq72wUv29jg}!Y@FYmj%QF E0CH&O8UO$Q literal 0 HcmV?d00001 diff --git a/jsdoc-toolkit/jsrun.sh b/jsdoc-toolkit/jsrun.sh new file mode 100644 index 0000000..74ca79c --- /dev/null +++ b/jsdoc-toolkit/jsrun.sh @@ -0,0 +1,52 @@ +#!/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/jsdoc-toolkit/out/jsdoc/files.html b/jsdoc-toolkit/out/jsdoc/files.html new file mode 100644 index 0000000..03e954f --- /dev/null +++ b/jsdoc-toolkit/out/jsdoc/files.html @@ -0,0 +1,255 @@ + + + + + + JsDoc Reference - File Index + + + + + + + + +
+ +
+

Classes

+ +
+
+ +
+

File Index

+ + +
+

dygraph.js

+ +Creates an interactive, zoomable graph based on a CSV file or +string. Dygraph can handle multiple series with or without error bars. The +date/value ranges will be automatically set. Dygraph uses the +<canvas> tag, so it only works in FF1.5+. +
+ +
Author:
+
danvdk@gmail.com (Dan Vanderkam) + + Usage: +
+ + + The CSV file is of the form + + Date,SeriesA,SeriesB,SeriesC + YYYYMMDD,A1,B1,C1 + YYYYMMDD,A2,B2,C2 + + If the 'errorBars' option is set in the constructor, the input should be of + the form + Date,SeriesA,SeriesB,... + YYYYMMDD,A1,sigmaA1,B1,sigmaB1,... + YYYYMMDD,A2,sigmaA2,B2,sigmaB2,... + + If the 'fractions' option is set, the input should be of the form: + + Date,SeriesA,SeriesB,... + YYYYMMDD,A1/B1,A2/B2,... + YYYYMMDD,A1/B1,A2/B2,... + + And error bars will be calculated automatically using a binomial distribution. + + For further documentation and examples, see http://dygraphs.com/
+ + + + +
+
+
+ + +
+
+ + Documentation generated by JsDoc Toolkit 2.4.0 on Mon May 09 2011 07:12:49 GMT-0700 (PDT) +
+ + \ No newline at end of file diff --git a/jsdoc-toolkit/out/jsdoc/index.html b/jsdoc-toolkit/out/jsdoc/index.html new file mode 100644 index 0000000..c32dce5 --- /dev/null +++ b/jsdoc-toolkit/out/jsdoc/index.html @@ -0,0 +1,218 @@ + + + + + + JsDoc Reference - Index + + + + + + + + +
+ +
+

Classes

+ +
+
+ +
+

Class Index

+ + +
+

_global_

+ +
+
+ +
+

Dygraph

+ +
+
+ + +
+
+ + Documentation generated by JsDoc Toolkit 2.4.0 on Mon May 09 2011 07:12:49 GMT-0700 (PDT) +
+ + \ No newline at end of file diff --git a/jsdoc-toolkit/out/jsdoc/symbols/Dygraph.html b/jsdoc-toolkit/out/jsdoc/symbols/Dygraph.html new file mode 100644 index 0000000..bf40cde --- /dev/null +++ b/jsdoc-toolkit/out/jsdoc/symbols/Dygraph.html @@ -0,0 +1,2586 @@ + + + + + + + JsDoc Reference - Dygraph + + + + + + + + + + + +
+ + +
+

Classes

+ +
+ +
+ +
+ +

+ + Class Dygraph +

+ + +

+ + + + + + +
Defined in: dygraph.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ Dygraph(div, file, attrs) +
+
Creates an interactive, zoomable chart.
+
+ + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
<static>   + +
Default interation model for dygraphs.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
adjustRoll(length) +
+
Adjusts the number of points in the rolling average.
+
  + +
Return the list of annotations.
+
  + +
Clears the current selection (i.e.
+
<static>   +
Dygraph.dateTicker(startDate, endDate, self) +
+
Add ticks to the x-axis based on a date range.
+
  +
destroy() +
+
Detach DOM elements in the dygraph and null out all data references.
+
<static>   +
Dygraph.endPan(event, g, context) +
+
Called in response to an interaction model operation that +responds to an event that ends panning.
+
<static>   +
Dygraph.endZoom(event, g, context) +
+
Called in response to an interaction model operation that +responds to an event that performs a zoom based on previously defined +bounds.
+
<static>   +
Dygraph.floatFormat(x, opt_precision) +
+
Number formatting function which mimicks the behavior of %g in printf, i.e.
+
  + +
Return the list of colors.
+
  + +
Returns the number of the currently selected row.
+
  +
getValue(row, col) +
+
Returns the value in the given row and column.
+
<static>   +
Dygraph.GVizChart(container) +
+
A wrapper around Dygraph that implements the gviz API.
+
  + +
Get the index of a series (column) given its name.
+
  +
isZoomed(axis) +
+
Returns the zoomed status of the chart for one or both axes.
+
<static>   +
Dygraph.movePan(event, g, context) +
+
Called in response to an interaction model operation that +responds to an event that pans the view.
+
<static>   +
Dygraph.moveZoom(event, g, context) +
+
Called in response to an interaction model operation that +responds to an event that defines zoom boundaries.
+
  +
numAxes() +
+
Returns the number of y-axes on the chart.
+
  + +
Returns the number of columns (including the independent variable).
+
<static>   +
Dygraph.numericTicks(minV, maxV, self, attribute, vals) +
+
Add ticks when the x axis has numbers on it (instead of dates)
+
  +
numRows() +
+
Returns the number of rows (excluding any header/label row).
+
  +
resize(width, height) +
+
Resizes the dygraph.
+
  + +
Returns the current rolling period, as set by the user or an option.
+
  +
setAnnotations(ann, suppressDraw) +
+
Update the list of annotations and redraw the chart.
+
  +
setSelection(row) +
+
Manually set the selected points and display information about them in the +legend.
+
  +
setVisibility(num, value) +
+
Changes the visiblity of a series.
+
<static>   +
Dygraph.startPan(event, g, context) +
+
Called in response to an interaction model operation that +should start the default panning behavior.
+
<static>   +
Dygraph.startZoom(event, g, context) +
+
Called in response to an interaction model operation that +responds to an event that starts zooming.
+
  +
toDataCoords(x, y, axis) +
+
Convert from canvas/div coords to data coordinates.
+
  + +
Convert from canvas/div x coordinate to data coordinate.
+
  +
toDataYCoord(y, axis) +
+
Convert from canvas/div y coord to value.
+
  +
toDomCoords(x, y, axis) +
+
Convert from data coordinates to canvas/div X/Y coordinates.
+
  + +
Convert from data x coordinates to canvas/div X coordinate.
+
  +
toDomYCoord(y, axis) +
+
Convert from data x coordinates to canvas/div Y coordinate and optional +axis.
+
  + +
Converts an x value to a percentage from the left to the right of +the drawing area.
+
  +
toPercentYCoord(y, axis) +
+
Converts a y for an axis to a percentage from the top to the +bottom of the drawing area.
+
  + +
Returns information about the Dygraph object, including its containing ID.
+
<static>   +
Dygraph.toString() +
+
Returns information about the Dygraph class.
+
  +
updateOptions(attrs) +
+
Changes various properties of the graph.
+
  + +
Returns a boolean array of visibility statuses.
+
  + +
Returns the lower- and upper-bound x-axis values of the +data set.
+
  + +
Returns the currently-visible x-range.
+
  +
yAxisRange(idx) +
+
Returns the currently-visible y-range for an axis.
+
  + +
Returns the currently-visible y-ranges for each axis.
+
+ + + + + + + + + +
+
+ Class Detail +
+ +
+ Dygraph(div, file, attrs) +
+ +
+ Creates an interactive, zoomable chart. + +
+ + + + + +
+
Parameters:
+ +
+ {div | String} div + +
+
A div or the id of a div into which to construct +the chart.
+ +
+ {String | Function} file + +
+
A file containing CSV data or a function +that returns this data. The most basic expected format for each line is +"YYYY/MM/DD,val1,val2,...". For more information, see +http://dygraphs.com/data.html.
+ +
+ {Object} attrs + +
+
Various other attributes, e.g. errorBars determines +whether the input data contains error ranges. For a complete list of +options, see http://dygraphs.com/options.html.
+ +
+ + + + + + + + +
+ + + + +
+ Field Detail +
+ + +
<static> + + + Dygraph.defaultInteractionModel + +
+
+ Default interation model for dygraphs. You can refer to specific elements of +this when constructing your own interaction model, e.g.: +g.updateOptions( { + interactionModel: { + mousedown: Dygraph.defaultInteractionModel.mousedown + } +} ); + + +
+ + + + + + + + + + + + + + +
+ Method Detail +
+ + +
+ + + adjustRoll(length) + +
+
+ Adjusts the number of points in the rolling average. Updates the graph to +reflect the new averaging period. + + +
+ + + + +
+
Parameters:
+ +
+ {Number} length + +
+
Number of points over which to average the data.
+ +
+ + + + + + + + +
+ + +
+ + + annotations() + +
+
+ Return the list of annotations. + + +
+ + + + + + + + + + + +
+ + +
+ + + clearSelection() + +
+
+ Clears the current selection (i.e. points that were highlighted by moving +the mouse over the chart). + + +
+ + + + + + + + + + + +
+ + +
<static> + + {[Object]} + Dygraph.dateTicker(startDate, endDate, self) + +
+
+ Add ticks to the x-axis based on a date range. + + +
+ + + + +
+
Parameters:
+ +
+ {Number} startDate + +
+
Start of the date window (millis since epoch)
+ +
+ {Number} endDate + +
+
End of the date window (millis since epoch)
+ +
+ {Dygraph} self + +
+
The dygraph object
+ +
+ + + + + +
+
Returns:
+ +
{[Object]} Array of {label, value} tuples.
+ +
+ + + + +
+ + +
+ + + destroy() + +
+
+ Detach DOM elements in the dygraph and null out all data references. +Calling this when you're done with a dygraph can dramatically reduce memory +usage. See, e.g., the tests/perf.html example. + + +
+ + + + + + + + + + + +
+ + +
<static> + + + Dygraph.endPan(event, g, context) + +
+
+ Called in response to an interaction model operation that +responds to an event that ends panning. + +It's used in the default callback for "mouseup" operations. +Custom interaction model builders can use it to provide the default +panning behavior. + + +
+ + + + +
+
Parameters:
+ +
+ {Event} event + +
+
the event object which led to the startZoom call.
+ +
+ {Dygraph} g + +
+
The dygraph on which to act.
+ +
+ {Object} context + +
+
The dragging context object (with +dragStartX/dragStartY/etc. properties). This function modifies the context.
+ +
+ + + + + + + + +
+ + +
<static> + + + Dygraph.endZoom(event, g, context) + +
+
+ Called in response to an interaction model operation that +responds to an event that performs a zoom based on previously defined +bounds.. + +It's used in the default callback for "mouseup" operations. +Custom interaction model builders can use it to provide the default +zooming behavior. + + +
+ + + + +
+
Parameters:
+ +
+ {Event} event + +
+
the event object which led to the endZoom call.
+ +
+ {Dygraph} g + +
+
The dygraph on which to end the zoom.
+ +
+ {Object} context + +
+
The dragging context object (with +dragStartX/dragStartY/etc. properties). This function modifies the context.
+ +
+ + + + + + + + +
+ + +
<static> + + {String} + Dygraph.floatFormat(x, opt_precision) + +
+
+ Number formatting function which mimicks the behavior of %g in printf, i.e. +either exponential or fixed format (without trailing 0s) is used depending on +the length of the generated string. The advantage of this format is that +there is a predictable upper bound on the resulting string length, +significant figures are not dropped, and normal numbers are not displayed in +exponential notation. + +NOTE: JavaScript's native toPrecision() is NOT a drop-in replacement for %g. +It creates strings which are too long for absolute values between 10^-4 and +10^-6, e.g. '0.00001' instead of '1e-5'. See tests/number-format.html for +output examples. + + +
+ + + + +
+
Parameters:
+ +
+ {Number} x + +
+
The number to format
+ +
+ {Number} opt_precision + +
+
The precision to use, default 2.
+ +
+ + + + + +
+
Returns:
+ +
{String} A string formatted like %g in printf. The max generated + string length should be precision + 6 (e.g 1.123e+300).
+ +
+ + + + +
+ + +
+ + {Array} + getColors() + +
+
+ Return the list of colors. This is either the list of colors passed in the +attributes or the autogenerated list of rgb(r,g,b) strings. + + +
+ + + + + + + + +
+
Returns:
+ +
{Array} The list of colors.
+ +
+ + + + +
+ + +
+ + {Integer} + getSelection() + +
+
+ Returns the number of the currently selected row. To get data for this row, +you can use the getValue method. + + +
+ + + + + + + + +
+
Returns:
+ +
{Integer} row number, or -1 if nothing is selected
+ +
+ + + + +
+ + +
+ + {Number} + getValue(row, col) + +
+
+ Returns the value in the given row and column. If the row and column exceed +the bounds on the data, returns null. Also returns null if the value is +missing. + + +
+ + + + +
+
Parameters:
+ +
+ {Number} row + +
+
The row number of the data (0-based). Row 0 is the +first row of data, not a header row.
+ +
+ {Number} col + +
+
The column number of the data (0-based)
+ +
+ + + + + +
+
Returns:
+ +
{Number} The value in the specified cell or null if the row/col +were out of range.
+ +
+ + + + +
+ + +
<static> + + + Dygraph.GVizChart(container) + +
+
+ A wrapper around Dygraph that implements the gviz API. + + +
+ + + + +
+
Parameters:
+ +
+ {Object} container + +
+
The DOM object the visualization should live in.
+ +
+ + + + + + + + +
+ + +
+ + + indexFromSetName(name) + +
+
+ Get the index of a series (column) given its name. The first column is the +x-axis, so the data series start with index 1. + + +
+ + + + +
+
Parameters:
+ +
+ name + +
+
+ +
+ + + + + + + + +
+ + +
+ + + isZoomed(axis) + +
+
+ Returns the zoomed status of the chart for one or both axes. + +Axis is an optional parameter. Can be set to 'x' or 'y'. + +The zoomed status for an axis is set whenever a user zooms using the mouse +or when the dateWindow or valueRange are updated (unless the isZoomedIgnoreProgrammaticZoom +option is also specified). + + +
+ + + + +
+
Parameters:
+ +
+ axis + +
+
+ +
+ + + + + + + + +
+ + +
<static> + + + Dygraph.movePan(event, g, context) + +
+
+ Called in response to an interaction model operation that +responds to an event that pans the view. + +It's used in the default callback for "mousemove" operations. +Custom interaction model builders can use it to provide the default +panning behavior. + + +
+ + + + +
+
Parameters:
+ +
+ {Event} event + +
+
the event object which led to the movePan call.
+ +
+ {Dygraph} g + +
+
The dygraph on which to act.
+ +
+ {Object} context + +
+
The dragging context object (with +dragStartX/dragStartY/etc. properties). This function modifies the context.
+ +
+ + + + + + + + +
+ + +
<static> + + + Dygraph.moveZoom(event, g, context) + +
+
+ Called in response to an interaction model operation that +responds to an event that defines zoom boundaries. + +It's used in the default callback for "mousemove" operations. +Custom interaction model builders can use it to provide the default +zooming behavior. + + +
+ + + + +
+
Parameters:
+ +
+ {Event} event + +
+
the event object which led to the moveZoom call.
+ +
+ {Dygraph} g + +
+
The dygraph on which to act.
+ +
+ {Object} context + +
+
The dragging context object (with +dragStartX/dragStartY/etc. properties). This function modifies the context.
+ +
+ + + + + + + + +
+ + +
+ + {Number} + numAxes() + +
+
+ Returns the number of y-axes on the chart. + + +
+ + + + + + + + +
+
Returns:
+ +
{Number} the number of axes.
+ +
+ + + + +
+ + +
+ + {Integer} + numColumns() + +
+
+ Returns the number of columns (including the independent variable). + + +
+ + + + + + + + +
+
Returns:
+ +
{Integer} The number of columns.
+ +
+ + + + +
+ + +
<static> + + {[Object]} + Dygraph.numericTicks(minV, maxV, self, attribute, vals) + +
+
+ Add ticks when the x axis has numbers on it (instead of dates) + + +
+ + + + +
+
Parameters:
+ +
+ {Number} minV + +
+
minimum value
+ +
+ {Number} maxV + +
+
maximum value
+ +
+ self + +
+
+ +
+ {function} attribute + +
+
accessor function.
+ +
+ vals + +
+
+ +
+ + + + + +
+
Returns:
+ +
{[Object]} Array of {label, value} tuples.
+ +
+ + + + +
+ + +
+ + {Integer} + numRows() + +
+
+ Returns the number of rows (excluding any header/label row). + + +
+ + + + + + + + +
+
Returns:
+ +
{Integer} The number of rows, less any header.
+ +
+ + + + +
+ + +
+ + + resize(width, height) + +
+
+ Resizes the dygraph. If no parameters are specified, resizes to fill the +containing div (which has presumably changed size since the dygraph was +instantiated. If the width/height are specified, the div will be resized. + +This is far more efficient than destroying and re-instantiating a +Dygraph, since it doesn't have to reparse the underlying data. + + +
+ + + + +
+
Parameters:
+ +
+ {Number} width + Optional +
+
Width (in pixels)
+ +
+ {Number} height + Optional +
+
Height (in pixels)
+ +
+ + + + + + + + +
+ + +
+ + {Number} + rollPeriod() + +
+
+ Returns the current rolling period, as set by the user or an option. + + +
+ + + + + + + + +
+
Returns:
+ +
{Number} The number of points in the rolling window
+ +
+ + + + +
+ + +
+ + + setAnnotations(ann, suppressDraw) + +
+
+ Update the list of annotations and redraw the chart. + + +
+ + + + +
+
Parameters:
+ +
+ ann + +
+
+ +
+ suppressDraw + +
+
+ +
+ + + + + + + + +
+ + +
+ + + setSelection(row) + +
+
+ Manually set the selected points and display information about them in the +legend. The selection can be cleared using clearSelection() and queried +using getSelection(). + + +
+ + + + +
+
Parameters:
+ +
+ {Integer} row + +
+
number that should be highlighted (i.e. appear with +hover dots on the chart). Set to false to clear any selection.
+ +
+ + + + + + + + +
+ + +
+ + + setVisibility(num, value) + +
+
+ Changes the visiblity of a series. + + +
+ + + + +
+
Parameters:
+ +
+ num + +
+
+ +
+ value + +
+
+ +
+ + + + + + + + +
+ + +
<static> + + + Dygraph.startPan(event, g, context) + +
+
+ Called in response to an interaction model operation that +should start the default panning behavior. + +It's used in the default callback for "mousedown" operations. +Custom interaction model builders can use it to provide the default +panning behavior. + + +
+ + + + +
+
Parameters:
+ +
+ {Event} event + +
+
the event object which led to the startPan call.
+ +
+ {Dygraph} g + +
+
The dygraph on which to act.
+ +
+ {Object} context + +
+
The dragging context object (with +dragStartX/dragStartY/etc. properties). This function modifies the context.
+ +
+ + + + + + + + +
+ + +
<static> + + + Dygraph.startZoom(event, g, context) + +
+
+ Called in response to an interaction model operation that +responds to an event that starts zooming. + +It's used in the default callback for "mousedown" operations. +Custom interaction model builders can use it to provide the default +zooming behavior. + + +
+ + + + +
+
Parameters:
+ +
+ {Event} event + +
+
the event object which led to the startZoom call.
+ +
+ {Dygraph} g + +
+
The dygraph on which to act.
+ +
+ {Object} context + +
+
The dragging context object (with +dragStartX/dragStartY/etc. properties). This function modifies the context.
+ +
+ + + + + + + + +
+ + +
+ + + toDataCoords(x, y, axis) + +
+
+ Convert from canvas/div coords to data coordinates. +If specified, do this conversion for the coordinate system of a particular +axis. Uses the first axis by default. +Returns a two-element array: [X, Y]. + +Note: use toDataXCoord instead of toDataCoords(x, null) and use toDataYCoord +instead of toDataCoords(null, y, axis). + + +
+ + + + +
+
Parameters:
+ +
+ x + +
+
+ +
+ y + +
+
+ +
+ axis + +
+
+ +
+ + + + + + + + +
+ + +
+ + + toDataXCoord(x) + +
+
+ Convert from canvas/div x coordinate to data coordinate. + +If x is null, this returns null. + + +
+ + + + +
+
Parameters:
+ +
+ x + +
+
+ +
+ + + + + + + + +
+ + +
+ + + toDataYCoord(y, axis) + +
+
+ Convert from canvas/div y coord to value. + +If y is null, this returns null. +if axis is null, this uses the first axis. + + +
+ + + + +
+
Parameters:
+ +
+ y + +
+
+ +
+ axis + +
+
+ +
+ + + + + + + + +
+ + +
+ + + toDomCoords(x, y, axis) + +
+
+ Convert from data coordinates to canvas/div X/Y coordinates. +If specified, do this conversion for the coordinate system of a particular +axis. Uses the first axis by default. +Returns a two-element array: [X, Y] + +Note: use toDomXCoord instead of toDomCoords(x, null) and use toDomYCoord +instead of toDomCoords(null, y, axis). + + +
+ + + + +
+
Parameters:
+ +
+ x + +
+
+ +
+ y + +
+
+ +
+ axis + +
+
+ +
+ + + + + + + + +
+ + +
+ + + toDomXCoord(x) + +
+
+ Convert from data x coordinates to canvas/div X coordinate. +If specified, do this conversion for the coordinate system of a particular +axis. +Returns a single value or null if x is null. + + +
+ + + + +
+
Parameters:
+ +
+ x + +
+
+ +
+ + + + + + + + +
+ + +
+ + + toDomYCoord(y, axis) + +
+
+ Convert from data x coordinates to canvas/div Y coordinate and optional +axis. Uses the first axis by default. + +returns a single value or null if y is null. + + +
+ + + + +
+
Parameters:
+ +
+ y + +
+
+ +
+ axis + +
+
+ +
+ + + + + + + + +
+ + +
+ + {Number} + toPercentXCoord(x) + +
+
+ Converts an x value to a percentage from the left to the right of +the drawing area. + +If the coordinate represents a value visible on the canvas, then +the value will be between 0 and 1, where 0 is the left of the canvas. +However, this method will return values outside the range, as +values can fall outside the canvas. + +If x is null, this returns null. + + +
+ + + + +
+
Parameters:
+ +
+ {Number} x + +
+
The data x-coordinate.
+ +
+ + + + + +
+
Returns:
+ +
{Number} A fraction in [0, 1] where 0 = the left edge.
+ +
+ + + + +
+ + +
+ + {Number} + toPercentYCoord(y, axis) + +
+
+ Converts a y for an axis to a percentage from the top to the +bottom of the drawing area. + +If the coordinate represents a value visible on the canvas, then +the value will be between 0 and 1, where 0 is the top of the canvas. +However, this method will return values outside the range, as +values can fall outside the canvas. + +If y is null, this returns null. +if axis is null, this uses the first axis. + + +
+ + + + +
+
Parameters:
+ +
+ {Number} y + +
+
The data y-coordinate.
+ +
+ {Number} axis + Optional +
+
The axis number on which the data coordinate lives.
+ +
+ + + + + +
+
Returns:
+ +
{Number} A fraction in [0, 1] where 0 = the top edge.
+ +
+ + + + +
+ + +
+ + + toString() + +
+
+ Returns information about the Dygraph object, including its containing ID. + + +
+ + + + + + + + + + + +
+ + +
<static> + + + Dygraph.toString() + +
+
+ Returns information about the Dygraph class. + + +
+ + + + + + + + + + + +
+ + +
+ + + updateOptions(attrs) + +
+
+ Changes various properties of the graph. These can include: +
    +
  • file: changes the source data for the graph
  • +
  • errorBars: changes whether the data contains stddev
  • +
+ + +
+ + + + +
+
Parameters:
+ +
+ {Object} attrs + +
+
The new properties and values
+ +
+ + + + + + + + +
+ + +
+ + + visibility() + +
+
+ Returns a boolean array of visibility statuses. + + +
+ + + + + + + + + + + +
+ + +
+ + + xAxisExtremes() + +
+
+ Returns the lower- and upper-bound x-axis values of the +data set. + + +
+ + + + + + + + + + + +
+ + +
+ + + xAxisRange() + +
+
+ Returns the currently-visible x-range. This can be affected by zooming, +panning or a call to updateOptions. +Returns a two-element array: [left, right]. +If the Dygraph has dates on the x-axis, these will be millis since epoch. + + +
+ + + + + + + + + + + +
+ + +
+ + + yAxisRange(idx) + +
+
+ Returns the currently-visible y-range for an axis. This can be affected by +zooming, panning or a call to updateOptions. Axis indices are zero-based. If +called with no arguments, returns the range of the first axis. +Returns a two-element array: [bottom, top]. + + +
+ + + + +
+
Parameters:
+ +
+ idx + +
+
+ +
+ + + + + + + + +
+ + +
+ + + yAxisRanges() + +
+
+ Returns the currently-visible y-ranges for each axis. This can be affected by +zooming, panning, calls to updateOptions, etc. +Returns an array of [bottom, top] pairs, one for each y-axis. + + +
+ + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + Documentation generated by JsDoc Toolkit 2.4.0 on Mon May 09 2011 07:12:49 GMT-0700 (PDT) +
+ + diff --git a/jsdoc-toolkit/out/jsdoc/symbols/_global_.html b/jsdoc-toolkit/out/jsdoc/symbols/_global_.html new file mode 100644 index 0000000..a43c452 --- /dev/null +++ b/jsdoc-toolkit/out/jsdoc/symbols/_global_.html @@ -0,0 +1,251 @@ + + + + + + + JsDoc Reference - _global_ + + + + + + + + + + + +
+ + +
+

Classes

+ +
+ +
+ +
+ +

+ + Built-In Namespace _global_ +

+ + +

+ + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + Documentation generated by JsDoc Toolkit 2.4.0 on Mon May 09 2011 07:12:49 GMT-0700 (PDT) +
+ + diff --git a/jsdoc-toolkit/out/jsdoc/symbols/src/dygraph.js.html b/jsdoc-toolkit/out/jsdoc/symbols/src/dygraph.js.html new file mode 100644 index 0000000..e8272b5 --- /dev/null +++ b/jsdoc-toolkit/out/jsdoc/symbols/src/dygraph.js.html @@ -0,0 +1,4530 @@ +
  1 // Copyright 2006 Dan Vanderkam (danvdk@gmail.com)
+  2 // All Rights Reserved.
+  3 
+  4 /**
+  5  * @fileoverview Creates an interactive, zoomable graph based on a CSV file or
+  6  * string. Dygraph can handle multiple series with or without error bars. The
+  7  * date/value ranges will be automatically set. Dygraph uses the
+  8  * <canvas> tag, so it only works in FF1.5+.
+  9  * @author danvdk@gmail.com (Dan Vanderkam)
+ 10 
+ 11   Usage:
+ 12    <div id="graphdiv" style="width:800px; height:500px;"></div>
+ 13    <script type="text/javascript">
+ 14      new Dygraph(document.getElementById("graphdiv"),
+ 15                  "datafile.csv",  // CSV file with headers
+ 16                  { }); // options
+ 17    </script>
+ 18 
+ 19  The CSV file is of the form
+ 20 
+ 21    Date,SeriesA,SeriesB,SeriesC
+ 22    YYYYMMDD,A1,B1,C1
+ 23    YYYYMMDD,A2,B2,C2
+ 24 
+ 25  If the 'errorBars' option is set in the constructor, the input should be of
+ 26  the form
+ 27    Date,SeriesA,SeriesB,...
+ 28    YYYYMMDD,A1,sigmaA1,B1,sigmaB1,...
+ 29    YYYYMMDD,A2,sigmaA2,B2,sigmaB2,...
+ 30 
+ 31  If the 'fractions' option is set, the input should be of the form:
+ 32 
+ 33    Date,SeriesA,SeriesB,...
+ 34    YYYYMMDD,A1/B1,A2/B2,...
+ 35    YYYYMMDD,A1/B1,A2/B2,...
+ 36 
+ 37  And error bars will be calculated automatically using a binomial distribution.
+ 38 
+ 39  For further documentation and examples, see http://dygraphs.com/
+ 40 
+ 41  */
+ 42 
+ 43 /**
+ 44  * Creates an interactive, zoomable chart.
+ 45  *
+ 46  * @constructor
+ 47  * @param {div | String} div A div or the id of a div into which to construct
+ 48  * the chart.
+ 49  * @param {String | Function} file A file containing CSV data or a function
+ 50  * that returns this data. The most basic expected format for each line is
+ 51  * "YYYY/MM/DD,val1,val2,...". For more information, see
+ 52  * http://dygraphs.com/data.html.
+ 53  * @param {Object} attrs Various other attributes, e.g. errorBars determines
+ 54  * whether the input data contains error ranges. For a complete list of
+ 55  * options, see http://dygraphs.com/options.html.
+ 56  */
+ 57 Dygraph = function(div, data, opts) {
+ 58   if (arguments.length > 0) {
+ 59     if (arguments.length == 4) {
+ 60       // Old versions of dygraphs took in the series labels as a constructor
+ 61       // parameter. This doesn't make sense anymore, but it's easy to continue
+ 62       // to support this usage.
+ 63       this.warn("Using deprecated four-argument dygraph constructor");
+ 64       this.__old_init__(div, data, arguments[2], arguments[3]);
+ 65     } else {
+ 66       this.__init__(div, data, opts);
+ 67     }
+ 68   }
+ 69 };
+ 70 
+ 71 Dygraph.NAME = "Dygraph";
+ 72 Dygraph.VERSION = "1.2";
+ 73 Dygraph.__repr__ = function() {
+ 74   return "[" + this.NAME + " " + this.VERSION + "]";
+ 75 };
+ 76 
+ 77 /**
+ 78  * Returns information about the Dygraph class.
+ 79  */
+ 80 Dygraph.toString = function() {
+ 81   return this.__repr__();
+ 82 };
+ 83 
+ 84 // Various default values
+ 85 Dygraph.DEFAULT_ROLL_PERIOD = 1;
+ 86 Dygraph.DEFAULT_WIDTH = 480;
+ 87 Dygraph.DEFAULT_HEIGHT = 320;
+ 88 Dygraph.AXIS_LINE_WIDTH = 0.3;
+ 89 
+ 90 Dygraph.LOG_SCALE = 10;
+ 91 Dygraph.LN_TEN = Math.log(Dygraph.LOG_SCALE);
+ 92 /**
+ 93  * @private
+ 94  */
+ 95 Dygraph.log10 = function(x) {
+ 96   return Math.log(x) / Dygraph.LN_TEN;
+ 97 }
+ 98 
+ 99 // Default attribute values.
+100 Dygraph.DEFAULT_ATTRS = {
+101   highlightCircleSize: 3,
+102   pixelsPerXLabel: 60,
+103   pixelsPerYLabel: 30,
+104 
+105   labelsDivWidth: 250,
+106   labelsDivStyles: {
+107     // TODO(danvk): move defaults from createStatusMessage_ here.
+108   },
+109   labelsSeparateLines: false,
+110   labelsShowZeroValues: true,
+111   labelsKMB: false,
+112   labelsKMG2: false,
+113   showLabelsOnHighlight: true,
+114 
+115   yValueFormatter: function(a,b) { return Dygraph.numberFormatter(a,b); },
+116   digitsAfterDecimal: 2,
+117   maxNumberWidth: 6,
+118   sigFigs: null,
+119 
+120   strokeWidth: 1.0,
+121 
+122   axisTickSize: 3,
+123   axisLabelFontSize: 14,
+124   xAxisLabelWidth: 50,
+125   yAxisLabelWidth: 50,
+126   xAxisLabelFormatter: Dygraph.dateAxisFormatter,
+127   rightGap: 5,
+128 
+129   showRoller: false,
+130   xValueFormatter: Dygraph.dateString_,
+131   xValueParser: Dygraph.dateParser,
+132   xTicker: Dygraph.dateTicker,
+133 
+134   delimiter: ',',
+135 
+136   sigma: 2.0,
+137   errorBars: false,
+138   fractions: false,
+139   wilsonInterval: true,  // only relevant if fractions is true
+140   customBars: false,
+141   fillGraph: false,
+142   fillAlpha: 0.15,
+143   connectSeparatedPoints: false,
+144 
+145   stackedGraph: false,
+146   hideOverlayOnMouseOut: true,
+147 
+148   // TODO(danvk): support 'onmouseover' and 'never', and remove synonyms.
+149   legend: 'onmouseover',  // the only relevant value at the moment is 'always'.
+150 
+151   stepPlot: false,
+152   avoidMinZero: false,
+153 
+154   // Sizes of the various chart labels.
+155   titleHeight: 28,
+156   xLabelHeight: 18,
+157   yLabelWidth: 18,
+158 
+159   interactionModel: null  // will be set to Dygraph.defaultInteractionModel.
+160 };
+161 
+162 // Various logging levels.
+163 Dygraph.DEBUG = 1;
+164 Dygraph.INFO = 2;
+165 Dygraph.WARNING = 3;
+166 Dygraph.ERROR = 3;
+167 
+168 // Directions for panning and zooming. Use bit operations when combined
+169 // values are possible.
+170 Dygraph.HORIZONTAL = 1;
+171 Dygraph.VERTICAL = 2;
+172 
+173 // Used for initializing annotation CSS rules only once.
+174 Dygraph.addedAnnotationCSS = false;
+175 
+176 /**
+177  * @private
+178  * Return the 2d context for a dygraph canvas.
+179  *
+180  * This method is only exposed for the sake of replacing the function in
+181  * automated tests, e.g.
+182  *
+183  * var oldFunc = Dygraph.getContext();
+184  * Dygraph.getContext = function(canvas) {
+185  *   var realContext = oldFunc(canvas);
+186  *   return new Proxy(realContext);
+187  * };
+188  */
+189 Dygraph.getContext = function(canvas) {
+190   return canvas.getContext("2d");
+191 };
+192 
+193 Dygraph.prototype.__old_init__ = function(div, file, labels, attrs) {
+194   // Labels is no longer a constructor parameter, since it's typically set
+195   // directly from the data source. It also conains a name for the x-axis,
+196   // which the previous constructor form did not.
+197   if (labels != null) {
+198     var new_labels = ["Date"];
+199     for (var i = 0; i < labels.length; i++) new_labels.push(labels[i]);
+200     Dygraph.update(attrs, { 'labels': new_labels });
+201   }
+202   this.__init__(div, file, attrs);
+203 };
+204 
+205 /**
+206  * Initializes the Dygraph. This creates a new DIV and constructs the PlotKit
+207  * and context <canvas> inside of it. See the constructor for details.
+208  * on the parameters.
+209  * @param {Element} div the Element to render the graph into.
+210  * @param {String | Function} file Source data
+211  * @param {Object} attrs Miscellaneous other options
+212  * @private
+213  */
+214 Dygraph.prototype.__init__ = function(div, file, attrs) {
+215   // Hack for IE: if we're using excanvas and the document hasn't finished
+216   // loading yet (and hence may not have initialized whatever it needs to
+217   // initialize), then keep calling this routine periodically until it has.
+218   if (/MSIE/.test(navigator.userAgent) && !window.opera &&
+219       typeof(G_vmlCanvasManager) != 'undefined' &&
+220       document.readyState != 'complete') {
+221     var self = this;
+222     setTimeout(function() { self.__init__(div, file, attrs) }, 100);
+223   }
+224 
+225   // Support two-argument constructor
+226   if (attrs == null) { attrs = {}; }
+227 
+228   // Copy the important bits into the object
+229   // TODO(danvk): most of these should just stay in the attrs_ dictionary.
+230   this.maindiv_ = div;
+231   this.file_ = file;
+232   this.rollPeriod_ = attrs.rollPeriod || Dygraph.DEFAULT_ROLL_PERIOD;
+233   this.previousVerticalX_ = -1;
+234   this.fractions_ = attrs.fractions || false;
+235   this.dateWindow_ = attrs.dateWindow || null;
+236 
+237   this.wilsonInterval_ = attrs.wilsonInterval || true;
+238   this.is_initial_draw_ = true;
+239   this.annotations_ = [];
+240 
+241   // Zoomed indicators - These indicate when the graph has been zoomed and on what axis.
+242   this.zoomed_x_ = false;
+243   this.zoomed_y_ = false;
+244 
+245   // Clear the div. This ensure that, if multiple dygraphs are passed the same
+246   // div, then only one will be drawn.
+247   div.innerHTML = "";
+248 
+249   // If the div isn't already sized then inherit from our attrs or
+250   // give it a default size.
+251   if (div.style.width == '') {
+252     div.style.width = (attrs.width || Dygraph.DEFAULT_WIDTH) + "px";
+253   }
+254   if (div.style.height == '') {
+255     div.style.height = (attrs.height || Dygraph.DEFAULT_HEIGHT) + "px";
+256   }
+257   this.width_ = parseInt(div.style.width, 10);
+258   this.height_ = parseInt(div.style.height, 10);
+259   // The div might have been specified as percent of the current window size,
+260   // convert that to an appropriate number of pixels.
+261   if (div.style.width.indexOf("%") == div.style.width.length - 1) {
+262     this.width_ = div.offsetWidth;
+263   }
+264   if (div.style.height.indexOf("%") == div.style.height.length - 1) {
+265     this.height_ = div.offsetHeight;
+266   }
+267 
+268   if (this.width_ == 0) {
+269     this.error("dygraph has zero width. Please specify a width in pixels.");
+270   }
+271   if (this.height_ == 0) {
+272     this.error("dygraph has zero height. Please specify a height in pixels.");
+273   }
+274 
+275   // TODO(danvk): set fillGraph to be part of attrs_ here, not user_attrs_.
+276   if (attrs['stackedGraph']) {
+277     attrs['fillGraph'] = true;
+278     // TODO(nikhilk): Add any other stackedGraph checks here.
+279   }
+280 
+281   // Dygraphs has many options, some of which interact with one another.
+282   // To keep track of everything, we maintain two sets of options:
+283   //
+284   //  this.user_attrs_   only options explicitly set by the user.
+285   //  this.attrs_        defaults, options derived from user_attrs_, data.
+286   //
+287   // Options are then accessed this.attr_('attr'), which first looks at
+288   // user_attrs_ and then computed attrs_. This way Dygraphs can set intelligent
+289   // defaults without overriding behavior that the user specifically asks for.
+290   this.user_attrs_ = {};
+291   Dygraph.update(this.user_attrs_, attrs);
+292 
+293   this.attrs_ = {};
+294   Dygraph.update(this.attrs_, Dygraph.DEFAULT_ATTRS);
+295 
+296   this.boundaryIds_ = [];
+297 
+298   // Make a note of whether labels will be pulled from the CSV file.
+299   this.labelsFromCSV_ = (this.attr_("labels") == null);
+300 
+301   // Create the containing DIV and other interactive elements
+302   this.createInterface_();
+303 
+304   this.start_();
+305 };
+306 
+307 /**
+308  * Returns the zoomed status of the chart for one or both axes.
+309  *
+310  * Axis is an optional parameter. Can be set to 'x' or 'y'.
+311  *
+312  * The zoomed status for an axis is set whenever a user zooms using the mouse
+313  * or when the dateWindow or valueRange are updated (unless the isZoomedIgnoreProgrammaticZoom
+314  * option is also specified).
+315  */
+316 Dygraph.prototype.isZoomed = function(axis) {
+317   if (axis == null) return this.zoomed_x_ || this.zoomed_y_;
+318   if (axis == 'x') return this.zoomed_x_;
+319   if (axis == 'y') return this.zoomed_y_;
+320   throw "axis parameter to Dygraph.isZoomed must be missing, 'x' or 'y'.";
+321 };
+322 
+323 /**
+324  * Returns information about the Dygraph object, including its containing ID.
+325  */
+326 Dygraph.prototype.toString = function() {
+327   var maindiv = this.maindiv_;
+328   var id = (maindiv && maindiv.id) ? maindiv.id : maindiv
+329   return "[Dygraph " + id + "]";
+330 }
+331 
+332 /**
+333  * @private
+334  * Returns the value of an option. This may be set by the user (either in the
+335  * constructor or by calling updateOptions) or by dygraphs, and may be set to a
+336  * per-series value.
+337  * @param { String } name The name of the option, e.g. 'rollPeriod'.
+338  * @param { String } [seriesName] The name of the series to which the option
+339  * will be applied. If no per-series value of this option is available, then
+340  * the global value is returned. This is optional.
+341  * @return { ... } The value of the option.
+342  */
+343 Dygraph.prototype.attr_ = function(name, seriesName) {
+344 // <REMOVE_FOR_COMBINED>
+345   if (typeof(Dygraph.OPTIONS_REFERENCE) === 'undefined') {
+346     this.error('Must include options reference JS for testing');
+347   } else if (!Dygraph.OPTIONS_REFERENCE.hasOwnProperty(name)) {
+348     this.error('Dygraphs is using property ' + name + ', which has no entry ' +
+349                'in the Dygraphs.OPTIONS_REFERENCE listing.');
+350     // Only log this error once.
+351     Dygraph.OPTIONS_REFERENCE[name] = true;
+352   }
+353 // </REMOVE_FOR_COMBINED>
+354   if (seriesName &&
+355       typeof(this.user_attrs_[seriesName]) != 'undefined' &&
+356       this.user_attrs_[seriesName] != null &&
+357       typeof(this.user_attrs_[seriesName][name]) != 'undefined') {
+358     return this.user_attrs_[seriesName][name];
+359   } else if (typeof(this.user_attrs_[name]) != 'undefined') {
+360     return this.user_attrs_[name];
+361   } else if (typeof(this.attrs_[name]) != 'undefined') {
+362     return this.attrs_[name];
+363   } else {
+364     return null;
+365   }
+366 };
+367 
+368 // TODO(danvk): any way I can get the line numbers to be this.warn call?
+369 /**
+370  * @private
+371  * Log an error on the JS console at the given severity.
+372  * @param { Integer } severity One of Dygraph.{DEBUG,INFO,WARNING,ERROR}
+373  * @param { String } The message to log.
+374  */
+375 Dygraph.prototype.log = function(severity, message) {
+376   if (typeof(console) != 'undefined') {
+377     switch (severity) {
+378       case Dygraph.DEBUG:
+379         console.debug('dygraphs: ' + message);
+380         break;
+381       case Dygraph.INFO:
+382         console.info('dygraphs: ' + message);
+383         break;
+384       case Dygraph.WARNING:
+385         console.warn('dygraphs: ' + message);
+386         break;
+387       case Dygraph.ERROR:
+388         console.error('dygraphs: ' + message);
+389         break;
+390     }
+391   }
+392 };
+393 
+394 /**
+395  * @private
+396  */
+397 Dygraph.prototype.info = function(message) {
+398   this.log(Dygraph.INFO, message);
+399 };
+400 
+401 /**
+402  * @private
+403  */
+404 Dygraph.prototype.warn = function(message) {
+405   this.log(Dygraph.WARNING, message);
+406 };
+407 
+408 /**
+409  * @private
+410  */
+411 Dygraph.prototype.error = function(message) {
+412   this.log(Dygraph.ERROR, message);
+413 };
+414 
+415 /**
+416  * Returns the current rolling period, as set by the user or an option.
+417  * @return {Number} The number of points in the rolling window
+418  */
+419 Dygraph.prototype.rollPeriod = function() {
+420   return this.rollPeriod_;
+421 };
+422 
+423 /**
+424  * Returns the currently-visible x-range. This can be affected by zooming,
+425  * panning or a call to updateOptions.
+426  * Returns a two-element array: [left, right].
+427  * If the Dygraph has dates on the x-axis, these will be millis since epoch.
+428  */
+429 Dygraph.prototype.xAxisRange = function() {
+430   return this.dateWindow_ ? this.dateWindow_ : this.xAxisExtremes();
+431 };
+432 
+433 /**
+434  * Returns the lower- and upper-bound x-axis values of the
+435  * data set.
+436  */
+437 Dygraph.prototype.xAxisExtremes = function() {
+438   var left = this.rawData_[0][0];
+439   var right = this.rawData_[this.rawData_.length - 1][0];
+440   return [left, right];
+441 };
+442 
+443 /**
+444  * Returns the currently-visible y-range for an axis. This can be affected by
+445  * zooming, panning or a call to updateOptions. Axis indices are zero-based. If
+446  * called with no arguments, returns the range of the first axis.
+447  * Returns a two-element array: [bottom, top].
+448  */
+449 Dygraph.prototype.yAxisRange = function(idx) {
+450   if (typeof(idx) == "undefined") idx = 0;
+451   if (idx < 0 || idx >= this.axes_.length) return null;
+452   return [ this.axes_[idx].computedValueRange[0],
+453            this.axes_[idx].computedValueRange[1] ];
+454 };
+455 
+456 /**
+457  * Returns the currently-visible y-ranges for each axis. This can be affected by
+458  * zooming, panning, calls to updateOptions, etc.
+459  * Returns an array of [bottom, top] pairs, one for each y-axis.
+460  */
+461 Dygraph.prototype.yAxisRanges = function() {
+462   var ret = [];
+463   for (var i = 0; i < this.axes_.length; i++) {
+464     ret.push(this.yAxisRange(i));
+465   }
+466   return ret;
+467 };
+468 
+469 // TODO(danvk): use these functions throughout dygraphs.
+470 /**
+471  * Convert from data coordinates to canvas/div X/Y coordinates.
+472  * If specified, do this conversion for the coordinate system of a particular
+473  * axis. Uses the first axis by default.
+474  * Returns a two-element array: [X, Y]
+475  *
+476  * Note: use toDomXCoord instead of toDomCoords(x, null) and use toDomYCoord
+477  * instead of toDomCoords(null, y, axis).
+478  */
+479 Dygraph.prototype.toDomCoords = function(x, y, axis) {
+480   return [ this.toDomXCoord(x), this.toDomYCoord(y, axis) ];
+481 };
+482 
+483 /**
+484  * Convert from data x coordinates to canvas/div X coordinate.
+485  * If specified, do this conversion for the coordinate system of a particular
+486  * axis.
+487  * Returns a single value or null if x is null.
+488  */
+489 Dygraph.prototype.toDomXCoord = function(x) {
+490   if (x == null) {
+491     return null;
+492   };
+493 
+494   var area = this.plotter_.area;
+495   var xRange = this.xAxisRange();
+496   return area.x + (x - xRange[0]) / (xRange[1] - xRange[0]) * area.w;
+497 }
+498 
+499 /**
+500  * Convert from data x coordinates to canvas/div Y coordinate and optional
+501  * axis. Uses the first axis by default.
+502  *
+503  * returns a single value or null if y is null.
+504  */
+505 Dygraph.prototype.toDomYCoord = function(y, axis) {
+506   var pct = this.toPercentYCoord(y, axis);
+507 
+508   if (pct == null) {
+509     return null;
+510   }
+511   var area = this.plotter_.area;
+512   return area.y + pct * area.h;
+513 }
+514 
+515 /**
+516  * Convert from canvas/div coords to data coordinates.
+517  * If specified, do this conversion for the coordinate system of a particular
+518  * axis. Uses the first axis by default.
+519  * Returns a two-element array: [X, Y].
+520  *
+521  * Note: use toDataXCoord instead of toDataCoords(x, null) and use toDataYCoord
+522  * instead of toDataCoords(null, y, axis).
+523  */
+524 Dygraph.prototype.toDataCoords = function(x, y, axis) {
+525   return [ this.toDataXCoord(x), this.toDataYCoord(y, axis) ];
+526 };
+527 
+528 /**
+529  * Convert from canvas/div x coordinate to data coordinate.
+530  *
+531  * If x is null, this returns null.
+532  */
+533 Dygraph.prototype.toDataXCoord = function(x) {
+534   if (x == null) {
+535     return null;
+536   }
+537 
+538   var area = this.plotter_.area;
+539   var xRange = this.xAxisRange();
+540   return xRange[0] + (x - area.x) / area.w * (xRange[1] - xRange[0]);
+541 };
+542 
+543 /**
+544  * Convert from canvas/div y coord to value.
+545  *
+546  * If y is null, this returns null.
+547  * if axis is null, this uses the first axis.
+548  */
+549 Dygraph.prototype.toDataYCoord = function(y, axis) {
+550   if (y == null) {
+551     return null;
+552   }
+553 
+554   var area = this.plotter_.area;
+555   var yRange = this.yAxisRange(axis);
+556 
+557   if (typeof(axis) == "undefined") axis = 0;
+558   if (!this.axes_[axis].logscale) {
+559     return yRange[0] + (area.h - y) / area.h * (yRange[1] - yRange[0]);
+560   } else {
+561     // Computing the inverse of toDomCoord.
+562     var pct = (y - area.y) / area.h
+563 
+564     // Computing the inverse of toPercentYCoord. The function was arrived at with
+565     // the following steps:
+566     //
+567     // Original calcuation:
+568     // pct = (logr1 - Dygraph.log10(y)) / (logr1 - Dygraph.log10(yRange[0]));
+569     //
+570     // Move denominator to both sides:
+571     // pct * (logr1 - Dygraph.log10(yRange[0])) = logr1 - Dygraph.log10(y);
+572     //
+573     // subtract logr1, and take the negative value.
+574     // logr1 - (pct * (logr1 - Dygraph.log10(yRange[0]))) = Dygraph.log10(y);
+575     //
+576     // Swap both sides of the equation, and we can compute the log of the
+577     // return value. Which means we just need to use that as the exponent in
+578     // e^exponent.
+579     // Dygraph.log10(y) = logr1 - (pct * (logr1 - Dygraph.log10(yRange[0])));
+580 
+581     var logr1 = Dygraph.log10(yRange[1]);
+582     var exponent = logr1 - (pct * (logr1 - Dygraph.log10(yRange[0])));
+583     var value = Math.pow(Dygraph.LOG_SCALE, exponent);
+584     return value;
+585   }
+586 };
+587 
+588 /**
+589  * Converts a y for an axis to a percentage from the top to the
+590  * bottom of the drawing area.
+591  *
+592  * If the coordinate represents a value visible on the canvas, then
+593  * the value will be between 0 and 1, where 0 is the top of the canvas.
+594  * However, this method will return values outside the range, as
+595  * values can fall outside the canvas.
+596  *
+597  * If y is null, this returns null.
+598  * if axis is null, this uses the first axis.
+599  *
+600  * @param { Number } y The data y-coordinate.
+601  * @param { Number } [axis] The axis number on which the data coordinate lives.
+602  * @return { Number } A fraction in [0, 1] where 0 = the top edge.
+603  */
+604 Dygraph.prototype.toPercentYCoord = function(y, axis) {
+605   if (y == null) {
+606     return null;
+607   }
+608   if (typeof(axis) == "undefined") axis = 0;
+609 
+610   var area = this.plotter_.area;
+611   var yRange = this.yAxisRange(axis);
+612 
+613   var pct;
+614   if (!this.axes_[axis].logscale) {
+615     // yRange[1] - y is unit distance from the bottom.
+616     // yRange[1] - yRange[0] is the scale of the range.
+617     // (yRange[1] - y) / (yRange[1] - yRange[0]) is the % from the bottom.
+618     pct = (yRange[1] - y) / (yRange[1] - yRange[0]);
+619   } else {
+620     var logr1 = Dygraph.log10(yRange[1]);
+621     pct = (logr1 - Dygraph.log10(y)) / (logr1 - Dygraph.log10(yRange[0]));
+622   }
+623   return pct;
+624 }
+625 
+626 /**
+627  * Converts an x value to a percentage from the left to the right of
+628  * the drawing area.
+629  *
+630  * If the coordinate represents a value visible on the canvas, then
+631  * the value will be between 0 and 1, where 0 is the left of the canvas.
+632  * However, this method will return values outside the range, as
+633  * values can fall outside the canvas.
+634  *
+635  * If x is null, this returns null.
+636  * @param { Number } x The data x-coordinate.
+637  * @return { Number } A fraction in [0, 1] where 0 = the left edge.
+638  */
+639 Dygraph.prototype.toPercentXCoord = function(x) {
+640   if (x == null) {
+641     return null;
+642   }
+643 
+644   var xRange = this.xAxisRange();
+645   return (x - xRange[0]) / (xRange[1] - xRange[0]);
+646 };
+647 
+648 /**
+649  * Returns the number of columns (including the independent variable).
+650  * @return { Integer } The number of columns.
+651  */
+652 Dygraph.prototype.numColumns = function() {
+653   return this.rawData_[0].length;
+654 };
+655 
+656 /**
+657  * Returns the number of rows (excluding any header/label row).
+658  * @return { Integer } The number of rows, less any header.
+659  */
+660 Dygraph.prototype.numRows = function() {
+661   return this.rawData_.length;
+662 };
+663 
+664 /**
+665  * Returns the value in the given row and column. If the row and column exceed
+666  * the bounds on the data, returns null. Also returns null if the value is
+667  * missing.
+668  * @param { Number} row The row number of the data (0-based). Row 0 is the
+669  * first row of data, not a header row.
+670  * @param { Number} col The column number of the data (0-based)
+671  * @return { Number } The value in the specified cell or null if the row/col
+672  * were out of range.
+673  */
+674 Dygraph.prototype.getValue = function(row, col) {
+675   if (row < 0 || row > this.rawData_.length) return null;
+676   if (col < 0 || col > this.rawData_[row].length) return null;
+677 
+678   return this.rawData_[row][col];
+679 };
+680 
+681 /**
+682  * @private
+683  * Add an event handler. This smooths a difference between IE and the rest of
+684  * the world.
+685  * @param { DOM element } el The element to add the event to.
+686  * @param { String } evt The name of the event, e.g. 'click' or 'mousemove'.
+687  * @param { Function } fn The function to call on the event. The function takes
+688  * one parameter: the event object.
+689  */
+690 Dygraph.addEvent = function(el, evt, fn) {
+691   var normed_fn = function(e) {
+692     if (!e) var e = window.event;
+693     fn(e);
+694   };
+695   if (window.addEventListener) {  // Mozilla, Netscape, Firefox
+696     el.addEventListener(evt, normed_fn, false);
+697   } else {  // IE
+698     el.attachEvent('on' + evt, normed_fn);
+699   }
+700 };
+701 
+702 
+703 /**
+704  * @private
+705  * Cancels further processing of an event. This is useful to prevent default
+706  * browser actions, e.g. highlighting text on a double-click.
+707  * Based on the article at
+708  * http://www.switchonthecode.com/tutorials/javascript-tutorial-the-scroll-wheel
+709  * @param { Event } e The event whose normal behavior should be canceled.
+710  */
+711 Dygraph.cancelEvent = function(e) {
+712   e = e ? e : window.event;
+713   if (e.stopPropagation) {
+714     e.stopPropagation();
+715   }
+716   if (e.preventDefault) {
+717     e.preventDefault();
+718   }
+719   e.cancelBubble = true;
+720   e.cancel = true;
+721   e.returnValue = false;
+722   return false;
+723 };
+724 
+725 
+726 /**
+727  * Generates interface elements for the Dygraph: a containing div, a div to
+728  * display the current point, and a textbox to adjust the rolling average
+729  * period. Also creates the Renderer/Layout elements.
+730  * @private
+731  */
+732 Dygraph.prototype.createInterface_ = function() {
+733   // Create the all-enclosing graph div
+734   var enclosing = this.maindiv_;
+735 
+736   this.graphDiv = document.createElement("div");
+737   this.graphDiv.style.width = this.width_ + "px";
+738   this.graphDiv.style.height = this.height_ + "px";
+739   enclosing.appendChild(this.graphDiv);
+740 
+741   // Create the canvas for interactive parts of the chart.
+742   this.canvas_ = Dygraph.createCanvas();
+743   this.canvas_.style.position = "absolute";
+744   this.canvas_.width = this.width_;
+745   this.canvas_.height = this.height_;
+746   this.canvas_.style.width = this.width_ + "px";    // for IE
+747   this.canvas_.style.height = this.height_ + "px";  // for IE
+748 
+749   this.canvas_ctx_ = Dygraph.getContext(this.canvas_);
+750 
+751   // ... and for static parts of the chart.
+752   this.hidden_ = this.createPlotKitCanvas_(this.canvas_);
+753   this.hidden_ctx_ = Dygraph.getContext(this.hidden_);
+754 
+755   // The interactive parts of the graph are drawn on top of the chart.
+756   this.graphDiv.appendChild(this.hidden_);
+757   this.graphDiv.appendChild(this.canvas_);
+758   this.mouseEventElement_ = this.canvas_;
+759 
+760   var dygraph = this;
+761   Dygraph.addEvent(this.mouseEventElement_, 'mousemove', function(e) {
+762     dygraph.mouseMove_(e);
+763   });
+764   Dygraph.addEvent(this.mouseEventElement_, 'mouseout', function(e) {
+765     dygraph.mouseOut_(e);
+766   });
+767 
+768   // Create the grapher
+769   // TODO(danvk): why does the Layout need its own set of options?
+770   this.layoutOptions_ = { 'xOriginIsZero': false };
+771   Dygraph.update(this.layoutOptions_, this.attrs_);
+772   Dygraph.update(this.layoutOptions_, this.user_attrs_);
+773   Dygraph.update(this.layoutOptions_, {
+774     'errorBars': (this.attr_("errorBars") || this.attr_("customBars")) });
+775 
+776   this.layout_ = new DygraphLayout(this, this.layoutOptions_);
+777 
+778   // TODO(danvk): why does the Renderer need its own set of options?
+779   this.renderOptions_ = { colorScheme: this.colors_,
+780                           strokeColor: null,
+781                           axisLineWidth: Dygraph.AXIS_LINE_WIDTH };
+782   Dygraph.update(this.renderOptions_, this.attrs_);
+783   Dygraph.update(this.renderOptions_, this.user_attrs_);
+784 
+785   this.createStatusMessage_();
+786   this.createDragInterface_();
+787 };
+788 
+789 /**
+790  * Detach DOM elements in the dygraph and null out all data references.
+791  * Calling this when you're done with a dygraph can dramatically reduce memory
+792  * usage. See, e.g., the tests/perf.html example.
+793  */
+794 Dygraph.prototype.destroy = function() {
+795   var removeRecursive = function(node) {
+796     while (node.hasChildNodes()) {
+797       removeRecursive(node.firstChild);
+798       node.removeChild(node.firstChild);
+799     }
+800   };
+801   removeRecursive(this.maindiv_);
+802 
+803   var nullOut = function(obj) {
+804     for (var n in obj) {
+805       if (typeof(obj[n]) === 'object') {
+806         obj[n] = null;
+807       }
+808     }
+809   };
+810 
+811   // These may not all be necessary, but it can't hurt...
+812   nullOut(this.layout_);
+813   nullOut(this.plotter_);
+814   nullOut(this);
+815 };
+816 
+817 /**
+818  * Creates the canvas on which the chart will be drawn. Only the Renderer ever
+819  * draws on this particular canvas. All Dygraph work (i.e. drawing hover dots
+820  * or the zoom rectangles) is done on this.canvas_.
+821  * @param {Object} canvas The Dygraph canvas over which to overlay the plot
+822  * @return {Object} The newly-created canvas
+823  * @private
+824  */
+825 Dygraph.prototype.createPlotKitCanvas_ = function(canvas) {
+826   var h = Dygraph.createCanvas();
+827   h.style.position = "absolute";
+828   // TODO(danvk): h should be offset from canvas. canvas needs to include
+829   // some extra area to make it easier to zoom in on the far left and far
+830   // right. h needs to be precisely the plot area, so that clipping occurs.
+831   h.style.top = canvas.style.top;
+832   h.style.left = canvas.style.left;
+833   h.width = this.width_;
+834   h.height = this.height_;
+835   h.style.width = this.width_ + "px";    // for IE
+836   h.style.height = this.height_ + "px";  // for IE
+837   return h;
+838 };
+839 
+840 /**
+841  * Convert hsv values to an rgb(r,g,b) string. Taken from MochiKit.Color. This
+842  * is used to generate default series colors which are evenly spaced on the
+843  * color wheel.
+844  * @param { Number } hue Range is 0.0-1.0.
+845  * @param { Number } saturation Range is 0.0-1.0.
+846  * @param { Number } value Range is 0.0-1.0.
+847  * @return { String } "rgb(r,g,b)" where r, g and b range from 0-255.
+848  * @private
+849  */
+850 Dygraph.hsvToRGB = function (hue, saturation, value) {
+851   var red;
+852   var green;
+853   var blue;
+854   if (saturation === 0) {
+855     red = value;
+856     green = value;
+857     blue = value;
+858   } else {
+859     var i = Math.floor(hue * 6);
+860     var f = (hue * 6) - i;
+861     var p = value * (1 - saturation);
+862     var q = value * (1 - (saturation * f));
+863     var t = value * (1 - (saturation * (1 - f)));
+864     switch (i) {
+865       case 1: red = q; green = value; blue = p; break;
+866       case 2: red = p; green = value; blue = t; break;
+867       case 3: red = p; green = q; blue = value; break;
+868       case 4: red = t; green = p; blue = value; break;
+869       case 5: red = value; green = p; blue = q; break;
+870       case 6: // fall through
+871       case 0: red = value; green = t; blue = p; break;
+872     }
+873   }
+874   red = Math.floor(255 * red + 0.5);
+875   green = Math.floor(255 * green + 0.5);
+876   blue = Math.floor(255 * blue + 0.5);
+877   return 'rgb(' + red + ',' + green + ',' + blue + ')';
+878 };
+879 
+880 
+881 /**
+882  * Generate a set of distinct colors for the data series. This is done with a
+883  * color wheel. Saturation/Value are customizable, and the hue is
+884  * equally-spaced around the color wheel. If a custom set of colors is
+885  * specified, that is used instead.
+886  * @private
+887  */
+888 Dygraph.prototype.setColors_ = function() {
+889   // TODO(danvk): compute this directly into this.attrs_['colorScheme'] and do
+890   // away with this.renderOptions_.
+891   var num = this.attr_("labels").length - 1;
+892   this.colors_ = [];
+893   var colors = this.attr_('colors');
+894   if (!colors) {
+895     var sat = this.attr_('colorSaturation') || 1.0;
+896     var val = this.attr_('colorValue') || 0.5;
+897     var half = Math.ceil(num / 2);
+898     for (var i = 1; i <= num; i++) {
+899       if (!this.visibility()[i-1]) continue;
+900       // alternate colors for high contrast.
+901       var idx = i % 2 ? Math.ceil(i / 2) : (half + i / 2);
+902       var hue = (1.0 * idx/ (1 + num));
+903       this.colors_.push(Dygraph.hsvToRGB(hue, sat, val));
+904     }
+905   } else {
+906     for (var i = 0; i < num; i++) {
+907       if (!this.visibility()[i]) continue;
+908       var colorStr = colors[i % colors.length];
+909       this.colors_.push(colorStr);
+910     }
+911   }
+912 
+913   // TODO(danvk): update this w/r/t/ the new options system.
+914   this.renderOptions_.colorScheme = this.colors_;
+915   Dygraph.update(this.plotter_.options, this.renderOptions_);
+916   Dygraph.update(this.layoutOptions_, this.user_attrs_);
+917   Dygraph.update(this.layoutOptions_, this.attrs_);
+918 };
+919 
+920 /**
+921  * Return the list of colors. This is either the list of colors passed in the
+922  * attributes or the autogenerated list of rgb(r,g,b) strings.
+923  * @return {Array<string>} The list of colors.
+924  */
+925 Dygraph.prototype.getColors = function() {
+926   return this.colors_;
+927 };
+928 
+929 // The following functions are from quirksmode.org with a modification for Safari from
+930 // http://blog.firetree.net/2005/07/04/javascript-find-position/
+931 // http://www.quirksmode.org/js/findpos.html
+932 
+933 /**
+934  * @private
+935  */
+936 Dygraph.findPosX = function(obj) {
+937   var curleft = 0;
+938   if(obj.offsetParent)
+939     while(1)
+940     {
+941       curleft += obj.offsetLeft;
+942       if(!obj.offsetParent)
+943         break;
+944       obj = obj.offsetParent;
+945     }
+946   else if(obj.x)
+947     curleft += obj.x;
+948   return curleft;
+949 };
+950 
+951 
+952 /**
+953  * @private
+954  */
+955 Dygraph.findPosY = function(obj) {
+956   var curtop = 0;
+957   if(obj.offsetParent)
+958     while(1)
+959     {
+960       curtop += obj.offsetTop;
+961       if(!obj.offsetParent)
+962         break;
+963       obj = obj.offsetParent;
+964     }
+965   else if(obj.y)
+966     curtop += obj.y;
+967   return curtop;
+968 };
+969 
+970 
+971 /**
+972  * Create the div that contains information on the selected point(s)
+973  * This goes in the top right of the canvas, unless an external div has already
+974  * been specified.
+975  * @private
+976  */
+977 Dygraph.prototype.createStatusMessage_ = function() {
+978   var userLabelsDiv = this.user_attrs_["labelsDiv"];
+979   if (userLabelsDiv && null != userLabelsDiv
+980     && (typeof(userLabelsDiv) == "string" || userLabelsDiv instanceof String)) {
+981     this.user_attrs_["labelsDiv"] = document.getElementById(userLabelsDiv);
+982   }
+983   if (!this.attr_("labelsDiv")) {
+984     var divWidth = this.attr_('labelsDivWidth');
+985     var messagestyle = {
+986       "position": "absolute",
+987       "fontSize": "14px",
+988       "zIndex": 10,
+989       "width": divWidth + "px",
+990       "top": "0px",
+991       "left": (this.width_ - divWidth - 2) + "px",
+992       "background": "white",
+993       "textAlign": "left",
+994       "overflow": "hidden"};
+995     Dygraph.update(messagestyle, this.attr_('labelsDivStyles'));
+996     var div = document.createElement("div");
+997     for (var name in messagestyle) {
+998       if (messagestyle.hasOwnProperty(name)) {
+999         div.style[name] = messagestyle[name];
+1000       }
+1001     }
+1002     this.graphDiv.appendChild(div);
+1003     this.attrs_.labelsDiv = div;
+1004   }
+1005 };
+1006 
+1007 /**
+1008  * Position the labels div so that:
+1009  * - its right edge is flush with the right edge of the charting area
+1010  * - its top edge is flush with the top edge of the charting area
+1011  * @private
+1012  */
+1013 Dygraph.prototype.positionLabelsDiv_ = function() {
+1014   // Don't touch a user-specified labelsDiv.
+1015   if (this.user_attrs_.hasOwnProperty("labelsDiv")) return;
+1016 
+1017   var area = this.plotter_.area;
+1018   var div = this.attr_("labelsDiv");
+1019   div.style.left = area.x + area.w - this.attr_("labelsDivWidth") - 1 + "px";
+1020   div.style.top = area.y + "px";
+1021 };
+1022 
+1023 /**
+1024  * Create the text box to adjust the averaging period
+1025  * @private
+1026  */
+1027 Dygraph.prototype.createRollInterface_ = function() {
+1028   // Create a roller if one doesn't exist already.
+1029   if (!this.roller_) {
+1030     this.roller_ = document.createElement("input");
+1031     this.roller_.type = "text";
+1032     this.roller_.style.display = "none";
+1033     this.graphDiv.appendChild(this.roller_);
+1034   }
+1035 
+1036   var display = this.attr_('showRoller') ? 'block' : 'none';
+1037 
+1038   var area = this.plotter_.area;
+1039   var textAttr = { "position": "absolute",
+1040                    "zIndex": 10,
+1041                    "top": (area.y + area.h - 25) + "px",
+1042                    "left": (area.x + 1) + "px",
+1043                    "display": display
+1044                   };
+1045   this.roller_.size = "2";
+1046   this.roller_.value = this.rollPeriod_;
+1047   for (var name in textAttr) {
+1048     if (textAttr.hasOwnProperty(name)) {
+1049       this.roller_.style[name] = textAttr[name];
+1050     }
+1051   }
+1052 
+1053   var dygraph = this;
+1054   this.roller_.onchange = function() { dygraph.adjustRoll(dygraph.roller_.value); };
+1055 };
+1056 
+1057 /**
+1058  * @private
+1059  * Returns the x-coordinate of the event in a coordinate system where the
+1060  * top-left corner of the page (not the window) is (0,0).
+1061  * Taken from MochiKit.Signal
+1062  */
+1063 Dygraph.pageX = function(e) {
+1064   if (e.pageX) {
+1065     return (!e.pageX || e.pageX < 0) ? 0 : e.pageX;
+1066   } else {
+1067     var de = document;
+1068     var b = document.body;
+1069     return e.clientX +
+1070         (de.scrollLeft || b.scrollLeft) -
+1071         (de.clientLeft || 0);
+1072   }
+1073 };
+1074 
+1075 /**
+1076  * @private
+1077  * Returns the y-coordinate of the event in a coordinate system where the
+1078  * top-left corner of the page (not the window) is (0,0).
+1079  * Taken from MochiKit.Signal
+1080  */
+1081 Dygraph.pageY = function(e) {
+1082   if (e.pageY) {
+1083     return (!e.pageY || e.pageY < 0) ? 0 : e.pageY;
+1084   } else {
+1085     var de = document;
+1086     var b = document.body;
+1087     return e.clientY +
+1088         (de.scrollTop || b.scrollTop) -
+1089         (de.clientTop || 0);
+1090   }
+1091 };
+1092 
+1093 /**
+1094  * @private
+1095  * Converts page the x-coordinate of the event to pixel x-coordinates on the
+1096  * canvas (i.e. DOM Coords).
+1097  */
+1098 Dygraph.prototype.dragGetX_ = function(e, context) {
+1099   return Dygraph.pageX(e) - context.px
+1100 };
+1101 
+1102 /**
+1103  * @private
+1104  * Converts page the y-coordinate of the event to pixel y-coordinates on the
+1105  * canvas (i.e. DOM Coords).
+1106  */
+1107 Dygraph.prototype.dragGetY_ = function(e, context) {
+1108   return Dygraph.pageY(e) - context.py
+1109 };
+1110 
+1111 /**
+1112  * Called in response to an interaction model operation that
+1113  * should start the default panning behavior.
+1114  *
+1115  * It's used in the default callback for "mousedown" operations.
+1116  * Custom interaction model builders can use it to provide the default
+1117  * panning behavior.
+1118  *
+1119  * @param { Event } event the event object which led to the startPan call.
+1120  * @param { Dygraph} g The dygraph on which to act.
+1121  * @param { Object} context The dragging context object (with
+1122  * dragStartX/dragStartY/etc. properties). This function modifies the context.
+1123  */
+1124 Dygraph.startPan = function(event, g, context) {
+1125   context.isPanning = true;
+1126   var xRange = g.xAxisRange();
+1127   context.dateRange = xRange[1] - xRange[0];
+1128   context.initialLeftmostDate = xRange[0];
+1129   context.xUnitsPerPixel = context.dateRange / (g.plotter_.area.w - 1);
+1130 
+1131   if (g.attr_("panEdgeFraction")) {
+1132     var maxXPixelsToDraw = g.width_ * g.attr_("panEdgeFraction");
+1133     var xExtremes = g.xAxisExtremes(); // I REALLY WANT TO CALL THIS xTremes!
+1134 
+1135     var boundedLeftX = g.toDomXCoord(xExtremes[0]) - maxXPixelsToDraw;
+1136     var boundedRightX = g.toDomXCoord(xExtremes[1]) + maxXPixelsToDraw;
+1137 
+1138     var boundedLeftDate = g.toDataXCoord(boundedLeftX);
+1139     var boundedRightDate = g.toDataXCoord(boundedRightX);
+1140     context.boundedDates = [boundedLeftDate, boundedRightDate];
+1141 
+1142     var boundedValues = [];
+1143     var maxYPixelsToDraw = g.height_ * g.attr_("panEdgeFraction");
+1144 
+1145     for (var i = 0; i < g.axes_.length; i++) {
+1146       var axis = g.axes_[i];
+1147       var yExtremes = axis.extremeRange;
+1148 
+1149       var boundedTopY = g.toDomYCoord(yExtremes[0], i) + maxYPixelsToDraw;
+1150       var boundedBottomY = g.toDomYCoord(yExtremes[1], i) - maxYPixelsToDraw;
+1151 
+1152       var boundedTopValue = g.toDataYCoord(boundedTopY);
+1153       var boundedBottomValue = g.toDataYCoord(boundedBottomY);
+1154 
+1155       boundedValues[i] = [boundedTopValue, boundedBottomValue];
+1156     }
+1157     context.boundedValues = boundedValues;
+1158   }
+1159 
+1160   // Record the range of each y-axis at the start of the drag.
+1161   // If any axis has a valueRange or valueWindow, then we want a 2D pan.
+1162   context.is2DPan = false;
+1163   for (var i = 0; i < g.axes_.length; i++) {
+1164     var axis = g.axes_[i];
+1165     var yRange = g.yAxisRange(i);
+1166     // TODO(konigsberg): These values should be in |context|.
+1167     // In log scale, initialTopValue, dragValueRange and unitsPerPixel are log scale.
+1168     if (axis.logscale) {
+1169       axis.initialTopValue = Dygraph.log10(yRange[1]);
+1170       axis.dragValueRange = Dygraph.log10(yRange[1]) - Dygraph.log10(yRange[0]);
+1171     } else {
+1172       axis.initialTopValue = yRange[1];
+1173       axis.dragValueRange = yRange[1] - yRange[0];
+1174     }
+1175     axis.unitsPerPixel = axis.dragValueRange / (g.plotter_.area.h - 1);
+1176 
+1177     // While calculating axes, set 2dpan.
+1178     if (axis.valueWindow || axis.valueRange) context.is2DPan = true;
+1179   }
+1180 };
+1181 
+1182 /**
+1183  * Called in response to an interaction model operation that
+1184  * responds to an event that pans the view.
+1185  *
+1186  * It's used in the default callback for "mousemove" operations.
+1187  * Custom interaction model builders can use it to provide the default
+1188  * panning behavior.
+1189  *
+1190  * @param { Event } event the event object which led to the movePan call.
+1191  * @param { Dygraph} g The dygraph on which to act.
+1192  * @param { Object} context The dragging context object (with
+1193  * dragStartX/dragStartY/etc. properties). This function modifies the context.
+1194  */
+1195 Dygraph.movePan = function(event, g, context) {
+1196   context.dragEndX = g.dragGetX_(event, context);
+1197   context.dragEndY = g.dragGetY_(event, context);
+1198 
+1199   var minDate = context.initialLeftmostDate -
+1200     (context.dragEndX - context.dragStartX) * context.xUnitsPerPixel;
+1201   if (context.boundedDates) {
+1202     minDate = Math.max(minDate, context.boundedDates[0]);
+1203   }
+1204   var maxDate = minDate + context.dateRange;
+1205   if (context.boundedDates) {
+1206     if (maxDate > context.boundedDates[1]) {
+1207       // Adjust minDate, and recompute maxDate.
+1208       minDate = minDate - (maxDate - context.boundedDates[1]);
+1209       maxDate = minDate + context.dateRange;
+1210     }
+1211   }
+1212 
+1213   g.dateWindow_ = [minDate, maxDate];
+1214 
+1215   // y-axis scaling is automatic unless this is a full 2D pan.
+1216   if (context.is2DPan) {
+1217     // Adjust each axis appropriately.
+1218     for (var i = 0; i < g.axes_.length; i++) {
+1219       var axis = g.axes_[i];
+1220 
+1221       var pixelsDragged = context.dragEndY - context.dragStartY;
+1222       var unitsDragged = pixelsDragged * axis.unitsPerPixel;
+1223  
+1224       var boundedValue = context.boundedValues ? context.boundedValues[i] : null;
+1225 
+1226       // In log scale, maxValue and minValue are the logs of those values.
+1227       var maxValue = axis.initialTopValue + unitsDragged;
+1228       if (boundedValue) {
+1229         maxValue = Math.min(maxValue, boundedValue[1]);
+1230       }
+1231       var minValue = maxValue - axis.dragValueRange;
+1232       if (boundedValue) {
+1233         if (minValue < boundedValue[0]) {
+1234           // Adjust maxValue, and recompute minValue.
+1235           maxValue = maxValue - (minValue - boundedValue[0]);
+1236           minValue = maxValue - axis.dragValueRange;
+1237         }
+1238       }
+1239       if (axis.logscale) {
+1240         axis.valueWindow = [ Math.pow(Dygraph.LOG_SCALE, minValue),
+1241                              Math.pow(Dygraph.LOG_SCALE, maxValue) ];
+1242       } else {
+1243         axis.valueWindow = [ minValue, maxValue ];
+1244       }
+1245     }
+1246   }
+1247 
+1248   g.drawGraph_();
+1249 };
+1250 
+1251 /**
+1252  * Called in response to an interaction model operation that
+1253  * responds to an event that ends panning.
+1254  *
+1255  * It's used in the default callback for "mouseup" operations.
+1256  * Custom interaction model builders can use it to provide the default
+1257  * panning behavior.
+1258  *
+1259  * @param { Event } event the event object which led to the startZoom call.
+1260  * @param { Dygraph} g The dygraph on which to act.
+1261  * @param { Object} context The dragging context object (with
+1262  * dragStartX/dragStartY/etc. properties). This function modifies the context.
+1263  */
+1264 Dygraph.endPan = function(event, g, context) {
+1265   // TODO(konigsberg): Clear the context data from the axis.
+1266   // TODO(konigsberg): mouseup should just delete the
+1267   // context object, and mousedown should create a new one.
+1268   context.isPanning = false;
+1269   context.is2DPan = false;
+1270   context.initialLeftmostDate = null;
+1271   context.dateRange = null;
+1272   context.valueRange = null;
+1273   context.boundedDates = null;
+1274   context.boundedValues = null;
+1275 };
+1276 
+1277 /**
+1278  * Called in response to an interaction model operation that
+1279  * responds to an event that starts zooming.
+1280  *
+1281  * It's used in the default callback for "mousedown" operations.
+1282  * Custom interaction model builders can use it to provide the default
+1283  * zooming behavior.
+1284  *
+1285  * @param { Event } event the event object which led to the startZoom call.
+1286  * @param { Dygraph} g The dygraph on which to act.
+1287  * @param { Object} context The dragging context object (with
+1288  * dragStartX/dragStartY/etc. properties). This function modifies the context.
+1289  */
+1290 Dygraph.startZoom = function(event, g, context) {
+1291   context.isZooming = true;
+1292 };
+1293 
+1294 /**
+1295  * Called in response to an interaction model operation that
+1296  * responds to an event that defines zoom boundaries.
+1297  *
+1298  * It's used in the default callback for "mousemove" operations.
+1299  * Custom interaction model builders can use it to provide the default
+1300  * zooming behavior.
+1301  *
+1302  * @param { Event } event the event object which led to the moveZoom call.
+1303  * @param { Dygraph} g The dygraph on which to act.
+1304  * @param { Object} context The dragging context object (with
+1305  * dragStartX/dragStartY/etc. properties). This function modifies the context.
+1306  */
+1307 Dygraph.moveZoom = function(event, g, context) {
+1308   context.dragEndX = g.dragGetX_(event, context);
+1309   context.dragEndY = g.dragGetY_(event, context);
+1310 
+1311   var xDelta = Math.abs(context.dragStartX - context.dragEndX);
+1312   var yDelta = Math.abs(context.dragStartY - context.dragEndY);
+1313 
+1314   // drag direction threshold for y axis is twice as large as x axis
+1315   context.dragDirection = (xDelta < yDelta / 2) ? Dygraph.VERTICAL : Dygraph.HORIZONTAL;
+1316 
+1317   g.drawZoomRect_(
+1318       context.dragDirection,
+1319       context.dragStartX,
+1320       context.dragEndX,
+1321       context.dragStartY,
+1322       context.dragEndY,
+1323       context.prevDragDirection,
+1324       context.prevEndX,
+1325       context.prevEndY);
+1326 
+1327   context.prevEndX = context.dragEndX;
+1328   context.prevEndY = context.dragEndY;
+1329   context.prevDragDirection = context.dragDirection;
+1330 };
+1331 
+1332 /**
+1333  * Called in response to an interaction model operation that
+1334  * responds to an event that performs a zoom based on previously defined
+1335  * bounds..
+1336  *
+1337  * It's used in the default callback for "mouseup" operations.
+1338  * Custom interaction model builders can use it to provide the default
+1339  * zooming behavior.
+1340  *
+1341  * @param { Event } event the event object which led to the endZoom call.
+1342  * @param { Dygraph} g The dygraph on which to end the zoom.
+1343  * @param { Object} context The dragging context object (with
+1344  * dragStartX/dragStartY/etc. properties). This function modifies the context.
+1345  */
+1346 Dygraph.endZoom = function(event, g, context) {
+1347   // TODO(konigsberg): Refactor or rename this fn -- it deals with clicks, too.
+1348   context.isZooming = false;
+1349   context.dragEndX = g.dragGetX_(event, context);
+1350   context.dragEndY = g.dragGetY_(event, context);
+1351   var regionWidth = Math.abs(context.dragEndX - context.dragStartX);
+1352   var regionHeight = Math.abs(context.dragEndY - context.dragStartY);
+1353 
+1354   if (regionWidth < 2 && regionHeight < 2 &&
+1355       g.lastx_ != undefined && g.lastx_ != -1) {
+1356     // TODO(danvk): pass along more info about the points, e.g. 'x'
+1357     if (g.attr_('clickCallback') != null) {
+1358       g.attr_('clickCallback')(event, g.lastx_, g.selPoints_);
+1359     }
+1360     if (g.attr_('pointClickCallback')) {
+1361       // check if the click was on a particular point.
+1362       var closestIdx = -1;
+1363       var closestDistance = 0;
+1364       for (var i = 0; i < g.selPoints_.length; i++) {
+1365         var p = g.selPoints_[i];
+1366         var distance = Math.pow(p.canvasx - context.dragEndX, 2) +
+1367                        Math.pow(p.canvasy - context.dragEndY, 2);
+1368         if (closestIdx == -1 || distance < closestDistance) {
+1369           closestDistance = distance;
+1370           closestIdx = i;
+1371         }
+1372       }
+1373 
+1374       // Allow any click within two pixels of the dot.
+1375       var radius = g.attr_('highlightCircleSize') + 2;
+1376       if (closestDistance <= 5 * 5) {
+1377         g.attr_('pointClickCallback')(event, g.selPoints_[closestIdx]);
+1378       }
+1379     }
+1380   }
+1381 
+1382   if (regionWidth >= 10 && context.dragDirection == Dygraph.HORIZONTAL) {
+1383     g.doZoomX_(Math.min(context.dragStartX, context.dragEndX),
+1384                Math.max(context.dragStartX, context.dragEndX));
+1385   } else if (regionHeight >= 10 && context.dragDirection == Dygraph.VERTICAL) {
+1386     g.doZoomY_(Math.min(context.dragStartY, context.dragEndY),
+1387                Math.max(context.dragStartY, context.dragEndY));
+1388   } else {
+1389     g.canvas_ctx_.clearRect(0, 0, g.canvas_.width, g.canvas_.height);
+1390   }
+1391   context.dragStartX = null;
+1392   context.dragStartY = null;
+1393 };
+1394 
+1395 /**
+1396  * Default interation model for dygraphs. You can refer to specific elements of
+1397  * this when constructing your own interaction model, e.g.:
+1398  * g.updateOptions( {
+1399  *   interactionModel: {
+1400  *     mousedown: Dygraph.defaultInteractionModel.mousedown
+1401  *   }
+1402  * } );
+1403  */
+1404 Dygraph.defaultInteractionModel = {
+1405   // Track the beginning of drag events
+1406   mousedown: function(event, g, context) {
+1407     context.initializeMouseDown(event, g, context);
+1408 
+1409     if (event.altKey || event.shiftKey) {
+1410       Dygraph.startPan(event, g, context);
+1411     } else {
+1412       Dygraph.startZoom(event, g, context);
+1413     }
+1414   },
+1415 
+1416   // Draw zoom rectangles when the mouse is down and the user moves around
+1417   mousemove: function(event, g, context) {
+1418     if (context.isZooming) {
+1419       Dygraph.moveZoom(event, g, context);
+1420     } else if (context.isPanning) {
+1421       Dygraph.movePan(event, g, context);
+1422     }
+1423   },
+1424 
+1425   mouseup: function(event, g, context) {
+1426     if (context.isZooming) {
+1427       Dygraph.endZoom(event, g, context);
+1428     } else if (context.isPanning) {
+1429       Dygraph.endPan(event, g, context);
+1430     }
+1431   },
+1432 
+1433   // Temporarily cancel the dragging event when the mouse leaves the graph
+1434   mouseout: function(event, g, context) {
+1435     if (context.isZooming) {
+1436       context.dragEndX = null;
+1437       context.dragEndY = null;
+1438     }
+1439   },
+1440 
+1441   // Disable zooming out if panning.
+1442   dblclick: function(event, g, context) {
+1443     if (event.altKey || event.shiftKey) {
+1444       return;
+1445     }
+1446     // TODO(konigsberg): replace g.doUnzoom()_ with something that is
+1447     // friendlier to public use.
+1448     g.doUnzoom_();
+1449   }
+1450 };
+1451 
+1452 Dygraph.DEFAULT_ATTRS.interactionModel = Dygraph.defaultInteractionModel;
+1453 
+1454 /**
+1455  * Set up all the mouse handlers needed to capture dragging behavior for zoom
+1456  * events.
+1457  * @private
+1458  */
+1459 Dygraph.prototype.createDragInterface_ = function() {
+1460   var context = {
+1461     // Tracks whether the mouse is down right now
+1462     isZooming: false,
+1463     isPanning: false,  // is this drag part of a pan?
+1464     is2DPan: false,    // if so, is that pan 1- or 2-dimensional?
+1465     dragStartX: null,
+1466     dragStartY: null,
+1467     dragEndX: null,
+1468     dragEndY: null,
+1469     dragDirection: null,
+1470     prevEndX: null,
+1471     prevEndY: null,
+1472     prevDragDirection: null,
+1473 
+1474     // The value on the left side of the graph when a pan operation starts.
+1475     initialLeftmostDate: null,
+1476 
+1477     // The number of units each pixel spans. (This won't be valid for log
+1478     // scales)
+1479     xUnitsPerPixel: null,
+1480 
+1481     // TODO(danvk): update this comment
+1482     // The range in second/value units that the viewport encompasses during a
+1483     // panning operation.
+1484     dateRange: null,
+1485 
+1486     // Utility function to convert page-wide coordinates to canvas coords
+1487     px: 0,
+1488     py: 0,
+1489 
+1490     // Values for use with panEdgeFraction, which limit how far outside the
+1491     // graph's data boundaries it can be panned.
+1492     boundedDates: null, // [minDate, maxDate]
+1493     boundedValues: null, // [[minValue, maxValue] ...]
+1494 
+1495     initializeMouseDown: function(event, g, context) {
+1496       // prevents mouse drags from selecting page text.
+1497       if (event.preventDefault) {
+1498         event.preventDefault();  // Firefox, Chrome, etc.
+1499       } else {
+1500         event.returnValue = false;  // IE
+1501         event.cancelBubble = true;
+1502       }
+1503 
+1504       context.px = Dygraph.findPosX(g.canvas_);
+1505       context.py = Dygraph.findPosY(g.canvas_);
+1506       context.dragStartX = g.dragGetX_(event, context);
+1507       context.dragStartY = g.dragGetY_(event, context);
+1508     }
+1509   };
+1510 
+1511   var interactionModel = this.attr_("interactionModel");
+1512 
+1513   // Self is the graph.
+1514   var self = this;
+1515 
+1516   // Function that binds the graph and context to the handler.
+1517   var bindHandler = function(handler) {
+1518     return function(event) {
+1519       handler(event, self, context);
+1520     };
+1521   };
+1522 
+1523   for (var eventName in interactionModel) {
+1524     if (!interactionModel.hasOwnProperty(eventName)) continue;
+1525     Dygraph.addEvent(this.mouseEventElement_, eventName,
+1526         bindHandler(interactionModel[eventName]));
+1527   }
+1528 
+1529   // If the user releases the mouse button during a drag, but not over the
+1530   // canvas, then it doesn't count as a zooming action.
+1531   Dygraph.addEvent(document, 'mouseup', function(event) {
+1532     if (context.isZooming || context.isPanning) {
+1533       context.isZooming = false;
+1534       context.dragStartX = null;
+1535       context.dragStartY = null;
+1536     }
+1537 
+1538     if (context.isPanning) {
+1539       context.isPanning = false;
+1540       context.draggingDate = null;
+1541       context.dateRange = null;
+1542       for (var i = 0; i < self.axes_.length; i++) {
+1543         delete self.axes_[i].draggingValue;
+1544         delete self.axes_[i].dragValueRange;
+1545       }
+1546     }
+1547   });
+1548 };
+1549 
+1550 
+1551 /**
+1552  * Draw a gray zoom rectangle over the desired area of the canvas. Also clears
+1553  * up any previous zoom rectangles that were drawn. This could be optimized to
+1554  * avoid extra redrawing, but it's tricky to avoid interactions with the status
+1555  * dots.
+1556  * 
+1557  * @param {Number} direction the direction of the zoom rectangle. Acceptable
+1558  * values are Dygraph.HORIZONTAL and Dygraph.VERTICAL.
+1559  * @param {Number} startX The X position where the drag started, in canvas
+1560  * coordinates.
+1561  * @param {Number} endX The current X position of the drag, in canvas coords.
+1562  * @param {Number} startY The Y position where the drag started, in canvas
+1563  * coordinates.
+1564  * @param {Number} endY The current Y position of the drag, in canvas coords.
+1565  * @param {Number} prevDirection the value of direction on the previous call to
+1566  * this function. Used to avoid excess redrawing
+1567  * @param {Number} prevEndX The value of endX on the previous call to this
+1568  * function. Used to avoid excess redrawing
+1569  * @param {Number} prevEndY The value of endY on the previous call to this
+1570  * function. Used to avoid excess redrawing
+1571  * @private
+1572  */
+1573 Dygraph.prototype.drawZoomRect_ = function(direction, startX, endX, startY,
+1574                                            endY, prevDirection, prevEndX,
+1575                                            prevEndY) {
+1576   var ctx = this.canvas_ctx_;
+1577 
+1578   // Clean up from the previous rect if necessary
+1579   if (prevDirection == Dygraph.HORIZONTAL) {
+1580     ctx.clearRect(Math.min(startX, prevEndX), 0,
+1581                   Math.abs(startX - prevEndX), this.height_);
+1582   } else if (prevDirection == Dygraph.VERTICAL){
+1583     ctx.clearRect(0, Math.min(startY, prevEndY),
+1584                   this.width_, Math.abs(startY - prevEndY));
+1585   }
+1586 
+1587   // Draw a light-grey rectangle to show the new viewing area
+1588   if (direction == Dygraph.HORIZONTAL) {
+1589     if (endX && startX) {
+1590       ctx.fillStyle = "rgba(128,128,128,0.33)";
+1591       ctx.fillRect(Math.min(startX, endX), 0,
+1592                    Math.abs(endX - startX), this.height_);
+1593     }
+1594   }
+1595   if (direction == Dygraph.VERTICAL) {
+1596     if (endY && startY) {
+1597       ctx.fillStyle = "rgba(128,128,128,0.33)";
+1598       ctx.fillRect(0, Math.min(startY, endY),
+1599                    this.width_, Math.abs(endY - startY));
+1600     }
+1601   }
+1602 };
+1603 
+1604 /**
+1605  * Zoom to something containing [lowX, highX]. These are pixel coordinates in
+1606  * the canvas. The exact zoom window may be slightly larger if there are no data
+1607  * points near lowX or highX. Don't confuse this function with doZoomXDates,
+1608  * which accepts dates that match the raw data. This function redraws the graph.
+1609  *
+1610  * @param {Number} lowX The leftmost pixel value that should be visible.
+1611  * @param {Number} highX The rightmost pixel value that should be visible.
+1612  * @private
+1613  */
+1614 Dygraph.prototype.doZoomX_ = function(lowX, highX) {
+1615   // Find the earliest and latest dates contained in this canvasx range.
+1616   // Convert the call to date ranges of the raw data.
+1617   var minDate = this.toDataXCoord(lowX);
+1618   var maxDate = this.toDataXCoord(highX);
+1619   this.doZoomXDates_(minDate, maxDate);
+1620 };
+1621 
+1622 /**
+1623  * Zoom to something containing [minDate, maxDate] values. Don't confuse this
+1624  * method with doZoomX which accepts pixel coordinates. This function redraws
+1625  * the graph.
+1626  *
+1627  * @param {Number} minDate The minimum date that should be visible.
+1628  * @param {Number} maxDate The maximum date that should be visible.
+1629  * @private
+1630  */
+1631 Dygraph.prototype.doZoomXDates_ = function(minDate, maxDate) {
+1632   this.dateWindow_ = [minDate, maxDate];
+1633   this.zoomed_x_ = true;
+1634   this.drawGraph_();
+1635   if (this.attr_("zoomCallback")) {
+1636     this.attr_("zoomCallback")(minDate, maxDate, this.yAxisRanges());
+1637   }
+1638 };
+1639 
+1640 /**
+1641  * Zoom to something containing [lowY, highY]. These are pixel coordinates in
+1642  * the canvas. This function redraws the graph.
+1643  *
+1644  * @param {Number} lowY The topmost pixel value that should be visible.
+1645  * @param {Number} highY The lowest pixel value that should be visible.
+1646  * @private
+1647  */
+1648 Dygraph.prototype.doZoomY_ = function(lowY, highY) {
+1649   // Find the highest and lowest values in pixel range for each axis.
+1650   // Note that lowY (in pixels) corresponds to the max Value (in data coords).
+1651   // This is because pixels increase as you go down on the screen, whereas data
+1652   // coordinates increase as you go up the screen.
+1653   var valueRanges = [];
+1654   for (var i = 0; i < this.axes_.length; i++) {
+1655     var hi = this.toDataYCoord(lowY, i);
+1656     var low = this.toDataYCoord(highY, i);
+1657     this.axes_[i].valueWindow = [low, hi];
+1658     valueRanges.push([low, hi]);
+1659   }
+1660 
+1661   this.zoomed_y_ = true;
+1662   this.drawGraph_();
+1663   if (this.attr_("zoomCallback")) {
+1664     var xRange = this.xAxisRange();
+1665     var yRange = this.yAxisRange();
+1666     this.attr_("zoomCallback")(xRange[0], xRange[1], this.yAxisRanges());
+1667   }
+1668 };
+1669 
+1670 /**
+1671  * Reset the zoom to the original view coordinates. This is the same as
+1672  * double-clicking on the graph.
+1673  *
+1674  * @private
+1675  */
+1676 Dygraph.prototype.doUnzoom_ = function() {
+1677   var dirty = false;
+1678   if (this.dateWindow_ != null) {
+1679     dirty = true;
+1680     this.dateWindow_ = null;
+1681   }
+1682 
+1683   for (var i = 0; i < this.axes_.length; i++) {
+1684     if (this.axes_[i].valueWindow != null) {
+1685       dirty = true;
+1686       delete this.axes_[i].valueWindow;
+1687     }
+1688   }
+1689 
+1690   if (dirty) {
+1691     // Putting the drawing operation before the callback because it resets
+1692     // yAxisRange.
+1693     this.zoomed_x_ = false;
+1694     this.zoomed_y_ = false;
+1695     this.drawGraph_();
+1696     if (this.attr_("zoomCallback")) {
+1697       var minDate = this.rawData_[0][0];
+1698       var maxDate = this.rawData_[this.rawData_.length - 1][0];
+1699       this.attr_("zoomCallback")(minDate, maxDate, this.yAxisRanges());
+1700     }
+1701   }
+1702 };
+1703 
+1704 /**
+1705  * When the mouse moves in the canvas, display information about a nearby data
+1706  * point and draw dots over those points in the data series. This function
+1707  * takes care of cleanup of previously-drawn dots.
+1708  * @param {Object} event The mousemove event from the browser.
+1709  * @private
+1710  */
+1711 Dygraph.prototype.mouseMove_ = function(event) {
+1712   // This prevents JS errors when mousing over the canvas before data loads.
+1713   var points = this.layout_.points;
+1714   if (points === undefined) return;
+1715 
+1716   var canvasx = Dygraph.pageX(event) - Dygraph.findPosX(this.mouseEventElement_);
+1717 
+1718   var lastx = -1;
+1719   var lasty = -1;
+1720 
+1721   // Loop through all the points and find the date nearest to our current
+1722   // location.
+1723   var minDist = 1e+100;
+1724   var idx = -1;
+1725   for (var i = 0; i < points.length; i++) {
+1726     var point = points[i];
+1727     if (point == null) continue;
+1728     var dist = Math.abs(point.canvasx - canvasx);
+1729     if (dist > minDist) continue;
+1730     minDist = dist;
+1731     idx = i;
+1732   }
+1733   if (idx >= 0) lastx = points[idx].xval;
+1734 
+1735   // Extract the points we've selected
+1736   this.selPoints_ = [];
+1737   var l = points.length;
+1738   if (!this.attr_("stackedGraph")) {
+1739     for (var i = 0; i < l; i++) {
+1740       if (points[i].xval == lastx) {
+1741         this.selPoints_.push(points[i]);
+1742       }
+1743     }
+1744   } else {
+1745     // Need to 'unstack' points starting from the bottom
+1746     var cumulative_sum = 0;
+1747     for (var i = l - 1; i >= 0; i--) {
+1748       if (points[i].xval == lastx) {
+1749         var p = {};  // Clone the point since we modify it
+1750         for (var k in points[i]) {
+1751           p[k] = points[i][k];
+1752         }
+1753         p.yval -= cumulative_sum;
+1754         cumulative_sum += p.yval;
+1755         this.selPoints_.push(p);
+1756       }
+1757     }
+1758     this.selPoints_.reverse();
+1759   }
+1760 
+1761   if (this.attr_("highlightCallback")) {
+1762     var px = this.lastx_;
+1763     if (px !== null && lastx != px) {
+1764       // only fire if the selected point has changed.
+1765       this.attr_("highlightCallback")(event, lastx, this.selPoints_, this.idxToRow_(idx));
+1766     }
+1767   }
+1768 
+1769   // Save last x position for callbacks.
+1770   this.lastx_ = lastx;
+1771 
+1772   this.updateSelection_();
+1773 };
+1774 
+1775 /**
+1776  * Transforms layout_.points index into data row number.
+1777  * @param int layout_.points index
+1778  * @return int row number, or -1 if none could be found.
+1779  * @private
+1780  */
+1781 Dygraph.prototype.idxToRow_ = function(idx) {
+1782   if (idx < 0) return -1;
+1783 
+1784   for (var i in this.layout_.datasets) {
+1785     if (idx < this.layout_.datasets[i].length) {
+1786       return this.boundaryIds_[0][0]+idx;
+1787     }
+1788     idx -= this.layout_.datasets[i].length;
+1789   }
+1790   return -1;
+1791 };
+1792 
+1793 /**
+1794  * @private
+1795  * @param { Number } x The number to consider.
+1796  * @return { Boolean } Whether the number is zero or NaN.
+1797  */
+1798 // TODO(danvk): rename this function to something like 'isNonZeroNan'.
+1799 Dygraph.isOK = function(x) {
+1800   return x && !isNaN(x);
+1801 };
+1802 
+1803 /**
+1804  * @private
+1805  * Generates HTML for the legend which is displayed when hovering over the
+1806  * chart. If no selected points are specified, a default legend is returned
+1807  * (this may just be the empty string).
+1808  * @param { Number } [x] The x-value of the selected points.
+1809  * @param { [Object] } [sel_points] List of selected points for the given
+1810  * x-value. Should have properties like 'name', 'yval' and 'canvasy'.
+1811  */
+1812 Dygraph.prototype.generateLegendHTML_ = function(x, sel_points) {
+1813   // If no points are selected, we display a default legend. Traditionally,
+1814   // this has been blank. But a better default would be a conventional legend,
+1815   // which provides essential information for a non-interactive chart.
+1816   if (typeof(x) === 'undefined') {
+1817     if (this.attr_('legend') != 'always') return '';
+1818 
+1819     var sepLines = this.attr_('labelsSeparateLines');
+1820     var labels = this.attr_('labels');
+1821     var html = '';
+1822     for (var i = 1; i < labels.length; i++) {
+1823       if (!this.visibility()[i - 1]) continue;
+1824       var c = this.plotter_.colors[labels[i]];
+1825       if (html != '') html += (sepLines ? '<br/>' : ' ');
+1826       html += "<b><span style='color: " + c + ";'>—" + labels[i] +
+1827         "</span></b>";
+1828     }
+1829     return html;
+1830   }
+1831 
+1832   var html = this.attr_('xValueFormatter')(x) + ":";
+1833 
+1834   var fmtFunc = this.attr_('yValueFormatter');
+1835   var showZeros = this.attr_("labelsShowZeroValues");
+1836   var sepLines = this.attr_("labelsSeparateLines");
+1837   for (var i = 0; i < this.selPoints_.length; i++) {
+1838     var pt = this.selPoints_[i];
+1839     if (pt.yval == 0 && !showZeros) continue;
+1840     if (!Dygraph.isOK(pt.canvasy)) continue;
+1841     if (sepLines) html += "<br/>";
+1842 
+1843     var c = this.plotter_.colors[pt.name];
+1844     var yval = fmtFunc(pt.yval, this);
+1845     // TODO(danvk): use a template string here and make it an attribute.
+1846     html += " <b><span style='color: " + c + ";'>"
+1847       + pt.name + "</span></b>:"
+1848       + yval;
+1849   }
+1850   return html;
+1851 };
+1852 
+1853 /**
+1854  * @private
+1855  * Displays information about the selected points in the legend. If there is no
+1856  * selection, the legend will be cleared.
+1857  * @param { Number } [x] The x-value of the selected points.
+1858  * @param { [Object] } [sel_points] List of selected points for the given
+1859  * x-value. Should have properties like 'name', 'yval' and 'canvasy'.
+1860  */
+1861 Dygraph.prototype.setLegendHTML_ = function(x, sel_points) {
+1862   var html = this.generateLegendHTML_(x, sel_points);
+1863   var labelsDiv = this.attr_("labelsDiv");
+1864   if (labelsDiv !== null) {
+1865     labelsDiv.innerHTML = html;
+1866   } else {
+1867     if (typeof(this.shown_legend_error_) == 'undefined') {
+1868       this.error('labelsDiv is set to something nonexistent; legend will not be shown.');
+1869       this.shown_legend_error_ = true;
+1870     }
+1871   }
+1872 };
+1873 
+1874 /**
+1875  * Draw dots over the selectied points in the data series. This function
+1876  * takes care of cleanup of previously-drawn dots.
+1877  * @private
+1878  */
+1879 Dygraph.prototype.updateSelection_ = function() {
+1880   // Clear the previously drawn vertical, if there is one
+1881   var ctx = this.canvas_ctx_;
+1882   if (this.previousVerticalX_ >= 0) {
+1883     // Determine the maximum highlight circle size.
+1884     var maxCircleSize = 0;
+1885     var labels = this.attr_('labels');
+1886     for (var i = 1; i < labels.length; i++) {
+1887       var r = this.attr_('highlightCircleSize', labels[i]);
+1888       if (r > maxCircleSize) maxCircleSize = r;
+1889     }
+1890     var px = this.previousVerticalX_;
+1891     ctx.clearRect(px - maxCircleSize - 1, 0,
+1892                   2 * maxCircleSize + 2, this.height_);
+1893   }
+1894 
+1895   if (this.selPoints_.length > 0) {
+1896     // Set the status message to indicate the selected point(s)
+1897     if (this.attr_('showLabelsOnHighlight')) {
+1898       this.setLegendHTML_(this.lastx_, this.selPoints_);
+1899     }
+1900 
+1901     // Draw colored circles over the center of each selected point
+1902     var canvasx = this.selPoints_[0].canvasx;
+1903     ctx.save();
+1904     for (var i = 0; i < this.selPoints_.length; i++) {
+1905       var pt = this.selPoints_[i];
+1906       if (!Dygraph.isOK(pt.canvasy)) continue;
+1907 
+1908       var circleSize = this.attr_('highlightCircleSize', pt.name);
+1909       ctx.beginPath();
+1910       ctx.fillStyle = this.plotter_.colors[pt.name];
+1911       ctx.arc(canvasx, pt.canvasy, circleSize, 0, 2 * Math.PI, false);
+1912       ctx.fill();
+1913     }
+1914     ctx.restore();
+1915 
+1916     this.previousVerticalX_ = canvasx;
+1917   }
+1918 };
+1919 
+1920 /**
+1921  * Manually set the selected points and display information about them in the
+1922  * legend. The selection can be cleared using clearSelection() and queried
+1923  * using getSelection().
+1924  * @param { Integer } row number that should be highlighted (i.e. appear with
+1925  * hover dots on the chart). Set to false to clear any selection.
+1926  */
+1927 Dygraph.prototype.setSelection = function(row) {
+1928   // Extract the points we've selected
+1929   this.selPoints_ = [];
+1930   var pos = 0;
+1931 
+1932   if (row !== false) {
+1933     row = row-this.boundaryIds_[0][0];
+1934   }
+1935 
+1936   if (row !== false && row >= 0) {
+1937     for (var i in this.layout_.datasets) {
+1938       if (row < this.layout_.datasets[i].length) {
+1939         var point = this.layout_.points[pos+row];
+1940         
+1941         if (this.attr_("stackedGraph")) {
+1942           point = this.layout_.unstackPointAtIndex(pos+row);
+1943         }
+1944         
+1945         this.selPoints_.push(point);
+1946       }
+1947       pos += this.layout_.datasets[i].length;
+1948     }
+1949   }
+1950 
+1951   if (this.selPoints_.length) {
+1952     this.lastx_ = this.selPoints_[0].xval;
+1953     this.updateSelection_();
+1954   } else {
+1955     this.clearSelection();
+1956   }
+1957 
+1958 };
+1959 
+1960 /**
+1961  * The mouse has left the canvas. Clear out whatever artifacts remain
+1962  * @param {Object} event the mouseout event from the browser.
+1963  * @private
+1964  */
+1965 Dygraph.prototype.mouseOut_ = function(event) {
+1966   if (this.attr_("unhighlightCallback")) {
+1967     this.attr_("unhighlightCallback")(event);
+1968   }
+1969 
+1970   if (this.attr_("hideOverlayOnMouseOut")) {
+1971     this.clearSelection();
+1972   }
+1973 };
+1974 
+1975 /**
+1976  * Clears the current selection (i.e. points that were highlighted by moving
+1977  * the mouse over the chart).
+1978  */
+1979 Dygraph.prototype.clearSelection = function() {
+1980   // Get rid of the overlay data
+1981   this.canvas_ctx_.clearRect(0, 0, this.width_, this.height_);
+1982   this.setLegendHTML_();
+1983   this.selPoints_ = [];
+1984   this.lastx_ = -1;
+1985 }
+1986 
+1987 /**
+1988  * Returns the number of the currently selected row. To get data for this row,
+1989  * you can use the getValue method.
+1990  * @return { Integer } row number, or -1 if nothing is selected
+1991  */
+1992 Dygraph.prototype.getSelection = function() {
+1993   if (!this.selPoints_ || this.selPoints_.length < 1) {
+1994     return -1;
+1995   }
+1996 
+1997   for (var row=0; row<this.layout_.points.length; row++ ) {
+1998     if (this.layout_.points[row].x == this.selPoints_[0].x) {
+1999       return row + this.boundaryIds_[0][0];
+2000     }
+2001   }
+2002   return -1;
+2003 };
+2004 
+2005 /**
+2006  * Number formatting function which mimicks the behavior of %g in printf, i.e.
+2007  * either exponential or fixed format (without trailing 0s) is used depending on
+2008  * the length of the generated string.  The advantage of this format is that
+2009  * there is a predictable upper bound on the resulting string length,
+2010  * significant figures are not dropped, and normal numbers are not displayed in
+2011  * exponential notation.
+2012  *
+2013  * NOTE: JavaScript's native toPrecision() is NOT a drop-in replacement for %g.
+2014  * It creates strings which are too long for absolute values between 10^-4 and
+2015  * 10^-6, e.g. '0.00001' instead of '1e-5'. See tests/number-format.html for
+2016  * output examples.
+2017  *
+2018  * @param {Number} x The number to format
+2019  * @param {Number} opt_precision The precision to use, default 2.
+2020  * @return {String} A string formatted like %g in printf.  The max generated
+2021  *                  string length should be precision + 6 (e.g 1.123e+300).
+2022  */
+2023 Dygraph.floatFormat = function(x, opt_precision) {
+2024   // Avoid invalid precision values; [1, 21] is the valid range.
+2025   var p = Math.min(Math.max(1, opt_precision || 2), 21);
+2026 
+2027   // This is deceptively simple.  The actual algorithm comes from:
+2028   //
+2029   // Max allowed length = p + 4
+2030   // where 4 comes from 'e+n' and '.'.
+2031   //
+2032   // Length of fixed format = 2 + y + p
+2033   // where 2 comes from '0.' and y = # of leading zeroes.
+2034   //
+2035   // Equating the two and solving for y yields y = 2, or 0.00xxxx which is
+2036   // 1.0e-3.
+2037   //
+2038   // Since the behavior of toPrecision() is identical for larger numbers, we
+2039   // don't have to worry about the other bound.
+2040   //
+2041   // Finally, the argument for toExponential() is the number of trailing digits,
+2042   // so we take off 1 for the value before the '.'.
+2043   return (Math.abs(x) < 1.0e-3 && x != 0.0) ?
+2044       x.toExponential(p - 1) : x.toPrecision(p);
+2045 };
+2046 
+2047 /**
+2048  * @private
+2049  * Return a string version of a number. This respects the digitsAfterDecimal
+2050  * and maxNumberWidth options.
+2051  * @param {Number} x The number to be formatted
+2052  * @param {Dygraph} g The dygraph object
+2053  */
+2054 Dygraph.numberFormatter = function(x, g) {
+2055   var sigFigs = g.attr_('sigFigs');
+2056 
+2057   if (sigFigs !== null) {
+2058     // User has opted for a fixed number of significant figures.
+2059     return Dygraph.floatFormat(x, sigFigs);
+2060   }
+2061 
+2062   var digits = g.attr_('digitsAfterDecimal');
+2063   var maxNumberWidth = g.attr_('maxNumberWidth');
+2064 
+2065   // switch to scientific notation if we underflow or overflow fixed display.
+2066   if (x !== 0.0 &&
+2067       (Math.abs(x) >= Math.pow(10, maxNumberWidth) ||
+2068        Math.abs(x) < Math.pow(10, -digits))) {
+2069     return x.toExponential(digits);
+2070   } else {
+2071     return '' + Dygraph.round_(x, digits);
+2072   }
+2073 };
+2074 
+2075 /**
+2076  * @private
+2077  * Converts '9' to '09' (useful for dates)
+2078  */
+2079 Dygraph.zeropad = function(x) {
+2080   if (x < 10) return "0" + x; else return "" + x;
+2081 };
+2082 
+2083 /**
+2084  * Return a string version of the hours, minutes and seconds portion of a date.
+2085  * @param {Number} date The JavaScript date (ms since epoch)
+2086  * @return {String} A time of the form "HH:MM:SS"
+2087  * @private
+2088  */
+2089 Dygraph.hmsString_ = function(date) {
+2090   var zeropad = Dygraph.zeropad;
+2091   var d = new Date(date);
+2092   if (d.getSeconds()) {
+2093     return zeropad(d.getHours()) + ":" +
+2094            zeropad(d.getMinutes()) + ":" +
+2095            zeropad(d.getSeconds());
+2096   } else {
+2097     return zeropad(d.getHours()) + ":" + zeropad(d.getMinutes());
+2098   }
+2099 };
+2100 
+2101 /**
+2102  * Convert a JS date to a string appropriate to display on an axis that
+2103  * is displaying values at the stated granularity.
+2104  * @param {Date} date The date to format
+2105  * @param {Number} granularity One of the Dygraph granularity constants
+2106  * @return {String} The formatted date
+2107  * @private
+2108  */
+2109 Dygraph.dateAxisFormatter = function(date, granularity) {
+2110   if (granularity >= Dygraph.DECADAL) {
+2111     return date.strftime('%Y');
+2112   } else if (granularity >= Dygraph.MONTHLY) {
+2113     return date.strftime('%b %y');
+2114   } else {
+2115     var frac = date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds() + date.getMilliseconds();
+2116     if (frac == 0 || granularity >= Dygraph.DAILY) {
+2117       return new Date(date.getTime() + 3600*1000).strftime('%d%b');
+2118     } else {
+2119       return Dygraph.hmsString_(date.getTime());
+2120     }
+2121   }
+2122 };
+2123 
+2124 /**
+2125  * Convert a JS date (millis since epoch) to YYYY/MM/DD
+2126  * @param {Number} date The JavaScript date (ms since epoch)
+2127  * @return {String} A date of the form "YYYY/MM/DD"
+2128  * @private
+2129  */
+2130 Dygraph.dateString_ = function(date) {
+2131   var zeropad = Dygraph.zeropad;
+2132   var d = new Date(date);
+2133 
+2134   // Get the year:
+2135   var year = "" + d.getFullYear();
+2136   // Get a 0 padded month string
+2137   var month = zeropad(d.getMonth() + 1);  //months are 0-offset, sigh
+2138   // Get a 0 padded day string
+2139   var day = zeropad(d.getDate());
+2140 
+2141   var ret = "";
+2142   var frac = d.getHours() * 3600 + d.getMinutes() * 60 + d.getSeconds();
+2143   if (frac) ret = " " + Dygraph.hmsString_(date);
+2144 
+2145   return year + "/" + month + "/" + day + ret;
+2146 };
+2147 
+2148 /**
+2149  * Round a number to the specified number of digits past the decimal point.
+2150  * @param {Number} num The number to round
+2151  * @param {Number} places The number of decimals to which to round
+2152  * @return {Number} The rounded number
+2153  * @private
+2154  */
+2155 Dygraph.round_ = function(num, places) {
+2156   var shift = Math.pow(10, places);
+2157   return Math.round(num * shift)/shift;
+2158 };
+2159 
+2160 /**
+2161  * Fires when there's data available to be graphed.
+2162  * @param {String} data Raw CSV data to be plotted
+2163  * @private
+2164  */
+2165 Dygraph.prototype.loadedEvent_ = function(data) {
+2166   this.rawData_ = this.parseCSV_(data);
+2167   this.predraw_();
+2168 };
+2169 
+2170 Dygraph.prototype.months =  ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
+2171                              "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
+2172 Dygraph.prototype.quarters = ["Jan", "Apr", "Jul", "Oct"];
+2173 
+2174 /**
+2175  * Add ticks on the x-axis representing years, months, quarters, weeks, or days
+2176  * @private
+2177  */
+2178 Dygraph.prototype.addXTicks_ = function() {
+2179   // Determine the correct ticks scale on the x-axis: quarterly, monthly, ...
+2180   var range;
+2181   if (this.dateWindow_) {
+2182     range = [this.dateWindow_[0], this.dateWindow_[1]];
+2183   } else {
+2184     range = [this.rawData_[0][0], this.rawData_[this.rawData_.length - 1][0]];
+2185   }
+2186 
+2187   var xTicks = this.attr_('xTicker')(range[0], range[1], this);
+2188   this.layout_.updateOptions({xTicks: xTicks});
+2189 };
+2190 
+2191 // Time granularity enumeration
+2192 Dygraph.SECONDLY = 0;
+2193 Dygraph.TWO_SECONDLY = 1;
+2194 Dygraph.FIVE_SECONDLY = 2;
+2195 Dygraph.TEN_SECONDLY = 3;
+2196 Dygraph.THIRTY_SECONDLY  = 4;
+2197 Dygraph.MINUTELY = 5;
+2198 Dygraph.TWO_MINUTELY = 6;
+2199 Dygraph.FIVE_MINUTELY = 7;
+2200 Dygraph.TEN_MINUTELY = 8;
+2201 Dygraph.THIRTY_MINUTELY = 9;
+2202 Dygraph.HOURLY = 10;
+2203 Dygraph.TWO_HOURLY = 11;
+2204 Dygraph.SIX_HOURLY = 12;
+2205 Dygraph.DAILY = 13;
+2206 Dygraph.WEEKLY = 14;
+2207 Dygraph.MONTHLY = 15;
+2208 Dygraph.QUARTERLY = 16;
+2209 Dygraph.BIANNUAL = 17;
+2210 Dygraph.ANNUAL = 18;
+2211 Dygraph.DECADAL = 19;
+2212 Dygraph.CENTENNIAL = 20;
+2213 Dygraph.NUM_GRANULARITIES = 21;
+2214 
+2215 Dygraph.SHORT_SPACINGS = [];
+2216 Dygraph.SHORT_SPACINGS[Dygraph.SECONDLY]        = 1000 * 1;
+2217 Dygraph.SHORT_SPACINGS[Dygraph.TWO_SECONDLY]    = 1000 * 2;
+2218 Dygraph.SHORT_SPACINGS[Dygraph.FIVE_SECONDLY]   = 1000 * 5;
+2219 Dygraph.SHORT_SPACINGS[Dygraph.TEN_SECONDLY]    = 1000 * 10;
+2220 Dygraph.SHORT_SPACINGS[Dygraph.THIRTY_SECONDLY] = 1000 * 30;
+2221 Dygraph.SHORT_SPACINGS[Dygraph.MINUTELY]        = 1000 * 60;
+2222 Dygraph.SHORT_SPACINGS[Dygraph.TWO_MINUTELY]    = 1000 * 60 * 2;
+2223 Dygraph.SHORT_SPACINGS[Dygraph.FIVE_MINUTELY]   = 1000 * 60 * 5;
+2224 Dygraph.SHORT_SPACINGS[Dygraph.TEN_MINUTELY]    = 1000 * 60 * 10;
+2225 Dygraph.SHORT_SPACINGS[Dygraph.THIRTY_MINUTELY] = 1000 * 60 * 30;
+2226 Dygraph.SHORT_SPACINGS[Dygraph.HOURLY]          = 1000 * 3600;
+2227 Dygraph.SHORT_SPACINGS[Dygraph.TWO_HOURLY]      = 1000 * 3600 * 2;
+2228 Dygraph.SHORT_SPACINGS[Dygraph.SIX_HOURLY]      = 1000 * 3600 * 6;
+2229 Dygraph.SHORT_SPACINGS[Dygraph.DAILY]           = 1000 * 86400;
+2230 Dygraph.SHORT_SPACINGS[Dygraph.WEEKLY]          = 1000 * 604800;
+2231 
+2232 /**
+2233  * @private
+2234  * If we used this time granularity, how many ticks would there be?
+2235  * This is only an approximation, but it's generally good enough.
+2236  */
+2237 Dygraph.prototype.NumXTicks = function(start_time, end_time, granularity) {
+2238   if (granularity < Dygraph.MONTHLY) {
+2239     // Generate one tick mark for every fixed interval of time.
+2240     var spacing = Dygraph.SHORT_SPACINGS[granularity];
+2241     return Math.floor(0.5 + 1.0 * (end_time - start_time) / spacing);
+2242   } else {
+2243     var year_mod = 1;  // e.g. to only print one point every 10 years.
+2244     var num_months = 12;
+2245     if (granularity == Dygraph.QUARTERLY) num_months = 3;
+2246     if (granularity == Dygraph.BIANNUAL) num_months = 2;
+2247     if (granularity == Dygraph.ANNUAL) num_months = 1;
+2248     if (granularity == Dygraph.DECADAL) { num_months = 1; year_mod = 10; }
+2249     if (granularity == Dygraph.CENTENNIAL) { num_months = 1; year_mod = 100; }
+2250 
+2251     var msInYear = 365.2524 * 24 * 3600 * 1000;
+2252     var num_years = 1.0 * (end_time - start_time) / msInYear;
+2253     return Math.floor(0.5 + 1.0 * num_years * num_months / year_mod);
+2254   }
+2255 };
+2256 
+2257 /**
+2258  * @private
+2259  *
+2260  * Construct an x-axis of nicely-formatted times on meaningful boundaries
+2261  * (e.g. 'Jan 09' rather than 'Jan 22, 2009').
+2262  *
+2263  * Returns an array containing {v: millis, label: label} dictionaries.
+2264  */
+2265 Dygraph.prototype.GetXAxis = function(start_time, end_time, granularity) {
+2266   var formatter = this.attr_("xAxisLabelFormatter");
+2267   var ticks = [];
+2268   if (granularity < Dygraph.MONTHLY) {
+2269     // Generate one tick mark for every fixed interval of time.
+2270     var spacing = Dygraph.SHORT_SPACINGS[granularity];
+2271     var format = '%d%b';  // e.g. "1Jan"
+2272 
+2273     // Find a time less than start_time which occurs on a "nice" time boundary
+2274     // for this granularity.
+2275     var g = spacing / 1000;
+2276     var d = new Date(start_time);
+2277     if (g <= 60) {  // seconds
+2278       var x = d.getSeconds(); d.setSeconds(x - x % g);
+2279     } else {
+2280       d.setSeconds(0);
+2281       g /= 60;
+2282       if (g <= 60) {  // minutes
+2283         var x = d.getMinutes(); d.setMinutes(x - x % g);
+2284       } else {
+2285         d.setMinutes(0);
+2286         g /= 60;
+2287 
+2288         if (g <= 24) {  // days
+2289           var x = d.getHours(); d.setHours(x - x % g);
+2290         } else {
+2291           d.setHours(0);
+2292           g /= 24;
+2293 
+2294           if (g == 7) {  // one week
+2295             d.setDate(d.getDate() - d.getDay());
+2296           }
+2297         }
+2298       }
+2299     }
+2300     start_time = d.getTime();
+2301 
+2302     for (var t = start_time; t <= end_time; t += spacing) {
+2303       ticks.push({ v:t, label: formatter(new Date(t), granularity) });
+2304     }
+2305   } else {
+2306     // Display a tick mark on the first of a set of months of each year.
+2307     // Years get a tick mark iff y % year_mod == 0. This is useful for
+2308     // displaying a tick mark once every 10 years, say, on long time scales.
+2309     var months;
+2310     var year_mod = 1;  // e.g. to only print one point every 10 years.
+2311 
+2312     if (granularity == Dygraph.MONTHLY) {
+2313       months = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ];
+2314     } else if (granularity == Dygraph.QUARTERLY) {
+2315       months = [ 0, 3, 6, 9 ];
+2316     } else if (granularity == Dygraph.BIANNUAL) {
+2317       months = [ 0, 6 ];
+2318     } else if (granularity == Dygraph.ANNUAL) {
+2319       months = [ 0 ];
+2320     } else if (granularity == Dygraph.DECADAL) {
+2321       months = [ 0 ];
+2322       year_mod = 10;
+2323     } else if (granularity == Dygraph.CENTENNIAL) {
+2324       months = [ 0 ];
+2325       year_mod = 100;
+2326     } else {
+2327       this.warn("Span of dates is too long");
+2328     }
+2329 
+2330     var start_year = new Date(start_time).getFullYear();
+2331     var end_year   = new Date(end_time).getFullYear();
+2332     var zeropad = Dygraph.zeropad;
+2333     for (var i = start_year; i <= end_year; i++) {
+2334       if (i % year_mod != 0) continue;
+2335       for (var j = 0; j < months.length; j++) {
+2336         var date_str = i + "/" + zeropad(1 + months[j]) + "/01";
+2337         var t = Dygraph.dateStrToMillis(date_str);
+2338         if (t < start_time || t > end_time) continue;
+2339         ticks.push({ v:t, label: formatter(new Date(t), granularity) });
+2340       }
+2341     }
+2342   }
+2343 
+2344   return ticks;
+2345 };
+2346 
+2347 
+2348 /**
+2349  * Add ticks to the x-axis based on a date range.
+2350  * @param {Number} startDate Start of the date window (millis since epoch)
+2351  * @param {Number} endDate End of the date window (millis since epoch)
+2352  * @param {Dygraph} self The dygraph object
+2353  * @return { [Object] } Array of {label, value} tuples.
+2354  * @public
+2355  */
+2356 Dygraph.dateTicker = function(startDate, endDate, self) {
+2357   // TODO(danvk): why does this take 'self' as a param?
+2358   var chosen = -1;
+2359   for (var i = 0; i < Dygraph.NUM_GRANULARITIES; i++) {
+2360     var num_ticks = self.NumXTicks(startDate, endDate, i);
+2361     if (self.width_ / num_ticks >= self.attr_('pixelsPerXLabel')) {
+2362       chosen = i;
+2363       break;
+2364     }
+2365   }
+2366 
+2367   if (chosen >= 0) {
+2368     return self.GetXAxis(startDate, endDate, chosen);
+2369   } else {
+2370     // TODO(danvk): signal error.
+2371   }
+2372 };
+2373 
+2374 /**
+2375  * @private
+2376  * This is a list of human-friendly values at which to show tick marks on a log
+2377  * scale. It is k * 10^n, where k=1..9 and n=-39..+39, so:
+2378  * ..., 1, 2, 3, 4, 5, ..., 9, 10, 20, 30, ..., 90, 100, 200, 300, ...
+2379  * NOTE: this assumes that Dygraph.LOG_SCALE = 10.
+2380  */
+2381 Dygraph.PREFERRED_LOG_TICK_VALUES = function() {
+2382   var vals = [];
+2383   for (var power = -39; power <= 39; power++) {
+2384     var range = Math.pow(10, power);
+2385     for (var mult = 1; mult <= 9; mult++) {
+2386       var val = range * mult;
+2387       vals.push(val);
+2388     }
+2389   }
+2390   return vals;
+2391 }();
+2392 
+2393 /**
+2394  * @private
+2395  * Implementation of binary search over an array.
+2396  * Currently does not work when val is outside the range of arry's values.
+2397  * @param { Integer } val the value to search for
+2398  * @param { Integer[] } arry is the value over which to search
+2399  * @param { Integer } abs If abs > 0, find the lowest entry greater than val
+2400  * If abs < 0, find the highest entry less than val.
+2401  * if abs == 0, find the entry that equals val.
+2402  * @param { Integer } [low] The first index in arry to consider (optional)
+2403  * @param { Integer } [high] The last index in arry to consider (optional)
+2404  */
+2405 Dygraph.binarySearch = function(val, arry, abs, low, high) {
+2406   if (low == null || high == null) {
+2407     low = 0;
+2408     high = arry.length - 1;
+2409   }
+2410   if (low > high) {
+2411     return -1;
+2412   }
+2413   if (abs == null) {
+2414     abs = 0;
+2415   }
+2416   var validIndex = function(idx) {
+2417     return idx >= 0 && idx < arry.length;
+2418   }
+2419   var mid = parseInt((low + high) / 2);
+2420   var element = arry[mid];
+2421   if (element == val) {
+2422     return mid;
+2423   }
+2424   if (element > val) {
+2425     if (abs > 0) {
+2426       // Accept if element > val, but also if prior element < val.
+2427       var idx = mid - 1;
+2428       if (validIndex(idx) && arry[idx] < val) {
+2429         return mid;
+2430       }
+2431     }
+2432     return Dygraph.binarySearch(val, arry, abs, low, mid - 1);
+2433   }
+2434   if (element < val) {
+2435     if (abs < 0) {
+2436       // Accept if element < val, but also if prior element > val.
+2437       var idx = mid + 1;
+2438       if (validIndex(idx) && arry[idx] > val) {
+2439         return mid;
+2440       }
+2441     }
+2442     return Dygraph.binarySearch(val, arry, abs, mid + 1, high);
+2443   }
+2444 };
+2445 
+2446 // TODO(konigsberg): Update comment.
+2447 /**
+2448  * Add ticks when the x axis has numbers on it (instead of dates)
+2449  *
+2450  * @param {Number} minV minimum value
+2451  * @param {Number} maxV maximum value
+2452  * @param self
+2453  * @param {function} attribute accessor function.
+2454  * @return {[Object]} Array of {label, value} tuples.
+2455  */
+2456 Dygraph.numericTicks = function(minV, maxV, self, axis_props, vals) {
+2457   var attr = function(k) {
+2458     if (axis_props && axis_props.hasOwnProperty(k)) return axis_props[k];
+2459     return self.attr_(k);
+2460   };
+2461 
+2462   var ticks = [];
+2463   if (vals) {
+2464     for (var i = 0; i < vals.length; i++) {
+2465       ticks.push({v: vals[i]});
+2466     }
+2467   } else {
+2468     if (axis_props && attr("logscale")) {
+2469       var pixelsPerTick = attr('pixelsPerYLabel');
+2470       // NOTE(konigsberg): Dan, should self.height_ be self.plotter_.area.h?
+2471       var nTicks  = Math.floor(self.height_ / pixelsPerTick);
+2472       var minIdx = Dygraph.binarySearch(minV, Dygraph.PREFERRED_LOG_TICK_VALUES, 1);
+2473       var maxIdx = Dygraph.binarySearch(maxV, Dygraph.PREFERRED_LOG_TICK_VALUES, -1);
+2474       if (minIdx == -1) {
+2475         minIdx = 0;
+2476       }
+2477       if (maxIdx == -1) {
+2478         maxIdx = Dygraph.PREFERRED_LOG_TICK_VALUES.length - 1;
+2479       }
+2480       // Count the number of tick values would appear, if we can get at least
+2481       // nTicks / 4 accept them.
+2482       var lastDisplayed = null;
+2483       if (maxIdx - minIdx >= nTicks / 4) {
+2484         var axisId = axis_props.yAxisId;
+2485         for (var idx = maxIdx; idx >= minIdx; idx--) {
+2486           var tickValue = Dygraph.PREFERRED_LOG_TICK_VALUES[idx];
+2487           var domCoord = axis_props.g.toDomYCoord(tickValue, axisId);
+2488           var tick = { v: tickValue };
+2489           if (lastDisplayed == null) {
+2490             lastDisplayed = {
+2491               tickValue : tickValue,
+2492               domCoord : domCoord
+2493             };
+2494           } else {
+2495             if (domCoord - lastDisplayed.domCoord >= pixelsPerTick) {
+2496               lastDisplayed = {
+2497                 tickValue : tickValue,
+2498                 domCoord : domCoord
+2499               };
+2500             } else {
+2501               tick.label = "";
+2502             }
+2503           }
+2504           ticks.push(tick);
+2505         }
+2506         // Since we went in backwards order.
+2507         ticks.reverse();
+2508       }
+2509     }
+2510 
+2511     // ticks.length won't be 0 if the log scale function finds values to insert.
+2512     if (ticks.length == 0) {
+2513       // Basic idea:
+2514       // Try labels every 1, 2, 5, 10, 20, 50, 100, etc.
+2515       // Calculate the resulting tick spacing (i.e. this.height_ / nTicks).
+2516       // The first spacing greater than pixelsPerYLabel is what we use.
+2517       // TODO(danvk): version that works on a log scale.
+2518       if (attr("labelsKMG2")) {
+2519         var mults = [1, 2, 4, 8];
+2520       } else {
+2521         var mults = [1, 2, 5];
+2522       }
+2523       var scale, low_val, high_val, nTicks;
+2524       // TODO(danvk): make it possible to set this for x- and y-axes independently.
+2525       var pixelsPerTick = attr('pixelsPerYLabel');
+2526       for (var i = -10; i < 50; i++) {
+2527         if (attr("labelsKMG2")) {
+2528           var base_scale = Math.pow(16, i);
+2529         } else {
+2530           var base_scale = Math.pow(10, i);
+2531         }
+2532         for (var j = 0; j < mults.length; j++) {
+2533           scale = base_scale * mults[j];
+2534           low_val = Math.floor(minV / scale) * scale;
+2535           high_val = Math.ceil(maxV / scale) * scale;
+2536           nTicks = Math.abs(high_val - low_val) / scale;
+2537           var spacing = self.height_ / nTicks;
+2538           // wish I could break out of both loops at once...
+2539           if (spacing > pixelsPerTick) break;
+2540         }
+2541         if (spacing > pixelsPerTick) break;
+2542       }
+2543 
+2544       // Construct the set of ticks.
+2545       // Allow reverse y-axis if it's explicitly requested.
+2546       if (low_val > high_val) scale *= -1;
+2547       for (var i = 0; i < nTicks; i++) {
+2548         var tickV = low_val + i * scale;
+2549         ticks.push( {v: tickV} );
+2550       }
+2551     }
+2552   }
+2553 
+2554   // Add formatted labels to the ticks.
+2555   var k;
+2556   var k_labels = [];
+2557   if (attr("labelsKMB")) {
+2558     k = 1000;
+2559     k_labels = [ "K", "M", "B", "T" ];
+2560   }
+2561   if (attr("labelsKMG2")) {
+2562     if (k) self.warn("Setting both labelsKMB and labelsKMG2. Pick one!");
+2563     k = 1024;
+2564     k_labels = [ "k", "M", "G", "T" ];
+2565   }
+2566   var formatter = attr('yAxisLabelFormatter') ?
+2567       attr('yAxisLabelFormatter') : attr('yValueFormatter');
+2568 
+2569   // Add labels to the ticks.
+2570   for (var i = 0; i < ticks.length; i++) {
+2571     if (ticks[i].label !== undefined) continue;  // Use current label.
+2572     var tickV = ticks[i].v;
+2573     var absTickV = Math.abs(tickV);
+2574     var label = formatter(tickV, self);
+2575     if (k_labels.length > 0) {
+2576       // Round up to an appropriate unit.
+2577       var n = k*k*k*k;
+2578       for (var j = 3; j >= 0; j--, n /= k) {
+2579         if (absTickV >= n) {
+2580           label = Dygraph.round_(tickV / n, attr('digitsAfterDecimal')) + k_labels[j];
+2581           break;
+2582         }
+2583       }
+2584     }
+2585     ticks[i].label = label;
+2586   }
+2587 
+2588   return ticks;
+2589 };
+2590 
+2591 /**
+2592  * @private
+2593  * Computes the range of the data series (including confidence intervals).
+2594  * @param { [Array] } series either [ [x1, y1], [x2, y2], ... ] or
+2595  * [ [x1, [y1, dev_low, dev_high]], [x2, [y2, dev_low, dev_high]], ...
+2596  * @return [low, high]
+2597  */
+2598 Dygraph.prototype.extremeValues_ = function(series) {
+2599   var minY = null, maxY = null;
+2600 
+2601   var bars = this.attr_("errorBars") || this.attr_("customBars");
+2602   if (bars) {
+2603     // With custom bars, maxY is the max of the high values.
+2604     for (var j = 0; j < series.length; j++) {
+2605       var y = series[j][1][0];
+2606       if (!y) continue;
+2607       var low = y - series[j][1][1];
+2608       var high = y + series[j][1][2];
+2609       if (low > y) low = y;    // this can happen with custom bars,
+2610       if (high < y) high = y;  // e.g. in tests/custom-bars.html
+2611       if (maxY == null || high > maxY) {
+2612         maxY = high;
+2613       }
+2614       if (minY == null || low < minY) {
+2615         minY = low;
+2616       }
+2617     }
+2618   } else {
+2619     for (var j = 0; j < series.length; j++) {
+2620       var y = series[j][1];
+2621       if (y === null || isNaN(y)) continue;
+2622       if (maxY == null || y > maxY) {
+2623         maxY = y;
+2624       }
+2625       if (minY == null || y < minY) {
+2626         minY = y;
+2627       }
+2628     }
+2629   }
+2630 
+2631   return [minY, maxY];
+2632 };
+2633 
+2634 /**
+2635  * @private
+2636  * This function is called once when the chart's data is changed or the options
+2637  * dictionary is updated. It is _not_ called when the user pans or zooms. The
+2638  * idea is that values derived from the chart's data can be computed here,
+2639  * rather than every time the chart is drawn. This includes things like the
+2640  * number of axes, rolling averages, etc.
+2641  */
+2642 Dygraph.prototype.predraw_ = function() {
+2643   // TODO(danvk): move more computations out of drawGraph_ and into here.
+2644   this.computeYAxes_();
+2645 
+2646   // Create a new plotter.
+2647   if (this.plotter_) this.plotter_.clear();
+2648   this.plotter_ = new DygraphCanvasRenderer(this,
+2649                                             this.hidden_,
+2650                                             this.hidden_ctx_,
+2651                                             this.layout_,
+2652                                             this.renderOptions_);
+2653 
+2654   // The roller sits in the bottom left corner of the chart. We don't know where
+2655   // this will be until the options are available, so it's positioned here.
+2656   this.createRollInterface_();
+2657 
+2658   // Same thing applies for the labelsDiv. It's right edge should be flush with
+2659   // the right edge of the charting area (which may not be the same as the right
+2660   // edge of the div, if we have two y-axes.
+2661   this.positionLabelsDiv_();
+2662 
+2663   // If the data or options have changed, then we'd better redraw.
+2664   this.drawGraph_();
+2665 };
+2666 
+2667 /**
+2668  * Update the graph with new data. This method is called when the viewing area
+2669  * has changed. If the underlying data or options have changed, predraw_ will
+2670  * be called before drawGraph_ is called.
+2671  * @private
+2672  */
+2673 Dygraph.prototype.drawGraph_ = function() {
+2674   var data = this.rawData_;
+2675 
+2676   // This is used to set the second parameter to drawCallback, below.
+2677   var is_initial_draw = this.is_initial_draw_;
+2678   this.is_initial_draw_ = false;
+2679 
+2680   var minY = null, maxY = null;
+2681   this.layout_.removeAllDatasets();
+2682   this.setColors_();
+2683   this.attrs_['pointSize'] = 0.5 * this.attr_('highlightCircleSize');
+2684 
+2685   // Loop over the fields (series).  Go from the last to the first,
+2686   // because if they're stacked that's how we accumulate the values.
+2687 
+2688   var cumulative_y = [];  // For stacked series.
+2689   var datasets = [];
+2690 
+2691   var extremes = {};  // series name -> [low, high]
+2692 
+2693   // Loop over all fields and create datasets
+2694   for (var i = data[0].length - 1; i >= 1; i--) {
+2695     if (!this.visibility()[i - 1]) continue;
+2696 
+2697     var seriesName = this.attr_("labels")[i];
+2698     var connectSeparatedPoints = this.attr_('connectSeparatedPoints', i);
+2699     var logScale = this.attr_('logscale', i);
+2700 
+2701     var series = [];
+2702     for (var j = 0; j < data.length; j++) {
+2703       var date = data[j][0];
+2704       var point = data[j][i];
+2705       if (logScale) {
+2706         // On the log scale, points less than zero do not exist.
+2707         // This will create a gap in the chart. Note that this ignores
+2708         // connectSeparatedPoints.
+2709         if (point <= 0) {
+2710           point = null;
+2711         }
+2712         series.push([date, point]);
+2713       } else {
+2714         if (point != null || !connectSeparatedPoints) {
+2715           series.push([date, point]);
+2716         }
+2717       }
+2718     }
+2719 
+2720     // TODO(danvk): move this into predraw_. It's insane to do it here.
+2721     series = this.rollingAverage(series, this.rollPeriod_);
+2722 
+2723     // Prune down to the desired range, if necessary (for zooming)
+2724     // Because there can be lines going to points outside of the visible area,
+2725     // we actually prune to visible points, plus one on either side.
+2726     var bars = this.attr_("errorBars") || this.attr_("customBars");
+2727     if (this.dateWindow_) {
+2728       var low = this.dateWindow_[0];
+2729       var high= this.dateWindow_[1];
+2730       var pruned = [];
+2731       // TODO(danvk): do binary search instead of linear search.
+2732       // TODO(danvk): pass firstIdx and lastIdx directly to the renderer.
+2733       var firstIdx = null, lastIdx = null;
+2734       for (var k = 0; k < series.length; k++) {
+2735         if (series[k][0] >= low && firstIdx === null) {
+2736           firstIdx = k;
+2737         }
+2738         if (series[k][0] <= high) {
+2739           lastIdx = k;
+2740         }
+2741       }
+2742       if (firstIdx === null) firstIdx = 0;
+2743       if (firstIdx > 0) firstIdx--;
+2744       if (lastIdx === null) lastIdx = series.length - 1;
+2745       if (lastIdx < series.length - 1) lastIdx++;
+2746       this.boundaryIds_[i-1] = [firstIdx, lastIdx];
+2747       for (var k = firstIdx; k <= lastIdx; k++) {
+2748         pruned.push(series[k]);
+2749       }
+2750       series = pruned;
+2751     } else {
+2752       this.boundaryIds_[i-1] = [0, series.length-1];
+2753     }
+2754 
+2755     var seriesExtremes = this.extremeValues_(series);
+2756 
+2757     if (bars) {
+2758       for (var j=0; j<series.length; j++) {
+2759         val = [series[j][0], series[j][1][0], series[j][1][1], series[j][1][2]];
+2760         series[j] = val;
+2761       }
+2762     } else if (this.attr_("stackedGraph")) {
+2763       var l = series.length;
+2764       var actual_y;
+2765       for (var j = 0; j < l; j++) {
+2766         // If one data set has a NaN, let all subsequent stacked
+2767         // sets inherit the NaN -- only start at 0 for the first set.
+2768         var x = series[j][0];
+2769         if (cumulative_y[x] === undefined) {
+2770           cumulative_y[x] = 0;
+2771         }
+2772 
+2773         actual_y = series[j][1];
+2774         cumulative_y[x] += actual_y;
+2775 
+2776         series[j] = [x, cumulative_y[x]]
+2777 
+2778         if (cumulative_y[x] > seriesExtremes[1]) {
+2779           seriesExtremes[1] = cumulative_y[x];
+2780         }
+2781         if (cumulative_y[x] < seriesExtremes[0]) {
+2782           seriesExtremes[0] = cumulative_y[x];
+2783         }
+2784       }
+2785     }
+2786     extremes[seriesName] = seriesExtremes;
+2787 
+2788     datasets[i] = series;
+2789   }
+2790 
+2791   for (var i = 1; i < datasets.length; i++) {
+2792     if (!this.visibility()[i - 1]) continue;
+2793     this.layout_.addDataset(this.attr_("labels")[i], datasets[i]);
+2794   }
+2795 
+2796   this.computeYAxisRanges_(extremes);
+2797   this.layout_.updateOptions( { yAxes: this.axes_,
+2798                                 seriesToAxisMap: this.seriesToAxisMap_
+2799                               } );
+2800   this.addXTicks_();
+2801 
+2802   // Save the X axis zoomed status as the updateOptions call will tend to set it errorneously
+2803   var tmp_zoomed_x = this.zoomed_x_;
+2804   // Tell PlotKit to use this new data and render itself
+2805   this.layout_.updateOptions({dateWindow: this.dateWindow_});
+2806   this.zoomed_x_ = tmp_zoomed_x;
+2807   this.layout_.evaluateWithError();
+2808   this.plotter_.clear();
+2809   this.plotter_.render();
+2810   this.canvas_.getContext('2d').clearRect(0, 0, this.canvas_.width,
+2811                                           this.canvas_.height);
+2812 
+2813   if (is_initial_draw) {
+2814     // Generate a static legend before any particular point is selected.
+2815     this.setLegendHTML_();
+2816   } else {
+2817     if (typeof(this.selPoints_) !== 'undefined' && this.selPoints_.length) {
+2818       this.lastx_ = this.selPoints_[0].xval;
+2819       this.updateSelection_();
+2820     } else {
+2821       this.clearSelection();
+2822     }
+2823   }
+2824 
+2825   if (this.attr_("drawCallback") !== null) {
+2826     this.attr_("drawCallback")(this, is_initial_draw);
+2827   }
+2828 };
+2829 
+2830 /**
+2831  * @private
+2832  * Determine properties of the y-axes which are independent of the data
+2833  * currently being displayed. This includes things like the number of axes and
+2834  * the style of the axes. It does not include the range of each axis and its
+2835  * tick marks.
+2836  * This fills in this.axes_ and this.seriesToAxisMap_.
+2837  * axes_ = [ { options } ]
+2838  * seriesToAxisMap_ = { seriesName: 0, seriesName2: 1, ... }
+2839  *   indices are into the axes_ array.
+2840  */
+2841 Dygraph.prototype.computeYAxes_ = function() {
+2842   this.axes_ = [{ yAxisId : 0, g : this }];  // always have at least one y-axis.
+2843   this.seriesToAxisMap_ = {};
+2844 
+2845   // Get a list of series names.
+2846   var labels = this.attr_("labels");
+2847   var series = {};
+2848   for (var i = 1; i < labels.length; i++) series[labels[i]] = (i - 1);
+2849 
+2850   // all options which could be applied per-axis:
+2851   var axisOptions = [
+2852     'includeZero',
+2853     'valueRange',
+2854     'labelsKMB',
+2855     'labelsKMG2',
+2856     'pixelsPerYLabel',
+2857     'yAxisLabelWidth',
+2858     'axisLabelFontSize',
+2859     'axisTickSize',
+2860     'logscale'
+2861   ];
+2862 
+2863   // Copy global axis options over to the first axis.
+2864   for (var i = 0; i < axisOptions.length; i++) {
+2865     var k = axisOptions[i];
+2866     var v = this.attr_(k);
+2867     if (v) this.axes_[0][k] = v;
+2868   }
+2869 
+2870   // Go through once and add all the axes.
+2871   for (var seriesName in series) {
+2872     if (!series.hasOwnProperty(seriesName)) continue;
+2873     var axis = this.attr_("axis", seriesName);
+2874     if (axis == null) {
+2875       this.seriesToAxisMap_[seriesName] = 0;
+2876       continue;
+2877     }
+2878     if (typeof(axis) == 'object') {
+2879       // Add a new axis, making a copy of its per-axis options.
+2880       var opts = {};
+2881       Dygraph.update(opts, this.axes_[0]);
+2882       Dygraph.update(opts, { valueRange: null });  // shouldn't inherit this.
+2883       var yAxisId = this.axes_.length;
+2884       opts.yAxisId = yAxisId;
+2885       opts.g = this;
+2886       Dygraph.update(opts, axis);
+2887       this.axes_.push(opts);
+2888       this.seriesToAxisMap_[seriesName] = yAxisId;
+2889     }
+2890   }
+2891 
+2892   // Go through one more time and assign series to an axis defined by another
+2893   // series, e.g. { 'Y1: { axis: {} }, 'Y2': { axis: 'Y1' } }
+2894   for (var seriesName in series) {
+2895     if (!series.hasOwnProperty(seriesName)) continue;
+2896     var axis = this.attr_("axis", seriesName);
+2897     if (typeof(axis) == 'string') {
+2898       if (!this.seriesToAxisMap_.hasOwnProperty(axis)) {
+2899         this.error("Series " + seriesName + " wants to share a y-axis with " +
+2900                    "series " + axis + ", which does not define its own axis.");
+2901         return null;
+2902       }
+2903       var idx = this.seriesToAxisMap_[axis];
+2904       this.seriesToAxisMap_[seriesName] = idx;
+2905     }
+2906   }
+2907 
+2908   // Now we remove series from seriesToAxisMap_ which are not visible. We do
+2909   // this last so that hiding the first series doesn't destroy the axis
+2910   // properties of the primary axis.
+2911   var seriesToAxisFiltered = {};
+2912   var vis = this.visibility();
+2913   for (var i = 1; i < labels.length; i++) {
+2914     var s = labels[i];
+2915     if (vis[i - 1]) seriesToAxisFiltered[s] = this.seriesToAxisMap_[s];
+2916   }
+2917   this.seriesToAxisMap_ = seriesToAxisFiltered;
+2918 };
+2919 
+2920 /**
+2921  * Returns the number of y-axes on the chart.
+2922  * @return {Number} the number of axes.
+2923  */
+2924 Dygraph.prototype.numAxes = function() {
+2925   var last_axis = 0;
+2926   for (var series in this.seriesToAxisMap_) {
+2927     if (!this.seriesToAxisMap_.hasOwnProperty(series)) continue;
+2928     var idx = this.seriesToAxisMap_[series];
+2929     if (idx > last_axis) last_axis = idx;
+2930   }
+2931   return 1 + last_axis;
+2932 };
+2933 
+2934 /**
+2935  * @private
+2936  * Determine the value range and tick marks for each axis.
+2937  * @param {Object} extremes A mapping from seriesName -> [low, high]
+2938  * This fills in the valueRange and ticks fields in each entry of this.axes_.
+2939  */
+2940 Dygraph.prototype.computeYAxisRanges_ = function(extremes) {
+2941   // Build a map from axis number -> [list of series names]
+2942   var seriesForAxis = [];
+2943   for (var series in this.seriesToAxisMap_) {
+2944     if (!this.seriesToAxisMap_.hasOwnProperty(series)) continue;
+2945     var idx = this.seriesToAxisMap_[series];
+2946     while (seriesForAxis.length <= idx) seriesForAxis.push([]);
+2947     seriesForAxis[idx].push(series);
+2948   }
+2949 
+2950   // Compute extreme values, a span and tick marks for each axis.
+2951   for (var i = 0; i < this.axes_.length; i++) {
+2952     var axis = this.axes_[i];
+2953  
+2954     if (!seriesForAxis[i]) {
+2955       // If no series are defined or visible then use a reasonable default
+2956       axis.extremeRange = [0, 1];
+2957     } else {
+2958       // Calculate the extremes of extremes.
+2959       var series = seriesForAxis[i];
+2960       var minY = Infinity;  // extremes[series[0]][0];
+2961       var maxY = -Infinity;  // extremes[series[0]][1];
+2962       var extremeMinY, extremeMaxY;
+2963       for (var j = 0; j < series.length; j++) {
+2964         // Only use valid extremes to stop null data series' from corrupting the scale.
+2965         extremeMinY = extremes[series[j]][0];
+2966         if (extremeMinY != null) {
+2967           minY = Math.min(extremeMinY, minY);
+2968         }
+2969         extremeMaxY = extremes[series[j]][1];
+2970         if (extremeMaxY != null) {
+2971           maxY = Math.max(extremeMaxY, maxY);
+2972         }
+2973       }
+2974       if (axis.includeZero && minY > 0) minY = 0;
+2975 
+2976       // Ensure we have a valid scale, otherwise defualt to zero for safety.
+2977       if (minY == Infinity) minY = 0;
+2978       if (maxY == -Infinity) maxY = 0;
+2979 
+2980       // Add some padding and round up to an integer to be human-friendly.
+2981       var span = maxY - minY;
+2982       // special case: if we have no sense of scale, use +/-10% of the sole value.
+2983       if (span == 0) { span = maxY; }
+2984 
+2985       var maxAxisY;
+2986       var minAxisY;
+2987       if (axis.logscale) {
+2988         var maxAxisY = maxY + 0.1 * span;
+2989         var minAxisY = minY;
+2990       } else {
+2991         var maxAxisY = maxY + 0.1 * span;
+2992         var minAxisY = minY - 0.1 * span;
+2993 
+2994         // Try to include zero and make it minAxisY (or maxAxisY) if it makes sense.
+2995         if (!this.attr_("avoidMinZero")) {
+2996           if (minAxisY < 0 && minY >= 0) minAxisY = 0;
+2997           if (maxAxisY > 0 && maxY <= 0) maxAxisY = 0;
+2998         }
+2999 
+3000         if (this.attr_("includeZero")) {
+3001           if (maxY < 0) maxAxisY = 0;
+3002           if (minY > 0) minAxisY = 0;
+3003         }
+3004       }
+3005       axis.extremeRange = [minAxisY, maxAxisY];
+3006     }
+3007     if (axis.valueWindow) {
+3008       // This is only set if the user has zoomed on the y-axis. It is never set
+3009       // by a user. It takes precedence over axis.valueRange because, if you set
+3010       // valueRange, you'd still expect to be able to pan.
+3011       axis.computedValueRange = [axis.valueWindow[0], axis.valueWindow[1]];
+3012     } else if (axis.valueRange) {
+3013       // This is a user-set value range for this axis.
+3014       axis.computedValueRange = [axis.valueRange[0], axis.valueRange[1]];
+3015     } else {
+3016       axis.computedValueRange = axis.extremeRange;
+3017     }
+3018 
+3019     // Add ticks. By default, all axes inherit the tick positions of the
+3020     // primary axis. However, if an axis is specifically marked as having
+3021     // independent ticks, then that is permissible as well.
+3022     if (i == 0 || axis.independentTicks) {
+3023       axis.ticks =
+3024         Dygraph.numericTicks(axis.computedValueRange[0],
+3025                              axis.computedValueRange[1],
+3026                              this,
+3027                              axis);
+3028     } else {
+3029       var p_axis = this.axes_[0];
+3030       var p_ticks = p_axis.ticks;
+3031       var p_scale = p_axis.computedValueRange[1] - p_axis.computedValueRange[0];
+3032       var scale = axis.computedValueRange[1] - axis.computedValueRange[0];
+3033       var tick_values = [];
+3034       for (var i = 0; i < p_ticks.length; i++) {
+3035         var y_frac = (p_ticks[i].v - p_axis.computedValueRange[0]) / p_scale;
+3036         var y_val = axis.computedValueRange[0] + y_frac * scale;
+3037         tick_values.push(y_val);
+3038       }
+3039 
+3040       axis.ticks =
+3041         Dygraph.numericTicks(axis.computedValueRange[0],
+3042                              axis.computedValueRange[1],
+3043                              this, axis, tick_values);
+3044     }
+3045   }
+3046 };
+3047  
+3048 /**
+3049  * @private
+3050  * Calculates the rolling average of a data set.
+3051  * If originalData is [label, val], rolls the average of those.
+3052  * If originalData is [label, [, it's interpreted as [value, stddev]
+3053  *   and the roll is returned in the same form, with appropriately reduced
+3054  *   stddev for each value.
+3055  * Note that this is where fractional input (i.e. '5/10') is converted into
+3056  *   decimal values.
+3057  * @param {Array} originalData The data in the appropriate format (see above)
+3058  * @param {Number} rollPeriod The number of points over which to average the
+3059  *                            data
+3060  */
+3061 Dygraph.prototype.rollingAverage = function(originalData, rollPeriod) {
+3062   if (originalData.length < 2)
+3063     return originalData;
+3064   var rollPeriod = Math.min(rollPeriod, originalData.length - 1);
+3065   var rollingData = [];
+3066   var sigma = this.attr_("sigma");
+3067 
+3068   if (this.fractions_) {
+3069     var num = 0;
+3070     var den = 0;  // numerator/denominator
+3071     var mult = 100.0;
+3072     for (var i = 0; i < originalData.length; i++) {
+3073       num += originalData[i][1][0];
+3074       den += originalData[i][1][1];
+3075       if (i - rollPeriod >= 0) {
+3076         num -= originalData[i - rollPeriod][1][0];
+3077         den -= originalData[i - rollPeriod][1][1];
+3078       }
+3079 
+3080       var date = originalData[i][0];
+3081       var value = den ? num / den : 0.0;
+3082       if (this.attr_("errorBars")) {
+3083         if (this.wilsonInterval_) {
+3084           // For more details on this confidence interval, see:
+3085           // http://en.wikipedia.org/wiki/Binomial_confidence_interval
+3086           if (den) {
+3087             var p = value < 0 ? 0 : value, n = den;
+3088             var pm = sigma * Math.sqrt(p*(1-p)/n + sigma*sigma/(4*n*n));
+3089             var denom = 1 + sigma * sigma / den;
+3090             var low  = (p + sigma * sigma / (2 * den) - pm) / denom;
+3091             var high = (p + sigma * sigma / (2 * den) + pm) / denom;
+3092             rollingData[i] = [date,
+3093                               [p * mult, (p - low) * mult, (high - p) * mult]];
+3094           } else {
+3095             rollingData[i] = [date, [0, 0, 0]];
+3096           }
+3097         } else {
+3098           var stddev = den ? sigma * Math.sqrt(value * (1 - value) / den) : 1.0;
+3099           rollingData[i] = [date, [mult * value, mult * stddev, mult * stddev]];
+3100         }
+3101       } else {
+3102         rollingData[i] = [date, mult * value];
+3103       }
+3104     }
+3105   } else if (this.attr_("customBars")) {
+3106     var low = 0;
+3107     var mid = 0;
+3108     var high = 0;
+3109     var count = 0;
+3110     for (var i = 0; i < originalData.length; i++) {
+3111       var data = originalData[i][1];
+3112       var y = data[1];
+3113       rollingData[i] = [originalData[i][0], [y, y - data[0], data[2] - y]];
+3114 
+3115       if (y != null && !isNaN(y)) {
+3116         low += data[0];
+3117         mid += y;
+3118         high += data[2];
+3119         count += 1;
+3120       }
+3121       if (i - rollPeriod >= 0) {
+3122         var prev = originalData[i - rollPeriod];
+3123         if (prev[1][1] != null && !isNaN(prev[1][1])) {
+3124           low -= prev[1][0];
+3125           mid -= prev[1][1];
+3126           high -= prev[1][2];
+3127           count -= 1;
+3128         }
+3129       }
+3130       rollingData[i] = [originalData[i][0], [ 1.0 * mid / count,
+3131                                               1.0 * (mid - low) / count,
+3132                                               1.0 * (high - mid) / count ]];
+3133     }
+3134   } else {
+3135     // Calculate the rolling average for the first rollPeriod - 1 points where
+3136     // there is not enough data to roll over the full number of points
+3137     var num_init_points = Math.min(rollPeriod - 1, originalData.length - 2);
+3138     if (!this.attr_("errorBars")){
+3139       if (rollPeriod == 1) {
+3140         return originalData;
+3141       }
+3142 
+3143       for (var i = 0; i < originalData.length; i++) {
+3144         var sum = 0;
+3145         var num_ok = 0;
+3146         for (var j = Math.max(0, i - rollPeriod + 1); j < i + 1; j++) {
+3147           var y = originalData[j][1];
+3148           if (y == null || isNaN(y)) continue;
+3149           num_ok++;
+3150           sum += originalData[j][1];
+3151         }
+3152         if (num_ok) {
+3153           rollingData[i] = [originalData[i][0], sum / num_ok];
+3154         } else {
+3155           rollingData[i] = [originalData[i][0], null];
+3156         }
+3157       }
+3158 
+3159     } else {
+3160       for (var i = 0; i < originalData.length; i++) {
+3161         var sum = 0;
+3162         var variance = 0;
+3163         var num_ok = 0;
+3164         for (var j = Math.max(0, i - rollPeriod + 1); j < i + 1; j++) {
+3165           var y = originalData[j][1][0];
+3166           if (y == null || isNaN(y)) continue;
+3167           num_ok++;
+3168           sum += originalData[j][1][0];
+3169           variance += Math.pow(originalData[j][1][1], 2);
+3170         }
+3171         if (num_ok) {
+3172           var stddev = Math.sqrt(variance) / num_ok;
+3173           rollingData[i] = [originalData[i][0],
+3174                             [sum / num_ok, sigma * stddev, sigma * stddev]];
+3175         } else {
+3176           rollingData[i] = [originalData[i][0], [null, null, null]];
+3177         }
+3178       }
+3179     }
+3180   }
+3181 
+3182   return rollingData;
+3183 };
+3184 
+3185 /**
+3186  * @private
+3187  * Parses a date, returning the number of milliseconds since epoch. This can be
+3188  * passed in as an xValueParser in the Dygraph constructor.
+3189  * TODO(danvk): enumerate formats that this understands.
+3190  * @param {String} A date in YYYYMMDD format.
+3191  * @return {Number} Milliseconds since epoch.
+3192  */
+3193 Dygraph.dateParser = function(dateStr, self) {
+3194   var dateStrSlashed;
+3195   var d;
+3196   if (dateStr.search("-") != -1) {  // e.g. '2009-7-12' or '2009-07-12'
+3197     dateStrSlashed = dateStr.replace("-", "/", "g");
+3198     while (dateStrSlashed.search("-") != -1) {
+3199       dateStrSlashed = dateStrSlashed.replace("-", "/");
+3200     }
+3201     d = Dygraph.dateStrToMillis(dateStrSlashed);
+3202   } else if (dateStr.length == 8) {  // e.g. '20090712'
+3203     // TODO(danvk): remove support for this format. It's confusing.
+3204     dateStrSlashed = dateStr.substr(0,4) + "/" + dateStr.substr(4,2)
+3205                        + "/" + dateStr.substr(6,2);
+3206     d = Dygraph.dateStrToMillis(dateStrSlashed);
+3207   } else {
+3208     // Any format that Date.parse will accept, e.g. "2009/07/12" or
+3209     // "2009/07/12 12:34:56"
+3210     d = Dygraph.dateStrToMillis(dateStr);
+3211   }
+3212 
+3213   if (!d || isNaN(d)) {
+3214     self.error("Couldn't parse " + dateStr + " as a date");
+3215   }
+3216   return d;
+3217 };
+3218 
+3219 /**
+3220  * Detects the type of the str (date or numeric) and sets the various
+3221  * formatting attributes in this.attrs_ based on this type.
+3222  * @param {String} str An x value.
+3223  * @private
+3224  */
+3225 Dygraph.prototype.detectTypeFromString_ = function(str) {
+3226   var isDate = false;
+3227   if (str.indexOf('-') > 0 ||
+3228       str.indexOf('/') >= 0 ||
+3229       isNaN(parseFloat(str))) {
+3230     isDate = true;
+3231   } else if (str.length == 8 && str > '19700101' && str < '20371231') {
+3232     // TODO(danvk): remove support for this format.
+3233     isDate = true;
+3234   }
+3235 
+3236   if (isDate) {
+3237     this.attrs_.xValueFormatter = Dygraph.dateString_;
+3238     this.attrs_.xValueParser = Dygraph.dateParser;
+3239     this.attrs_.xTicker = Dygraph.dateTicker;
+3240     this.attrs_.xAxisLabelFormatter = Dygraph.dateAxisFormatter;
+3241   } else {
+3242     // TODO(danvk): use Dygraph.numberFormatter here?
+3243     this.attrs_.xValueFormatter = function(x) { return x; };
+3244     this.attrs_.xValueParser = function(x) { return parseFloat(x); };
+3245     this.attrs_.xTicker = Dygraph.numericTicks;
+3246     this.attrs_.xAxisLabelFormatter = this.attrs_.xValueFormatter;
+3247   }
+3248 };
+3249 
+3250 /**
+3251  * Parses the value as a floating point number. This is like the parseFloat()
+3252  * built-in, but with a few differences:
+3253  * - the empty string is parsed as null, rather than NaN.
+3254  * - if the string cannot be parsed at all, an error is logged.
+3255  * If the string can't be parsed, this method returns null.
+3256  * @param {String} x The string to be parsed
+3257  * @param {Number} opt_line_no The line number from which the string comes.
+3258  * @param {String} opt_line The text of the line from which the string comes.
+3259  * @private
+3260  */
+3261 
+3262 // Parse the x as a float or return null if it's not a number.
+3263 Dygraph.prototype.parseFloat_ = function(x, opt_line_no, opt_line) {
+3264   var val = parseFloat(x);
+3265   if (!isNaN(val)) return val;
+3266 
+3267   // Try to figure out what happeend.
+3268   // If the value is the empty string, parse it as null.
+3269   if (/^ *$/.test(x)) return null;
+3270 
+3271   // If it was actually "NaN", return it as NaN.
+3272   if (/^ *nan *$/i.test(x)) return NaN;
+3273 
+3274   // Looks like a parsing error.
+3275   var msg = "Unable to parse '" + x + "' as a number";
+3276   if (opt_line !== null && opt_line_no !== null) {
+3277     msg += " on line " + (1+opt_line_no) + " ('" + opt_line + "') of CSV.";
+3278   }
+3279   this.error(msg);
+3280 
+3281   return null;
+3282 };
+3283 
+3284 /**
+3285  * @private
+3286  * Parses a string in a special csv format.  We expect a csv file where each
+3287  * line is a date point, and the first field in each line is the date string.
+3288  * We also expect that all remaining fields represent series.
+3289  * if the errorBars attribute is set, then interpret the fields as:
+3290  * date, series1, stddev1, series2, stddev2, ...
+3291  * @param {[Object]} data See above.
+3292  *
+3293  * @return [Object] An array with one entry for each row. These entries
+3294  * are an array of cells in that row. The first entry is the parsed x-value for
+3295  * the row. The second, third, etc. are the y-values. These can take on one of
+3296  * three forms, depending on the CSV and constructor parameters:
+3297  * 1. numeric value
+3298  * 2. [ value, stddev ]
+3299  * 3. [ low value, center value, high value ]
+3300  */
+3301 Dygraph.prototype.parseCSV_ = function(data) {
+3302   var ret = [];
+3303   var lines = data.split("\n");
+3304 
+3305   // Use the default delimiter or fall back to a tab if that makes sense.
+3306   var delim = this.attr_('delimiter');
+3307   if (lines[0].indexOf(delim) == -1 && lines[0].indexOf('\t') >= 0) {
+3308     delim = '\t';
+3309   }
+3310 
+3311   var start = 0;
+3312   if (this.labelsFromCSV_) {
+3313     start = 1;
+3314     this.attrs_.labels = lines[0].split(delim);
+3315   }
+3316   var line_no = 0;
+3317 
+3318   var xParser;
+3319   var defaultParserSet = false;  // attempt to auto-detect x value type
+3320   var expectedCols = this.attr_("labels").length;
+3321   var outOfOrder = false;
+3322   for (var i = start; i < lines.length; i++) {
+3323     var line = lines[i];
+3324     line_no = i;
+3325     if (line.length == 0) continue;  // skip blank lines
+3326     if (line[0] == '#') continue;    // skip comment lines
+3327     var inFields = line.split(delim);
+3328     if (inFields.length < 2) continue;
+3329 
+3330     var fields = [];
+3331     if (!defaultParserSet) {
+3332       this.detectTypeFromString_(inFields[0]);
+3333       xParser = this.attr_("xValueParser");
+3334       defaultParserSet = true;
+3335     }
+3336     fields[0] = xParser(inFields[0], this);
+3337 
+3338     // If fractions are expected, parse the numbers as "A/B"
+3339     if (this.fractions_) {
+3340       for (var j = 1; j < inFields.length; j++) {
+3341         // TODO(danvk): figure out an appropriate way to flag parse errors.
+3342         var vals = inFields[j].split("/");
+3343         if (vals.length != 2) {
+3344           this.error('Expected fractional "num/den" values in CSV data ' +
+3345                      "but found a value '" + inFields[j] + "' on line " +
+3346                      (1 + i) + " ('" + line + "') which is not of this form.");
+3347           fields[j] = [0, 0];
+3348         } else {
+3349           fields[j] = [this.parseFloat_(vals[0], i, line),
+3350                        this.parseFloat_(vals[1], i, line)];
+3351         }
+3352       }
+3353     } else if (this.attr_("errorBars")) {
+3354       // If there are error bars, values are (value, stddev) pairs
+3355       if (inFields.length % 2 != 1) {
+3356         this.error('Expected alternating (value, stdev.) pairs in CSV data ' +
+3357                    'but line ' + (1 + i) + ' has an odd number of values (' +
+3358                    (inFields.length - 1) + "): '" + line + "'");
+3359       }
+3360       for (var j = 1; j < inFields.length; j += 2) {
+3361         fields[(j + 1) / 2] = [this.parseFloat_(inFields[j], i, line),
+3362                                this.parseFloat_(inFields[j + 1], i, line)];
+3363       }
+3364     } else if (this.attr_("customBars")) {
+3365       // Bars are a low;center;high tuple
+3366       for (var j = 1; j < inFields.length; j++) {
+3367         var val = inFields[j];
+3368         if (/^ *$/.test(val)) {
+3369           fields[j] = [null, null, null];
+3370         } else {
+3371           var vals = val.split(";");
+3372           if (vals.length == 3) {
+3373             fields[j] = [ this.parseFloat_(vals[0], i, line),
+3374                           this.parseFloat_(vals[1], i, line),
+3375                           this.parseFloat_(vals[2], i, line) ];
+3376           } else {
+3377             this.warning('When using customBars, values must be either blank ' +
+3378                          'or "low;center;high" tuples (got "' + val +
+3379                          '" on line ' + (1+i));
+3380           }
+3381         }
+3382       }
+3383     } else {
+3384       // Values are just numbers
+3385       for (var j = 1; j < inFields.length; j++) {
+3386         fields[j] = this.parseFloat_(inFields[j], i, line);
+3387       }
+3388     }
+3389     if (ret.length > 0 && fields[0] < ret[ret.length - 1][0]) {
+3390       outOfOrder = true;
+3391     }
+3392 
+3393     if (fields.length != expectedCols) {
+3394       this.error("Number of columns in line " + i + " (" + fields.length +
+3395                  ") does not agree with number of labels (" + expectedCols +
+3396                  ") " + line);
+3397     }
+3398 
+3399     // If the user specified the 'labels' option and none of the cells of the
+3400     // first row parsed correctly, then they probably double-specified the
+3401     // labels. We go with the values set in the option, discard this row and
+3402     // log a warning to the JS console.
+3403     if (i == 0 && this.attr_('labels')) {
+3404       var all_null = true;
+3405       for (var j = 0; all_null && j < fields.length; j++) {
+3406         if (fields[j]) all_null = false;
+3407       }
+3408       if (all_null) {
+3409         this.warn("The dygraphs 'labels' option is set, but the first row of " +
+3410                   "CSV data ('" + line + "') appears to also contain labels. " +
+3411                   "Will drop the CSV labels and use the option labels.");
+3412         continue;
+3413       }
+3414     }
+3415     ret.push(fields);
+3416   }
+3417 
+3418   if (outOfOrder) {
+3419     this.warn("CSV is out of order; order it correctly to speed loading.");
+3420     ret.sort(function(a,b) { return a[0] - b[0] });
+3421   }
+3422 
+3423   return ret;
+3424 };
+3425 
+3426 /**
+3427  * @private
+3428  * The user has provided their data as a pre-packaged JS array. If the x values
+3429  * are numeric, this is the same as dygraphs' internal format. If the x values
+3430  * are dates, we need to convert them from Date objects to ms since epoch.
+3431  * @param {[Object]} data
+3432  * @return {[Object]} data with numeric x values.
+3433  */
+3434 Dygraph.prototype.parseArray_ = function(data) {
+3435   // Peek at the first x value to see if it's numeric.
+3436   if (data.length == 0) {
+3437     this.error("Can't plot empty data set");
+3438     return null;
+3439   }
+3440   if (data[0].length == 0) {
+3441     this.error("Data set cannot contain an empty row");
+3442     return null;
+3443   }
+3444 
+3445   if (this.attr_("labels") == null) {
+3446     this.warn("Using default labels. Set labels explicitly via 'labels' " +
+3447               "in the options parameter");
+3448     this.attrs_.labels = [ "X" ];
+3449     for (var i = 1; i < data[0].length; i++) {
+3450       this.attrs_.labels.push("Y" + i);
+3451     }
+3452   }
+3453 
+3454   if (Dygraph.isDateLike(data[0][0])) {
+3455     // Some intelligent defaults for a date x-axis.
+3456     this.attrs_.xValueFormatter = Dygraph.dateString_;
+3457     this.attrs_.xAxisLabelFormatter = Dygraph.dateAxisFormatter;
+3458     this.attrs_.xTicker = Dygraph.dateTicker;
+3459 
+3460     // Assume they're all dates.
+3461     var parsedData = Dygraph.clone(data);
+3462     for (var i = 0; i < data.length; i++) {
+3463       if (parsedData[i].length == 0) {
+3464         this.error("Row " + (1 + i) + " of data is empty");
+3465         return null;
+3466       }
+3467       if (parsedData[i][0] == null
+3468           || typeof(parsedData[i][0].getTime) != 'function'
+3469           || isNaN(parsedData[i][0].getTime())) {
+3470         this.error("x value in row " + (1 + i) + " is not a Date");
+3471         return null;
+3472       }
+3473       parsedData[i][0] = parsedData[i][0].getTime();
+3474     }
+3475     return parsedData;
+3476   } else {
+3477     // Some intelligent defaults for a numeric x-axis.
+3478     this.attrs_.xValueFormatter = function(x) { return x; };
+3479     this.attrs_.xTicker = Dygraph.numericTicks;
+3480     return data;
+3481   }
+3482 };
+3483 
+3484 /**
+3485  * Parses a DataTable object from gviz.
+3486  * The data is expected to have a first column that is either a date or a
+3487  * number. All subsequent columns must be numbers. If there is a clear mismatch
+3488  * between this.xValueParser_ and the type of the first column, it will be
+3489  * fixed. Fills out rawData_.
+3490  * @param {[Object]} data See above.
+3491  * @private
+3492  */
+3493 Dygraph.prototype.parseDataTable_ = function(data) {
+3494   var cols = data.getNumberOfColumns();
+3495   var rows = data.getNumberOfRows();
+3496 
+3497   var indepType = data.getColumnType(0);
+3498   if (indepType == 'date' || indepType == 'datetime') {
+3499     this.attrs_.xValueFormatter = Dygraph.dateString_;
+3500     this.attrs_.xValueParser = Dygraph.dateParser;
+3501     this.attrs_.xTicker = Dygraph.dateTicker;
+3502     this.attrs_.xAxisLabelFormatter = Dygraph.dateAxisFormatter;
+3503   } else if (indepType == 'number') {
+3504     this.attrs_.xValueFormatter = function(x) { return x; };
+3505     this.attrs_.xValueParser = function(x) { return parseFloat(x); };
+3506     this.attrs_.xTicker = Dygraph.numericTicks;
+3507     this.attrs_.xAxisLabelFormatter = this.attrs_.xValueFormatter;
+3508   } else {
+3509     this.error("only 'date', 'datetime' and 'number' types are supported for " +
+3510                "column 1 of DataTable input (Got '" + indepType + "')");
+3511     return null;
+3512   }
+3513 
+3514   // Array of the column indices which contain data (and not annotations).
+3515   var colIdx = [];
+3516   var annotationCols = {};  // data index -> [annotation cols]
+3517   var hasAnnotations = false;
+3518   for (var i = 1; i < cols; i++) {
+3519     var type = data.getColumnType(i);
+3520     if (type == 'number') {
+3521       colIdx.push(i);
+3522     } else if (type == 'string' && this.attr_('displayAnnotations')) {
+3523       // This is OK -- it's an annotation column.
+3524       var dataIdx = colIdx[colIdx.length - 1];
+3525       if (!annotationCols.hasOwnProperty(dataIdx)) {
+3526         annotationCols[dataIdx] = [i];
+3527       } else {
+3528         annotationCols[dataIdx].push(i);
+3529       }
+3530       hasAnnotations = true;
+3531     } else {
+3532       this.error("Only 'number' is supported as a dependent type with Gviz." +
+3533                  " 'string' is only supported if displayAnnotations is true");
+3534     }
+3535   }
+3536 
+3537   // Read column labels
+3538   // TODO(danvk): add support back for errorBars
+3539   var labels = [data.getColumnLabel(0)];
+3540   for (var i = 0; i < colIdx.length; i++) {
+3541     labels.push(data.getColumnLabel(colIdx[i]));
+3542     if (this.attr_("errorBars")) i += 1;
+3543   }
+3544   this.attrs_.labels = labels;
+3545   cols = labels.length;
+3546 
+3547   var ret = [];
+3548   var outOfOrder = false;
+3549   var annotations = [];
+3550   for (var i = 0; i < rows; i++) {
+3551     var row = [];
+3552     if (typeof(data.getValue(i, 0)) === 'undefined' ||
+3553         data.getValue(i, 0) === null) {
+3554       this.warn("Ignoring row " + i +
+3555                 " of DataTable because of undefined or null first column.");
+3556       continue;
+3557     }
+3558 
+3559     if (indepType == 'date' || indepType == 'datetime') {
+3560       row.push(data.getValue(i, 0).getTime());
+3561     } else {
+3562       row.push(data.getValue(i, 0));
+3563     }
+3564     if (!this.attr_("errorBars")) {
+3565       for (var j = 0; j < colIdx.length; j++) {
+3566         var col = colIdx[j];
+3567         row.push(data.getValue(i, col));
+3568         if (hasAnnotations &&
+3569             annotationCols.hasOwnProperty(col) &&
+3570             data.getValue(i, annotationCols[col][0]) != null) {
+3571           var ann = {};
+3572           ann.series = data.getColumnLabel(col);
+3573           ann.xval = row[0];
+3574           ann.shortText = String.fromCharCode(65 /* A */ + annotations.length)
+3575           ann.text = '';
+3576           for (var k = 0; k < annotationCols[col].length; k++) {
+3577             if (k) ann.text += "\n";
+3578             ann.text += data.getValue(i, annotationCols[col][k]);
+3579           }
+3580           annotations.push(ann);
+3581         }
+3582       }
+3583 
+3584       // Strip out infinities, which give dygraphs problems later on.
+3585       for (var j = 0; j < row.length; j++) {
+3586         if (!isFinite(row[j])) row[j] = null;
+3587       }
+3588     } else {
+3589       for (var j = 0; j < cols - 1; j++) {
+3590         row.push([ data.getValue(i, 1 + 2 * j), data.getValue(i, 2 + 2 * j) ]);
+3591       }
+3592     }
+3593     if (ret.length > 0 && row[0] < ret[ret.length - 1][0]) {
+3594       outOfOrder = true;
+3595     }
+3596     ret.push(row);
+3597   }
+3598 
+3599   if (outOfOrder) {
+3600     this.warn("DataTable is out of order; order it correctly to speed loading.");
+3601     ret.sort(function(a,b) { return a[0] - b[0] });
+3602   }
+3603   this.rawData_ = ret;
+3604 
+3605   if (annotations.length > 0) {
+3606     this.setAnnotations(annotations, true);
+3607   }
+3608 }
+3609 
+3610 /**
+3611  * @private
+3612  * This is identical to JavaScript's built-in Date.parse() method, except that
+3613  * it doesn't get replaced with an incompatible method by aggressive JS
+3614  * libraries like MooTools or Joomla.
+3615  * @param { String } str The date string, e.g. "2011/05/06"
+3616  * @return { Integer } millis since epoch
+3617  */
+3618 Dygraph.dateStrToMillis = function(str) {
+3619   return new Date(str).getTime();
+3620 };
+3621 
+3622 // These functions are all based on MochiKit.
+3623 /**
+3624  * @private
+3625  */
+3626 Dygraph.update = function (self, o) {
+3627   if (typeof(o) != 'undefined' && o !== null) {
+3628     for (var k in o) {
+3629       if (o.hasOwnProperty(k)) {
+3630         self[k] = o[k];
+3631       }
+3632     }
+3633   }
+3634   return self;
+3635 };
+3636 
+3637 /**
+3638  * @private
+3639  */
+3640 Dygraph.isArrayLike = function (o) {
+3641   var typ = typeof(o);
+3642   if (
+3643       (typ != 'object' && !(typ == 'function' &&
+3644         typeof(o.item) == 'function')) ||
+3645       o === null ||
+3646       typeof(o.length) != 'number' ||
+3647       o.nodeType === 3
+3648      ) {
+3649     return false;
+3650   }
+3651   return true;
+3652 };
+3653 
+3654 /**
+3655  * @private
+3656  */
+3657 Dygraph.isDateLike = function (o) {
+3658   if (typeof(o) != "object" || o === null ||
+3659       typeof(o.getTime) != 'function') {
+3660     return false;
+3661   }
+3662   return true;
+3663 };
+3664 
+3665 /**
+3666  * @private
+3667  */
+3668 Dygraph.clone = function(o) {
+3669   // TODO(danvk): figure out how MochiKit's version works
+3670   var r = [];
+3671   for (var i = 0; i < o.length; i++) {
+3672     if (Dygraph.isArrayLike(o[i])) {
+3673       r.push(Dygraph.clone(o[i]));
+3674     } else {
+3675       r.push(o[i]);
+3676     }
+3677   }
+3678   return r;
+3679 };
+3680 
+3681 
+3682 /**
+3683  * Get the CSV data. If it's in a function, call that function. If it's in a
+3684  * file, do an XMLHttpRequest to get it.
+3685  * @private
+3686  */
+3687 Dygraph.prototype.start_ = function() {
+3688   if (typeof this.file_ == 'function') {
+3689     // CSV string. Pretend we got it via XHR.
+3690     this.loadedEvent_(this.file_());
+3691   } else if (Dygraph.isArrayLike(this.file_)) {
+3692     this.rawData_ = this.parseArray_(this.file_);
+3693     this.predraw_();
+3694   } else if (typeof this.file_ == 'object' &&
+3695              typeof this.file_.getColumnRange == 'function') {
+3696     // must be a DataTable from gviz.
+3697     this.parseDataTable_(this.file_);
+3698     this.predraw_();
+3699   } else if (typeof this.file_ == 'string') {
+3700     // Heuristic: a newline means it's CSV data. Otherwise it's an URL.
+3701     if (this.file_.indexOf('\n') >= 0) {
+3702       this.loadedEvent_(this.file_);
+3703     } else {
+3704       var req = new XMLHttpRequest();
+3705       var caller = this;
+3706       req.onreadystatechange = function () {
+3707         if (req.readyState == 4) {
+3708           if (req.status == 200) {
+3709             caller.loadedEvent_(req.responseText);
+3710           }
+3711         }
+3712       };
+3713 
+3714       req.open("GET", this.file_, true);
+3715       req.send(null);
+3716     }
+3717   } else {
+3718     this.error("Unknown data format: " + (typeof this.file_));
+3719   }
+3720 };
+3721 
+3722 /**
+3723  * Changes various properties of the graph. These can include:
+3724  * <ul>
+3725  * <li>file: changes the source data for the graph</li>
+3726  * <li>errorBars: changes whether the data contains stddev</li>
+3727  * </ul>
+3728  *
+3729  * @param {Object} attrs The new properties and values
+3730  */
+3731 Dygraph.prototype.updateOptions = function(attrs) {
+3732   // TODO(danvk): this is a mess. Rethink this function.
+3733   if ('rollPeriod' in attrs) {
+3734     this.rollPeriod_ = attrs.rollPeriod;
+3735   }
+3736   if ('dateWindow' in attrs) {
+3737     this.dateWindow_ = attrs.dateWindow;
+3738     if (!('isZoomedIgnoreProgrammaticZoom' in attrs)) {
+3739       this.zoomed_x_ = attrs.dateWindow != null;
+3740     }
+3741   }
+3742   if ('valueRange' in attrs && !('isZoomedIgnoreProgrammaticZoom' in attrs)) {
+3743     this.zoomed_y_ = attrs.valueRange != null;
+3744   }
+3745 
+3746   // TODO(danvk): validate per-series options.
+3747   // Supported:
+3748   // strokeWidth
+3749   // pointSize
+3750   // drawPoints
+3751   // highlightCircleSize
+3752 
+3753   Dygraph.update(this.user_attrs_, attrs);
+3754   Dygraph.update(this.renderOptions_, attrs);
+3755 
+3756   this.labelsFromCSV_ = (this.attr_("labels") == null);
+3757 
+3758   // TODO(danvk): this doesn't match the constructor logic
+3759   this.layout_.updateOptions({ 'errorBars': this.attr_("errorBars") });
+3760   if (attrs['file']) {
+3761     this.file_ = attrs['file'];
+3762     this.start_();
+3763   } else {
+3764     this.predraw_();
+3765   }
+3766 };
+3767 
+3768 /**
+3769  * Resizes the dygraph. If no parameters are specified, resizes to fill the
+3770  * containing div (which has presumably changed size since the dygraph was
+3771  * instantiated. If the width/height are specified, the div will be resized.
+3772  *
+3773  * This is far more efficient than destroying and re-instantiating a
+3774  * Dygraph, since it doesn't have to reparse the underlying data.
+3775  *
+3776  * @param {Number} [width] Width (in pixels)
+3777  * @param {Number} [height] Height (in pixels)
+3778  */
+3779 Dygraph.prototype.resize = function(width, height) {
+3780   if (this.resize_lock) {
+3781     return;
+3782   }
+3783   this.resize_lock = true;
+3784 
+3785   if ((width === null) != (height === null)) {
+3786     this.warn("Dygraph.resize() should be called with zero parameters or " +
+3787               "two non-NULL parameters. Pretending it was zero.");
+3788     width = height = null;
+3789   }
+3790 
+3791   // TODO(danvk): there should be a clear() method.
+3792   this.maindiv_.innerHTML = "";
+3793   this.attrs_.labelsDiv = null;
+3794 
+3795   if (width) {
+3796     this.maindiv_.style.width = width + "px";
+3797     this.maindiv_.style.height = height + "px";
+3798     this.width_ = width;
+3799     this.height_ = height;
+3800   } else {
+3801     this.width_ = this.maindiv_.offsetWidth;
+3802     this.height_ = this.maindiv_.offsetHeight;
+3803   }
+3804 
+3805   this.createInterface_();
+3806   this.predraw_();
+3807 
+3808   this.resize_lock = false;
+3809 };
+3810 
+3811 /**
+3812  * Adjusts the number of points in the rolling average. Updates the graph to
+3813  * reflect the new averaging period.
+3814  * @param {Number} length Number of points over which to average the data.
+3815  */
+3816 Dygraph.prototype.adjustRoll = function(length) {
+3817   this.rollPeriod_ = length;
+3818   this.predraw_();
+3819 };
+3820 
+3821 /**
+3822  * Returns a boolean array of visibility statuses.
+3823  */
+3824 Dygraph.prototype.visibility = function() {
+3825   // Do lazy-initialization, so that this happens after we know the number of
+3826   // data series.
+3827   if (!this.attr_("visibility")) {
+3828     this.attrs_["visibility"] = [];
+3829   }
+3830   while (this.attr_("visibility").length < this.rawData_[0].length - 1) {
+3831     this.attr_("visibility").push(true);
+3832   }
+3833   return this.attr_("visibility");
+3834 };
+3835 
+3836 /**
+3837  * Changes the visiblity of a series.
+3838  */
+3839 Dygraph.prototype.setVisibility = function(num, value) {
+3840   var x = this.visibility();
+3841   if (num < 0 || num >= x.length) {
+3842     this.warn("invalid series number in setVisibility: " + num);
+3843   } else {
+3844     x[num] = value;
+3845     this.predraw_();
+3846   }
+3847 };
+3848 
+3849 /**
+3850  * Update the list of annotations and redraw the chart.
+3851  */
+3852 Dygraph.prototype.setAnnotations = function(ann, suppressDraw) {
+3853   // Only add the annotation CSS rule once we know it will be used.
+3854   Dygraph.addAnnotationRule();
+3855   this.annotations_ = ann;
+3856   this.layout_.setAnnotations(this.annotations_);
+3857   if (!suppressDraw) {
+3858     this.predraw_();
+3859   }
+3860 };
+3861 
+3862 /**
+3863  * Return the list of annotations.
+3864  */
+3865 Dygraph.prototype.annotations = function() {
+3866   return this.annotations_;
+3867 };
+3868 
+3869 /**
+3870  * Get the index of a series (column) given its name. The first column is the
+3871  * x-axis, so the data series start with index 1.
+3872  */
+3873 Dygraph.prototype.indexFromSetName = function(name) {
+3874   var labels = this.attr_("labels");
+3875   for (var i = 0; i < labels.length; i++) {
+3876     if (labels[i] == name) return i;
+3877   }
+3878   return null;
+3879 };
+3880 
+3881 /**
+3882  * @private
+3883  * Adds a default style for the annotation CSS classes to the document. This is
+3884  * only executed when annotations are actually used. It is designed to only be
+3885  * called once -- all calls after the first will return immediately.
+3886  */
+3887 Dygraph.addAnnotationRule = function() {
+3888   if (Dygraph.addedAnnotationCSS) return;
+3889 
+3890   var rule = "border: 1px solid black; " +
+3891              "background-color: white; " +
+3892              "text-align: center;";
+3893 
+3894   var styleSheetElement = document.createElement("style");
+3895   styleSheetElement.type = "text/css";
+3896   document.getElementsByTagName("head")[0].appendChild(styleSheetElement);
+3897 
+3898   // Find the first style sheet that we can access.
+3899   // We may not add a rule to a style sheet from another domain for security
+3900   // reasons. This sometimes comes up when using gviz, since the Google gviz JS
+3901   // adds its own style sheets from google.com.
+3902   for (var i = 0; i < document.styleSheets.length; i++) {
+3903     if (document.styleSheets[i].disabled) continue;
+3904     var mysheet = document.styleSheets[i];
+3905     try {
+3906       if (mysheet.insertRule) {  // Firefox
+3907         var idx = mysheet.cssRules ? mysheet.cssRules.length : 0;
+3908         mysheet.insertRule(".dygraphDefaultAnnotation { " + rule + " }", idx);
+3909       } else if (mysheet.addRule) {  // IE
+3910         mysheet.addRule(".dygraphDefaultAnnotation", rule);
+3911       }
+3912       Dygraph.addedAnnotationCSS = true;
+3913       return;
+3914     } catch(err) {
+3915       // Was likely a security exception.
+3916     }
+3917   }
+3918 
+3919   this.warn("Unable to add default annotation CSS rule; display may be off.");
+3920 }
+3921 
+3922 /**
+3923  * @private
+3924  * Create a new canvas element. This is more complex than a simple
+3925  * document.createElement("canvas") because of IE and excanvas.
+3926  */
+3927 Dygraph.createCanvas = function() {
+3928   var canvas = document.createElement("canvas");
+3929 
+3930   isIE = (/MSIE/.test(navigator.userAgent) && !window.opera);
+3931   if (isIE && (typeof(G_vmlCanvasManager) != 'undefined')) {
+3932     canvas = G_vmlCanvasManager.initElement(canvas);
+3933   }
+3934 
+3935   return canvas;
+3936 };
+3937 
+3938 
+3939 /**
+3940  * A wrapper around Dygraph that implements the gviz API.
+3941  * @param {Object} container The DOM object the visualization should live in.
+3942  */
+3943 Dygraph.GVizChart = function(container) {
+3944   this.container = container;
+3945 }
+3946 
+3947 Dygraph.GVizChart.prototype.draw = function(data, options) {
+3948   // Clear out any existing dygraph.
+3949   // TODO(danvk): would it make more sense to simply redraw using the current
+3950   // date_graph object?
+3951   this.container.innerHTML = '';
+3952   if (typeof(this.date_graph) != 'undefined') {
+3953     this.date_graph.destroy();
+3954   }
+3955 
+3956   this.date_graph = new Dygraph(this.container, data, options);
+3957 }
+3958 
+3959 /**
+3960  * Google charts compatible setSelection
+3961  * Only row selection is supported, all points in the row will be highlighted
+3962  * @param {Array} array of the selected cells
+3963  * @public
+3964  */
+3965 Dygraph.GVizChart.prototype.setSelection = function(selection_array) {
+3966   var row = false;
+3967   if (selection_array.length) {
+3968     row = selection_array[0].row;
+3969   }
+3970   this.date_graph.setSelection(row);
+3971 }
+3972 
+3973 /**
+3974  * Google charts compatible getSelection implementation
+3975  * @return {Array} array of the selected cells
+3976  * @public
+3977  */
+3978 Dygraph.GVizChart.prototype.getSelection = function() {
+3979   var selection = [];
+3980 
+3981   var row = this.date_graph.getSelection();
+3982 
+3983   if (row < 0) return selection;
+3984 
+3985   col = 1;
+3986   for (var i in this.date_graph.layout_.datasets) {
+3987     selection.push({row: row, column: col});
+3988     col++;
+3989   }
+3990 
+3991   return selection;
+3992 }
+3993 
+3994 // Older pages may still use this name.
+3995 DateGraph = Dygraph;
+3996 
+3997 // <REMOVE_FOR_COMBINED>
+3998 Dygraph.OPTIONS_REFERENCE =  // <JSON>
+3999 {
+4000   "xValueParser": {
+4001     "default": "parseFloat() or Date.parse()*",
+4002     "labels": ["CSV parsing"],
+4003     "type": "function(str) -> number",
+4004     "description": "A function which parses x-values (i.e. the dependent series). Must return a number, even when the values are dates. In this case, millis since epoch are used. This is used primarily for parsing CSV data. *=Dygraphs is slightly more accepting in the dates which it will parse. See code for details."
+4005   },
+4006   "stackedGraph": {
+4007     "default": "false",
+4008     "labels": ["Data Line display"],
+4009     "type": "boolean",
+4010     "description": "If set, stack series on top of one another rather than drawing them independently."
+4011   },
+4012   "pointSize": {
+4013     "default": "1",
+4014     "labels": ["Data Line display"],
+4015     "type": "integer",
+4016     "description": "The size of the dot to draw on each point in pixels (see drawPoints). A dot is always drawn when a point is \"isolated\", i.e. there is a missing point on either side of it. This also controls the size of those dots."
+4017   },
+4018   "labelsDivStyles": {
+4019     "default": "null",
+4020     "labels": ["Legend"],
+4021     "type": "{}",
+4022     "description": "Additional styles to apply to the currently-highlighted points div. For example, { 'font-weight': 'bold' } will make the labels bold."
+4023   },
+4024   "drawPoints": {
+4025     "default": "false",
+4026     "labels": ["Data Line display"],
+4027     "type": "boolean",
+4028     "description": "Draw a small dot at each point, in addition to a line going through the point. This makes the individual data points easier to see, but can increase visual clutter in the chart."
+4029   },
+4030   "height": {
+4031     "default": "320",
+4032     "labels": ["Overall display"],
+4033     "type": "integer",
+4034     "description": "Height, in pixels, of the chart. If the container div has been explicitly sized, this will be ignored."
+4035   },
+4036   "zoomCallback": {
+4037     "default": "null",
+4038     "labels": ["Callbacks"],
+4039     "type": "function(minDate, maxDate, yRanges)",
+4040     "description": "A function to call when the zoom window is changed (either by zooming in or out). minDate and maxDate are milliseconds since epoch. yRanges is an array of [bottom, top] pairs, one for each y-axis."
+4041   },
+4042   "pointClickCallback": {
+4043     "default": "",
+4044     "labels": ["Callbacks", "Interactive Elements"],
+4045     "type": "",
+4046     "description": ""
+4047   },
+4048   "colors": {
+4049     "default": "(see description)",
+4050     "labels": ["Data Series Colors"],
+4051     "type": "array<string>",
+4052     "example": "['red', '#00FF00']",
+4053     "description": "List of colors for the data series. These can be of the form \"#AABBCC\" or \"rgb(255,100,200)\" or \"yellow\", etc. If not specified, equally-spaced points around a color wheel are used."
+4054   },
+4055   "connectSeparatedPoints": {
+4056     "default": "false",
+4057     "labels": ["Data Line display"],
+4058     "type": "boolean",
+4059     "description": "Usually, when Dygraphs encounters a missing value in a data series, it interprets this as a gap and draws it as such. If, instead, the missing values represents an x-value for which only a different series has data, then you'll want to connect the dots by setting this to true. To explicitly include a gap with this option set, use a value of NaN."
+4060   },
+4061   "highlightCallback": {
+4062     "default": "null",
+4063     "labels": ["Callbacks"],
+4064     "type": "function(event, x, points,row)",
+4065     "description": "When set, this callback gets called every time a new point is highlighted. The parameters are the JavaScript mousemove event, the x-coordinate of the highlighted points and an array of highlighted points: <code>[ {name: 'series', yval: y-value}, … ]</code>"
+4066   },
+4067   "includeZero": {
+4068     "default": "false",
+4069     "labels": ["Axis display"],
+4070     "type": "boolean",
+4071     "description": "Usually, dygraphs will use the range of the data plus some padding to set the range of the y-axis. If this option is set, the y-axis will always include zero, typically as the lowest value. This can be used to avoid exaggerating the variance in the data"
+4072   },
+4073   "rollPeriod": {
+4074     "default": "1",
+4075     "labels": ["Error Bars", "Rolling Averages"],
+4076     "type": "integer >= 1",
+4077     "description": "Number of days over which to average data. Discussed extensively above."
+4078   },
+4079   "unhighlightCallback": {
+4080     "default": "null",
+4081     "labels": ["Callbacks"],
+4082     "type": "function(event)",
+4083     "description": "When set, this callback gets called every time the user stops highlighting any point by mousing out of the graph.  The parameter is the mouseout event."
+4084   },
+4085   "axisTickSize": {
+4086     "default": "3.0",
+4087     "labels": ["Axis display"],
+4088     "type": "number",
+4089     "description": "The size of the line to display next to each tick mark on x- or y-axes."
+4090   },
+4091   "labelsSeparateLines": {
+4092     "default": "false",
+4093     "labels": ["Legend"],
+4094     "type": "boolean",
+4095     "description": "Put <code><br/></code> between lines in the label string. Often used in conjunction with <strong>labelsDiv</strong>."
+4096   },
+4097   "xValueFormatter": {
+4098     "default": "(Round to 2 decimal places)",
+4099     "labels": ["Axis display"],
+4100     "type": "function(x)",
+4101     "description": "Function to provide a custom display format for the X value for mouseover."
+4102   },
+4103   "pixelsPerYLabel": {
+4104     "default": "30",
+4105     "labels": ["Axis display", "Grid"],
+4106     "type": "integer",
+4107     "description": "Number of pixels to require between each x- and y-label. Larger values will yield a sparser axis with fewer ticks."
+4108   },
+4109   "annotationMouseOverHandler": {
+4110     "default": "null",
+4111     "labels": ["Annotations"],
+4112     "type": "function(annotation, point, dygraph, event)",
+4113     "description": "If provided, this function is called whenever the user mouses over an annotation."
+4114   },
+4115   "annotationMouseOutHandler": {
+4116     "default": "null",
+4117     "labels": ["Annotations"],
+4118     "type": "function(annotation, point, dygraph, event)",
+4119     "description": "If provided, this function is called whenever the user mouses out of an annotation."
+4120   },
+4121   "annotationClickHandler": {
+4122     "default": "null",
+4123     "labels": ["Annotations"],
+4124     "type": "function(annotation, point, dygraph, event)",
+4125     "description": "If provided, this function is called whenever the user clicks on an annotation."
+4126   },
+4127   "annotationDblClickHandler": {
+4128     "default": "null",
+4129     "labels": ["Annotations"],
+4130     "type": "function(annotation, point, dygraph, event)",
+4131     "description": "If provided, this function is called whenever the user double-clicks on an annotation."
+4132   },
+4133   "drawCallback": {
+4134     "default": "null",
+4135     "labels": ["Callbacks"],
+4136     "type": "function(dygraph, is_initial)",
+4137     "description": "When set, this callback gets called every time the dygraph is drawn. This includes the initial draw, after zooming and repeatedly while panning. The first parameter is the dygraph being drawn. The second is a boolean value indicating whether this is the initial draw."
+4138   },
+4139   "labelsKMG2": {
+4140     "default": "false",
+4141     "labels": ["Value display/formatting"],
+4142     "type": "boolean",
+4143     "description": "Show k/M/G for kilo/Mega/Giga on y-axis. This is different than <code>labelsKMB</code> in that it uses base 2, not 10."
+4144   },
+4145   "delimiter": {
+4146     "default": ",",
+4147     "labels": ["CSV parsing"],
+4148     "type": "string",
+4149     "description": "The delimiter to look for when separating fields of a CSV file. Setting this to a tab is not usually necessary, since tab-delimited data is auto-detected."
+4150   },
+4151   "axisLabelFontSize": {
+4152     "default": "14",
+4153     "labels": ["Axis display"],
+4154     "type": "integer",
+4155     "description": "Size of the font (in pixels) to use in the axis labels, both x- and y-axis."
+4156   },
+4157   "underlayCallback": {
+4158     "default": "null",
+4159     "labels": ["Callbacks"],
+4160     "type": "function(canvas, area, dygraph)",
+4161     "description": "When set, this callback gets called before the chart is drawn. It details on how to use this."
+4162   },
+4163   "width": {
+4164     "default": "480",
+4165     "labels": ["Overall display"],
+4166     "type": "integer",
+4167     "description": "Width, in pixels, of the chart. If the container div has been explicitly sized, this will be ignored."
+4168   },
+4169   "interactionModel": {
+4170     "default": "...",
+4171     "labels": ["Interactive Elements"],
+4172     "type": "Object",
+4173     "description": "TODO(konigsberg): document this"
+4174   },
+4175   "xTicker": {
+4176     "default": "Dygraph.dateTicker or Dygraph.numericTicks",
+4177     "labels": ["Axis display"],
+4178     "type": "function(min, max, dygraph) -> [{v: ..., label: ...}, ...]",
+4179     "description": "This lets you specify an arbitrary function to generate tick marks on an axis. The tick marks are an array of (value, label) pairs. The built-in functions go to great lengths to choose good tick marks so, if you set this option, you'll most likely want to call one of them and modify the result."
+4180   },
+4181   "xAxisLabelWidth": {
+4182     "default": "50",
+4183     "labels": ["Axis display"],
+4184     "type": "integer",
+4185     "description": "Width, in pixels, of the x-axis labels."
+4186   },
+4187   "showLabelsOnHighlight": {
+4188     "default": "true",
+4189     "labels": ["Interactive Elements", "Legend"],
+4190     "type": "boolean",
+4191     "description": "Whether to show the legend upon mouseover."
+4192   },
+4193   "axis": {
+4194     "default": "(none)",
+4195     "labels": ["Axis display"],
+4196     "type": "string or object",
+4197     "description": "Set to either an object ({}) filled with options for this axis or to the name of an existing data series with its own axis to re-use that axis. See tests for usage."
+4198   },
+4199   "pixelsPerXLabel": {
+4200     "default": "60",
+4201     "labels": ["Axis display", "Grid"],
+4202     "type": "integer",
+4203     "description": "Number of pixels to require between each x- and y-label. Larger values will yield a sparser axis with fewer ticks."
+4204   },
+4205   "labelsDiv": {
+4206     "default": "null",
+4207     "labels": ["Legend"],
+4208     "type": "DOM element or string",
+4209     "example": "<code style='font-size: small'>document.getElementById('foo')</code>or<code>'foo'",
+4210     "description": "Show data labels in an external div, rather than on the graph.  This value can either be a div element or a div id."
+4211   },
+4212   "fractions": {
+4213     "default": "false",
+4214     "labels": ["CSV parsing", "Error Bars"],
+4215     "type": "boolean",
+4216     "description": "When set, attempt to parse each cell in the CSV file as \"a/b\", where a and b are integers. The ratio will be plotted. This allows computation of Wilson confidence intervals (see below)."
+4217   },
+4218   "logscale": {
+4219     "default": "false",
+4220     "labels": ["Axis display"],
+4221     "type": "boolean",
+4222     "description": "When set for a y-axis, the graph shows that axis in log scale. Any values less than or equal to zero are not displayed.\n\nNot compatible with showZero, and ignores connectSeparatedPoints. Also, showing log scale with valueRanges that are less than zero will result in an unviewable graph."
+4223   },
+4224   "strokeWidth": {
+4225     "default": "1.0",
+4226     "labels": ["Data Line display"],
+4227     "type": "integer",
+4228     "example": "0.5, 2.0",
+4229     "description": "The width of the lines connecting data points. This can be used to increase the contrast or some graphs."
+4230   },
+4231   "wilsonInterval": {
+4232     "default": "true",
+4233     "labels": ["Error Bars"],
+4234     "type": "boolean",
+4235     "description": "Use in conjunction with the \"fractions\" option. Instead of plotting +/- N standard deviations, dygraphs will compute a Wilson confidence interval and plot that. This has more reasonable behavior for ratios close to 0 or 1."
+4236   },
+4237   "fillGraph": {
+4238     "default": "false",
+4239     "labels": ["Data Line display"],
+4240     "type": "boolean",
+4241     "description": "Should the area underneath the graph be filled? This option is not compatible with error bars."
+4242   },
+4243   "highlightCircleSize": {
+4244     "default": "3",
+4245     "labels": ["Interactive Elements"],
+4246     "type": "integer",
+4247     "description": "The size in pixels of the dot drawn over highlighted points."
+4248   },
+4249   "gridLineColor": {
+4250     "default": "rgb(128,128,128)",
+4251     "labels": ["Grid"],
+4252     "type": "red, blue",
+4253     "description": "The color of the gridlines."
+4254   },
+4255   "visibility": {
+4256     "default": "[true, true, ...]",
+4257     "labels": ["Data Line display"],
+4258     "type": "Array of booleans",
+4259     "description": "Which series should initially be visible? Once the Dygraph has been constructed, you can access and modify the visibility of each series using the <code>visibility</code> and <code>setVisibility</code> methods."
+4260   },
+4261   "valueRange": {
+4262     "default": "Full range of the input is shown",
+4263     "labels": ["Axis display"],
+4264     "type": "Array of two numbers",
+4265     "example": "[10, 110]",
+4266     "description": "Explicitly set the vertical range of the graph to [low, high]."
+4267   },
+4268   "labelsDivWidth": {
+4269     "default": "250",
+4270     "labels": ["Legend"],
+4271     "type": "integer",
+4272     "description": "Width (in pixels) of the div which shows information on the currently-highlighted points."
+4273   },
+4274   "colorSaturation": {
+4275     "default": "1.0",
+4276     "labels": ["Data Series Colors"],
+4277     "type": "0.0 - 1.0",
+4278     "description": "If <strong>colors</strong> is not specified, saturation of the automatically-generated data series colors."
+4279   },
+4280   "yAxisLabelWidth": {
+4281     "default": "50",
+4282     "labels": ["Axis display"],
+4283     "type": "integer",
+4284     "description": "Width, in pixels, of the y-axis labels."
+4285   },
+4286   "hideOverlayOnMouseOut": {
+4287     "default": "true",
+4288     "labels": ["Interactive Elements", "Legend"],
+4289     "type": "boolean",
+4290     "description": "Whether to hide the legend when the mouse leaves the chart area."
+4291   },
+4292   "yValueFormatter": {
+4293     "default": "(Round to 2 decimal places)",
+4294     "labels": ["Axis display"],
+4295     "type": "function(x)",
+4296     "description": "Function to provide a custom display format for the Y value for mouseover."
+4297   },
+4298   "legend": {
+4299     "default": "onmouseover",
+4300     "labels": ["Legend"],
+4301     "type": "string",
+4302     "description": "When to display the legend. By default, it only appears when a user mouses over the chart. Set it to \"always\" to always display a legend of some sort."
+4303   },
+4304   "labelsShowZeroValues": {
+4305     "default": "true",
+4306     "labels": ["Legend"],
+4307     "type": "boolean",
+4308     "description": "Show zero value labels in the labelsDiv."
+4309   },
+4310   "stepPlot": {
+4311     "default": "false",
+4312     "labels": ["Data Line display"],
+4313     "type": "boolean",
+4314     "description": "When set, display the graph as a step plot instead of a line plot."
+4315   },
+4316   "labelsKMB": {
+4317     "default": "false",
+4318     "labels": ["Value display/formatting"],
+4319     "type": "boolean",
+4320     "description": "Show K/M/B for thousands/millions/billions on y-axis."
+4321   },
+4322   "rightGap": {
+4323     "default": "5",
+4324     "labels": ["Overall display"],
+4325     "type": "integer",
+4326     "description": "Number of pixels to leave blank at the right edge of the Dygraph. This makes it easier to highlight the right-most data point."
+4327   },
+4328   "avoidMinZero": {
+4329     "default": "false",
+4330     "labels": ["Axis display"],
+4331     "type": "boolean",
+4332     "description": "When set, the heuristic that fixes the Y axis at zero for a data set with the minimum Y value of zero is disabled. \nThis is particularly useful for data sets that contain many zero values, especially for step plots which may otherwise have lines not visible running along the bottom axis."
+4333   },
+4334   "xAxisLabelFormatter": {
+4335     "default": "Dygraph.dateAxisFormatter",
+4336     "labels": ["Axis display", "Value display/formatting"],
+4337     "type": "function(date, granularity)",
+4338     "description": "Function to call to format values along the x axis."
+4339   },
+4340   "clickCallback": {
+4341     "snippet": "function(e, date){<br>  alert(date);<br>}",
+4342     "default": "null",
+4343     "labels": ["Callbacks"],
+4344     "type": "function(e, date)",
+4345     "description": "A function to call when a data point is clicked. The function should take two arguments, the event object for the click and the date that was clicked."
+4346   },
+4347   "yAxisLabelFormatter": {
+4348     "default": "yValueFormatter",
+4349     "labels": ["Axis display", "Value display/formatting"],
+4350     "type": "function(x)",
+4351     "description": "Function used to format values along the Y axis. By default it uses the same as the <code>yValueFormatter</code> unless specified."
+4352   },
+4353   "labels": {
+4354     "default": "[\"X\", \"Y1\", \"Y2\", ...]*",
+4355     "labels": ["Legend"],
+4356     "type": "array<string>",
+4357     "description": "A name for each data series, including the independent (X) series. For CSV files and DataTable objections, this is determined by context. For raw data, this must be specified. If it is not, default values are supplied and a warning is logged."
+4358   },
+4359   "dateWindow": {
+4360     "default": "Full range of the input is shown",
+4361     "labels": ["Axis display"],
+4362     "type": "Array of two Dates or numbers",
+4363     "example": "[<br>  Date.parse('2006-01-01'),<br>  (new Date()).valueOf()<br>]",
+4364     "description": "Initially zoom in on a section of the graph. Is of the form [earliest, latest], where earliest/latest are milliseconds since epoch. If the data for the x-axis is numeric, the values in dateWindow must also be numbers."
+4365   },
+4366   "showRoller": {
+4367     "default": "false",
+4368     "labels": ["Interactive Elements", "Rolling Averages"],
+4369     "type": "boolean",
+4370     "description": "If the rolling average period text box should be shown."
+4371   },
+4372   "sigma": {
+4373     "default": "2.0",
+4374     "labels": ["Error Bars"],
+4375     "type": "float",
+4376     "description": "When errorBars is set, shade this many standard deviations above/below each point."
+4377   },
+4378   "customBars": {
+4379     "default": "false",
+4380     "labels": ["CSV parsing", "Error Bars"],
+4381     "type": "boolean",
+4382     "description": "When set, parse each CSV cell as \"low;middle;high\". Error bars will be drawn for each point between low and high, with the series itself going through middle."
+4383   },
+4384   "colorValue": {
+4385     "default": "1.0",
+4386     "labels": ["Data Series Colors"],
+4387     "type": "float (0.0 - 1.0)",
+4388     "description": "If colors is not specified, value of the data series colors, as in hue/saturation/value. (0.0-1.0, default 0.5)"
+4389   },
+4390   "errorBars": {
+4391     "default": "false",
+4392     "labels": ["CSV parsing", "Error Bars"],
+4393     "type": "boolean",
+4394     "description": "Does the data contain standard deviations? Setting this to true alters the input format (see above)."
+4395   },
+4396   "displayAnnotations": {
+4397     "default": "false",
+4398     "labels": ["Annotations"],
+4399     "type": "boolean",
+4400     "description": "Only applies when Dygraphs is used as a GViz chart. Causes string columns following a data series to be interpreted as annotations on points in that series. This is the same format used by Google's AnnotatedTimeLine chart."
+4401   },
+4402   "panEdgeFraction": {
+4403     "default": "null",
+4404     "labels": ["Axis Display", "Interactive Elements"],
+4405     "type": "float",
+4406     "default": "null",
+4407     "description": "A value representing the farthest a graph may be panned, in percent of the display. For example, a value of 0.1 means that the graph can only be panned 10% pased the edges of the displayed values. null means no bounds."
+4408   },
+4409   "title": {
+4410     "labels": ["Chart labels"],
+4411     "type": "string",
+4412     "default": "null",
+4413     "description": "Text to display above the chart. You can supply any HTML for this value, not just text. If you wish to style it using CSS, use the 'dygraph-label' or 'dygraph-title' classes."
+4414   },
+4415   "titleHeight": {
+4416     "default": "18",
+4417     "labels": ["Chart labels"],
+4418     "type": "integer",
+4419     "description": "Height of the chart title, in pixels. This also controls the default font size of the title. If you style the title on your own, this controls how much space is set aside above the chart for the title's div."
+4420   },
+4421   "xlabel": {
+4422     "labels": ["Chart labels"],
+4423     "type": "string",
+4424     "default": "null",
+4425     "description": "Text to display below the chart's x-axis. You can supply any HTML for this value, not just text. If you wish to style it using CSS, use the 'dygraph-label' or 'dygraph-xlabel' classes."
+4426   },
+4427   "xLabelHeight": {
+4428     "labels": ["Chart labels"],
+4429     "type": "integer",
+4430     "default": "18",
+4431     "description": "Height of the x-axis label, in pixels. This also controls the default font size of the x-axis label. If you style the label on your own, this controls how much space is set aside below the chart for the x-axis label's div."
+4432   },
+4433   "ylabel": {
+4434     "labels": ["Chart labels"],
+4435     "type": "string",
+4436     "default": "null",
+4437     "description": "Text to display to the left of the chart's y-axis. You can supply any HTML for this value, not just text. If you wish to style it using CSS, use the 'dygraph-label' or 'dygraph-ylabel' classes. The text will be rotated 90 degrees by default, so CSS rules may behave in unintuitive ways. No additional space is set aside for a y-axis label. If you need more space, increase the width of the y-axis tick labels using the yAxisLabelWidth option. If you need a wider div for the y-axis label, either style it that way with CSS (but remember that it's rotated, so width is controlled by the 'height' property) or set the yLabelWidth option."
+4438   },
+4439   "yLabelWidth": {
+4440     "labels": ["Chart labels"],
+4441     "type": "integer",
+4442     "default": "18",
+4443     "description": "Width of the div which contains the y-axis label. Since the y-axis label appears rotated 90 degrees, this actually affects the height of its div."
+4444   },
+4445   "isZoomedIgnoreProgrammaticZoom" : {
+4446     "default": "false",
+4447     "labels": ["Zooming"],
+4448     "type": "boolean",
+4449     "description" : "When this option is passed to updateOptions() along with either the <code>dateWindow</code> or <code>valueRange</code> options, the zoom flags are not changed to reflect a zoomed state. This is primarily useful for when the display area of a chart is changed programmatically and also where manual zooming is allowed and use is made of the <code>isZoomed</code> method to determine this."
+4450   },
+4451   "sigFigs" : {
+4452     "default": "null",
+4453     "labels": ["Value display/formatting"],
+4454     "type": "integer",
+4455     "description": "By default, dygraphs displays numbers with a fixed number of digits after the decimal point. If you'd prefer to have a fixed number of significant figures, set this option to that number of sig figs. A value of 2, for instance, would cause 1 to be display as 1.0 and 1234 to be displayed as 1.23e+3."
+4456   },
+4457   "digitsAfterDecimal" : {
+4458     "default": "2",
+4459     "labels": ["Value display/formatting"],
+4460     "type": "integer",
+4461     "description": "Unless it's run in scientific mode (see the <code>sigFigs</code> option), dygraphs displays numbers with <code>digitsAfterDecimal</code> digits after the decimal point. Trailing zeros are not displayed, so with a value of 2 you'll get '0', '0.1', '0.12', '123.45' but not '123.456' (it will be rounded to '123.46'). Numbers with absolute value less than 0.1^digitsAfterDecimal (i.e. those which would show up as '0.00') will be displayed in scientific notation."
+4462   },
+4463   "maxNumberWidth" : {
+4464     "default": "6",
+4465     "labels": ["Value display/formatting"],
+4466     "type": "integer",
+4467     "description": "When displaying numbers in normal (not scientific) mode, large numbers will be displayed with many trailing zeros (e.g. 100000000 instead of 1e9). This can lead to unwieldy y-axis labels. If there are more than <code>maxNumberWidth</code> digits to the left of the decimal in a number, dygraphs will switch to scientific notation, even when not operating in scientific mode. If you'd like to see all those digits, set this to something large, like 20 or 30."
+4468   }
+4469 }
+4470 ;  // </JSON>
+4471 // NOTE: in addition to parsing as JS, this snippet is expected to be valid
+4472 // JSON. This assumption cannot be checked in JS, but it will be checked when
+4473 // documentation is generated by the generate-documentation.py script. For the
+4474 // most part, this just means that you should always use double quotes.
+4475 
+4476 // Do a quick sanity check on the options reference.
+4477 (function() {
+4478   var warn = function(msg) { if (console) console.warn(msg); };
+4479   var flds = ['type', 'default', 'description'];
+4480   var valid_cats = [ 
+4481    'Annotations',
+4482    'Axis display',
+4483    'Chart labels',
+4484    'CSV parsing',
+4485    'Callbacks',
+4486    'Data Line display',
+4487    'Data Series Colors',
+4488    'Error Bars',
+4489    'Grid',
+4490    'Interactive Elements',
+4491    'Legend',
+4492    'Overall display',
+4493    'Rolling Averages',
+4494    'Value display/formatting',
+4495    'Zooming'
+4496   ];
+4497   var cats = {};
+4498   for (var i = 0; i < valid_cats.length; i++) cats[valid_cats[i]] = true;
+4499 
+4500   for (var k in Dygraph.OPTIONS_REFERENCE) {
+4501     if (!Dygraph.OPTIONS_REFERENCE.hasOwnProperty(k)) continue;
+4502     var op = Dygraph.OPTIONS_REFERENCE[k];
+4503     for (var i = 0; i < flds.length; i++) {
+4504       if (!op.hasOwnProperty(flds[i])) {
+4505         warn('Option ' + k + ' missing "' + flds[i] + '" property');
+4506       } else if (typeof(op[flds[i]]) != 'string') {
+4507         warn(k + '.' + flds[i] + ' must be of type string');
+4508       }
+4509     }
+4510     var labels = op['labels'];
+4511     if (typeof(labels) !== 'object') {
+4512       warn('Option "' + k + '" is missing a "labels": [...] option');
+4513       for (var i = 0; i < labels.length; i++) {
+4514         if (!cats.hasOwnProperty(labels[i])) {
+4515           warn('Option "' + k + '" has label "' + labels[i] +
+4516                '", which is invalid.');
+4517         }
+4518       }
+4519     }
+4520   }
+4521 })();
+4522 // </REMOVE_FOR_COMBINED>
+4523 
\ No newline at end of file diff --git a/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl b/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl new file mode 100644 index 0000000..32f4358 --- /dev/null +++ b/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl @@ -0,0 +1,17 @@ +
{+new Link().toFile("index.html").withText("Class Index")+} +| {+new Link().toFile("files.html").withText("File Index")+}
+
+