From b0ef8262f6c9e1f601495588599f492f30e03e38 Mon Sep 17 00:00:00 2001 From: zmikaya Date: Mon, 23 May 2016 10:52:38 +0000 Subject: [PATCH 1/6] Added ability to create a non 'localhost' server with any ip:port combo instead --- .eslintrc | 13 + .gitignore | 6 + .npmignore | 2 + .travis.yml | 6 + CONTRIBUTING.md | 48 + LICENSE | 25 + Makefile | 27 + README.md | 44 + conf/docs/assets/css/main.css | 399 + conf/docs/assets/favicon.ico | Bin 0 -> 5430 bytes conf/docs/assets/vendor/prettify/CHANGES.html | 155 + conf/docs/assets/vendor/prettify/COPYING | 202 + conf/docs/assets/vendor/prettify/README.html | 233 + .../assets/vendor/prettify/prettify-min.css | 1 + .../assets/vendor/prettify/prettify-min.js | 1 + conf/docs/assets/vendor/prettify/prettify.css | 52 + conf/docs/assets/vendor/prettify/prettify.js | 1710 ++++ conf/docs/index.mustache | 87 + conf/docs/layouts/main.mustache | 112 + conf/docs/project.json | 5 + docs/args/component.json | 7 + docs/args/index.mustache | 339 + docs/args/partials/help.mustache | 38 + docs/syntax/component.json | 7 + docs/syntax/index.mustache | 1441 +++ docs/themes/component.json | 7 + docs/themes/index.mustache | 119 + lib/builder.js | 1797 ++++ lib/cli.js | 49 + lib/docparser.js | 1581 ++++ lib/docview.js | 66 + lib/files.js | 486 + lib/help.js | 81 + lib/index.js | 122 + lib/options.js | 186 + lib/project.js | 68 + lib/server.js | 237 + lib/utils.js | 498 + lib/yuidoc.js | 418 + output/api/api.js | 28 + output/api/assets/css/external-small.png | Bin 0 -> 491 bytes output/api/assets/css/logo.png | Bin 0 -> 7143 bytes output/api/assets/css/main.css | 783 ++ output/api/assets/favicon.ico | Bin 0 -> 5430 bytes output/api/assets/img/spinner.gif | Bin 0 -> 2685 bytes output/api/assets/index.html | 10 + output/api/assets/js/api-filter.js | 56 + output/api/assets/js/api-list.js | 255 + output/api/assets/js/api-search.js | 98 + output/api/assets/js/apidocs.js | 376 + output/api/assets/js/yui-prettify.js | 17 + .../api/assets/vendor/prettify/CHANGES.html | 130 + output/api/assets/vendor/prettify/COPYING | 202 + output/api/assets/vendor/prettify/README.html | 203 + .../assets/vendor/prettify/prettify-min.css | 1 + .../assets/vendor/prettify/prettify-min.js | 1 + output/api/classes/CLI.html | 144 + output/api/classes/DocBuilder.html | 2623 ++++++ output/api/classes/DocParser.html | 8032 +++++++++++++++++ output/api/classes/DocView.html | 296 + output/api/classes/Files.html | 1191 +++ output/api/classes/Help.html | 278 + output/api/classes/Main.html | 153 + output/api/classes/Options.html | 225 + output/api/classes/Server.html | 698 ++ output/api/classes/Utils.html | 1049 +++ output/api/classes/YUIDoc.html | 875 ++ output/api/classes/index.html | 10 + output/api/data.json | 2667 ++++++ output/api/elements/index.html | 10 + output/api/files/index.html | 10 + output/api/files/lib_builder.js.html | 1910 ++++ output/api/files/lib_cli.js.html | 161 + output/api/files/lib_docparser.js.html | 1693 ++++ output/api/files/lib_docview.js.html | 178 + output/api/files/lib_files.js.html | 598 ++ output/api/files/lib_help.js.html | 193 + output/api/files/lib_index.js.html | 234 + output/api/files/lib_options.js.html | 290 + output/api/files/lib_project.js.html | 180 + output/api/files/lib_server.js.html | 349 + output/api/files/lib_utils.js.html | 610 ++ output/api/files/lib_yuidoc.js.html | 530 ++ output/api/index.html | 126 + output/api/modules/index.html | 10 + output/api/modules/yuidoc.html | 196 + output/args/index.html | 482 + output/assets/css/main.css | 399 + output/assets/favicon.ico | Bin 0 -> 5430 bytes output/assets/vendor/prettify/CHANGES.html | 155 + output/assets/vendor/prettify/COPYING | 202 + output/assets/vendor/prettify/README.html | 233 + .../assets/vendor/prettify/prettify-min.css | 1 + output/assets/vendor/prettify/prettify-min.js | 1 + output/assets/vendor/prettify/prettify.css | 52 + output/assets/vendor/prettify/prettify.js | 1710 ++++ output/index.html | 188 + output/syntax/index.html | 1492 +++ output/themes/index.html | 207 + package.json | 112 + scripts/docs.sh | 29 + scripts/help.sh | 5 + scripts/prep.sh | 18 + scripts/report.js | 15 + scripts/versions.js | 17 + tests/builder.js | 197 + tests/files.js | 182 + tests/input/charts/AreaSeries.js | 91 + tests/input/charts/AreaSplineSeries.js | 52 + tests/input/charts/Axis.js | 1516 ++++ tests/input/charts/AxisType.js | 710 ++ tests/input/charts/BarSeries.js | 158 + tests/input/charts/BottomAxisLayout.js | 349 + tests/input/charts/CartesianChart.js | 2131 +++++ tests/input/charts/CartesianChartLegend.js | 738 ++ tests/input/charts/CartesianSeries.js | 839 ++ tests/input/charts/CategoryAxis.js | 277 + tests/input/charts/Chart.js | 19 + tests/input/charts/ChartBase.js | 1183 +++ tests/input/charts/ChartLegend.js | 768 ++ tests/input/charts/CircleGroup.js | 59 + tests/input/charts/ColumnSeries.js | 149 + tests/input/charts/ComboSeries.js | 267 + tests/input/charts/ComboSplineSeries.js | 48 + tests/input/charts/CurveUtil.js | 119 + tests/input/charts/DiamondGroup.js | 29 + tests/input/charts/EllipseGroup.js | 29 + tests/input/charts/Fills.js | 363 + tests/input/charts/Graph.js | 792 ++ tests/input/charts/Gridlines.js | 189 + tests/input/charts/Histogram.js | 219 + tests/input/charts/LeftAxisLayout.js | 361 + tests/input/charts/LineSeries.js | 94 + tests/input/charts/Lines.js | 264 + tests/input/charts/MarkerSeries.js | 103 + tests/input/charts/NumericAxis.js | 681 ++ tests/input/charts/PieChart.js | 465 + tests/input/charts/PieChartLegend.js | 132 + tests/input/charts/PieSeries.js | 729 ++ tests/input/charts/Plots.js | 513 ++ tests/input/charts/RectGroup.js | 29 + tests/input/charts/Renderer.js | 117 + tests/input/charts/RightAxisLayout.js | 366 + tests/input/charts/ShapeGroup.js | 178 + tests/input/charts/SplineSeries.js | 63 + tests/input/charts/StackedAreaSeries.js | 49 + tests/input/charts/StackedAreaSplineSeries.js | 38 + tests/input/charts/StackedAxis.js | 102 + tests/input/charts/StackedBarSeries.js | 352 + tests/input/charts/StackedColumnSeries.js | 339 + tests/input/charts/StackedComboSeries.js | 74 + .../input/charts/StackedComboSplineSeries.js | 60 + tests/input/charts/StackedLineSeries.js | 37 + tests/input/charts/StackedMarkerSeries.js | 38 + tests/input/charts/StackedSplineSeries.js | 38 + tests/input/charts/StackingUtil.js | 62 + tests/input/charts/TimeAxis.js | 338 + tests/input/charts/TopAxisLayout.js | 379 + tests/input/coffee1/test.coffee | 12 + tests/input/coffee2/test.coffee | 12 + tests/input/folders1/one/two/yuidoc.json | 3 + tests/input/folders1/yuidoc.json | 3 + tests/input/folders2/one/two/yuidoc.json | 3 + tests/input/folders2/package.json | 3 + tests/input/folders3/one/package.json | 3 + tests/input/folders3/one/two/yuidoc.json | 3 + tests/input/folders3/package.json | 3 + tests/input/folders3/yuidoc.json | 3 + tests/input/folders4/one/two/package.json | 3 + tests/input/folders4/one/two/yuidoc.json | 3 + tests/input/folders4/one/yuidoc.json | 3 + tests/input/folders5/one/three/yuidoc.json | 3 + tests/input/folders5/two/package.json | 3 + tests/input/folders5/two/yuidoc.json | 3 + .../deep/deep/sub/yui/src/example/example.js | 1 + .../deep/shallow/yui/src/example/example.js | 1 + .../shallow/yui/src/example/example.js | 1 + tests/input/inherit/examplemodule.js | 121 + tests/input/json/parse.js | 225 + tests/input/json/stringify.js | 343 + tests/input/namespace/ns.js | 13 + tests/input/preprocessor/preprocessortest.js | 5 + tests/input/test/anim.js | 35 + tests/input/test/test.js | 277 + tests/input/test2/dump/dump.js | 108 + tests/input/test2/namespace.js | 29 + tests/input/test2/oop/oop.js | 368 + tests/input/test2/slashes.js | 16 + tests/input/with-symlink/a/.gitignore | 0 tests/input/with-symlink/a/b | 1 + tests/input/with-symlink/a/d/.gitignore | 0 tests/input/with-symlink/a/some-file | 0 tests/input/with-symlink/c/.gitignore | 0 tests/input/with-symlink/some-file | 0 tests/lib/davglass.js | 5 + tests/lib/testpreprocessor.js | 14 + tests/lib/testpreprocessormodule/package.json | 3 + .../testpreprocessormodule.js | 3 + tests/options.js | 360 + tests/parser.js | 496 + tests/parser_coffee.js | 73 + tests/preprocessor.js | 102 + tests/utils.js | 158 + themes/default/assets/css/external-small.png | Bin 0 -> 491 bytes themes/default/assets/css/logo.png | Bin 0 -> 7143 bytes themes/default/assets/css/main.css | 783 ++ themes/default/assets/favicon.ico | Bin 0 -> 5430 bytes themes/default/assets/img/spinner.gif | Bin 0 -> 2685 bytes themes/default/assets/index.html | 10 + themes/default/assets/js/api-filter.js | 56 + themes/default/assets/js/api-list.js | 255 + themes/default/assets/js/api-search.js | 98 + themes/default/assets/js/apidocs.js | 376 + themes/default/assets/js/yui-prettify.js | 17 + .../assets/vendor/prettify/CHANGES.html | 130 + themes/default/assets/vendor/prettify/COPYING | 202 + .../assets/vendor/prettify/README.html | 203 + .../assets/vendor/prettify/prettify-min.css | 1 + .../assets/vendor/prettify/prettify-min.js | 1 + themes/default/layouts/main.handlebars | 55 + themes/default/layouts/xhr.handlebars | 7 + themes/default/partials/attributes.handlebars | 10 + themes/default/partials/attrs.handlebars | 141 + themes/default/partials/classes.handlebars | 203 + themes/default/partials/elements.handlebars | 80 + themes/default/partials/events.handlebars | 137 + themes/default/partials/files.handlebars | 7 + themes/default/partials/index.handlebars | 21 + themes/default/partials/method.handlebars | 212 + themes/default/partials/module.handlebars | 108 + themes/default/partials/options.handlebars | 23 + themes/default/partials/props.handlebars | 119 + themes/default/partials/sidebar.handlebars | 38 + themes/default/theme.json | 4 + themes/simple/assets/css/external-small.png | Bin 0 -> 491 bytes themes/simple/assets/css/logo.png | Bin 0 -> 7143 bytes themes/simple/assets/css/main.css | 429 + themes/simple/assets/js/tabs.js | 38 + themes/simple/assets/js/yui-prettify.js | 17 + .../assets/vendor/prettify/CHANGES.html | 130 + themes/simple/assets/vendor/prettify/COPYING | 202 + .../simple/assets/vendor/prettify/README.html | 203 + .../assets/vendor/prettify/prettify-min.css | 1 + .../assets/vendor/prettify/prettify-min.js | 1 + themes/simple/layouts/main.handlebars | 38 + themes/simple/partials/attributes.handlebars | 7 + themes/simple/partials/attrs.handlebars | 23 + themes/simple/partials/classes.handlebars | 73 + themes/simple/partials/elements.handlebars | 80 + themes/simple/partials/events.handlebars | 35 + themes/simple/partials/files.handlebars | 6 + themes/simple/partials/index.handlebars | 2 + themes/simple/partials/method.handlebars | 61 + themes/simple/partials/module.handlebars | 38 + themes/simple/partials/props.handlebars | 10 + themes/simple/partials/sidebar.handlebars | 118 + themes/simple/theme.json | 4 + 257 files changed, 68783 insertions(+) create mode 100644 .eslintrc create mode 100644 .gitignore create mode 100644 .npmignore create mode 100644 .travis.yml create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 conf/docs/assets/css/main.css create mode 100644 conf/docs/assets/favicon.ico create mode 100644 conf/docs/assets/vendor/prettify/CHANGES.html create mode 100644 conf/docs/assets/vendor/prettify/COPYING create mode 100644 conf/docs/assets/vendor/prettify/README.html create mode 100644 conf/docs/assets/vendor/prettify/prettify-min.css create mode 100644 conf/docs/assets/vendor/prettify/prettify-min.js create mode 100644 conf/docs/assets/vendor/prettify/prettify.css create mode 100644 conf/docs/assets/vendor/prettify/prettify.js create mode 100644 conf/docs/index.mustache create mode 100644 conf/docs/layouts/main.mustache create mode 100644 conf/docs/project.json create mode 100644 docs/args/component.json create mode 100644 docs/args/index.mustache create mode 100644 docs/args/partials/help.mustache create mode 100644 docs/syntax/component.json create mode 100644 docs/syntax/index.mustache create mode 100644 docs/themes/component.json create mode 100644 docs/themes/index.mustache create mode 100644 lib/builder.js create mode 100755 lib/cli.js create mode 100644 lib/docparser.js create mode 100644 lib/docview.js create mode 100644 lib/files.js create mode 100644 lib/help.js create mode 100644 lib/index.js create mode 100644 lib/options.js create mode 100644 lib/project.js create mode 100644 lib/server.js create mode 100644 lib/utils.js create mode 100755 lib/yuidoc.js create mode 100644 output/api/api.js create mode 100644 output/api/assets/css/external-small.png create mode 100644 output/api/assets/css/logo.png create mode 100644 output/api/assets/css/main.css create mode 100644 output/api/assets/favicon.ico create mode 100644 output/api/assets/img/spinner.gif create mode 100644 output/api/assets/index.html create mode 100644 output/api/assets/js/api-filter.js create mode 100644 output/api/assets/js/api-list.js create mode 100644 output/api/assets/js/api-search.js create mode 100644 output/api/assets/js/apidocs.js create mode 100644 output/api/assets/js/yui-prettify.js create mode 100644 output/api/assets/vendor/prettify/CHANGES.html create mode 100644 output/api/assets/vendor/prettify/COPYING create mode 100644 output/api/assets/vendor/prettify/README.html create mode 100644 output/api/assets/vendor/prettify/prettify-min.css create mode 100644 output/api/assets/vendor/prettify/prettify-min.js create mode 100644 output/api/classes/CLI.html create mode 100644 output/api/classes/DocBuilder.html create mode 100644 output/api/classes/DocParser.html create mode 100644 output/api/classes/DocView.html create mode 100644 output/api/classes/Files.html create mode 100644 output/api/classes/Help.html create mode 100644 output/api/classes/Main.html create mode 100644 output/api/classes/Options.html create mode 100644 output/api/classes/Server.html create mode 100644 output/api/classes/Utils.html create mode 100644 output/api/classes/YUIDoc.html create mode 100644 output/api/classes/index.html create mode 100644 output/api/data.json create mode 100644 output/api/elements/index.html create mode 100644 output/api/files/index.html create mode 100644 output/api/files/lib_builder.js.html create mode 100644 output/api/files/lib_cli.js.html create mode 100644 output/api/files/lib_docparser.js.html create mode 100644 output/api/files/lib_docview.js.html create mode 100644 output/api/files/lib_files.js.html create mode 100644 output/api/files/lib_help.js.html create mode 100644 output/api/files/lib_index.js.html create mode 100644 output/api/files/lib_options.js.html create mode 100644 output/api/files/lib_project.js.html create mode 100644 output/api/files/lib_server.js.html create mode 100644 output/api/files/lib_utils.js.html create mode 100644 output/api/files/lib_yuidoc.js.html create mode 100644 output/api/index.html create mode 100644 output/api/modules/index.html create mode 100644 output/api/modules/yuidoc.html create mode 100644 output/args/index.html create mode 100644 output/assets/css/main.css create mode 100644 output/assets/favicon.ico create mode 100644 output/assets/vendor/prettify/CHANGES.html create mode 100644 output/assets/vendor/prettify/COPYING create mode 100644 output/assets/vendor/prettify/README.html create mode 100644 output/assets/vendor/prettify/prettify-min.css create mode 100644 output/assets/vendor/prettify/prettify-min.js create mode 100644 output/assets/vendor/prettify/prettify.css create mode 100644 output/assets/vendor/prettify/prettify.js create mode 100644 output/index.html create mode 100644 output/syntax/index.html create mode 100644 output/themes/index.html create mode 100644 package.json create mode 100755 scripts/docs.sh create mode 100755 scripts/help.sh create mode 100755 scripts/prep.sh create mode 100755 scripts/report.js create mode 100755 scripts/versions.js create mode 100644 tests/builder.js create mode 100644 tests/files.js create mode 100644 tests/input/charts/AreaSeries.js create mode 100644 tests/input/charts/AreaSplineSeries.js create mode 100644 tests/input/charts/Axis.js create mode 100644 tests/input/charts/AxisType.js create mode 100644 tests/input/charts/BarSeries.js create mode 100644 tests/input/charts/BottomAxisLayout.js create mode 100644 tests/input/charts/CartesianChart.js create mode 100644 tests/input/charts/CartesianChartLegend.js create mode 100644 tests/input/charts/CartesianSeries.js create mode 100644 tests/input/charts/CategoryAxis.js create mode 100644 tests/input/charts/Chart.js create mode 100644 tests/input/charts/ChartBase.js create mode 100644 tests/input/charts/ChartLegend.js create mode 100755 tests/input/charts/CircleGroup.js create mode 100644 tests/input/charts/ColumnSeries.js create mode 100644 tests/input/charts/ComboSeries.js create mode 100644 tests/input/charts/ComboSplineSeries.js create mode 100644 tests/input/charts/CurveUtil.js create mode 100755 tests/input/charts/DiamondGroup.js create mode 100755 tests/input/charts/EllipseGroup.js create mode 100644 tests/input/charts/Fills.js create mode 100644 tests/input/charts/Graph.js create mode 100644 tests/input/charts/Gridlines.js create mode 100644 tests/input/charts/Histogram.js create mode 100644 tests/input/charts/LeftAxisLayout.js create mode 100644 tests/input/charts/LineSeries.js create mode 100644 tests/input/charts/Lines.js create mode 100644 tests/input/charts/MarkerSeries.js create mode 100644 tests/input/charts/NumericAxis.js create mode 100644 tests/input/charts/PieChart.js create mode 100644 tests/input/charts/PieChartLegend.js create mode 100644 tests/input/charts/PieSeries.js create mode 100644 tests/input/charts/Plots.js create mode 100755 tests/input/charts/RectGroup.js create mode 100644 tests/input/charts/Renderer.js create mode 100644 tests/input/charts/RightAxisLayout.js create mode 100755 tests/input/charts/ShapeGroup.js create mode 100644 tests/input/charts/SplineSeries.js create mode 100644 tests/input/charts/StackedAreaSeries.js create mode 100644 tests/input/charts/StackedAreaSplineSeries.js create mode 100644 tests/input/charts/StackedAxis.js create mode 100644 tests/input/charts/StackedBarSeries.js create mode 100644 tests/input/charts/StackedColumnSeries.js create mode 100644 tests/input/charts/StackedComboSeries.js create mode 100644 tests/input/charts/StackedComboSplineSeries.js create mode 100644 tests/input/charts/StackedLineSeries.js create mode 100644 tests/input/charts/StackedMarkerSeries.js create mode 100644 tests/input/charts/StackedSplineSeries.js create mode 100644 tests/input/charts/StackingUtil.js create mode 100644 tests/input/charts/TimeAxis.js create mode 100644 tests/input/charts/TopAxisLayout.js create mode 100644 tests/input/coffee1/test.coffee create mode 100644 tests/input/coffee2/test.coffee create mode 100644 tests/input/folders1/one/two/yuidoc.json create mode 100644 tests/input/folders1/yuidoc.json create mode 100644 tests/input/folders2/one/two/yuidoc.json create mode 100644 tests/input/folders2/package.json create mode 100644 tests/input/folders3/one/package.json create mode 100644 tests/input/folders3/one/two/yuidoc.json create mode 100644 tests/input/folders3/package.json create mode 100644 tests/input/folders3/yuidoc.json create mode 100644 tests/input/folders4/one/two/package.json create mode 100644 tests/input/folders4/one/two/yuidoc.json create mode 100644 tests/input/folders4/one/yuidoc.json create mode 100644 tests/input/folders5/one/three/yuidoc.json create mode 100644 tests/input/folders5/two/package.json create mode 100644 tests/input/folders5/two/yuidoc.json create mode 100644 tests/input/globbing/deep/deep/sub/yui/src/example/example.js create mode 100644 tests/input/globbing/deep/shallow/yui/src/example/example.js create mode 100644 tests/input/globbing/shallow/yui/src/example/example.js create mode 100644 tests/input/inherit/examplemodule.js create mode 100644 tests/input/json/parse.js create mode 100644 tests/input/json/stringify.js create mode 100644 tests/input/namespace/ns.js create mode 100644 tests/input/preprocessor/preprocessortest.js create mode 100644 tests/input/test/anim.js create mode 100644 tests/input/test/test.js create mode 100644 tests/input/test2/dump/dump.js create mode 100644 tests/input/test2/namespace.js create mode 100644 tests/input/test2/oop/oop.js create mode 100644 tests/input/test2/slashes.js create mode 100644 tests/input/with-symlink/a/.gitignore create mode 120000 tests/input/with-symlink/a/b create mode 100644 tests/input/with-symlink/a/d/.gitignore create mode 100644 tests/input/with-symlink/a/some-file create mode 100644 tests/input/with-symlink/c/.gitignore create mode 100644 tests/input/with-symlink/some-file create mode 100644 tests/lib/davglass.js create mode 100644 tests/lib/testpreprocessor.js create mode 100644 tests/lib/testpreprocessormodule/package.json create mode 100644 tests/lib/testpreprocessormodule/testpreprocessormodule.js create mode 100644 tests/options.js create mode 100644 tests/parser.js create mode 100644 tests/parser_coffee.js create mode 100644 tests/preprocessor.js create mode 100644 tests/utils.js create mode 100644 themes/default/assets/css/external-small.png create mode 100644 themes/default/assets/css/logo.png create mode 100644 themes/default/assets/css/main.css create mode 100644 themes/default/assets/favicon.ico create mode 100644 themes/default/assets/img/spinner.gif create mode 100644 themes/default/assets/index.html create mode 100644 themes/default/assets/js/api-filter.js create mode 100644 themes/default/assets/js/api-list.js create mode 100644 themes/default/assets/js/api-search.js create mode 100644 themes/default/assets/js/apidocs.js create mode 100644 themes/default/assets/js/yui-prettify.js create mode 100644 themes/default/assets/vendor/prettify/CHANGES.html create mode 100644 themes/default/assets/vendor/prettify/COPYING create mode 100644 themes/default/assets/vendor/prettify/README.html create mode 100644 themes/default/assets/vendor/prettify/prettify-min.css create mode 100644 themes/default/assets/vendor/prettify/prettify-min.js create mode 100644 themes/default/layouts/main.handlebars create mode 100644 themes/default/layouts/xhr.handlebars create mode 100644 themes/default/partials/attributes.handlebars create mode 100644 themes/default/partials/attrs.handlebars create mode 100644 themes/default/partials/classes.handlebars create mode 100644 themes/default/partials/elements.handlebars create mode 100644 themes/default/partials/events.handlebars create mode 100644 themes/default/partials/files.handlebars create mode 100644 themes/default/partials/index.handlebars create mode 100644 themes/default/partials/method.handlebars create mode 100644 themes/default/partials/module.handlebars create mode 100644 themes/default/partials/options.handlebars create mode 100644 themes/default/partials/props.handlebars create mode 100644 themes/default/partials/sidebar.handlebars create mode 100644 themes/default/theme.json create mode 100644 themes/simple/assets/css/external-small.png create mode 100644 themes/simple/assets/css/logo.png create mode 100644 themes/simple/assets/css/main.css create mode 100644 themes/simple/assets/js/tabs.js create mode 100644 themes/simple/assets/js/yui-prettify.js create mode 100644 themes/simple/assets/vendor/prettify/CHANGES.html create mode 100644 themes/simple/assets/vendor/prettify/COPYING create mode 100644 themes/simple/assets/vendor/prettify/README.html create mode 100644 themes/simple/assets/vendor/prettify/prettify-min.css create mode 100644 themes/simple/assets/vendor/prettify/prettify-min.js create mode 100644 themes/simple/layouts/main.handlebars create mode 100644 themes/simple/partials/attributes.handlebars create mode 100644 themes/simple/partials/attrs.handlebars create mode 100644 themes/simple/partials/classes.handlebars create mode 100644 themes/simple/partials/elements.handlebars create mode 100644 themes/simple/partials/events.handlebars create mode 100644 themes/simple/partials/files.handlebars create mode 100644 themes/simple/partials/index.handlebars create mode 100644 themes/simple/partials/method.handlebars create mode 100644 themes/simple/partials/module.handlebars create mode 100644 themes/simple/partials/props.handlebars create mode 100644 themes/simple/partials/sidebar.handlebars create mode 100644 themes/simple/theme.json diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000..bb2d3496 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,13 @@ +{ + "env": { + "node": true + }, + "extends": "eslint:recommended", + "globals": { + "YUI": true + }, + "rules": { + "no-console": 0, + "quotes": [2, "single"] + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..138812d2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*.swp +out +node_modules +coverage +ddc +npm-debug.log diff --git a/.npmignore b/.npmignore new file mode 100644 index 00000000..0f546451 --- /dev/null +++ b/.npmignore @@ -0,0 +1,2 @@ +.git +sandbox diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..0510a3bd --- /dev/null +++ b/.travis.yml @@ -0,0 +1,6 @@ +language: node_js +node_js: + - "0.10" + - "0.12" + - "4" +sudo: false diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..f9b3e256 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,48 @@ +Contributing to YUIDoc +====================== + +Getting Involved +---------------- + +If you want to work on the default theme or need to work on the libraries, here's the steps: + + $ git clone git://github.com/yui/yuidoc.git + $ cd yuidoc + $ npm link + +This will link `yuidoc` into the global folder. This basically installs it globally as a +link to this source directory. + +Now all changes you make to the current source tree are available in the global `yuidoc` +executable. No need to reinstall the app to test your changes. + +Running Unit Tests +------------------ + +You are also able to run unit tests by executing `npm test`. + + $ npm test + +Server Mode +----------- + +For performance, the Handlebars templates are cached from the first request. So you will have +to terminate the server and relaunch it before you can see your changes. + +Assets should not be cached, so they should still serve new files on each request. This way +you can modify the JavaScript and CSS files on the fly. + +Submitting Pull Requests +------------------------ + +Pull Requests are very welcome, but should be within the scope of the project, and follow the +repository's code conventions. Before submitting a Pull Request, it's always good to file an +issue, so we can discuss the details of the Pull Request. + +The Yahoo CLA +------------- + +At Yahoo, we have a single [Yahoo Open Source Contributor License Agreement][CLA] that we ask +contributors to electronically sign before merging in their Pull Requests. + +[CLA]: https://yahoocla.herokuapp.com/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..75b48531 --- /dev/null +++ b/LICENSE @@ -0,0 +1,25 @@ +Copyright 2011 Yahoo! Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Yahoo! Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..9869a939 --- /dev/null +++ b/Makefile @@ -0,0 +1,27 @@ +all: + npm -g i . + +version: + ./scripts/versions.js + +help: + ./scripts/help.sh + +doc: + ./node_modules/.bin/selleck --out ./output/ + +clean: + rm -rRf ./output/* + +api: + ./lib/cli.js + +docs: clean help doc api + +deploydocs: version + ./scripts/docs.sh + +test: + npm test + +.PHONY: docs clean diff --git a/README.md b/README.md new file mode 100644 index 00000000..725756db --- /dev/null +++ b/README.md @@ -0,0 +1,44 @@ +YUIDoc +====== + +YUI's JavaScript Documentation engine. + +[![npm Version](https://img.shields.io/npm/v/yuidocjs.svg?style=flat-square)](https://www.npmjs.org/package/yuidocjs) +[![Build Status](http://img.shields.io/travis/yui/yuidoc.svg?style=flat-square)](https://travis-ci.org/yui/yuidoc) +[![Dependency Status](https://img.shields.io/david/yui/yuidoc.svg?style=flat-square)](https://david-dm.org/yui/yuidoc) + +Overview +-------- + +YUIDoc is a [Node.js](http://nodejs.org/) application used at build time to +generate API documentation for JavaScript code. YUIDoc is comment-driven and supports a wide +range of JavaScript coding styles. The output of YUIDoc is API documentation formatted as a +set of HTML pages including information about methods, properties, custom events and +inheritance for JavaScript objects. + +YUIDoc was originally written for the YUI Project; it uses YUI JavaScript and CSS in the +generated files and it supports common YUI conventions like Custom Events. That said, +it can be used easily and productively on non-YUI code. + +Installation +------------ + + npm install -g yuidocjs + +Documentation +------------- + +* [User Guides](http://yui.github.io/yuidoc/) +* [Change Logs](https://github.com/yui/yuidoc/releases) +* [API Docs](http://yui.github.io/yuidoc/api/) +* [Mailing List](https://groups.google.com/forum/#!forum/yuidoc) + +Contributing +------------ + +Please see the [CONTRIBUTING.md](CONTRIBUTING.md). + +License +------- + +This software is free to use under the Yahoo Inc. BSD license. See the [LICENSE file](LICENSE) for license text and copyright information. diff --git a/conf/docs/assets/css/main.css b/conf/docs/assets/css/main.css new file mode 100644 index 00000000..d1d1609c --- /dev/null +++ b/conf/docs/assets/css/main.css @@ -0,0 +1,399 @@ +/* +Font sizes for all selectors other than the body are given in percentages, +with 100% equal to 13px. To calculate a font size percentage, multiply the +desired size in pixels by 7.6923076923. + +Here's a quick lookup table: + +10px - 76.923% +11px - 84.615% +12px - 92.308% +13px - 100% +14px - 107.692% +15px - 115.385% +16px - 123.077% +17px - 130.769% +18px - 138.462% +19px - 146.154% +20px - 153.846% +*/ + +html { + background: #fff; + color: #333; + overflow-y: scroll; +} + +body { + font: 13px/1.4 Helvetica, 'DejaVu Sans', 'Bitstream Vera Sans', Arial, sans-serif; + margin: 0; + padding: 0; +} + + +ul.links { + list-style-type: none; + padding-left: 0; +} + +ul.links li { + margin-bottom: 8px; +} + +ul.links .button { + display: block; + text-align: left; +} + +.crumbs { + background: whiteSmoke; + background: -moz-linear-gradient(top,#DCDBD9 0,#F6F5F3 100%); + background: -webkit-gradient(linear,left top,left bottom,color-stop(0%,#DCDBD9),color-stop(100%,#F6F5F3)); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dcdbd9',endColorstr='#F6F5F3',GradientType=0); + border-top: 1px solid #DFDFDF; + border-bottom: 1px solid #DFDFDF; + padding: 0.25em 1.25em 0.25em; + margin-bottom: 0.75em; +} +.crumbs a, .crumbs a:visited { + color: #30418C; +} + +#hd { + background: whiteSmoke; + background: -moz-linear-gradient(top,#DCDBD9 0,#F6F5F3 100%); + background: -webkit-gradient(linear,left top,left bottom,color-stop(0%,#DCDBD9),color-stop(100%,#F6F5F3)); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dcdbd9',endColorstr='#F6F5F3',GradientType=0); + border-bottom: 1px solid #DFDFDF; + padding: 0.75em 0 0.5em; + margin-bottom: 15px; +} + +#hd img { + margin-right: 10px; + vertical-align: middle; +} + +/* -- Links ----------------------------------------------------------------- */ +a { + color: #356de4; + text-decoration: none; +} + +a:hover { text-decoration: underline; } +a:visited { color: #6d93e4; } + +hr { + border: none; + border-top: 1px solid #afafaf; +} + +/* "Jump to Table of Contents" link is shown to assistive tools, but hidden from + sight until it's focused. */ +.jump { + position: absolute; + padding: 3px 6px; + left: -99999px; + top: 0; +} + +.jump:focus { left: 40%; } + +/* -- Paragraphs and paragraph-like blocks ---------------------------------- */ +p, +pre.code, pre.terminal, pre.cmd { + margin: 1.2em 0; +} + +dd p, td p { margin-bottom: 0; } +dd p:first-child, td p:first-child { margin-top: 0; } + +/* -- Headings -------------------------------------------------------------- */ +h1, h2, h3, h4, h5, h6 { + color: #eb8c28;/*was #f80*/ + font-family: 'Maven Pro', Helvetica, sans-serif; + font-weight: bold; + line-height: 1.1; + margin: 1.1em 0 0.5em; +} + +h1 { + font-size: 184.6%; + color: #30418C; + margin: 0.75em 0 0.5em; + padding: 0 16px 0 20px; +} + +h2 { font-size: 153.846%; } + +h3 { font-size: 138.462%; } + +h4 { + border-bottom: 1px solid #DBDFEA; + font-size: 115.385%; + font-weight: normal; + padding-bottom: 2px; +} + +h5, h6 { font-size: 107.692%; } + +/* -- Code and examples ----------------------------------------------------- */ +code, kbd, pre, samp { + font-family: Menlo, Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Consolas', 'Courier New', Courier, monospace; + font-size: 92.308%; + line-height: 1.35; +} + +p code, p kbd, p samp { + background: #FCFBFA; + border: 1px solid #EFEEED; + padding: 0 3px; +} + +a code, a kbd, a samp, +pre code, pre kbd, pre samp, +table code, table kbd, table samp, +.intro code, .intro kbd, .intro samp, +.toc code, .toc kbd, .toc samp { + background: none; + border: none; + padding: 0; +} + +pre.code, pre.terminal, pre.cmd, #doc pre.prettyprint { + overflow-x: auto; + padding: 0.3em 0.6em; + _width: 99%; +} + +pre.code, #doc pre.prettyprint { + background: #FCFBFA; + border: 1px solid #EFEEED; + border-left-width: 5px; +} + +pre.terminal, pre.cmd { + background: #F0EFFC; + border: 1px solid #D0CBFB; + border-left: 5px solid #D0CBFB; +} + +/* Don't reduce the font size of // elements inside
+   blocks. */
+pre code, pre kbd, pre samp { font-size: 100%; }
+
+/* Used to denote text that shouldn't be selectable, such as line numbers or
+   shell prompts. Guess which browser this doesn't work in. */
+.noselect {
+    -moz-user-select: -moz-none;
+    -khtml-user-select: none;
+    -webkit-user-select: none;
+    -o-user-select: none;
+    user-select: none;
+}
+
+/* -- Lists ----------------------------------------------------------------- */
+dd { margin: 0.2em 0 0.7em 1em; }
+dl { margin: 1em 0; }
+dt { font-weight: bold; }
+
+/* -- Lists ----------------------------------------------------------------- */
+dd { margin: 0.2em 0 0.7em 1em; }
+dl { margin: 1em 0; }
+dt { font-weight: bold; }
+
+/* -- Tables ---------------------------------------------------------------- */
+caption, th { text-align: left; }
+
+table {
+    border-collapse: collapse;
+    width: 100%;
+}
+
+td, th {
+    border: 1px solid #fff;
+    padding: 5px 12px;
+    vertical-align: top;
+}
+
+td { background: #E6E9F5; }
+td dl { margin: 0; }
+td dl dl { margin: 1em 0; }
+td pre:first-child { margin-top: 0; }
+
+th {
+    background: #D2D7E6;/*#97A0BF*/
+    border-bottom: none;
+    border-top: none;
+    color: #000;/*#FFF1D5*/
+    font-weight: bold;
+    line-height: 1.3;
+    white-space: nowrap;
+}
+
+/* -- Layout and Content ---------------------------------------------------- */
+#doc {
+    margin: auto;
+    min-width: 960px;
+    padding-bottom: 50px;
+}
+
+/*#main { width: 99%; }
+#sidebar { width: 270px; }
+*/
+.content { padding: 0 16px 0 20px; }
+
+/* -- Sidebar --------------------------------------------------------------- */
+.sidebar { padding: 0 15px 0 10px; }
+
+.sidebox {
+    border: 1px solid #D4D8EB;
+    -moz-border-radius: 3px;
+    -webkit-border-radius: 3px;
+    border-radius: 3px;
+    -moz-box-shadow: 0 1px 4px rgba(0,0,0,0.1);
+    -webkit-box-shadow: 0 1px 4px rgba(0,0,0,0.1);
+    box-shadow: 0 1px 4px rgba(0,0,0,0.1);
+    margin: 0 0 15px 0;
+    padding-bottom: 1px;
+}
+
+.sidebox .hd {
+    background: #E5E6F1;
+    -moz-border-radius: 3px 3px 0 0;
+    -webkit-border-radius: 3px 3px 0 0;
+    border-radius: 3px 3px 0 0;
+    padding: 4px 7px 5px;
+}
+
+.sidebox .bd {
+    background: #F9F9FC;
+    -moz-border-radius: 0 0 3px 3px;
+    -webkit-border-radius: 0 0 3px 3px;
+    border-radius: 0 0 3px 3px;
+    font-size: 11px;
+    padding: 10px 8px 10px;
+}
+
+.sidebox .hd h2 {
+    color: #30418c;
+    font-weight: bold;
+    font-size: 107.692%;
+    margin: 0;
+}
+
+.sidebox li {
+    color: #D4D5E3;
+    list-style-type: disc;
+}
+
+.sidebox ol, .sidebox ul {
+    margin: 0;
+    padding-left: 14px;
+}
+
+.sidebox ol ol, .sidebox ol ul,
+.sidebox ul ol, .sidebox ul ul {
+    margin: 0;
+    padding-left: 14px;
+}
+
+/* -- Table of Contents ----------------------------------------------------- */
+
+/* The #toc id refers to the single global table of contents, while the .toc
+   class refers to generic TOC lists that could be used throughout the page. */
+
+.toc code, .toc kbd, .toc samp { font-size: 100%; }
+.toc li { font-weight: bold; }
+.toc li li { font-weight: normal; }
+
+/* -- Intro and Example Boxes ----------------------------------------------- */
+.intro, .example { margin-bottom: 2em; }
+
+.example {
+    -moz-border-radius: 4px;
+    -webkit-border-radius: 4px;
+    border-radius: 4px;
+    -moz-box-shadow: 0 0 5px #bfbfbf;
+    -webkit-box-shadow: 0 0 5px #bfbfbf;
+    box-shadow: 0 0 5px #bfbfbf;
+    padding: 1em;
+    border: 1px solid #dfdfdf\9; /* IE6-8 only */
+}
+
+.intro {
+    background: #F0F1F8;/*E6E9F5*/
+    border: 1px solid #D4D8EB;
+    -moz-border-radius: 3px;
+    -webkit-border-radius: 3px;
+    border-radius: 3px;
+    padding: 0 1em;
+}
+
+/* -- Other Styles ---------------------------------------------------------- */
+
+/* These are probably YUI-specific, and should be moved out of Selleck's default
+   theme. */
+
+/* Pretty buttons. */
+.button,
+.button:visited {
+    color: #444;
+}
+
+.button {
+    border: 1px solid #e9e9e9;
+    -moz-border-radius: 3px;
+    -webkit-border-radius: 3px;
+    border-radius: 3px;
+    -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
+    -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
+    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
+    display: inline-block;
+    font-family: Helvetica, Arial, sans-serif;
+    font-size: 13px;
+    font-weight: bold;
+    padding: 4px 13px 3px;
+    text-align: center;
+    -moz-text-shadow: 1px 1px 0 #fff;
+    -webkit-text-shadow: 1px 1px 0 #fff;
+    text-shadow: 1px 1px 0 #fff;
+    white-space: nowrap;
+
+    background: #EFEFEF; /* old browsers */
+    background: -moz-linear-gradient(top, #f5f5f5 0%, #efefef 50%, #e5e5e5 51%, #dfdfdf 100%); /* firefox */
+    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(50%,#efefef), color-stop(51%,#e5e5e5), color-stop(100%,#dfdfdf)); /* webkit */
+    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#dfdfdf',GradientType=0 ); /* ie */
+    *border-color: #dadada;
+    *padding-bottom: 5px;
+}
+
+.button:hover {
+    border-color: #466899;
+    -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
+    -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
+    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
+    color: #fff;
+    text-decoration: none;
+    -moz-text-shadow: 1px 1px 0 #222;
+    -webkit-text-shadow: 1px 1px 0 #222;
+    text-shadow: 1px 1px 0 #222;
+
+    background: #6396D8; /* old browsers */
+    background: -moz-linear-gradient(top, #6396D8 0%, #5A83BC 50%, #547AB7 51%, #466899 100%); /* firefox */
+    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#6396D8), color-stop(50%,#5A83BC), color-stop(51%,#547AB7), color-stop(100%,#466899)); /* webkit */
+    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6396D8', endColorstr='#466899',GradientType=0 ); /* ie */
+}
+
+/* Big download button, like on the Home page. */
+.button.download {
+    display: block;
+    font-size: 18px;
+    margin: 0 0 1em;
+    padding: 9px 17px 8px;
+}
+
+.newwindow { text-align: center; }
+
+/* List with extra vertical spacing between items. */
+.spaced li { margin: 0.8em 0; }
diff --git a/conf/docs/assets/favicon.ico b/conf/docs/assets/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..414ac4fb9e145171ae8f660e51879e18c401e653
GIT binary patch
literal 5430
zcmdT|c~n&A6@SF^c=}JZwQU+rgHaP#WKr3f0cL=KVVglvkVQZiQDfDk(FA2t0)iWh
zY=W#JA~S%vRZzjDF`C4MRAU4c7u+h2MgbA{^?q-_;)qB%w&!%tx#zw2&G&uxzWd$#
zyTAK5PK$ew8$O()>u4_YeUAH#Wt}S-?OOYwFzy>RQteQ9yKUN)d(VW}sS?gZ?
zPx|>Q!Vau3)9EakCq-qL90hZ1ks>ulgswI!)`q9{n*WN=S|2z6sbrBy(?+QgBE*JB
zlnJnZksB2AoRK}#3JJogNS28kUOaCb+SeXkot@mC@Q@R^-quL*5MiyIF?RYpVBbPF
z?DVronzI>VjK-tk)Cp_N^|bcAW9b_=#|x%(<@s2lFu)#3Gp(_~*#hPBT~HA!L*8sL
z5-cX6B63B6=K7xxlrGM9x4v^V+X
z@!h76dhelXtk*db8Fs$J#|HUcwzQ80?IA{iKik6!8Kj%}a)*xu8-j)QTIwf8F}-ijENc|feZIeh-y_r024x{G$d+3m-A#1A#mc4rKV*4JZ^cW^A4gm2x16n1`1ZBt
zO=A=*TCJ+)5vp5_WA9%1Y4U@{YvUl~xHfH$Q*}!uT_cBaTn!1wWT;vqhtL>_N{i-`
zfQE5hjWeU^-jamj5&vVrqw#x_P5&?BEJq*RzBTINkt&-zmoH8FU)Zf`y7|$CeM+xA
z(W}x^+#S9n9DFkWk3*qYvohtsrN85O+mNd#4m%%+URIj!DtH`gG9FO|pJ4UW(O5P4
zV=U1gfmAQ~(RZ!C<9X}QhQpQqhr&a@FPv?KZLX$BC)`V-oY`Qlj~LU*h?w>%R!kU$
zNMoJ*&mJ`of0s5qz27vdJlL^Q8R!6IkPDAj+X?^DoJ_IBb_Ui9bg|ZGBEogYVAR!$g+%(=6w-i7}9
zGv5f)!~Cij>W#&6W2#YMu2gemybnsLeinM$A#0{3QXNgO*=9Q81XB??Z5*PFr>LIX
zzxU_C+R*w~HLNN*HaX7TxO0uAF21swh9$;2*fv{4wOdX;U^d8j9+BrM=D9?2cPxHw
zHko|zAhEZ8A5t0fRZ5n-33diaUb7+6
z#t55SEV}ipZBPWMV=B4GlH#pvl{v2#gq*{{)09Pl?4tC#GInl=Ur)_N!k6r*Tf
z-!^1Z{_k6;)?X1SM@fJq)UimI;9yMos7v{v`|RP3>)Hdcp{uiltBw!PPb3bMOuRP1
z+JLTx*cC!tXPzDJhb%rGM2IK;$YQcMK&tiwVG@rCzQoTc78y1t+8H96-lKL~@~XG$
zC;oq7cg~l&Zsy1(PRRIXs*@Qu*~~zO+!Q6DcGwYUhdhdh9vkAE%(33l9Lf-9-Ub$n
zrNl)UFV7+#wpD6E+*${zGi|T5x3=`jt$XYuo;t2P)VW1TamD<|aE0YmhN}e&iIc<$cAAl>WBF
z$z7occH!}rohRdzDN>NU5uhb{jD;6&f{QH}9YL4GIf68+I(%Fs506Vfl#`}WRT;>br*K7|<
z6b0C*^P;y6j%G-u9*yA=j|nUm2@|$bKCvF`+L>?6HFdq|`IkF4v}t%b
zH#c0;xmcFBvNm?v(TW8#n|F9wBU@&QH2UU}BAJfOw$l+$H969H8dh59VYN`7xatI4
z*sJgvkPga)fzEsO;O>V_XHSXilm*Lcw?yStd=Y%2FhF)K)6H77MPm3omN;rS^$N@M
z#vn?d_vB{XIsJj|J=l5etLlh1W?`
c9H-qz(m`J;Xu?oLlCTZhNI;9}q1!h68y;F)#sB~S

literal 0
HcmV?d00001

diff --git a/conf/docs/assets/vendor/prettify/CHANGES.html b/conf/docs/assets/vendor/prettify/CHANGES.html
new file mode 100644
index 00000000..9da9fa63
--- /dev/null
+++ b/conf/docs/assets/vendor/prettify/CHANGES.html
@@ -0,0 +1,155 @@
+
+  
+    
+    Change Log
+  
+  
+    README
+
+    

Known Issues

+
    +
  • Perl formatting is really crappy. Partly because the author is lazy and + partly because Perl is + hard to parse. +
  • On some browsers, <code> elements with newlines in the text + which use CSS to specify white-space:pre will have the newlines + improperly stripped if the element is not attached to the document at the time + the stripping is done. Also, on IE 6, all newlines will be stripped from + <code> elements because of the way IE6 produces + innerHTML. Workaround: use <pre> for code with + newlines. +
+ +

Change Log

+

29 March 2007

+
    +
  • Added tests for PHP support + to address + issue 3. +
  • Fixed + bug: prettyPrintOne was not halting. This was not + reachable through the normal entry point. +
  • Fixed + bug: recursing into a script block or PHP tag that was not properly + closed would not silently drop the content. + (test) +
  • Fixed + bug: was eating tabs + (test) +
  • Fixed entity handling so that the caveat +
    +

    Caveats: please properly escape less-thans. x&lt;y + instead of x<y, and use " instead of + &quot; for string delimiters.

    +
    + is no longer applicable. +
  • Added noisefree's C# + patch +
  • Added a distribution that has comments and + whitespace removed to reduce download size from 45.5kB to 12.8kB. +
+

4 Jul 2008

+
    +
  • Added language specific formatters that are triggered by the presence + of a lang-<language-file-extension>
  • +
  • Fixed bug: python handling of '''string''' +
  • Fixed bug: / in regex [charsets] should not end regex +
+

5 Jul 2008

+
+

14 Jul 2008

+ +

6 Jan 2009

+ +

21 May 2009

+ +

14 August 2009

+ +

3 October 2009

+ +

19 July 2010

+ +

7 September 2010

+ +

4 March 2011

+ +

29 March 2011

+ + + diff --git a/conf/docs/assets/vendor/prettify/COPYING b/conf/docs/assets/vendor/prettify/COPYING new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/conf/docs/assets/vendor/prettify/COPYING @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/conf/docs/assets/vendor/prettify/README.html b/conf/docs/assets/vendor/prettify/README.html new file mode 100644 index 00000000..967d6131 --- /dev/null +++ b/conf/docs/assets/vendor/prettify/README.html @@ -0,0 +1,233 @@ + + + + + Javascript code prettifier + + + + + + + + + + Languages : CH +

Javascript code prettifier

+ +

Setup

+
    +
  1. Download a distribution +
  2. Include the script and stylesheets in your document + (you will need to make sure the css and js file are on your server, and + adjust the paths in the script and link tag) +
    +<link href="prettify.css" type="text/css" rel="stylesheet" />
    +<script type="text/javascript" src="prettify.js"></script>
    +
  3. Add onload="prettyPrint()" to your + document's body tag. +
  4. Modify the stylesheet to get the coloring you prefer
  5. +
+ +

Usage

+

Put code snippets in + <pre class="prettyprint">...</pre> + or <code class="prettyprint">...</code> + and it will automatically be pretty printed. + + + + +
The original + Prettier +
class Voila {
+public:
+  // Voila
+  static const string VOILA = "Voila";
+
+  // will not interfere with embedded tags.
+}
+ +
class Voila {
+public:
+  // Voila
+  static const string VOILA = "Voila";
+
+  // will not interfere with embedded tags.
+}
+
+ +

FAQ

+

For which languages does it work?

+

The comments in prettify.js are authoritative but the lexer + should work on a number of languages including C and friends, + Java, Python, Bash, SQL, HTML, XML, CSS, Javascript, and Makefiles. + It works passably on Ruby, PHP, VB, and Awk and a decent subset of Perl + and Ruby, but, because of commenting conventions, doesn't work on + Smalltalk, or CAML-like languages.

+ +

LISPy languages are supported via an extension: + lang-lisp.js.

+

And similarly for + Clojure, + CSS, + Go, + Haskell, + Lua, + OCAML, SML, F#, + Nemerle, + Protocol Buffers, + Scala, + SQL, + TeX, LaTeX, + VHDL, + Visual Basic, + WikiText, + XQuery, and + YAML. + +

If you'd like to add an extension for your favorite language, please + look at src/lang-lisp.js and file an + issue including your language extension, and a testcase.

+ +

How do I specify the language of my code?

+

You don't need to specify the language since prettyprint() + will guess. You can specify a language by specifying the language extension + along with the prettyprint class like so:

+
<pre class="prettyprint lang-html">
+  The lang-* class specifies the language file extensions.
+  File extensions supported by default include
+    "bsh", "c", "cc", "cpp", "cs", "csh", "cyc", "cv", "htm", "html",
+    "java", "js", "m", "mxml", "perl", "pl", "pm", "py", "rb", "sh",
+    "xhtml", "xml", "xsl".
+</pre>
+ +

You may also use the + HTML 5 convention of embedding a code element inside the + PRE and using language-java style classes. + E.g.

<pre class="prettyprint"><code class="language-java">...</code></pre> + +

It doesn't work on <obfuscated code sample>?

+

Yes. Prettifying obfuscated code is like putting lipstick on a pig + — i.e. outside the scope of this tool.

+ +

Which browsers does it work with?

+

It's been tested with IE 6, Firefox 1.5 & 2, and Safari 2.0.4. + Look at the test page to see if it + works in your browser.

+ +

What's changed?

+

See the change log

+ +

Why doesn't Prettyprinting of strings work on WordPress?

+

Apparently wordpress does "smart quoting" which changes close quotes. + This causes end quotes to not match up with open quotes. +

This breaks prettifying as well as copying and pasting of code samples. + See + WordPress's help center for info on how to stop smart quoting of code + snippets.

+ +

How do I put line numbers in my code?

+

You can use the linenums class to turn on line + numbering. If your code doesn't start at line number 1, you can + add a colon and a line number to the end of that class as in + linenums:52. + +

For example +

<pre class="prettyprint linenums:4"
+>// This is line 4.
+foo();
+bar();
+baz();
+boo();
+far();
+faz();
+<pre>
+ produces +
// This is line 4.
+foo();
+bar();
+baz();
+boo();
+far();
+faz();
+
+ +

How do I prevent a portion of markup from being marked as code?

+

You can use the nocode class to identify a span of markup + that is not code. +

<pre class=prettyprint>
+int x = foo();  /* This is a comment  <span class="nocode">This is not code</span>
+  Continuation of comment */
+int y = bar();
+</pre>
+produces +
+int x = foo();  /* This is a comment  This is not code
+  Continuation of comment */
+int y = bar();
+
+ +

For a more complete example see the issue22 + testcase.

+ +

I get an error message "a is not a function" or "opt_whenDone is not a function"

+

If you are calling prettyPrint via an event handler, wrap it in a function. + Instead of doing +

+ addEventListener('load', prettyPrint, false); +
+ wrap it in a closure like +
+ addEventListener('load', function (event) { prettyPrint() }, false); +
+ so that the browser does not pass an event object to prettyPrint which + will confuse it. + +

How can I customize the colors and styles of my code?

+

+ Prettify adds <span> with classes describing + the kind of code. You can create CSS styles to matches these + classes. + See the + + theme gallery for examples. +

+ +


+ + + + diff --git a/conf/docs/assets/vendor/prettify/prettify-min.css b/conf/docs/assets/vendor/prettify/prettify-min.css new file mode 100644 index 00000000..d44b3a22 --- /dev/null +++ b/conf/docs/assets/vendor/prettify/prettify-min.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} \ No newline at end of file diff --git a/conf/docs/assets/vendor/prettify/prettify-min.js b/conf/docs/assets/vendor/prettify/prettify-min.js new file mode 100644 index 00000000..4845d05d --- /dev/null +++ b/conf/docs/assets/vendor/prettify/prettify-min.js @@ -0,0 +1 @@ +window.PR_SHOULD_USE_CONTINUATION=true;var prettyPrintOne;var prettyPrint;(function(){var O=window;var j=["break,continue,do,else,for,if,return,while"];var v=[j,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var q=[v,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var m=[q,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var y=[q,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var T=[y,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"];var s="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes";var x=[q,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var t="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var J=[j,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var g=[j,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var I=[j,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var B=[m,T,x,t+J,g,I];var f=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/;var D="str";var A="kwd";var k="com";var Q="typ";var H="lit";var M="pun";var G="pln";var n="tag";var F="dec";var K="src";var R="atn";var o="atv";var P="nocode";var N="(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function l(ab){var af=0;var U=false;var ae=false;for(var X=0,W=ab.length;X122)){if(!(am<65||ai>90)){ah.push([Math.max(65,ai)|32,Math.min(am,90)|32])}if(!(am<97||ai>122)){ah.push([Math.max(97,ai)&~32,Math.min(am,122)&~32])}}}}ah.sort(function(aw,av){return(aw[0]-av[0])||(av[1]-aw[1])});var ak=[];var aq=[];for(var at=0;atau[0]){if(au[1]+1>au[0]){ao.push("-")}ao.push(V(au[1]))}}ao.push("]");return ao.join("")}function Y(an){var al=an.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var aj=al.length;var ap=[];for(var am=0,ao=0;am=2&&ak==="["){al[am]=Z(ai)}else{if(ak!=="\\"){al[am]=ai.replace(/[a-zA-Z]/g,function(aq){var ar=aq.charCodeAt(0);return"["+String.fromCharCode(ar&~32,ar|32)+"]"})}}}}return al.join("")}var ac=[];for(var X=0,W=ab.length;X=0;){U[ae.charAt(ag)]=aa}}var ah=aa[1];var ac=""+ah;if(!ai.hasOwnProperty(ac)){aj.push(ah);ai[ac]=null}}aj.push(/[\0-\uffff]/);X=l(aj)})();var Z=V.length;var Y=function(aj){var ab=aj.sourceCode,aa=aj.basePos;var af=[aa,G];var ah=0;var ap=ab.match(X)||[];var al={};for(var ag=0,at=ap.length;ag=5&&"lang-"===ar.substring(0,5);if(ao&&!(ak&&typeof ak[1]==="string")){ao=false;ar=K}if(!ao){al[ai]=ar}}var ad=ah;ah+=ai.length;if(!ao){af.push(aa+ad,ar)}else{var an=ak[1];var am=ai.indexOf(an);var ae=am+an.length;if(ak[2]){ae=ai.length-ak[2].length;am=ae-an.length}var au=ar.substring(5);C(aa+ad,ai.substring(0,am),Y,af);C(aa+ad+am,an,r(au,an),af);C(aa+ad+ae,ai.substring(ae),Y,af)}}aj.decorations=af};return Y}function i(V){var Y=[],U=[];if(V.tripleQuotedStrings){Y.push([D,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(V.multiLineStrings){Y.push([D,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{Y.push([D,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(V.verbatimStrings){U.push([D,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var ab=V.hashComments;if(ab){if(V.cStyleComments){if(ab>1){Y.push([k,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{Y.push([k,/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}U.push([D,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,null])}else{Y.push([k,/^#[^\r\n]*/,null,"#"])}}if(V.cStyleComments){U.push([k,/^\/\/[^\r\n]*/,null]);U.push([k,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(V.regexLiterals){var aa=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");U.push(["lang-regex",new RegExp("^"+N+"("+aa+")")])}var X=V.types;if(X){U.push([Q,X])}var W=(""+V.keywords).replace(/^ | $/g,"");if(W.length){U.push([A,new RegExp("^(?:"+W.replace(/[\s,]+/g,"|")+")\\b"),null])}Y.push([G,/^\s+/,null," \r\n\t\xA0"]);var Z=/^.[^\s\w\.$@\'\"\`\/\\]*/;U.push([H,/^@[a-z_$][a-z_$@0-9]*/i,null],[Q,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[G,/^[a-z_$][a-z_$@0-9]*/i,null],[H,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[G,/^\\[\s\S]?/,null],[M,Z,null]);return h(Y,U)}var L=i({keywords:B,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function S(W,ah,aa){var V=/(?:^|\s)nocode(?:\s|$)/;var ac=/\r\n?|\n/;var ad=W.ownerDocument;var ag=ad.createElement("li");while(W.firstChild){ag.appendChild(W.firstChild)}var X=[ag];function af(am){switch(am.nodeType){case 1:if(V.test(am.className)){break}if("br"===am.nodeName){ae(am);if(am.parentNode){am.parentNode.removeChild(am)}}else{for(var ao=am.firstChild;ao;ao=ao.nextSibling){af(ao)}}break;case 3:case 4:if(aa){var an=am.nodeValue;var ak=an.match(ac);if(ak){var aj=an.substring(0,ak.index);am.nodeValue=aj;var ai=an.substring(ak.index+ak[0].length);if(ai){var al=am.parentNode;al.insertBefore(ad.createTextNode(ai),am.nextSibling)}ae(am);if(!aj){am.parentNode.removeChild(am)}}}break}}function ae(al){while(!al.nextSibling){al=al.parentNode;if(!al){return}}function aj(am,at){var ar=at?am.cloneNode(false):am;var ap=am.parentNode;if(ap){var aq=aj(ap,1);var ao=am.nextSibling;aq.appendChild(ar);for(var an=ao;an;an=ao){ao=an.nextSibling;aq.appendChild(an)}}return ar}var ai=aj(al.nextSibling,0);for(var ak;(ak=ai.parentNode)&&ak.nodeType===1;){ai=ak}X.push(ai)}for(var Z=0;Z=U){aj+=2}if(Y>=ar){ac+=2}}}finally{if(au){au.style.display=ak}}}var u={};function d(W,X){for(var U=X.length;--U>=0;){var V=X[U];if(!u.hasOwnProperty(V)){u[V]=W}else{if(O.console){console.warn("cannot override language handler %s",V)}}}}function r(V,U){if(!(V&&u.hasOwnProperty(V))){V=/^\s*]*(?:>|$)/],[k,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[M,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);d(h([[G,/^[\s]+/,null," \t\r\n"],[o,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[n,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[R,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[M,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);d(h([],[[o,/^[\s\S]+/]]),["uq.val"]);d(i({keywords:m,hashComments:true,cStyleComments:true,types:f}),["c","cc","cpp","cxx","cyc","m"]);d(i({keywords:"null,true,false"}),["json"]);d(i({keywords:T,hashComments:true,cStyleComments:true,verbatimStrings:true,types:f}),["cs"]);d(i({keywords:y,cStyleComments:true}),["java"]);d(i({keywords:I,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);d(i({keywords:J,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);d(i({keywords:t,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);d(i({keywords:g,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);d(i({keywords:x,cStyleComments:true,regexLiterals:true}),["js"]);d(i({keywords:s,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);d(h([],[[D,/^[\s\S]+/]]),["regex"]);function e(X){var W=X.langExtension;try{var U=b(X.sourceNode,X.pre);var V=U.sourceCode;X.sourceCode=V;X.spans=U.spans;X.basePos=0;r(W,V)(X);E(X)}catch(Y){if(O.console){console.log(Y&&Y.stack?Y.stack:Y)}}}function z(Y,X,W){var U=document.createElement("pre");U.innerHTML=Y;if(W){S(U,W,true)}var V={langExtension:X,numberLines:W,sourceNode:U,pre:1};e(V);return U.innerHTML}function c(aj){function ab(al){return document.getElementsByTagName(al)}var ah=[ab("pre"),ab("code"),ab("xmp")];var V=[];for(var ae=0;ae]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); \ No newline at end of file diff --git a/conf/docs/assets/vendor/prettify/prettify.css b/conf/docs/assets/vendor/prettify/prettify.css new file mode 100644 index 00000000..400fd742 --- /dev/null +++ b/conf/docs/assets/vendor/prettify/prettify.css @@ -0,0 +1,52 @@ +/* Pretty printing styles. Used with prettify.js. */ + +/* SPAN elements with the classes below are added by prettyprint. */ +.pln { color: #000 } /* plain text */ + +@media screen { + .str { color: #080 } /* string content */ + .kwd { color: #008 } /* a keyword */ + .com { color: #800 } /* a comment */ + .typ { color: #606 } /* a type name */ + .lit { color: #066 } /* a literal value */ + /* punctuation, lisp open bracket, lisp close bracket */ + .pun, .opn, .clo { color: #660 } + .tag { color: #008 } /* a markup tag name */ + .atn { color: #606 } /* a markup attribute name */ + .atv { color: #080 } /* a markup attribute value */ + .dec, .var { color: #606 } /* a declaration; a variable name */ + .fun { color: red } /* a function name */ +} + +/* Use higher contrast and text-weight for printable form. */ +@media print, projection { + .str { color: #060 } + .kwd { color: #006; font-weight: bold } + .com { color: #600; font-style: italic } + .typ { color: #404; font-weight: bold } + .lit { color: #044 } + .pun, .opn, .clo { color: #440 } + .tag { color: #006; font-weight: bold } + .atn { color: #404 } + .atv { color: #060 } +} + +/* Put a border around prettyprinted code snippets. */ +pre.prettyprint { padding: 2px; border: 1px solid #888 } + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { margin-top: 0; margin-bottom: 0 } /* IE indents via margin-left */ +li.L0, +li.L1, +li.L2, +li.L3, +li.L5, +li.L6, +li.L7, +li.L8 { list-style-type: none } +/* Alternate shading for lines */ +li.L1, +li.L3, +li.L5, +li.L7, +li.L9 { background: #eee } diff --git a/conf/docs/assets/vendor/prettify/prettify.js b/conf/docs/assets/vendor/prettify/prettify.js new file mode 100644 index 00000000..63d73d0a --- /dev/null +++ b/conf/docs/assets/vendor/prettify/prettify.js @@ -0,0 +1,1710 @@ +// NOTE: This is a customized version of Prettify for Selleck, with Handlebars +// and CSS syntax highlighting added at the end. + +// Copyright (C) 2006 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +/** + * @fileoverview + * some functions for browser-side pretty printing of code contained in html. + * + *

+ * For a fairly comprehensive set of languages see the + * README + * file that came with this source. At a minimum, the lexer should work on a + * number of languages including C and friends, Java, Python, Bash, SQL, HTML, + * XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP and Awk + * and a subset of Perl, but, because of commenting conventions, doesn't work on + * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class. + *

+ * Usage:

    + *
  1. include this source file in an html page via + * {@code } + *
  2. define style rules. See the example page for examples. + *
  3. mark the {@code
    } and {@code } tags in your source with
    + *    {@code class=prettyprint.}
    + *    You can also use the (html deprecated) {@code } tag, but the pretty
    + *    printer needs to do more substantial DOM manipulations to support that, so
    + *    some css styles may not be preserved.
    + * </ol>
    + * That's it.  I wanted to keep the API as simple as possible, so there's no
    + * need to specify which language the code is in, but if you wish, you can add
    + * another class to the {@code <pre>} or {@code <code>} element to specify the
    + * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
    + * starts with "lang-" followed by a file extension, specifies the file type.
    + * See the "lang-*.js" files in this directory for code that implements
    + * per-language file handlers.
    + * <p>
    + * Change log:<br>
    + * cbeust, 2006/08/22
    + * <blockquote>
    + *   Java annotations (start with "@") are now captured as literals ("lit")
    + * </blockquote>
    + * @requires console
    + */
    +
    +// JSLint declarations
    +/*global console, document, navigator, setTimeout, window, define */
    +
    +/**
    + * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
    + * UI events.
    + * If set to {@code false}, {@code prettyPrint()} is synchronous.
    + */
    +window['PR_SHOULD_USE_CONTINUATION'] = true;
    +
    +/**
    + * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
    + * {@code class=prettyprint} and prettify them.
    + *
    + * @param {Function?} opt_whenDone if specified, called when the last entry
    + *     has been finished.
    + */
    +var prettyPrintOne;
    +/**
    + * Pretty print a chunk of code.
    + *
    + * @param {string} sourceCodeHtml code as html
    + * @return {string} code as html, but prettier
    + */
    +var prettyPrint;
    +
    +
    +(function () {
    +  var win = window;
    +  // Keyword lists for various languages.
    +  // We use things that coerce to strings to make them compact when minified
    +  // and to defeat aggressive optimizers that fold large string constants.
    +  var FLOW_CONTROL_KEYWORDS = ["break,continue,do,else,for,if,return,while"];
    +  var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,"auto,case,char,const,default," + 
    +      "double,enum,extern,float,goto,int,long,register,short,signed,sizeof," +
    +      "static,struct,switch,typedef,union,unsigned,void,volatile"];
    +  var COMMON_KEYWORDS = [C_KEYWORDS,"catch,class,delete,false,import," +
    +      "new,operator,private,protected,public,this,throw,true,try,typeof"];
    +  var CPP_KEYWORDS = [COMMON_KEYWORDS,"alignof,align_union,asm,axiom,bool," +
    +      "concept,concept_map,const_cast,constexpr,decltype," +
    +      "dynamic_cast,explicit,export,friend,inline,late_check," +
    +      "mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast," +
    +      "template,typeid,typename,using,virtual,where"];
    +  var JAVA_KEYWORDS = [COMMON_KEYWORDS,
    +      "abstract,boolean,byte,extends,final,finally,implements,import," +
    +      "instanceof,null,native,package,strictfp,super,synchronized,throws," +
    +      "transient"];
    +  var CSHARP_KEYWORDS = [JAVA_KEYWORDS,
    +      "as,base,by,checked,decimal,delegate,descending,dynamic,event," +
    +      "fixed,foreach,from,group,implicit,in,interface,internal,into,is,let," +
    +      "lock,object,out,override,orderby,params,partial,readonly,ref,sbyte," +
    +      "sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort," +
    +      "var,virtual,where"];
    +  var COFFEE_KEYWORDS = "all,and,by,catch,class,else,extends,false,finally," +
    +      "for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then," +
    +      "throw,true,try,unless,until,when,while,yes";
    +  var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,
    +      "debugger,eval,export,function,get,null,set,undefined,var,with," +
    +      "Infinity,NaN"];
    +  var PERL_KEYWORDS = "caller,delete,die,do,dump,elsif,eval,exit,foreach,for," +
    +      "goto,if,import,last,local,my,next,no,our,print,package,redo,require," +
    +      "sub,undef,unless,until,use,wantarray,while,BEGIN,END";
    +  var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "and,as,assert,class,def,del," +
    +      "elif,except,exec,finally,from,global,import,in,is,lambda," +
    +      "nonlocal,not,or,pass,print,raise,try,with,yield," +
    +      "False,True,None"];
    +  var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "alias,and,begin,case,class," +
    +      "def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo," +
    +      "rescue,retry,self,super,then,true,undef,unless,until,when,yield," +
    +      "BEGIN,END"];
    +  var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "case,done,elif,esac,eval,fi," +
    +      "function,in,local,set,then,until"];
    +  var ALL_KEYWORDS = [
    +      CPP_KEYWORDS, CSHARP_KEYWORDS, JSCRIPT_KEYWORDS, PERL_KEYWORDS +
    +      PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS];
    +  var C_TYPES = /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/;
    +
    +  // token style names.  correspond to css classes
    +  /**
    +   * token style for a string literal
    +   * @const
    +   */
    +  var PR_STRING = 'str';
    +  /**
    +   * token style for a keyword
    +   * @const
    +   */
    +  var PR_KEYWORD = 'kwd';
    +  /**
    +   * token style for a comment
    +   * @const
    +   */
    +  var PR_COMMENT = 'com';
    +  /**
    +   * token style for a type
    +   * @const
    +   */
    +  var PR_TYPE = 'typ';
    +  /**
    +   * token style for a literal value.  e.g. 1, null, true.
    +   * @const
    +   */
    +  var PR_LITERAL = 'lit';
    +  /**
    +   * token style for a punctuation string.
    +   * @const
    +   */
    +  var PR_PUNCTUATION = 'pun';
    +  /**
    +   * token style for plain text.
    +   * @const
    +   */
    +  var PR_PLAIN = 'pln';
    +
    +  /**
    +   * token style for an sgml tag.
    +   * @const
    +   */
    +  var PR_TAG = 'tag';
    +  /**
    +   * token style for a markup declaration such as a DOCTYPE.
    +   * @const
    +   */
    +  var PR_DECLARATION = 'dec';
    +  /**
    +   * token style for embedded source.
    +   * @const
    +   */
    +  var PR_SOURCE = 'src';
    +  /**
    +   * token style for an sgml attribute name.
    +   * @const
    +   */
    +  var PR_ATTRIB_NAME = 'atn';
    +  /**
    +   * token style for an sgml attribute value.
    +   * @const
    +   */
    +  var PR_ATTRIB_VALUE = 'atv';
    +
    +  /**
    +   * A class that indicates a section of markup that is not code, e.g. to allow
    +   * embedding of line numbers within code listings.
    +   * @const
    +   */
    +  var PR_NOCODE = 'nocode';
    +
    +
    +
    +/**
    + * A set of tokens that can precede a regular expression literal in
    + * javascript
    + * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html
    + * has the full list, but I've removed ones that might be problematic when
    + * seen in languages that don't support regular expression literals.
    + *
    + * <p>Specifically, I've removed any keywords that can't precede a regexp
    + * literal in a syntactically legal javascript program, and I've removed the
    + * "in" keyword since it's not a keyword in many languages, and might be used
    + * as a count of inches.
    + *
    + * <p>The link above does not accurately describe EcmaScript rules since
    + * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
    + * very well in practice.
    + *
    + * @private
    + * @const
    + */
    +var REGEXP_PRECEDER_PATTERN = '(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*';
    +
    +// CAVEAT: this does not properly handle the case where a regular
    +// expression immediately follows another since a regular expression may
    +// have flags for case-sensitivity and the like.  Having regexp tokens
    +// adjacent is not valid in any language I'm aware of, so I'm punting.
    +// TODO: maybe style special characters inside a regexp as punctuation.
    +
    +
    +  /**
    +   * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
    +   * matches the union of the sets of strings matched by the input RegExp.
    +   * Since it matches globally, if the input strings have a start-of-input
    +   * anchor (/^.../), it is ignored for the purposes of unioning.
    +   * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
    +   * @return {RegExp} a global regex.
    +   */
    +  function combinePrefixPatterns(regexs) {
    +    var capturedGroupIndex = 0;
    +  
    +    var needToFoldCase = false;
    +    var ignoreCase = false;
    +    for (var i = 0, n = regexs.length; i < n; ++i) {
    +      var regex = regexs[i];
    +      if (regex.ignoreCase) {
    +        ignoreCase = true;
    +      } else if (/[a-z]/i.test(regex.source.replace(
    +                     /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
    +        needToFoldCase = true;
    +        ignoreCase = false;
    +        break;
    +      }
    +    }
    +  
    +    var escapeCharToCodeUnit = {
    +      'b': 8,
    +      't': 9,
    +      'n': 0xa,
    +      'v': 0xb,
    +      'f': 0xc,
    +      'r': 0xd
    +    };
    +  
    +    function decodeEscape(charsetPart) {
    +      var cc0 = charsetPart.charCodeAt(0);
    +      if (cc0 !== 92 /* \\ */) {
    +        return cc0;
    +      }
    +      var c1 = charsetPart.charAt(1);
    +      cc0 = escapeCharToCodeUnit[c1];
    +      if (cc0) {
    +        return cc0;
    +      } else if ('0' <= c1 && c1 <= '7') {
    +        return parseInt(charsetPart.substring(1), 8);
    +      } else if (c1 === 'u' || c1 === 'x') {
    +        return parseInt(charsetPart.substring(2), 16);
    +      } else {
    +        return charsetPart.charCodeAt(1);
    +      }
    +    }
    +  
    +    function encodeEscape(charCode) {
    +      if (charCode < 0x20) {
    +        return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
    +      }
    +      var ch = String.fromCharCode(charCode);
    +      return (ch === '\\' || ch === '-' || ch === ']' || ch === '^')
    +          ? "\\" + ch : ch;
    +    }
    +  
    +    function caseFoldCharset(charSet) {
    +      var charsetParts = charSet.substring(1, charSet.length - 1).match(
    +          new RegExp(
    +              '\\\\u[0-9A-Fa-f]{4}'
    +              + '|\\\\x[0-9A-Fa-f]{2}'
    +              + '|\\\\[0-3][0-7]{0,2}'
    +              + '|\\\\[0-7]{1,2}'
    +              + '|\\\\[\\s\\S]'
    +              + '|-'
    +              + '|[^-\\\\]',
    +              'g'));
    +      var ranges = [];
    +      var inverse = charsetParts[0] === '^';
    +  
    +      var out = ['['];
    +      if (inverse) { out.push('^'); }
    +  
    +      for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
    +        var p = charsetParts[i];
    +        if (/\\[bdsw]/i.test(p)) {  // Don't muck with named groups.
    +          out.push(p);
    +        } else {
    +          var start = decodeEscape(p);
    +          var end;
    +          if (i + 2 < n && '-' === charsetParts[i + 1]) {
    +            end = decodeEscape(charsetParts[i + 2]);
    +            i += 2;
    +          } else {
    +            end = start;
    +          }
    +          ranges.push([start, end]);
    +          // If the range might intersect letters, then expand it.
    +          // This case handling is too simplistic.
    +          // It does not deal with non-latin case folding.
    +          // It works for latin source code identifiers though.
    +          if (!(end < 65 || start > 122)) {
    +            if (!(end < 65 || start > 90)) {
    +              ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
    +            }
    +            if (!(end < 97 || start > 122)) {
    +              ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
    +            }
    +          }
    +        }
    +      }
    +  
    +      // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
    +      // -> [[1, 12], [14, 14], [16, 17]]
    +      ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
    +      var consolidatedRanges = [];
    +      var lastRange = [];
    +      for (var i = 0; i < ranges.length; ++i) {
    +        var range = ranges[i];
    +        if (range[0] <= lastRange[1] + 1) {
    +          lastRange[1] = Math.max(lastRange[1], range[1]);
    +        } else {
    +          consolidatedRanges.push(lastRange = range);
    +        }
    +      }
    +  
    +      for (var i = 0; i < consolidatedRanges.length; ++i) {
    +        var range = consolidatedRanges[i];
    +        out.push(encodeEscape(range[0]));
    +        if (range[1] > range[0]) {
    +          if (range[1] + 1 > range[0]) { out.push('-'); }
    +          out.push(encodeEscape(range[1]));
    +        }
    +      }
    +      out.push(']');
    +      return out.join('');
    +    }
    +  
    +    function allowAnywhereFoldCaseAndRenumberGroups(regex) {
    +      // Split into character sets, escape sequences, punctuation strings
    +      // like ('(', '(?:', ')', '^'), and runs of characters that do not
    +      // include any of the above.
    +      var parts = regex.source.match(
    +          new RegExp(
    +              '(?:'
    +              + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
    +              + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
    +              + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
    +              + '|\\\\[0-9]+'  // a back-reference or octal escape
    +              + '|\\\\[^ux0-9]'  // other escape sequence
    +              + '|\\(\\?[:!=]'  // start of a non-capturing group
    +              + '|[\\(\\)\\^]'  // start/end of a group, or line start
    +              + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
    +              + ')',
    +              'g'));
    +      var n = parts.length;
    +  
    +      // Maps captured group numbers to the number they will occupy in
    +      // the output or to -1 if that has not been determined, or to
    +      // undefined if they need not be capturing in the output.
    +      var capturedGroups = [];
    +  
    +      // Walk over and identify back references to build the capturedGroups
    +      // mapping.
    +      for (var i = 0, groupIndex = 0; i < n; ++i) {
    +        var p = parts[i];
    +        if (p === '(') {
    +          // groups are 1-indexed, so max group index is count of '('
    +          ++groupIndex;
    +        } else if ('\\' === p.charAt(0)) {
    +          var decimalValue = +p.substring(1);
    +          if (decimalValue) {
    +            if (decimalValue <= groupIndex) {
    +              capturedGroups[decimalValue] = -1;
    +            } else {
    +              // Replace with an unambiguous escape sequence so that
    +              // an octal escape sequence does not turn into a backreference
    +              // to a capturing group from an earlier regex.
    +              parts[i] = encodeEscape(decimalValue);
    +            }
    +          }
    +        }
    +      }
    +  
    +      // Renumber groups and reduce capturing groups to non-capturing groups
    +      // where possible.
    +      for (var i = 1; i < capturedGroups.length; ++i) {
    +        if (-1 === capturedGroups[i]) {
    +          capturedGroups[i] = ++capturedGroupIndex;
    +        }
    +      }
    +      for (var i = 0, groupIndex = 0; i < n; ++i) {
    +        var p = parts[i];
    +        if (p === '(') {
    +          ++groupIndex;
    +          if (!capturedGroups[groupIndex]) {
    +            parts[i] = '(?:';
    +          }
    +        } else if ('\\' === p.charAt(0)) {
    +          var decimalValue = +p.substring(1);
    +          if (decimalValue && decimalValue <= groupIndex) {
    +            parts[i] = '\\' + capturedGroups[decimalValue];
    +          }
    +        }
    +      }
    +  
    +      // Remove any prefix anchors so that the output will match anywhere.
    +      // ^^ really does mean an anchored match though.
    +      for (var i = 0; i < n; ++i) {
    +        if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
    +      }
    +  
    +      // Expand letters to groups to handle mixing of case-sensitive and
    +      // case-insensitive patterns if necessary.
    +      if (regex.ignoreCase && needToFoldCase) {
    +        for (var i = 0; i < n; ++i) {
    +          var p = parts[i];
    +          var ch0 = p.charAt(0);
    +          if (p.length >= 2 && ch0 === '[') {
    +            parts[i] = caseFoldCharset(p);
    +          } else if (ch0 !== '\\') {
    +            // TODO: handle letters in numeric escapes.
    +            parts[i] = p.replace(
    +                /[a-zA-Z]/g,
    +                function (ch) {
    +                  var cc = ch.charCodeAt(0);
    +                  return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
    +                });
    +          }
    +        }
    +      }
    +  
    +      return parts.join('');
    +    }
    +  
    +    var rewritten = [];
    +    for (var i = 0, n = regexs.length; i < n; ++i) {
    +      var regex = regexs[i];
    +      if (regex.global || regex.multiline) { throw new Error('' + regex); }
    +      rewritten.push(
    +          '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
    +    }
    +  
    +    return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
    +  }
    +
    +
    +  /**
    +   * Split markup into a string of source code and an array mapping ranges in
    +   * that string to the text nodes in which they appear.
    +   *
    +   * <p>
    +   * The HTML DOM structure:</p>
    +   * <pre>
    +   * (Element   "p"
    +   *   (Element "b"
    +   *     (Text  "print "))       ; #1
    +   *   (Text    "'Hello '")      ; #2
    +   *   (Element "br")            ; #3
    +   *   (Text    "  + 'World';")) ; #4
    +   * </pre>
    +   * <p>
    +   * corresponds to the HTML
    +   * {@code <p><b>print </b>'Hello '<br>  + 'World';</p>}.</p>
    +   *
    +   * <p>
    +   * It will produce the output:</p>
    +   * <pre>
    +   * {
    +   *   sourceCode: "print 'Hello '\n  + 'World';",
    +   *   //                     1          2
    +   *   //           012345678901234 5678901234567
    +   *   spans: [0, #1, 6, #2, 14, #3, 15, #4]
    +   * }
    +   * </pre>
    +   * <p>
    +   * where #1 is a reference to the {@code "print "} text node above, and so
    +   * on for the other text nodes.
    +   * </p>
    +   *
    +   * <p>
    +   * The {@code} spans array is an array of pairs.  Even elements are the start
    +   * indices of substrings, and odd elements are the text nodes (or BR elements)
    +   * that contain the text for those substrings.
    +   * Substrings continue until the next index or the end of the source.
    +   * </p>
    +   *
    +   * @param {Node} node an HTML DOM subtree containing source-code.
    +   * @param {boolean} isPreformatted true if white-space in text nodes should
    +   *    be considered significant.
    +   * @return {Object} source code and the text nodes in which they occur.
    +   */
    +  function extractSourceSpans(node, isPreformatted) {
    +    var nocode = /(?:^|\s)nocode(?:\s|$)/;
    +  
    +    var chunks = [];
    +    var length = 0;
    +    var spans = [];
    +    var k = 0;
    +  
    +    function walk(node) {
    +      switch (node.nodeType) {
    +        case 1:  // Element
    +          if (nocode.test(node.className)) { return; }
    +          for (var child = node.firstChild; child; child = child.nextSibling) {
    +            walk(child);
    +          }
    +          var nodeName = node.nodeName.toLowerCase();
    +          if ('br' === nodeName || 'li' === nodeName) {
    +            chunks[k] = '\n';
    +            spans[k << 1] = length++;
    +            spans[(k++ << 1) | 1] = node;
    +          }
    +          break;
    +        case 3: case 4:  // Text
    +          var text = node.nodeValue;
    +          if (text.length) {
    +            if (!isPreformatted) {
    +              text = text.replace(/[ \t\r\n]+/g, ' ');
    +            } else {
    +              text = text.replace(/\r\n?/g, '\n');  // Normalize newlines.
    +            }
    +            // TODO: handle tabs here?
    +            chunks[k] = text;
    +            spans[k << 1] = length;
    +            length += text.length;
    +            spans[(k++ << 1) | 1] = node;
    +          }
    +          break;
    +      }
    +    }
    +  
    +    walk(node);
    +  
    +    return {
    +      sourceCode: chunks.join('').replace(/\n$/, ''),
    +      spans: spans
    +    };
    +  }
    +
    +
    +  /**
    +   * Apply the given language handler to sourceCode and add the resulting
    +   * decorations to out.
    +   * @param {number} basePos the index of sourceCode within the chunk of source
    +   *    whose decorations are already present on out.
    +   */
    +  function appendDecorations(basePos, sourceCode, langHandler, out) {
    +    if (!sourceCode) { return; }
    +    var job = {
    +      sourceCode: sourceCode,
    +      basePos: basePos
    +    };
    +    langHandler(job);
    +    out.push.apply(out, job.decorations);
    +  }
    +
    +  var notWs = /\S/;
    +
    +  /**
    +   * Given an element, if it contains only one child element and any text nodes
    +   * it contains contain only space characters, return the sole child element.
    +   * Otherwise returns undefined.
    +   * <p>
    +   * This is meant to return the CODE element in {@code <pre><code ...>} when
    +   * there is a single child element that contains all the non-space textual
    +   * content, but not to return anything where there are multiple child elements
    +   * as in {@code <pre><code>...</code><code>...</code></pre>} or when there
    +   * is textual content.
    +   */
    +  function childContentWrapper(element) {
    +    var wrapper = undefined;
    +    for (var c = element.firstChild; c; c = c.nextSibling) {
    +      var type = c.nodeType;
    +      wrapper = (type === 1)  // Element Node
    +          ? (wrapper ? element : c)
    +          : (type === 3)  // Text Node
    +          ? (notWs.test(c.nodeValue) ? element : wrapper)
    +          : wrapper;
    +    }
    +    return wrapper === element ? undefined : wrapper;
    +  }
    +
    +  /** Given triples of [style, pattern, context] returns a lexing function,
    +    * The lexing function interprets the patterns to find token boundaries and
    +    * returns a decoration list of the form
    +    * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
    +    * where index_n is an index into the sourceCode, and style_n is a style
    +    * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
    +    * all characters in sourceCode[index_n-1:index_n].
    +    *
    +    * The stylePatterns is a list whose elements have the form
    +    * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
    +    *
    +    * Style is a style constant like PR_PLAIN, or can be a string of the
    +    * form 'lang-FOO', where FOO is a language extension describing the
    +    * language of the portion of the token in $1 after pattern executes.
    +    * E.g., if style is 'lang-lisp', and group 1 contains the text
    +    * '(hello (world))', then that portion of the token will be passed to the
    +    * registered lisp handler for formatting.
    +    * The text before and after group 1 will be restyled using this decorator
    +    * so decorators should take care that this doesn't result in infinite
    +    * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
    +    * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
    +    * '<script>foo()<\/script>', which would cause the current decorator to
    +    * be called with '<script>' which would not match the same rule since
    +    * group 1 must not be empty, so it would be instead styled as PR_TAG by
    +    * the generic tag rule.  The handler registered for the 'js' extension would
    +    * then be called with 'foo()', and finally, the current decorator would
    +    * be called with '<\/script>' which would not match the original rule and
    +    * so the generic tag rule would identify it as a tag.
    +    *
    +    * Pattern must only match prefixes, and if it matches a prefix, then that
    +    * match is considered a token with the same style.
    +    *
    +    * Context is applied to the last non-whitespace, non-comment token
    +    * recognized.
    +    *
    +    * Shortcut is an optional string of characters, any of which, if the first
    +    * character, gurantee that this pattern and only this pattern matches.
    +    *
    +    * @param {Array} shortcutStylePatterns patterns that always start with
    +    *   a known character.  Must have a shortcut string.
    +    * @param {Array} fallthroughStylePatterns patterns that will be tried in
    +    *   order if the shortcut ones fail.  May have shortcuts.
    +    *
    +    * @return {function (Object)} a
    +    *   function that takes source code and returns a list of decorations.
    +    */
    +  function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
    +    var shortcuts = {};
    +    var tokenizer;
    +    (function () {
    +      var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
    +      var allRegexs = [];
    +      var regexKeys = {};
    +      for (var i = 0, n = allPatterns.length; i < n; ++i) {
    +        var patternParts = allPatterns[i];
    +        var shortcutChars = patternParts[3];
    +        if (shortcutChars) {
    +          for (var c = shortcutChars.length; --c >= 0;) {
    +            shortcuts[shortcutChars.charAt(c)] = patternParts;
    +          }
    +        }
    +        var regex = patternParts[1];
    +        var k = '' + regex;
    +        if (!regexKeys.hasOwnProperty(k)) {
    +          allRegexs.push(regex);
    +          regexKeys[k] = null;
    +        }
    +      }
    +      allRegexs.push(/[\0-\uffff]/);
    +      tokenizer = combinePrefixPatterns(allRegexs);
    +    })();
    +
    +    var nPatterns = fallthroughStylePatterns.length;
    +
    +    /**
    +     * Lexes job.sourceCode and produces an output array job.decorations of
    +     * style classes preceded by the position at which they start in
    +     * job.sourceCode in order.
    +     *
    +     * @param {Object} job an object like <pre>{
    +     *    sourceCode: {string} sourceText plain text,
    +     *    basePos: {int} position of job.sourceCode in the larger chunk of
    +     *        sourceCode.
    +     * }</pre>
    +     */
    +    var decorate = function (job) {
    +      var sourceCode = job.sourceCode, basePos = job.basePos;
    +      /** Even entries are positions in source in ascending order.  Odd enties
    +        * are style markers (e.g., PR_COMMENT) that run from that position until
    +        * the end.
    +        * @type {Array.<number|string>}
    +        */
    +      var decorations = [basePos, PR_PLAIN];
    +      var pos = 0;  // index into sourceCode
    +      var tokens = sourceCode.match(tokenizer) || [];
    +      var styleCache = {};
    +
    +      for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
    +        var token = tokens[ti];
    +        var style = styleCache[token];
    +        var match = void 0;
    +
    +        var isEmbedded;
    +        if (typeof style === 'string') {
    +          isEmbedded = false;
    +        } else {
    +          var patternParts = shortcuts[token.charAt(0)];
    +          if (patternParts) {
    +            match = token.match(patternParts[1]);
    +            style = patternParts[0];
    +          } else {
    +            for (var i = 0; i < nPatterns; ++i) {
    +              patternParts = fallthroughStylePatterns[i];
    +              match = token.match(patternParts[1]);
    +              if (match) {
    +                style = patternParts[0];
    +                break;
    +              }
    +            }
    +
    +            if (!match) {  // make sure that we make progress
    +              style = PR_PLAIN;
    +            }
    +          }
    +
    +          isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
    +          if (isEmbedded && !(match && typeof match[1] === 'string')) {
    +            isEmbedded = false;
    +            style = PR_SOURCE;
    +          }
    +
    +          if (!isEmbedded) { styleCache[token] = style; }
    +        }
    +
    +        var tokenStart = pos;
    +        pos += token.length;
    +
    +        if (!isEmbedded) {
    +          decorations.push(basePos + tokenStart, style);
    +        } else {  // Treat group 1 as an embedded block of source code.
    +          var embeddedSource = match[1];
    +          var embeddedSourceStart = token.indexOf(embeddedSource);
    +          var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
    +          if (match[2]) {
    +            // If embeddedSource can be blank, then it would match at the
    +            // beginning which would cause us to infinitely recurse on the
    +            // entire token, so we catch the right context in match[2].
    +            embeddedSourceEnd = token.length - match[2].length;
    +            embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
    +          }
    +          var lang = style.substring(5);
    +          // Decorate the left of the embedded source
    +          appendDecorations(
    +              basePos + tokenStart,
    +              token.substring(0, embeddedSourceStart),
    +              decorate, decorations);
    +          // Decorate the embedded source
    +          appendDecorations(
    +              basePos + tokenStart + embeddedSourceStart,
    +              embeddedSource,
    +              langHandlerForExtension(lang, embeddedSource),
    +              decorations);
    +          // Decorate the right of the embedded section
    +          appendDecorations(
    +              basePos + tokenStart + embeddedSourceEnd,
    +              token.substring(embeddedSourceEnd),
    +              decorate, decorations);
    +        }
    +      }
    +      job.decorations = decorations;
    +    };
    +    return decorate;
    +  }
    +
    +  /** returns a function that produces a list of decorations from source text.
    +    *
    +    * This code treats ", ', and ` as string delimiters, and \ as a string
    +    * escape.  It does not recognize perl's qq() style strings.
    +    * It has no special handling for double delimiter escapes as in basic, or
    +    * the tripled delimiters used in python, but should work on those regardless
    +    * although in those cases a single string literal may be broken up into
    +    * multiple adjacent string literals.
    +    *
    +    * It recognizes C, C++, and shell style comments.
    +    *
    +    * @param {Object} options a set of optional parameters.
    +    * @return {function (Object)} a function that examines the source code
    +    *     in the input job and builds the decoration list.
    +    */
    +  function sourceDecorator(options) {
    +    var shortcutStylePatterns = [], fallthroughStylePatterns = [];
    +    if (options['tripleQuotedStrings']) {
    +      // '''multi-line-string''', 'single-line-string', and double-quoted
    +      shortcutStylePatterns.push(
    +          [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
    +           null, '\'"']);
    +    } else if (options['multiLineStrings']) {
    +      // 'multi-line-string', "multi-line-string"
    +      shortcutStylePatterns.push(
    +          [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
    +           null, '\'"`']);
    +    } else {
    +      // 'single-line-string', "single-line-string"
    +      shortcutStylePatterns.push(
    +          [PR_STRING,
    +           /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
    +           null, '"\'']);
    +    }
    +    if (options['verbatimStrings']) {
    +      // verbatim-string-literal production from the C# grammar.  See issue 93.
    +      fallthroughStylePatterns.push(
    +          [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
    +    }
    +    var hc = options['hashComments'];
    +    if (hc) {
    +      if (options['cStyleComments']) {
    +        if (hc > 1) {  // multiline hash comments
    +          shortcutStylePatterns.push(
    +              [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);
    +        } else {
    +          // Stop C preprocessor declarations at an unclosed open comment
    +          shortcutStylePatterns.push(
    +              [PR_COMMENT, /^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,
    +               null, '#']);
    +        }
    +        // #include <stdio.h>
    +        fallthroughStylePatterns.push(
    +            [PR_STRING,
    +             /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,
    +             null]);
    +      } else {
    +        shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
    +      }
    +    }
    +    if (options['cStyleComments']) {
    +      fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
    +      fallthroughStylePatterns.push(
    +          [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
    +    }
    +    if (options['regexLiterals']) {
    +      /**
    +       * @const
    +       */
    +      var REGEX_LITERAL = (
    +          // A regular expression literal starts with a slash that is
    +          // not followed by * or / so that it is not confused with
    +          // comments.
    +          '/(?=[^/*])'
    +          // and then contains any number of raw characters,
    +          + '(?:[^/\\x5B\\x5C]'
    +          // escape sequences (\x5C),
    +          +    '|\\x5C[\\s\\S]'
    +          // or non-nesting character sets (\x5B\x5D);
    +          +    '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+'
    +          // finally closed by a /.
    +          + '/');
    +      fallthroughStylePatterns.push(
    +          ['lang-regex',
    +           new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
    +           ]);
    +    }
    +
    +    var types = options['types'];
    +    if (types) {
    +      fallthroughStylePatterns.push([PR_TYPE, types]);
    +    }
    +
    +    var keywords = ("" + options['keywords']).replace(/^ | $/g, '');
    +    if (keywords.length) {
    +      fallthroughStylePatterns.push(
    +          [PR_KEYWORD,
    +           new RegExp('^(?:' + keywords.replace(/[\s,]+/g, '|') + ')\\b'),
    +           null]);
    +    }
    +
    +    shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
    +
    +    var punctuation =
    +      // The Bash man page says
    +
    +      // A word is a sequence of characters considered as a single
    +      // unit by GRUB. Words are separated by metacharacters,
    +      // which are the following plus space, tab, and newline: { }
    +      // | & $ ; < >
    +      // ...
    +      
    +      // A word beginning with # causes that word and all remaining
    +      // characters on that line to be ignored.
    +
    +      // which means that only a '#' after /(?:^|[{}|&$;<>\s])/ starts a
    +      // comment but empirically
    +      // $ echo {#}
    +      // {#}
    +      // $ echo \$#
    +      // $#
    +      // $ echo }#
    +      // }#
    +
    +      // so /(?:^|[|&;<>\s])/ is more appropriate.
    +
    +      // http://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC3
    +      // suggests that this definition is compatible with a
    +      // default mode that tries to use a single token definition
    +      // to recognize both bash/python style comments and C
    +      // preprocessor directives.
    +
    +      // This definition of punctuation does not include # in the list of
    +      // follow-on exclusions, so # will not be broken before if preceeded
    +      // by a punctuation character.  We could try to exclude # after
    +      // [|&;<>] but that doesn't seem to cause many major problems.
    +      // If that does turn out to be a problem, we should change the below
    +      // when hc is truthy to include # in the run of punctuation characters
    +      // only when not followint [|&;<>].
    +      /^.[^\s\w\.$@\'\"\`\/\\]*/;
    +
    +    fallthroughStylePatterns.push(
    +        // TODO(mikesamuel): recognize non-latin letters and numerals in idents
    +        [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
    +        [PR_TYPE,        /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/, null],
    +        [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
    +        [PR_LITERAL,
    +         new RegExp(
    +             '^(?:'
    +             // A hex number
    +             + '0x[a-f0-9]+'
    +             // or an octal or decimal number,
    +             + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
    +             // possibly in scientific notation
    +             + '(?:e[+\\-]?\\d+)?'
    +             + ')'
    +             // with an optional modifier like UL for unsigned long
    +             + '[a-z]*', 'i'),
    +         null, '0123456789'],
    +        // Don't treat escaped quotes in bash as starting strings.  See issue 144.
    +        [PR_PLAIN,       /^\\[\s\S]?/, null],
    +        [PR_PUNCTUATION, punctuation, null]);
    +
    +    return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
    +  }
    +
    +  var decorateSource = sourceDecorator({
    +        'keywords': ALL_KEYWORDS,
    +        'hashComments': true,
    +        'cStyleComments': true,
    +        'multiLineStrings': true,
    +        'regexLiterals': true
    +      });
    +
    +  /**
    +   * Given a DOM subtree, wraps it in a list, and puts each line into its own
    +   * list item.
    +   *
    +   * @param {Node} node modified in place.  Its content is pulled into an
    +   *     HTMLOListElement, and each line is moved into a separate list item.
    +   *     This requires cloning elements, so the input might not have unique
    +   *     IDs after numbering.
    +   * @param {boolean} isPreformatted true iff white-space in text nodes should
    +   *     be treated as significant.
    +   */
    +  function numberLines(node, opt_startLineNum, isPreformatted) {
    +    var nocode = /(?:^|\s)nocode(?:\s|$)/;
    +    var lineBreak = /\r\n?|\n/;
    +  
    +    var document = node.ownerDocument;
    +  
    +    var li = document.createElement('li');
    +    while (node.firstChild) {
    +      li.appendChild(node.firstChild);
    +    }
    +    // An array of lines.  We split below, so this is initialized to one
    +    // un-split line.
    +    var listItems = [li];
    +  
    +    function walk(node) {
    +      switch (node.nodeType) {
    +        case 1:  // Element
    +          if (nocode.test(node.className)) { break; }
    +          if ('br' === node.nodeName) {
    +            breakAfter(node);
    +            // Discard the <BR> since it is now flush against a </LI>.
    +            if (node.parentNode) {
    +              node.parentNode.removeChild(node);
    +            }
    +          } else {
    +            for (var child = node.firstChild; child; child = child.nextSibling) {
    +              walk(child);
    +            }
    +          }
    +          break;
    +        case 3: case 4:  // Text
    +          if (isPreformatted) {
    +            var text = node.nodeValue;
    +            var match = text.match(lineBreak);
    +            if (match) {
    +              var firstLine = text.substring(0, match.index);
    +              node.nodeValue = firstLine;
    +              var tail = text.substring(match.index + match[0].length);
    +              if (tail) {
    +                var parent = node.parentNode;
    +                parent.insertBefore(
    +                    document.createTextNode(tail), node.nextSibling);
    +              }
    +              breakAfter(node);
    +              if (!firstLine) {
    +                // Don't leave blank text nodes in the DOM.
    +                node.parentNode.removeChild(node);
    +              }
    +            }
    +          }
    +          break;
    +      }
    +    }
    +  
    +    // Split a line after the given node.
    +    function breakAfter(lineEndNode) {
    +      // If there's nothing to the right, then we can skip ending the line
    +      // here, and move root-wards since splitting just before an end-tag
    +      // would require us to create a bunch of empty copies.
    +      while (!lineEndNode.nextSibling) {
    +        lineEndNode = lineEndNode.parentNode;
    +        if (!lineEndNode) { return; }
    +      }
    +  
    +      function breakLeftOf(limit, copy) {
    +        // Clone shallowly if this node needs to be on both sides of the break.
    +        var rightSide = copy ? limit.cloneNode(false) : limit;
    +        var parent = limit.parentNode;
    +        if (parent) {
    +          // We clone the parent chain.
    +          // This helps us resurrect important styling elements that cross lines.
    +          // E.g. in <i>Foo<br>Bar</i>
    +          // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.
    +          var parentClone = breakLeftOf(parent, 1);
    +          // Move the clone and everything to the right of the original
    +          // onto the cloned parent.
    +          var next = limit.nextSibling;
    +          parentClone.appendChild(rightSide);
    +          for (var sibling = next; sibling; sibling = next) {
    +            next = sibling.nextSibling;
    +            parentClone.appendChild(sibling);
    +          }
    +        }
    +        return rightSide;
    +      }
    +  
    +      var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);
    +  
    +      // Walk the parent chain until we reach an unattached LI.
    +      for (var parent;
    +           // Check nodeType since IE invents document fragments.
    +           (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {
    +        copiedListItem = parent;
    +      }
    +      // Put it on the list of lines for later processing.
    +      listItems.push(copiedListItem);
    +    }
    +  
    +    // Split lines while there are lines left to split.
    +    for (var i = 0;  // Number of lines that have been split so far.
    +         i < listItems.length;  // length updated by breakAfter calls.
    +         ++i) {
    +      walk(listItems[i]);
    +    }
    +  
    +    // Make sure numeric indices show correctly.
    +    if (opt_startLineNum === (opt_startLineNum|0)) {
    +      listItems[0].setAttribute('value', opt_startLineNum);
    +    }
    +  
    +    var ol = document.createElement('ol');
    +    ol.className = 'linenums';
    +    var offset = Math.max(0, ((opt_startLineNum - 1 /* zero index */)) | 0) || 0;
    +    for (var i = 0, n = listItems.length; i < n; ++i) {
    +      li = listItems[i];
    +      // Stick a class on the LIs so that stylesheets can
    +      // color odd/even rows, or any other row pattern that
    +      // is co-prime with 10.
    +      li.className = 'L' + ((i + offset) % 10);
    +      if (!li.firstChild) {
    +        li.appendChild(document.createTextNode('\xA0'));
    +      }
    +      ol.appendChild(li);
    +    }
    +  
    +    node.appendChild(ol);
    +  }
    +
    +  /**
    +   * Breaks {@code job.sourceCode} around style boundaries in
    +   * {@code job.decorations} and modifies {@code job.sourceNode} in place.
    +   * @param {Object} job like <pre>{
    +   *    sourceCode: {string} source as plain text,
    +   *    spans: {Array.<number|Node>} alternating span start indices into source
    +   *       and the text node or element (e.g. {@code <BR>}) corresponding to that
    +   *       span.
    +   *    decorations: {Array.<number|string} an array of style classes preceded
    +   *       by the position at which they start in job.sourceCode in order
    +   * }</pre>
    +   * @private
    +   */
    +  function recombineTagsAndDecorations(job) {
    +    var isIE8OrEarlier = /\bMSIE\s(\d+)/.exec(navigator.userAgent);
    +    isIE8OrEarlier = isIE8OrEarlier && +isIE8OrEarlier[1] <= 8;
    +    var newlineRe = /\n/g;
    +  
    +    var source = job.sourceCode;
    +    var sourceLength = source.length;
    +    // Index into source after the last code-unit recombined.
    +    var sourceIndex = 0;
    +  
    +    var spans = job.spans;
    +    var nSpans = spans.length;
    +    // Index into spans after the last span which ends at or before sourceIndex.
    +    var spanIndex = 0;
    +  
    +    var decorations = job.decorations;
    +    var nDecorations = decorations.length;
    +    // Index into decorations after the last decoration which ends at or before
    +    // sourceIndex.
    +    var decorationIndex = 0;
    +  
    +    // Remove all zero-length decorations.
    +    decorations[nDecorations] = sourceLength;
    +    var decPos, i;
    +    for (i = decPos = 0; i < nDecorations;) {
    +      if (decorations[i] !== decorations[i + 2]) {
    +        decorations[decPos++] = decorations[i++];
    +        decorations[decPos++] = decorations[i++];
    +      } else {
    +        i += 2;
    +      }
    +    }
    +    nDecorations = decPos;
    +  
    +    // Simplify decorations.
    +    for (i = decPos = 0; i < nDecorations;) {
    +      var startPos = decorations[i];
    +      // Conflate all adjacent decorations that use the same style.
    +      var startDec = decorations[i + 1];
    +      var end = i + 2;
    +      while (end + 2 <= nDecorations && decorations[end + 1] === startDec) {
    +        end += 2;
    +      }
    +      decorations[decPos++] = startPos;
    +      decorations[decPos++] = startDec;
    +      i = end;
    +    }
    +  
    +    nDecorations = decorations.length = decPos;
    +  
    +    var sourceNode = job.sourceNode;
    +    var oldDisplay;
    +    if (sourceNode) {
    +      oldDisplay = sourceNode.style.display;
    +      sourceNode.style.display = 'none';
    +    }
    +    try {
    +      var decoration = null;
    +      while (spanIndex < nSpans) {
    +        var spanStart = spans[spanIndex];
    +        var spanEnd = spans[spanIndex + 2] || sourceLength;
    +  
    +        var decEnd = decorations[decorationIndex + 2] || sourceLength;
    +  
    +        var end = Math.min(spanEnd, decEnd);
    +  
    +        var textNode = spans[spanIndex + 1];
    +        var styledText;
    +        if (textNode.nodeType !== 1  // Don't muck with <BR>s or <LI>s
    +            // Don't introduce spans around empty text nodes.
    +            && (styledText = source.substring(sourceIndex, end))) {
    +          // This may seem bizarre, and it is.  Emitting LF on IE causes the
    +          // code to display with spaces instead of line breaks.
    +          // Emitting Windows standard issue linebreaks (CRLF) causes a blank
    +          // space to appear at the beginning of every line but the first.
    +          // Emitting an old Mac OS 9 line separator makes everything spiffy.
    +          if (isIE8OrEarlier) {
    +            styledText = styledText.replace(newlineRe, '\r');
    +          }
    +          textNode.nodeValue = styledText;
    +          var document = textNode.ownerDocument;
    +          var span = document.createElement('span');
    +          span.className = decorations[decorationIndex + 1];
    +          var parentNode = textNode.parentNode;
    +          parentNode.replaceChild(span, textNode);
    +          span.appendChild(textNode);
    +          if (sourceIndex < spanEnd) {  // Split off a text node.
    +            spans[spanIndex + 1] = textNode
    +                // TODO: Possibly optimize by using '' if there's no flicker.
    +                = document.createTextNode(source.substring(end, spanEnd));
    +            parentNode.insertBefore(textNode, span.nextSibling);
    +          }
    +        }
    +  
    +        sourceIndex = end;
    +  
    +        if (sourceIndex >= spanEnd) {
    +          spanIndex += 2;
    +        }
    +        if (sourceIndex >= decEnd) {
    +          decorationIndex += 2;
    +        }
    +      }
    +    } finally {
    +      if (sourceNode) {
    +        sourceNode.style.display = oldDisplay;
    +      }
    +    }
    +  }
    +
    +
    +  /** Maps language-specific file extensions to handlers. */
    +  var langHandlerRegistry = {};
    +  /** Register a language handler for the given file extensions.
    +    * @param {function (Object)} handler a function from source code to a list
    +    *      of decorations.  Takes a single argument job which describes the
    +    *      state of the computation.   The single parameter has the form
    +    *      {@code {
    +    *        sourceCode: {string} as plain text.
    +    *        decorations: {Array.<number|string>} an array of style classes
    +    *                     preceded by the position at which they start in
    +    *                     job.sourceCode in order.
    +    *                     The language handler should assigned this field.
    +    *        basePos: {int} the position of source in the larger source chunk.
    +    *                 All positions in the output decorations array are relative
    +    *                 to the larger source chunk.
    +    *      } }
    +    * @param {Array.<string>} fileExtensions
    +    */
    +  function registerLangHandler(handler, fileExtensions) {
    +    for (var i = fileExtensions.length; --i >= 0;) {
    +      var ext = fileExtensions[i];
    +      if (!langHandlerRegistry.hasOwnProperty(ext)) {
    +        langHandlerRegistry[ext] = handler;
    +      } else if (win['console']) {
    +        console['warn']('cannot override language handler %s', ext);
    +      }
    +    }
    +  }
    +  function langHandlerForExtension(extension, source) {
    +    if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
    +      // Treat it as markup if the first non whitespace character is a < and
    +      // the last non-whitespace character is a >.
    +      extension = /^\s*</.test(source)
    +          ? 'default-markup'
    +          : 'default-code';
    +    }
    +    return langHandlerRegistry[extension];
    +  }
    +  registerLangHandler(decorateSource, ['default-code']);
    +  registerLangHandler(
    +      createSimpleLexer(
    +          [],
    +          [
    +           [PR_PLAIN,       /^[^<?]+/],
    +           [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
    +           [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
    +           // Unescaped content in an unknown language
    +           ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
    +           ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
    +           [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
    +           ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
    +           // Unescaped content in javascript.  (Or possibly vbscript).
    +           ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
    +           // Contains unescaped stylesheet content
    +           ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
    +           ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
    +          ]),
    +      ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
    +  registerLangHandler(
    +      createSimpleLexer(
    +          [
    +           [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
    +           [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
    +           ],
    +          [
    +           [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
    +           [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
    +           ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
    +           [PR_PUNCTUATION,  /^[=<>\/]+/],
    +           ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
    +           ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
    +           ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
    +           ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
    +           ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
    +           ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
    +           ]),
    +      ['in.tag']);
    +  registerLangHandler(
    +      createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': CPP_KEYWORDS,
    +          'hashComments': true,
    +          'cStyleComments': true,
    +          'types': C_TYPES
    +        }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': 'null,true,false'
    +        }), ['json']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': CSHARP_KEYWORDS,
    +          'hashComments': true,
    +          'cStyleComments': true,
    +          'verbatimStrings': true,
    +          'types': C_TYPES
    +        }), ['cs']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': JAVA_KEYWORDS,
    +          'cStyleComments': true
    +        }), ['java']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': SH_KEYWORDS,
    +          'hashComments': true,
    +          'multiLineStrings': true
    +        }), ['bsh', 'csh', 'sh']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': PYTHON_KEYWORDS,
    +          'hashComments': true,
    +          'multiLineStrings': true,
    +          'tripleQuotedStrings': true
    +        }), ['cv', 'py']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': PERL_KEYWORDS,
    +          'hashComments': true,
    +          'multiLineStrings': true,
    +          'regexLiterals': true
    +        }), ['perl', 'pl', 'pm']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': RUBY_KEYWORDS,
    +          'hashComments': true,
    +          'multiLineStrings': true,
    +          'regexLiterals': true
    +        }), ['rb']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': JSCRIPT_KEYWORDS,
    +          'cStyleComments': true,
    +          'regexLiterals': true
    +        }), ['js']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': COFFEE_KEYWORDS,
    +          'hashComments': 3,  // ### style block comments
    +          'cStyleComments': true,
    +          'multilineStrings': true,
    +          'tripleQuotedStrings': true,
    +          'regexLiterals': true
    +        }), ['coffee']);
    +  registerLangHandler(
    +      createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
    +
    +  function applyDecorator(job) {
    +    var opt_langExtension = job.langExtension;
    +
    +    try {
    +      // Extract tags, and convert the source code to plain text.
    +      var sourceAndSpans = extractSourceSpans(job.sourceNode, job.pre);
    +      /** Plain text. @type {string} */
    +      var source = sourceAndSpans.sourceCode;
    +      job.sourceCode = source;
    +      job.spans = sourceAndSpans.spans;
    +      job.basePos = 0;
    +
    +      // Apply the appropriate language handler
    +      langHandlerForExtension(opt_langExtension, source)(job);
    +
    +      // Integrate the decorations and tags back into the source code,
    +      // modifying the sourceNode in place.
    +      recombineTagsAndDecorations(job);
    +    } catch (e) {
    +      if (win['console']) {
    +        console['log'](e && e['stack'] ? e['stack'] : e);
    +      }
    +    }
    +  }
    +
    +  /**
    +   * @param sourceCodeHtml {string} The HTML to pretty print.
    +   * @param opt_langExtension {string} The language name to use.
    +   *     Typically, a filename extension like 'cpp' or 'java'.
    +   * @param opt_numberLines {number|boolean} True to number lines,
    +   *     or the 1-indexed number of the first line in sourceCodeHtml.
    +   */
    +  function prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {
    +    var container = document.createElement('pre');
    +    // This could cause images to load and onload listeners to fire.
    +    // E.g. <img onerror="alert(1337)" src="nosuchimage.png">.
    +    // We assume that the inner HTML is from a trusted source.
    +    container.innerHTML = sourceCodeHtml;
    +    if (opt_numberLines) {
    +      numberLines(container, opt_numberLines, true);
    +    }
    +
    +    var job = {
    +      langExtension: opt_langExtension,
    +      numberLines: opt_numberLines,
    +      sourceNode: container,
    +      pre: 1
    +    };
    +    applyDecorator(job);
    +    return container.innerHTML;
    +  }
    +
    +  function prettyPrint(opt_whenDone) {
    +    function byTagName(tn) { return document.getElementsByTagName(tn); }
    +    // fetch a list of nodes to rewrite
    +    var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
    +    var elements = [];
    +    for (var i = 0; i < codeSegments.length; ++i) {
    +      for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
    +        elements.push(codeSegments[i][j]);
    +      }
    +    }
    +    codeSegments = null;
    +
    +    var clock = Date;
    +    if (!clock['now']) {
    +      clock = { 'now': function () { return +(new Date); } };
    +    }
    +
    +    // The loop is broken into a series of continuations to make sure that we
    +    // don't make the browser unresponsive when rewriting a large page.
    +    var k = 0;
    +    var prettyPrintingJob;
    +
    +    var langExtensionRe = /\blang(?:uage)?-([\w.]+)(?!\S)/;
    +    var prettyPrintRe = /\bprettyprint\b/;
    +    var prettyPrintedRe = /\bprettyprinted\b/;
    +    var preformattedTagNameRe = /pre|xmp/i;
    +    var codeRe = /^code$/i;
    +    var preCodeXmpRe = /^(?:pre|code|xmp)$/i;
    +
    +    function doWork() {
    +      var endTime = (win['PR_SHOULD_USE_CONTINUATION'] ?
    +                     clock['now']() + 250 /* ms */ :
    +                     Infinity);
    +      for (; k < elements.length && clock['now']() < endTime; k++) {
    +        var cs = elements[k];
    +        var className = cs.className;
    +        if (prettyPrintRe.test(className)
    +            // Don't redo this if we've already done it.
    +            // This allows recalling pretty print to just prettyprint elements
    +            // that have been added to the page since last call.
    +            && !prettyPrintedRe.test(className)) {
    +
    +          // make sure this is not nested in an already prettified element
    +          var nested = false;
    +          for (var p = cs.parentNode; p; p = p.parentNode) {
    +            var tn = p.tagName;
    +            if (preCodeXmpRe.test(tn)
    +                && p.className && prettyPrintRe.test(p.className)) {
    +              nested = true;
    +              break;
    +            }
    +          }
    +          if (!nested) {
    +            // Mark done.  If we fail to prettyprint for whatever reason,
    +            // we shouldn't try again.
    +            cs.className += ' prettyprinted';
    +
    +            // If the classes includes a language extensions, use it.
    +            // Language extensions can be specified like
    +            //     <pre class="prettyprint lang-cpp">
    +            // the language extension "cpp" is used to find a language handler
    +            // as passed to PR.registerLangHandler.
    +            // HTML5 recommends that a language be specified using "language-"
    +            // as the prefix instead.  Google Code Prettify supports both.
    +            // http://dev.w3.org/html5/spec-author-view/the-code-element.html
    +            var langExtension = className.match(langExtensionRe);
    +            // Support <pre class="prettyprint"><code class="language-c">
    +            var wrapper;
    +            if (!langExtension && (wrapper = childContentWrapper(cs))
    +                && codeRe.test(wrapper.tagName)) {
    +              langExtension = wrapper.className.match(langExtensionRe);
    +            }
    +
    +            if (langExtension) { langExtension = langExtension[1]; }
    +
    +            var preformatted;
    +            if (preformattedTagNameRe.test(cs.tagName)) {
    +              preformatted = 1;
    +            } else {
    +              var currentStyle = cs['currentStyle'];
    +              var whitespace = (
    +                  currentStyle
    +                  ? currentStyle['whiteSpace']
    +                  : (document.defaultView
    +                     && document.defaultView.getComputedStyle)
    +                  ? document.defaultView.getComputedStyle(cs, null)
    +                  .getPropertyValue('white-space')
    +                  : 0);
    +              preformatted = whitespace
    +                  && 'pre' === whitespace.substring(0, 3);
    +            }
    +
    +            // Look for a class like linenums or linenums:<n> where <n> is the
    +            // 1-indexed number of the first line.
    +            var lineNums = cs.className.match(/\blinenums\b(?::(\d+))?/);
    +            lineNums = lineNums
    +                ? lineNums[1] && lineNums[1].length ? +lineNums[1] : true
    +                : false;
    +            if (lineNums) { numberLines(cs, lineNums, preformatted); }
    +
    +            // do the pretty printing
    +            prettyPrintingJob = {
    +              langExtension: langExtension,
    +              sourceNode: cs,
    +              numberLines: lineNums,
    +              pre: preformatted
    +            };
    +            applyDecorator(prettyPrintingJob);
    +          }
    +        }
    +      }
    +      if (k < elements.length) {
    +        // finish up in a continuation
    +        setTimeout(doWork, 250);
    +      } else if (opt_whenDone) {
    +        opt_whenDone();
    +      }
    +    }
    +
    +    doWork();
    +  }
    +
    +  /**
    +   * Contains functions for creating and registering new language handlers.
    +   * @type {Object}
    +   */
    +  var PR = win['PR'] = {
    +        'createSimpleLexer': createSimpleLexer,
    +        'registerLangHandler': registerLangHandler,
    +        'sourceDecorator': sourceDecorator,
    +        'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
    +        'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
    +        'PR_COMMENT': PR_COMMENT,
    +        'PR_DECLARATION': PR_DECLARATION,
    +        'PR_KEYWORD': PR_KEYWORD,
    +        'PR_LITERAL': PR_LITERAL,
    +        'PR_NOCODE': PR_NOCODE,
    +        'PR_PLAIN': PR_PLAIN,
    +        'PR_PUNCTUATION': PR_PUNCTUATION,
    +        'PR_SOURCE': PR_SOURCE,
    +        'PR_STRING': PR_STRING,
    +        'PR_TAG': PR_TAG,
    +        'PR_TYPE': PR_TYPE,
    +        'prettyPrintOne': win['prettyPrintOne'] = prettyPrintOne,
    +        'prettyPrint': win['prettyPrint'] = prettyPrint
    +      };
    +
    +  // Make PR available via the Asynchronous Module Definition (AMD) API.
    +  // Per https://github.com/amdjs/amdjs-api/wiki/AMD:
    +  // The Asynchronous Module Definition (AMD) API specifies a
    +  // mechanism for defining modules such that the module and its
    +  // dependencies can be asynchronously loaded.
    +  // ...
    +  // To allow a clear indicator that a global define function (as
    +  // needed for script src browser loading) conforms to the AMD API,
    +  // any global define function SHOULD have a property called "amd"
    +  // whose value is an object. This helps avoid conflict with any
    +  // other existing JavaScript code that could have defined a define()
    +  // function that does not conform to the AMD API.
    +  if (typeof define === "function" && define['amd']) {
    +    define("google-code-prettify", [], function () {
    +      return PR; 
    +    });
    +  }
    +})();
    +
    +
    +// ***** Customization begin
    +
    +// Contributed by Ryan Grove <ryan@wonko.com>
    +/**
    + * @fileoverview
    + * Registers a language handler for Handlebars.
    + *
    + * @author Ryan Grove <ryan@wonko.com>
    + */
    +
    +PR['registerLangHandler'](
    +  PR['createSimpleLexer'](
    +    [],
    +    [
    +      // -- HTML ---------------------------------------------------------------
    +      [PR['PR_DECLARATION'], /^<!\w[^>]*(?:>|$)/],
    +      [PR['PR_COMMENT'],     /^<\!--[\s\S]*?(?:-\->|$)/],
    +      [PR['PR_PUNCTUATION'], /^(?:<[%?]|[%?]>)/],
    +
    +      // Unescaped content in an unknown language
    +      ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
    +      ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
    +      ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
    +
    +      // Unescaped Handlebars template in JavaScript.
    +      ['lang-handlebars', /^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
    +
    +      // Unescaped content in javascript.  (Or possibly vbscript).
    +      ['lang-js',         /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
    +
    +      // Contains unescaped stylesheet content
    +      ['lang-css',        /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
    +      ['lang-in.tag',     /^(<\/?[a-z][^<>]*>)/i],
    +
    +      // -- Handlebars ---------------------------------------------------------
    +      // Tag (escaped).
    +      [PR['PR_DECLARATION'], /^{{[#^>/]?\s*[\w.][^}]*}}/],
    +
    +      // Tag (unescaped).
    +      [PR['PR_DECLARATION'], /^{{&?\s*[\w.][^}]*}}/],
    +
    +      // Tag (unescaped).
    +      [PR['PR_DECLARATION'], /^{{{>?\s*[\w.][^}]*}}}/],
    +
    +      // Comment.
    +      [PR['PR_COMMENT'], /^{{![^}]*}}/]
    +    ]),
    +['handlebars', 'hbs']);
    +
    +
    +
    +// Copyright (C) 2009 Google Inc.
    +//
    +// Licensed under the Apache License, Version 2.0 (the "License");
    +// you may not use this file except in compliance with the License.
    +// You may obtain a copy of the License at
    +//
    +//      http://www.apache.org/licenses/LICENSE-2.0
    +//
    +// Unless required by applicable law or agreed to in writing, software
    +// distributed under the License is distributed on an "AS IS" BASIS,
    +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +// See the License for the specific language governing permissions and
    +// limitations under the License.
    +
    +/**
    + * @fileoverview
    + * Registers a language handler for CSS.
    + *
    + *
    + * To use, include prettify.js and this file in your HTML page.
    + * Then put your code in an HTML tag like
    + *      <pre class="prettyprint lang-css"></pre>
    + *
    + *
    + * http://www.w3.org/TR/CSS21/grammar.html Section G2 defines the lexical
    + * grammar.  This scheme does not recognize keywords containing escapes.
    + *
    + * @author mikesamuel@gmail.com
    + */
    +
    +PR['registerLangHandler'](
    +    PR['createSimpleLexer'](
    +        [
    +         // The space production <s>
    +         [PR['PR_PLAIN'],       /^[ \t\r\n\f]+/, null, ' \t\r\n\f']
    +        ],
    +        [
    +         // Quoted strings.  <string1> and <string2>
    +         [PR['PR_STRING'],
    +          /^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/, null],
    +         [PR['PR_STRING'],
    +          /^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/, null],
    +         ['lang-css-str', /^url\(([^\)\"\']*)\)/i],
    +         [PR['PR_KEYWORD'],
    +          /^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,
    +          null],
    +         // A property name -- an identifier followed by a colon.
    +         ['lang-css-kw', /^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],
    +         // A C style block comment.  The <comment> production.
    +         [PR['PR_COMMENT'], /^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],
    +         // Escaping text spans
    +         [PR['PR_COMMENT'], /^(?:<!--|-->)/],
    +         // A number possibly containing a suffix.
    +         [PR['PR_LITERAL'], /^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],
    +         // A hex color
    +         [PR['PR_LITERAL'], /^#(?:[0-9a-f]{3}){1,2}/i],
    +         // An identifier
    +         [PR['PR_PLAIN'],
    +          /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],
    +         // A run of punctuation
    +         [PR['PR_PUNCTUATION'], /^[^\s\w\'\"]+/]
    +        ]),
    +    ['css']);
    +PR['registerLangHandler'](
    +    PR['createSimpleLexer']([],
    +        [
    +         [PR['PR_KEYWORD'],
    +          /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]
    +        ]),
    +    ['css-kw']);
    +PR['registerLangHandler'](
    +    PR['createSimpleLexer']([],
    +        [
    +         [PR['PR_STRING'], /^[^\)\"\']+/]
    +        ]),
    +    ['css-str']);
    +
    +
    +// ****** Customization end
    \ No newline at end of file
    diff --git a/conf/docs/index.mustache b/conf/docs/index.mustache
    new file mode 100644
    index 00000000..737f2491
    --- /dev/null
    +++ b/conf/docs/index.mustache
    @@ -0,0 +1,87 @@
    +<h2>Welcome to YUIDoc {{version}}!</h2>
    +
    +<div class="intro">
    +    <p>YUIDoc is a <a href="http://nodejs.org/">Node.js</a> application that
    +    generates API documentation from comments in source, using a syntax similar 
    +    to tools like Javadoc and Doxygen. YUIDoc provides:</p>
    +
    +    <ul>
    +        <li><b>Live previews.</b> YUIDoc includes a 
    +        <a href="args/index.html#server">standalone doc server</a>, 
    +        making it trivial to preview your docs as you write.</li>
    +        <li><b>Modern markup.</b> YUIDoc's generated documentation is an
    +        <a href="http://yuilibrary.com/yui/docs/api/classes/Model.html">attractive, 
    +        functional web application</a> with real URLs and graceful 
    +        fallbacks for spiders and other agents that can't run JavaScript.</li> 
    +        <li><b>Wide language support.</b> YUIDoc was originally designed for 
    +        the <a href="http://yuilibrary.com">YUI project</a>, but it is not
    +        tied to any particular library or programming language. 
    +        You can use it with any language that supports
    +        `/* */` comment blocks.</li>
    +    </ul>
    +</p>
    +</div>
    +
    +<h2 id="#install">Installation and Usage</h2>
    +
    +<ol>
    +    <li>Download and install <a href="http://nodejs.org/#download">Node.js</a></li>
    +    <li>Run `npm -g install yuidocjs`.</li>
    +    <li>Run `yuidoc .` at the top of your JS source tree.</li>
    +</ol>
    +
    +<p>That's it! For more information about running the `yuidoc` commandline tool,
    +refer to "<a href="args/index.html">Using YUIDoc</a>".</p>
    +
    +<h2>User Guides</h2>
    +
    +<ul>
    +  {{#components}}
    +    {{#meta}}
    +    <li><a href="{{name}}/index.html">{{displayName}}</a> &mdash; {{description}}</li>
    +    {{/meta}}
    +  {{/components}}
    +</ul>
    +
    +<h2>Example YUIDoc Comment Blocks</h2>
    +
    +<p>YUIDoc parses a modified form of JSDoc tags. 
    +This section provides a taste of some of the more common constructs in YUIDoc.
    +For more information, refer to the "<a href="./syntax/index.html">YUIDoc Syntax Reference</a>".</p>
    +
    +<h3>Example Class Block</h3>
    +```
    +/**
    +* This is the description for my class.
    +*
    +* @class MyClass
    +* @constructor
    +*/
    +```
    +<h3>Example Method Block</h3>
    +```
    +/**
    +* My method description.  Like other pieces of your comment blocks, 
    +* this can span multiple lines.
    +*
    +* @method methodName
    +* @param {String} foo Argument 1
    +* @param {Object} config A config object
    +* @param {String} config.name The name on the config object
    +* @param {Function} config.callback A callback function on the config object
    +* @param {Boolean} [extra=false] Do extra, optional work
    +* @return {Boolean} Returns true on success
    +*/
    +```
    +
    +<h3>Example Property Block</h3>
    +```
    +/**
    +* My property description.  Like other pieces of your comment blocks, 
    +* this can span multiple lines.
    +* 
    +* @property propertyName
    +* @type {Object}
    +* @default "foo"
    +*/
    +```
    diff --git a/conf/docs/layouts/main.mustache b/conf/docs/layouts/main.mustache
    new file mode 100644
    index 00000000..358402eb
    --- /dev/null
    +++ b/conf/docs/layouts/main.mustache
    @@ -0,0 +1,112 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>{{htmlTitle}}</title>
    +    <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Maven+Pro:400,700">
    +    <link rel="stylesheet" href="{{yuiGridsUrl}}">
    +    <link rel="stylesheet" href="{{projectAssets}}/css/main.css">
    +    <link rel="stylesheet" href="{{projectAssets}}/vendor/prettify/prettify-min.css">
    +    <link rel="icon" href="{{projectAssets}}/favicon.ico">
    +    <script src="{{yuiSeedUrl}}"></script>
    +</head>
    +<body>
    +<a href="https://github.com/yui/yuidoc"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub"></a>
    +<div id="doc">
    +    <div id="hd">
    +        <h1><img src="http://yuilibrary.com/img/yui-logo-2x.png" width="117" height="52">{{title}}</h1>
    +    </div>
    +    {{#if description}}
    +    <div class="crumbs">
    +        <a href="{{projectBase}}">Main Page</a> <a name="Arrow">&gt;</a> <a href="{{projectBase}}{{name}}/index.html">{{title}}</a>
    +    </div>
    +    {{/if}}
    +    {{^hideTableOfContents}}
    +        <a href="#toc" class="jump">Jump to Table of Contents</a>
    +    {{/hideTableOfContents}}
    +
    +    <div class="yui3-g">
    +        <div class="yui3-u-3-4">
    +            <div id="main">
    +                <div class="content">{{>layout_content}}</div>
    +            </div>
    +        </div>
    +
    +        <div class="yui3-u-1-4">
    +            <div class="sidebar">
    +                <ul class="links">
    +                    <li><a href="https://github.com/yui/yuidoc/" class="button">Get the Source</a></li>
    +                    <li><a href="https://groups.google.com/forum/#!forum/yuidoc" class="button">Questions? Join the Mailing List</a></li>
    +                    <li><a href="https://github.com/yui/yuidoc/issues/" class="button">File an Issue</a></li>
    +                    <li><a href="{{projectBase}}api/" class="button">View API Documentation</a></li>
    +                </ul>
    +                <div class="sidebox">
    +                    <div class="hd">
    +                        <h2 class="no-toc">Build Status</h2>
    +                    </div>
    +
    +                    <div class="bd">
    +                        <a href="http://travis-ci.org/yui/yuidoc"><img src="https://secure.travis-ci.org/yui/yuidoc.png?branch=master" border="0"></a>
    +                    </div>
    +                </div>
    +                {{^hideTableOfContents}}
    +                    <div id="toc" class="sidebox">
    +                        <div class="hd">
    +                            <h2 class="no-toc">Table of Contents</h2>
    +                        </div>
    +
    +                        <div class="bd">
    +                            {{toc}}
    +                        </div>
    +                    </div>
    +                {{/hideTableOfContents}}
    +
    +                {{#if hasOwnExamples}}
    +                    <div class="sidebox">
    +                        <div class="hd">
    +                            <h2 class="no-toc">Examples</h2>
    +                        </div>
    +
    +                        <div class="bd">
    +                            <ul class="examples">
    +                                {{#examples}}
    +                                    {{#unless inherited}}
    +                                        <li data-description="{{description}}">
    +                                            <a href="{{name}}.html">{{displayName}}</a>
    +                                        </li>
    +                                    {{/unless}}
    +                                {{/examples}}
    +                            </ul>
    +                        </div>
    +                    </div>
    +                {{/if}}
    +
    +                {{#if hasInheritedExamples}}
    +                    <div class="sidebox">
    +                        <div class="hd">
    +                            <h2 class="no-toc">Examples That Use This Component</h2>
    +                        </div>
    +
    +                        <div class="bd">
    +                            <ul class="examples">
    +                                {{#examples}}
    +                                    {{#if inherited}}
    +                                        <li data-description="{{description}}">
    +                                            <a href="../{{componentName}}/{{name}}.html">{{displayName}}</a>
    +                                        </li>
    +                                    {{/if}}
    +                                {{/examples}}
    +                            </ul>
    +                        </div>
    +                    </div>
    +                {{/if}}
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +
    +<script src="{{projectAssets}}/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +
    +</body>
    +</html>
    diff --git a/conf/docs/project.json b/conf/docs/project.json
    new file mode 100644
    index 00000000..7dc2fccc
    --- /dev/null
    +++ b/conf/docs/project.json
    @@ -0,0 +1,5 @@
    +{
    +  "projectName": "YUIDoc - JavaScript Documentation Tool",
    +  "version": "0.10.0",
    +  "yuiSeedUrl": "http://yui.yahooapis.com/3.5.1/build/yui/yui.js"
    +}
    \ No newline at end of file
    diff --git a/docs/args/component.json b/docs/args/component.json
    new file mode 100644
    index 00000000..f652fdcd
    --- /dev/null
    +++ b/docs/args/component.json
    @@ -0,0 +1,7 @@
    +{
    +    "name"       : "args",
    +    "displayName": "Using YUIDoc",
    +    "description": "Understanding YUIDoc command line arguments and usage.",
    +    "author"     : "davglass",
    +    "projectBase": "../"
    +}
    diff --git a/docs/args/index.mustache b/docs/args/index.mustache
    new file mode 100644
    index 00000000..ae20a02c
    --- /dev/null
    +++ b/docs/args/index.mustache
    @@ -0,0 +1,339 @@
    +<p>Generating documentation with YUIDoc is as simple as 
    +going to the top of your source tree and running:</p>
    +```terminal
    +$ yuidoc .
    +```
    +<p>However, you can configure YUIDoc's behavior further 
    +by providing <a href="#command-line">command line options</a>, 
    +a <a href="#json">JSON configuration file</a>, or even both.
    +This section discusses the `yuidoc` command line tool in more detail.</p>
    +
    +<h2 id="command-line">Running YUIDoc on the Command Line</h2>
    +
    +<p>Certain `yuidoc` command line options correspond to entries in the  
    +the <a href="#json">`yuidoc.json` configuration file</a>.
    +Command line options always take priority.</p>
    +
    +```terminal
    +{{>help}}
    +```
    +
    +<h3 id="server">Running YUIDoc in Server Mode</h3>
    +
    +<p>
    +Most documentation tools (including YUIDoc) involve some sort of build process.
    +However, YUIDoc provides a unique feature that allows you to short-circuit this.
    +</p>
    +<p>
    +In <dfn>server mode</dfn>, 
    +YUIDoc fires up a small Node.js based server and 
    +begins parsing and displaying documentation in real time.
    +This greatly speeds up the documentation authoring process,
    +as you can edit your source code and 
    +preview changes with a simple browser reload,
    +rather than waiting for a build.
    +</p>
    +
    +<p>To activate server mode on `localhost:3000`, run `yuidoc --server`.
    +You can optionally specify an alternate port:</p> 
    +
    +```terminal
    +    yuidoc --server
    +        or
    +    yuidoc --server 5000
    +```
    +
    +Then visit:
    +
    +```terminal
    +    http://127.0.0.1:3000/
    +        or
    +    http://127.0.0.1:5000/
    +```
    +
    +<p>
    +Any changes you make to your YUIDoc comment blocks. 
    +will be reflected when you reload the browser. 
    +It's that simple!
    +</p>
    +
    +<p><strong>NOTE:</strong> Server mode is not
    +a replacement for building and hosting your documentation,
    +just a handy previewing tool. 
    +For production, you should generate static HTML pages and 
    +host them on a real web server.</p> 
    +
    +<h3>Working with YUIDoc Parsed Data</h3>
    +
    +<p>
    +YUIDoc generates a `data.json` file after it parses your API documentation. 
    +The `external.data` config option enables you to import a YUIDoc `data.json` file 
    +from another project and mix it into your own documentation. 
    +</p>
    +
    +<p>
    +This feature is handy when you are extending another project and would like to link back
    +to their API documentation. For example, importing YUI Library's `data.json`
    +file would enable YUIDoc to automatically link back to `Base`, `EventTarget`, and
    +other core YUI objects that your own API might be extending or mixing in. 
    +</p>
    +
    +<p>
    +Currently, importing external data enables YUIDoc to resolve HTML links `@extends` or `@use` keywords, 
    +but does <em>not</em> cause YUIDoc to generate complete documentation for the external API.
    +Future versions of YUIDoc may provide the option to mix in the data natively 
    +and reproduce the external API right along with your own.
    +</p>
    +
    +<h4 id="external-data">Adding External YUIDoc Data to Your Project</h4>
    +
    +<p>
    +    Create an `external` object under the `options` object in your `yuidoc.json` file and give it
    +    a property called `data` pointing to the URL of the external `data.json` file you wish to import. 
    +    `data` can be a string or an array of strings. 
    +</p>
    +
    +```
    +{
    +  "options": {
    +    "external": {
    +      "data": "http://yuilibrary.com/yui/docs/api/data.json"
    +    }
    +  }
    +}
    +```
    +
    +<p>
    +    Also, you are able to give `base` data within `external` for external base URLs.
    +</p>
    +
    +```
    +{
    +  "options": {
    +    "external": {
    +      "data": [
    +        {
    +          "base": "http://emberjs.com/api/",
    +          "json": "http://builds.emberjs.com/tags/v1.5.1/ember-docs.json"
    +        },
    +        {
    +          "base": "http://emberjs.com/api/",
    +          "json": "http://builds.emberjs.com/tags/v1.0.0-beta.6/ember-data-docs.json"
    +        }
    +      ]
    +    }
    +  }
    +}
    +```
    +
    +<p>
    +<strong>NOTE:</strong> YUIDoc currently fetches external data on each run with no caching. 
    +</p>
    +
    +
    +
    +<h2 id="json">Configuring YUIDoc with yuidoc.json</h2>
    +
    +<p>
    +You can also store most YUIDoc configurables in a `yuidoc.json` file.
    +As mentioned in the <a href="#command-line">command line arguments</a> section,
    +command line options always take priority over `yuidoc.json` configuration values.</p>
    +</p>
    +<p>
    +The `yuidoc.json` file must reside in a directory somewhere under where you execute `yuidoc`. 
    +YUIDoc will scan the tree for this file before doing anything else.
    +</p>
    +
    +<p>A short example `yuidoc.json` file would resemble:</p>
    +
    +```
    +{
    +    "name": "The Foo API",
    +    "description": "The Foo API: a library for doing X, Y, and Z",
    +    "version": "1.2.1",
    +    "url": "http://example.com/",
    +    "options": {
    +        "outdir": "../build/apidocs"
    +    }
    +}
    +```
    +
    +See below for <a href="#ex-yui3">more</a> <a href="#ex-yuidoc">examples</a>.
    +
    +<h3>yuidoc.json Fields</h3>
    +
    +<h4>General YUIDoc Project Information</h4>
    +
    +<table>
    +<tr>
    +    <th>Name</th>
    +    <th>Description</th>
    +</tr>
    +<tr>
    +    <td>`name`</th>
    +    <td>A short name for the project.</td>
    +</tr>
    +<tr>
    +    <td>`description`</th>
    +    <td>A one or two sentence description of the project.</td>
    +</tr>
    +<tr>
    +    <td>`version`</th>
    +    <td>The project's current version, as some kind of meaningful string.</td>
    +</tr>
    +<tr>
    +    <td>`url`</th>
    +    <td>The project's primary URL. This does not necessarily have to be the URL of the generated API documentation.</td>
    +</tr>
    +<tr>
    +    <td>`logo`</th>
    +    <td>
    +        The logo to add to the header of all generated HTML documentation. 
    +        If you do not provide a header, YUIDoc will use the YUI logo by default.
    +    </td>
    +</tr>
    +</table>
    +
    +<h4>YUIDoc Options</h4>
    +
    +<p>Within the `options` object, you can provide any of the following fields:</p>
    +
    +<table>
    +<tr>
    +    <th>Name</th>
    +    <th>Description</th>
    +</tr>
    +<tr>
    +    <td>`linkNatives`</th>
    +    <td>Selects whether to autolink native types such as `String` and `Object` over to the Mozilla Developer Network. </td>
    +</tr>
    +<tr>
    +    <td>`attributesEmit`</th>
    +    <td>
    +        Selects whether YUIDoc should autogenerate documentation for change events 
    +        generated by the <a href="http://yuilibrary.com/yui/docs/api/classes/Attribute.html">YUI Attribute API</a>.
    +        When a YUI attribute `foo` changes its value, 
    +        YUI automatically fires a custom event named `fooChange`.
    +        Setting `attributesEmit` to `true` instructs YUIDoc to
    +        automatically generate documentation for each of these events.
    +        You can set this value to `false` if you think that your audience
    +        is well aware of change events and would not benefit from this extra verbiage.
    +    </td>
    +</tr>
    +<tr>
    +    <td>`selleck`</th>
    +    <td>
    +        Selects whether to add <a href="http://rgrove.github.com/selleck/">Selleck</a> metadata. 
    +        If `true`, YUIDoc searches for a `component.json` file above the source tree and 
    +        attaches that data to the module data as extra information.
    +    </td>
    +</tr>
    +<tr>
    +    <td>`ignorePaths`</th>
    +    <td>Specifies an array of string paths to ignore when using shell globbing. This only removes top level items from the list to initally scan. Use `exclude` to remove specific directories.</td>
    +</tr>
    +<tr>
    +    <td>`exclude`</th>
    +    <td>Specify a comma separated list of names you want to exclude from parses when YUIDoc recurses the source tree.</td>
    +</tr>
    +<tr>
    +    <td>`paths`</th>
    +    <td>
    +        Specifies a single string `glob` or array of globs 
    +        to use when searching the source tree for docs to parse.
    +    </td>
    +</tr>
    +<tr>
    +    <td>`outdir`</th>
    +    <td>Specifies the directory in which to place the rendered HTML files and assets.</td>
    +</tr>
    +<tr>
    +    <td>`tabtospace`</th>
    +    <td>Specifies the number of spaces each tab character in source code should be converted to when using YUIDoc's source code view. The default is 8.</td>
    +</tr>
    +<tr>
    +    <td>`external.data`</th>
    +    <td>
    +        Provides a link to an external `data.json` file to merge into the local api docs. 
    +        For more information, refer to the <a href="#external-data">external data example</a>.
    +    </td>
    +</tr>
    +<tr>
    +    <td>`markdown`</td>
    +    <td>
    +        Options to pass to markdown-it, the Markdown compiler used to compile API descriptions.
    +        See the <a href="https://markdown-it.github.io/markdown-it/#MarkdownIt.new">markdown-it API</a> for details.
    +    </td>
    +</tr>
    +<tr>
    +    <td>`preprocessor`</td>
    +    <td>
    +        Specifies the array of your preprocessor script or npm package like `yuidoc-preprocessor-foo`
    +        that implements a preprocessor. See the <a href="#ex-preprocessor">example used preprocessor</a>.
    +    </td>
    +</tr>
    +</table>
    +
    +<h3 id="ex-yui3">Example: YUI 3 Library API </h3>
    +
    +<p>
    +This sample `yuidoc.json` file is used in the <a href="http://yuilibrary.com/">YUI 3</a>
    +project:
    +</p>
    +
    +```
    +{
    +    "name": "YUI 3",
    +    "description": "YUI 3 JavaScript Framework",
    +    "version": "3.5.0",
    +    "url": "http://yuilibrary.com/",
    +    "options": {
    +        "linkNatives": "true",        
    +        "attributesEmit": "true",
    +        "selleck": "true",
    +        "ignorePaths": [ "simpleyui" ],
    +        "paths": "*/js",
    +        "outdir": "../api-js"
    +    }
    +}
    +```
    +
    +<h3 id="ex-yuidoc">Example: YUIDoc API</h3>
    +
    +<p>This sample `yuidoc.json` file is used in the YUIDoc project itself:</p>
    +
    +```
    +{
    +  "name": "YUIDoc",
    +  "description": "YUIDoc documentation tool written in JavaScript",
    +  "version": "0.2.38",
    +  "url": "http://yuilibrary.com/projects/yuidoc",
    +  "logo": "http://yuilibrary.com/img/yui-logo.png",
    +  "options": {
    +    "external": {
    +      "data": "http://yuilibrary.com/yui/docs/api/data.json"
    +    },
    +    "linkNatives": "true",
    +    "attributesEmit": "true",
    +    "paths": [
    +      "./lib"
    +    ],
    +    "outdir": "./output/api"
    +  }
    +}
    +```
    +
    +<h3 id="ex-preprocessor">Example: Using preprocessor</h3>
    +
    +<p>This sample `yuidoc.json` file used preprocessor option:</p>
    +
    +```
    +{
    +  "name": "My Project",
    +  "version": "1.0.0",
    +  "options": {
    +    "paths": "src",
    +    "preprocessor": ["./path/to/custom_doc_preprocessor.js", "yuidoc-preprocessor-foo"]
    +  }
    +}
    +```
    diff --git a/docs/args/partials/help.mustache b/docs/args/partials/help.mustache
    new file mode 100644
    index 00000000..13f14384
    --- /dev/null
    +++ b/docs/args/partials/help.mustache
    @@ -0,0 +1,38 @@
    +
    +YUI Doc generates API documentation from a modified JavaDoc syntax.
    +
    +Current version (0.10.0)
    +
    +Usage: yuidoc <options> <input path>
    +
    +Common Options:
    +  -c, --config, --configfile <filename>  A JSON config file to provide configuration data.
    +           You can also create a yuidoc.json file and place it
    +           anywhere under your source tree and YUI Doc will find it
    +           and use it.
    +  -e, --extension <comma sep list of file extensions> The list of file extensions to parse 
    +           for api documentation. (defaults to .js)
    +  -x, --exclude <comma sep list of directories> Directories to exclude from parsing 
    +           (defaults to '.DS_Store,.svn,CVS,.git,build_rollup_tmp,build_tmp')
    +  -v, --version Show the current YUIDoc version
    +  --project-version Set the doc version for the template
    +  -N, --no-color Turn off terminal colors (for automation)
    +  -C, --no-code Turn off code generation (don't include source files in output)
    +  -n, --norecurse Do not recurse directories (default is to recurse)
    +  --no-sort Do not alphabetical sorting of attributes, events, methods, and properties
    +  -S, --selleck Look for Selleck component data and attach to API meta data
    +  -V, --view Dump the Handlebars.js view data instead of writing template files
    +  -p, --parse-only Only parse the API docs and create the JSON data, do not render templates
    +  -o, --outdir <directory path> Path to put the generated files (defaults to ./out)
    +  -t, --themedir <directory path> Path to a custom theme directory containing Handlebars templates
    +  -H, --helpers <comma separated list of paths to files> Require these file and add Handlebars helpers. See docs for more information
    +  --charset CHARSET Use this as the default charset for all file operations. Defaults to 'utf8'
    +  -h, --help Show this help
    +  -q, --quiet Supress logging output
    +  -T, --theme <simple|default> Choose one of the built in themes (default is default)
    +  --syntaxtype <js|coffee> Choose comment syntax type (default is js)
    +  --server <port> Fire up the YUIDoc server for faster API doc developement. Pass optional port to listen on. (default is 3000)
    +  --lint Lint your docs, will print parser warnings and exit code 1 if there are any
    +
    +  <input path> Supply a list of paths (shell globbing is handy here)
    +
    diff --git a/docs/syntax/component.json b/docs/syntax/component.json
    new file mode 100644
    index 00000000..e0eedda0
    --- /dev/null
    +++ b/docs/syntax/component.json
    @@ -0,0 +1,7 @@
    +{
    +    "name"       : "syntax",
    +    "displayName": "YUIDoc Syntax Reference",
    +    "description": "Detailed instructions for writing YUIDoc comment blocks.",
    +    "author"     : "davglass",
    +    "projectBase": "../"
    +}
    diff --git a/docs/syntax/index.mustache b/docs/syntax/index.mustache
    new file mode 100644
    index 00000000..22ae0fe0
    --- /dev/null
    +++ b/docs/syntax/index.mustache
    @@ -0,0 +1,1441 @@
    +<div class="intro">
    +    <p>YUIDoc's syntax should be familiar if you've used 
    +    Javadoc, JSDoc, Doxygen, or other documentation generator tools. 
    +    YUIDoc relies on <dfn>tags</dfn> such as `@param` or `@return` embedded in comment blocks 
    +    that start with `/**` and end with `*/`. See <a
    +    href="#comment-styles">comment styles</a> for more information.
    +    It includes a small number of tags for documenting specific YUI features, 
    +    but most tags are generic enough to use with any object-oriented language.</p>
    +
    +    <p><b>IMPORTANT:</b> YUIDoc only parses YUIDoc comment blocks, not source code.
    +    This keeps YUIDoc relatively simple and language agnostic. 
    +    However, it also means you must declare everything to YUIDoc explicitly.
    +    A code snippet will not display as a "method" or "class" 
    +    until you describe it as such. 
    +    A corollary is that YUIDoc will never generate empty, "stub" doc entries
    +    for API members that lack comment blocks.</p>
    +</div>
    +
    +<h2>Basic Requirements</h2>
    +
    +<p>A given comment block must contain one (and only one) 
    +<a href="#primary-tags">primary tag</a> such as `@class` or `@method`,
    +and zero or more <a href="#secondary-tags">secondary tags</a>
    +such as `@param`, `@type`, and `@extends`. 
    +Some secondary tags can be used in any comment block, 
    +while others only make sense alongside a particular primary tag.</p>
    +
    +<p>A source tree must contain at least one comment block with a `@module` tag.</p>
    +
    +<p>Each module must have at least one comment block with a `@class` tag.</p>
    +
    +<p>Each class may then have zero or more comment blocks with 
    +an `attribute`, `@class`, `@event`, `@method`, or `@property` tag.</p>
    +
    +<h2 id="primary-tags">Primary Tags</h2>
    +<p>Each comment block must have one (and only one) of the following tags:</p>
    +
    +<table>
    +<tr>
    +    <th>Name</th>
    +    <th>Example</th>
    +    <th>Description</th>
    +</tr>
    +<tr id="module">
    +    <td>`module`</td>
    +    <td>
    +```
    +/**
    + * Provides the base Widget class...
    + *
    + * @module widget
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Indicates that the block describes a group of related classes. 
    +        For example, YUI's `app` module includes classes such as `App.Base`, `Model`, and `Router`.
    +        You can optionally break modules up into submodules.
    +        
    +        <p>YUIDoc requires you to provide at least one module per source tree. 
    +        Since there isn't always an obvious place to insert module documentation in JavaScript source, 
    +        the convention is to declare your module at the top of the file that contains your module's "primary" or "base" class.</p>
    +
    +        <p>
    +            See also: 
    +            <a href="#class">`@class`</a>,
    +            <a href="#for">`@for`</a>,
    +            <a href="#maintag">`@main`</a>,
    +            <a href="#submodule">`@submodule`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="maintag">
    +    <td>`main`</td>
    +    <td>
    +```
    +/**
    + * Provides more features for the widget module...
    + *
    + * @module widget
    + * @submodule widget-foo
    + * @main widget
    + */
    +```
    +    </td>
    +    <td>
    +    <p>
    +        When YUIDoc parses a module's directory, there may be several files in this directory that
    +        provides documentation for that module and it's submodules. YUIDoc will attempt to determine
    +        which module contains the main description for this module. If it has trouble doing that,
    +        you can add a `@main` tag to your module/submodule description and YUIDoc will use this block as
    +        the main module description on the modules API landing page.
    +    </p>
    +    </td>
    +</tr>
    +<tr id="class">
    +    <td>`class`</td>
    +    <td>
    +```
    +/**
    + * A utility that brokers HTTP requests...
    + *
    + * @class IO
    + * @constructor
    + */
    +function IO (config) {
    +```
    +    </td>
    +    <td>
    +        <p>Indicates that the block describes a class.
    +        In JavaScript, this is generally an object with a constructor function. 
    +        The value of `@class` should be the string that identifies the functional class on its parent object. 
    +        For example, the `@class` for `Y.DD.Drag` would be `Drag` 
    +        (and its <a href="#namespace">`@namespace`</a> would be `DD`).</p>
    +        
    +        <p>YUIDoc expects methods, properties, attributes, and events to belong to a class, 
    +        so in general you must provide at least one class for each module in your source tree. 
    +        A `@class` block should reside just above the class's constructor function,
    +        and above all methods, events, properties, and attributes that belong to the class.</p>
    +
    +        <p>A <a href="#class">`@class`</a> tag should be paired with 
    +        either a `@constructor` tag or a `@static` tag.</p> 
    +
    +        <p>
    +            See also: 
    +            <a href="#constructor">`@constructor`</a>,
    +            <a href="#extends">`@extends`</a>,
    +            <a href="#extensionfor">`@extensionfor`</a>,
    +            <a href="#for">`@for`</a>,
    +            <a href="#module">`@module`</a>,
    +            <a href="#namespace">`@namespace`</a>,
    +            <a href="#static">`@static`</a>,
    +            <a href="#uses">`@uses`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="element">
    +    <td>`element`</td>
    +    <td>
    +```
    +/**
    + * This is the foo element description...
    + *
    + * @element x-foo
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Indicates that the block describes a Custom Element.
    +        The <a href="#attribute">`@attribute`</a> tag works as a attribute of the element
    +        when you specify a `@element` tag. You can also specify the
    +        <a href="#parents">`@parents`</a>, <a href="#contents">`@contents`</a>,
    +        and <a href="#interface">`@interface`</a> tag for the element.</p>
    +
    +        <p>
    +            See also:
    +            <a href="#attribute">`@attribute`</a>,
    +            <a href="#parents">`@parents`</a>,
    +            <a href="#contents">`@contents`</a>,
    +            <a href="#interface">`@interface`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="method">
    +    <td>`method`</td>
    +    <td>
    +```
    +/**
    + * Returns this model's attributes as...
    + *
    + * @method toJSON
    + * @return {Object} Copy of ...
    + */
    +toJSON: function () {
    +```
    +    </td>
    +    <td>
    +        <p>Indicates that the block describes a method for the current class.
    +        By default, the "current" class is the last class that YUIDoc parsed, but
    +        you can reset this with the <a href="#for">`@for`</a> tag.</p>
    +
    +        <p>A `@method` block should always reside directly above the method's definition.
    +        At a minimum, you should also document any 
    +        parameters (<a href="#param">`@param`</a>) and
    +        return values (<a href="#return">`@return`</a>).</p>
    +
    +        <p>
    +            See also: 
    +            <a href="#chainable">`@chainable`</a>,
    +            <a href="#class">`@class`</a>,
    +            <a href="#constructor">`@constructor`</a>,
    +            <a href="#for">`@for`</a>,
    +            <a href="#param">`@param`</a>,
    +            <a href="#return">`@return`</a>,
    +            <a href="#throws">`@throws`</a>,
    +            <a href="#static">`@static`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="event">
    +    <td>`event`</td>
    +    <td>
    +```
    +/**
    + * Fired when an error occurs...
    + *
    + * @event error
    + * @param {String} msg A description of...
    + */
    +var EVT_ERROR = 'error',
    +```
    +    </td>
    +    <td>
    +        <p>Indicates that the block describes a custom event that the class can fire 
    +        at some interesting moment of code execution. 
    +        An `@event` block is somewhat similar to a <a href="#param">`@method`</a> block, 
    +        except that <a href="#return">`@return`</a> is irrelevant, and  
    +        <a href="#param">`@param`</a> is used to describe properties hanging off 
    +        the event object that callbacks listening for the event receive. </p>
    +
    +        <p>Ideally, an `@event` block should reside above the code that defines the event, 
    +        even if that code is just a simple string declaration.
    +        If you find that your `@event` block is "floating in space,"
    +        you should at least place it underneath the class that owns the event, 
    +        grouped with any other events that the class can fire.</p>
    +        
    +        <p>
    +            See also: 
    +            <a href="#bubbles">`@bubbles`</a>,
    +            <a href="#class">`@class`</a>,
    +            <a href="#for">`@for`</a>,
    +            <a href="#param">`@param`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="property">
    +    <td>`property`</td>
    +    <td>
    +```
    +/**
    + * Template for this view's container...
    + *
    + * @property containerTemplate
    + * @type String
    + * @default "<div/>"
    + */
    +containerTemplate: '<div/>',
    +```
    +    </td>
    +    <td>
    +        <p>Indicates that the block describes a property belonging to the current class.</p>
    +
    +        <p>As with methods, a `@property` block should always reside 
    +        directly above the point where the property is defined.
    +        At a minimum, you should also provide the property's `@type`, 
    +        even if the value is `"any"` or `"mixed"`.</p>
    +
    +        <p>
    +            See also: 
    +            <a href="#attribute">`@attribute`</a>,
    +            <a href="#default">`@default`</a>,
    +            <a href="#class">`@class`</a>,
    +            <a href="#for">`@for`</a>,
    +            <a href="#type">`@type`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="attribute">
    +    <td>`attribute`</td>
    +    <td>
    +```
    +/**
    + * Indicates whether this Widget
    + * has been rendered...
    + *
    + * @attribute rendered
    + * @readOnly
    + * @default false
    + * @type boolean
    + */
    +ATTRS[RENDERED] = {
    +```
    +    </td>
    +    <td>
    +        <p>[YUI-specific] Indicates that the block describes a managed configuration attribute.  
    +        An attribute is an object created and managed by the YUI
    +        <a href="http://yuilibrary.com/yui/docs/api/classes/Attribute.html">`Attribute` API</a>.
    +        It is a kind of "super-property", with getters, setters, and other nifty features, 
    +        including the ability to automatically fire change events.</p>
    +
    +        <p>An `@attribute` block should reside directly above the definition of the attribute,
    +        whether that is inside a `Y.Base` object's `ATTRS` property or elsewhere.
    +        Note that if your `yuidoc.json` file sets `attributesEmit` to `true`, 
    +        YUI will automatically generate documentation for the attribute's change events throughout the source tree, 
    +        with no extra YUIDoc comments needed from you.</p>
    +
    +        <p>If you specify a <a href="#element">`@element`</a> tag, the `@attribute` tag works as
    +        a attribute of the element.</p>
    +
    +        <p>
    +            See also: <a href="#element">`@element`</a>,
    +            <a href="#property">`@property`</a>,
    +            <a href="#default">`@default`</a>,
    +            <a href="#class">`@class`</a>,
    +            <a href="#for">`@for`</a>,
    +            <a href="#type">`@type`</a>,
    +            <a href="#required">`@required`</a>,
    +            <a href="#optional">`@optional`</a>.
    +        </p>
    +    </td>
    +</tr>
    +</table>
    +
    +<h2 id="secondary-tags">Secondary tags</h2>
    +<p>
    +    After choosing one of the five primary tags, you can further document a module, 
    +    class, method, event or property with one or more of the following secondary tags.
    +</p>
    +<table>
    +<tr>
    +    <th>Name</th>
    +    <th>Example</th>
    +    <th>Description</th>
    +</tr>
    +<tr id="submodule">
    +    <td>`submodule`</td>
    +    <td>
    +```
    +/**
    + * @module app
    + * @submodule view
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Specifies that the module is actually a submodule of some parent module. 
    +        For example, the `app-transitions` module is a submodule of the larger `app` module.</p>
    +
    +        <p>In YUI, submodules enable you to make very fine-grained choices about loading code.
    +        For example, the `foo` module might have a minimal `foo-core` or `foo-base` submodule
    +        that supplies `foo`'s basic functionality,
    +        plus additional `foo-*` modules that carry optional features.
    +        Using the YUI Loader, you can choose to load just `foo-core`, 
    +        `foo-core` plus a couple of extra modules, 
    +        or the entire `foo` "rollup".</p> 
    +
    +        <p>
    +            See also:
    +            <a href="#module">`@module`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="namespace">
    +    <td>`namespace`</td>
    +    <td>
    +```
    +/**
    + * @namespace Test.Mock
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Specifies a class's namespace.
    +        The `@namespace` should <em>not</em> include the "root" or "global" object 
    +        that your entire library hangs off of. 
    +        For example, `Y.DD.Drag` has 
    +        a <a href="#class">`@class`</a> of `Drag`
    +        and a `@namespace` of `DD`, not `Y.DD`.</p> 
    +
    +        <p>Supplying a `@namespace` enables you to refer to the class in YUIDoc using just the simple class name.</p>
    +
    +        <p>
    +            See also:
    +            <a href="#class">`@class`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="extends">
    +    <td>`extends`</td>
    +    <td>
    +```
    +/**
    + * @class View
    + * @constructor
    + * @extends Base
    + */
    +```
    +   </td>
    +   <td>
    +        <p>Specifies that the class inherits members from a parent class, 
    +        perhaps using <a href="http://yuilibrary.com/yui/docs/api/classes/YUI.html#method_extend">`Y.extend()`</a>, 
    +        <a href="http://yuilibrary.com/yui/docs/api/classes/Base.html#method_create">`Y.Base.create()`</a>,
    +        or similar methods.
    +        YUIDoc will generate API documentation for 
    +        methods, properties, events, and attributes inherited from the parent class,
    +        and link back to the parent class's documentation.
    +        In the default YUIDoc theme, users can toggle whether inherited members should display.</p>
    +
    +        <p>
    +            See also:
    +            <a href="#class">`@class`</a>,
    +            <a href="#extensionfor">`@extensionfor`</a>,
    +            <a href="#uses">`@uses`</a>.
    +        </p>
    +   </td>
    +</tr>
    +<tr id="config">
    +    <td>`config`</td>
    +    <td>
    +```
    +/**
    + * @config docScrollX
    + * @type Number
    + */
    +```
    +    </td>
    +    <td>
    +        <p>[YUI-specific] Alias for <a href="#attribute">`@attribute`</a>. 
    +        In older versions of YUI, `@config` was a slightly different take on attributes, 
    +        but the two concepts have merged.  
    +        Modern YUIDoc comments should use `@attribute` instead.</p>
    +    </td>
    +</tr>
    +<tr id="constructor">
    +    <td>`constructor`</td>
    +    <td>
    +```
    +/**
    + * @class IO
    + * @constructor
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Indicates that the class is instantiable
    +        (created with the `new` keyword).
    +        A <a href="#class">`@class`</a> tag should be paired with 
    +        either a `@constructor` tag or a `@static` tag.</p> 
    +        <p>
    +            See also:
    +            <a href="#class">`@class`</a>,
    +            <a href="#static">`@static`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="static">
    +    <td>`static`</td>
    +    <td>
    +```
    +/**
    + * YUI user agent detection...
    + *
    + * @class UA
    + * @static
    + */
    +
    +
    +```
    +    </td>
    +    <td>
    +        <p>Indicates that the method or class is static:</p> 
    +        <ul>
    +            <li>For methods, indicates that the method is meant to be 
    +            called without instantiating the class: 
    +            `var node = Y.Node.create('<div/>');`</li>
    +            <li>For classes, indicates that you should not 
    +            instantiate the class with `new`. 
    +            You can call all of the class's methods statically.
    +        </ul>    
    +        <p>A <a href="#class">`@class`</a> tag should be paired with 
    +        either a `@constructor` tag or a `@static` tag.</p> 
    +        <p>
    +            See also:
    +            <a href="#class">`@class`</a>,
    +            <a href="#constructor">`@constructor`</a>,
    +            <a href="#method">`@method`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="final">
    +    <td>`final`</td>
    +    <td>
    +```
    +/**
    + * Identifies state changes
    + * originating from...
    + *
    + * @property SRC_REPLACE
    + * @type String
    + * @static
    + * @final
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Indicates that the property or attribute is a constant and should not be changed.</p>
    +        <p>
    +            See also:
    +            <a href="#attribute">`@attribute`</a>,
    +            <a href="#property">`@property`</a>,
    +            <a href="#readOnly">`@readOnly`</a>,
    +            <a href="#writeOnce">`@writeOnce`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="readOnly">
    +    <td>`readOnly`</td>
    +    <td>
    +```
    +/**
    + * The current default button
    + * as configured through...
    + *
    + * @attribute defaultButton
    + * @type Node
    + * @default null
    + * @readOnly
    + */
    +```
    +    </td>
    +    <td>
    +        <p>[YUI-specific] Indicates that the attribute is configured with the 
    +        <a href="http://yuilibrary.com/yui/docs/api/classes/Attribute.html#method_addAttr">`readOnly`</a> property
    +        and cannot be changed by calling the 
    +        <a href="http://yuilibrary.com/yui/docs/api/classes/Attribute.html#method_set">`set()`</a> method.
    +        Read-only attributes should always document their <a href="#default">`@default`</a> value.</p>
    +        
    +        <p>Sometimes used with properties, as an alias for <a href="#final">`@final`</a>.</p>
    +
    +        <p>
    +            See also:
    +            <a href="#attribute">`@attribute`</a>,
    +            <a href="#default">`@default`</a>,
    +            <a href="#final">`@final`</a>,
    +            <a href="#property">`@property`</a>,
    +            <a href="#required">`@required`</a>,
    +            <a href="#optional">`@optional`</a>,
    +            <a href="#writeOnce">`@writeOnce`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="writeOnce">
    +    <td>`writeOnce`</td>
    +    <td>
    +```
    +/**
    + * Diameter of the circular
    + * background object. Other
    + * objects scale accordingly.
    + * Set this only before
    + * rendering.
    + *
    + * @attribute diameter
    + * @type {Number} number of px
    + * in diameter
    + * @default 100
    + * @writeOnce
    + */
    +```
    +    </td>
    +    <td>
    +        <p>[YUI-specific] Indicates that the attribute is configured with the
    +        <a href="http://yuilibrary.com/yui/docs/api/classes/Attribute.html#method_addAttr">`writeOnce`</a> property
    +        and can only be set once --
    +        by applying a <a href="#default">`@default`</a>, 
    +        by setting the value in the constructior, 
    +        or by calling the 
    +        <a href="http://yuilibrary.com/yui/docs/api/classes/Attribute.html#method_set">`set()`</a> method
    +        for the first time.</p>
    +        
    +        <p>
    +            See also:
    +            <a href="#attribute">`@attribute`</a>,
    +            <a href="#default">`@default`</a>,
    +            <a href="#final">`@final`</a>,
    +            <a href="#required">`@required`</a>,
    +            <a href="#optional">`@optional`</a>,
    +            <a href="#readOnly">`@readOnly`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="optional">
    +    <td>`optional`</td>
    +    <td>
    +```
    +/**
    + * An optional attribute,
    + * not required for proper
    + * use.
    + *
    + * @attribute extras
    + * @type {Object} extra data
    + * @optional
    + */
    +```
    +    </td>
    +    <td>
    +        <p>
    +        [YUI-specific] Indicates that the attribute is not
    +        required to be provided for proper use of this class.
    +        </p>
    +        
    +        <p>
    +            See also:
    +            <a href="#attribute">`@attribute`</a>,
    +            <a href="#default">`@default`</a>,
    +            <a href="#final">`@final`</a>,
    +            <a href="#required">`@required`</a>,
    +            <a href="#readOnly">`@readOnly`</a>.
    +        </p>
    +    </td>
    +</tr>
    +
    +<tr id="required">
    +    <td>`required`</td>
    +    <td>
    +```
    +/**
    + * A required attribute
    + * that is required for proper
    + * use, module will likely fail
    + * if this is not provided.
    + *
    + * @attribute url
    + * @type {String} url to fetch remote data from
    + * @required
    + */
    +```
    +    </td>
    +    <td>
    +        <p>
    +        [YUI-specific] Indicates that the attribute is
    +        required to be provided for proper use of this class.
    +        </p>
    +        
    +        <p>
    +            See also:
    +            <a href="#attribute">`@attribute`</a>,
    +            <a href="#default">`@default`</a>,
    +            <a href="#final">`@final`</a>,
    +            <a href="#optional">`@optional`</a>,
    +            <a href="#readOnly">`@readOnly`</a>.
    +        </p>
    +    </td>
    +</tr>
    +
    +
    +<tr id="param">
    +    <td>`*param`</td>
    +    <td>
    +```
    +/**
    + * @param {String} name An
    + * Attribute name or
    + * object property path.
    + */
    +```
    +
    +```
    +/**
    + * @param {Object} [options] Data
    + * to be mixed into the event
    + * facade of the `change`
    + * event(s) for these attributes.
    + * @param {Boolean} [options.silent]
    + * If `true`, no `change` event
    + * will be fired.
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Defines a parameter for an ordinary <a href="#method">`@method`</a>, 
    +        a parameter for a <a href="#constructor">`@constructor`</a>
    +        (generally defined inside a <a href="#class">`@class`</a> block),
    +        <em>or</em> a property that resides on an <a href="#method">`@event`</a> object.
    +        Can take either of the forms:</p>
    +
    +        <ul>
    +            <li>`@param {type} name description`</li> 
    +            <li>`@param name {type} description`</li>
    +        </ul>
    +
    +        <p>The `{type}` is optional, but if you include it, 
    +        you must surround it in curly braces so that YUIDoc 
    +        can distinguish it from the `name`. 
    +        The `name` also has optional syntax:</p>
    +        <ul>
    +            <li>`[name]` &mdash; optional parameter</li>
    +            <li>`[name=foo]` &mdash; default value is foo</li>
    +            <li>`...name` &mdash; placeholder for 1..n args</li>
    +            <li>`[...name]` &mdash; placeholder for 0..n args</li>
    +        </ul>
    +
    +        <p>As shown in the example, you can also nest `@param` tags. 
    +        This enables you to document object parameters that 
    +        have their own particular nested structure.</p> 
    +
    +        <p>
    +            See also:
    +            <a href="#class">`@class`</a>,
    +            <a href="#constructor">`@constructor`</a>,
    +            <a href="#event">`@event`</a>,
    +            <a href="#method">`@method`</a>,
    +            <a href="#return">`@return`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="return">
    +    <td>`return`</td>
    +    <td>
    +```
    +/**
    + * @method generateClientId
    + * @return {String} Unique clientId.
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Specifies a method's return value. 
    +        A `@return` tag has the structure `@return {type} description`.
    +        The `{type}` is optional.</p>
    +
    +        <!--p>If a return value is an object with a complex structure,
    +        you can <a href="#param">nest `@param` tags</a> 
    +        underneath the `@return` value.</p-->
    +
    +        <p>
    +            See also:
    +            <a href="#method">`@method`</a>,
    +            <a href="#param">`@param`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="throws">
    +    <td>`throws`</td>
    +    <td>
    +```
    +/**
    + * @method generateClientId
    + * @throws {Error} An error.
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Specifies an error which method throws.
    +        A `@throws` tag has the structure `@throws {type} description`.
    +        The `{type}` is optional.</p>
    +        <p>
    +            See also:
    +            <a href="#method">`@method`</a>,
    +            <a href="#return">`@return`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="for">
    +    <td>`for`</td>
    +    <td>
    +```
    +/**
    + * Some inner class 'foo'...
    + *
    + * @class foo
    + * @for OuterClass
    + */
    +```
    +```
    +/**
    + * Some method 'bar'
    + * disconnected from
    + * its class 'FarawayClass'...
    + *
    + * @method bar
    + * @for FarawayClass
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Sets YUIDoc's class scope.</p> 
    +
    +        <p>Using `@for OuterClass` in a `@class` block creates an inner class.
    +        YUIDoc will document methods and other items that follow that block 
    +        as belonging to the inner class, but the inner class is correctly 
    +        shown as belonging to its parent outer class.</p>
    +
    +        <p>To close an inner class, add `@for OuterClass` (again!) 
    +        to the <em>last</em>
    +        `@attribute`, `@event`, `@method`, or `@property` block 
    +        in the inner class. 
    +        This resets the YUIDoc parser to use `OuterClass` 
    +        as the owner of subsequent items.</p>
    +
    +        <p>If you are not inside an inner class, 
    +        using `@for FarawayClass` 
    +        in an `@attribute`, `@event`, `@method`, or `@property` block
    +        will attach all that item and subsequent items 
    +        to the specified faraway class. 
    +        This is useful when you have a module that attaches extra
    +        methods to a class's prototype, 
    +        but the main class definition is in some entirely different file.</p>
    +
    +        <p>
    +            See also:
    +            <a href="#class">`@class`</a>,
    +            <a href="#method">`@method`</a>.
    +        </p>
    +</td>
    +</tr>
    +<tr id="type">
    +    <td>`type`</td>
    +    <td>
    +```
    +/**
    + * @type String
    + */
    +```
    +```
    +/**
    + * @type HTMLElement|Node|String
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Specifies the type of a property or attribute.  
    +        You can specify a single type, 
    +        a list of legal types separated by vertical bars, 
    +        or if you are lazy, "any" or "mixed".</p>
    +
    +        <p>
    +            See also:
    +            <a href="#attribute">`@attribute`</a>,
    +            <a href="#default">`@default`</a>,
    +            <a href="#property">`@property`</a>.
    +        <p>
    +    </td>
    +</tr>
    +<tr id="private">
    +    <td>`private`</td>
    +    <td>
    +```
    +/**
    + * Reference to the internal JSONP
    + * instance used to make the queries.
    + *
    + * @private
    + * @property _jsonp
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Indicates a member that should not be used externally. 
    +        Although YUIDoc does not generate documentation for `@private` blocks, 
    +        YUIDoc comments are still a nice, structured way to document internals in source code.
    +        All methods and properties are assumed to be public 
    +        unless marked as private or protected.</p>
    +
    +        <p>
    +            See also:
    +            <a href="#protected">`@protected`</a>.
    +        <p>
    +    </td>
    +</tr>
    +<tr id="protected">
    +    <td>`protected`</td>
    +    <td>
    +```
    +/**
    + * Removes the `container` from
    + * the DOM and ...
    + *
    + * @method _destroyContainer
    + * @protected
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Indicates a member that should not be modified 
    +        by implementers unless they are creating a subclass.
    +        All methods and properties are assumed to be public 
    +        unless marked as private or protected.</p>
    +
    +        <p>
    +            See also:
    +            <a href="#private">`@private`</a>.
    +        <p>
    +    </td>
    +</tr>
    +<tr id="requires">
    +    <td>`requires`</td>
    +    <td>
    +```
    +/**
    + * @module event-simulate
    + * @requires event
    + */
    +```
    +    </td>
    +    <td>
    +        <p>[Uncommon] Identifies one or more dependencies in the module declaration.
    +        Can be a single module name or a comma-separated list.</p>
    +
    +        <p>
    +            See also:
    +            <a href="#extends">`@extends`</a>,
    +            <a href="#extensionfor">`@extensionfor`</a>,
    +            <a href="#module">`@module`</a>,
    +            <a href="#submodule">`@submodule`</a>.
    +        <p>
    +    </td>
    +</tr>
    +<tr id="default">
    +    <td>`default`</td>
    +    <td>
    +```
    +/**
    + * @default false
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Specifies the default value of a property or attribute.
    +        Should be paired with a <a href="#type">`@type`</a> tag.</p>
    +
    +        <p>
    +            See also:
    +            <a href="#attribute">`@attribute`</a>,
    +            <a href="#property">`@property`</a>,
    +            <a href="#type">`@type`</a>.
    +        <p>
    +    </td>
    +</tr>
    +<tr id="uses">
    +    <td>`*uses`</td>
    +    <td>
    +```
    +/**
    + * @class Panel
    + * @constructor
    + * @extends Widget
    + * @uses WidgetAutohide
    + * @uses WidgetButtons
    +...
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Specifies that the class has some other class's 
    +        properties, methods, and other members mixed into its prototype, 
    +        perhaps using <a href="http://yuilibrary.com/yui/docs/api/classes/YUI.html#method_mix">`Y.mix()`</a>, 
    +        <a href="http://yuilibrary.com/yui/docs/api/classes/Base.html#method_mix">`Y.Base.mix()`</a>,
    +        <a href="http://yuilibrary.com/yui/docs/api/classes/Base.html#method_create">`Y.Base.create()`</a>,
    +        or similar methods.
    +        YUIDoc will generate API documentation for 
    +        methods, properties, events, and attributes mixed into the parent class,
    +        and link back to the parent class's documentation.
    +        In the default YUIDoc theme, users can toggle whether mixed in members should display.</p>
    +        
    +        <p>Note that `@uses` does not indicate inheritance.
    +        To establish an "is a" relationship, use <a href="#extends">`@extends`</a>.
    +        Unlike `@extends`, you can provide multiple `@uses` tags. </p>
    +
    +        <p>
    +            See also:
    +            <a href="#class">`@class`</a>,
    +            <a href="#extends">`@extends`</a>,
    +            <a href="#extensionfor">`@extensionfor`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="example">
    +    <td>`*example`</td>
    +    <td>
    +```
    +/**
    + * @example
    + *     model.set('foo', 'bar');
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Indicates a block of example code 
    +        to be automatically parsed and displayed with 
    +        YUIDoc's Markdown and code highlighting parser.
    +        Your code sample should be indented beneath the `@example` tag.
    +        YUIDoc displays all examples highlighted with 
    +        `<span>` elements and other markup.</p>
    +
    +        <p>A block may include multiple `@example` tags.</p>
    +    </td>
    +</tr>
    +<tr id="chainable">
    +    <td>`chainable`</td>
    +    <td>
    +```
    +/**
    + * Renders this view ...
    + *
    + * @method render
    + * @chainable
    + */
    +render: function () {
    +    return this;
    +},
    +```
    +    </td>
    +    <td>
    +        <p>Indicates that a method returns `this` (the parent object), 
    +        enabling you to chain it with other calls on the same object.</p>
    +
    +        <p>
    +            See also:
    +            <a href="#method">`@method`</a>.
    +        </p>
    +</tr>
    +<tr id="deprecated">
    +    <td>`deprecated`</td>
    +    <td>
    +```
    +/**
    + * @property locale
    + * @type String
    + * @deprecated Use `config.lang`
    + * instead.
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Indicates that the module, class, or member is deprecated 
    +        and will be removed in a future release.
    +        You can optionally supply a string message 
    +        describing what to use instead.</p>
    +
    +        <p>
    +            See also:
    +            <a href="#beta">`@beta`</a>,
    +            <a href="#since">`@since`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="since">
    +    <td>`since`</td>
    +    <td>
    +```
    +/**
    + * @since 3.4.0
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Indicates that the module, class, or member 
    +        was added to the source at the specified version.</p>
    +
    +        <p>
    +            See also:
    +            <a href="#beta">`@beta`</a>,
    +            <a href="#deprecated">`@deprecated`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="async">
    +    <td>`async`</td>
    +    <td>
    +```
    +/**
    + * @async
    + */
    +```
    +    </td>
    +    <td>
    +        <p>[Uncommon] Indicates that the method is 
    +        asynchronous and requires a callback.</p>
    +    </td>
    +</tr>
    +<tr id="beta">
    +    <td>`beta`</td>
    +    <td>
    +```
    +/**
    + * @beta
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Indicates that the method, class, or member is in beta 
    +        and might undergo backwards-incompatible changes in the near future.</p>
    +
    +        <p>
    +            See also:
    +            <a href="#deprecated">`@deprecated`</a>,
    +            <a href="#since">`@since`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="bubbles">
    +    <td>`bubbles`</td>
    +    <td>
    +```
    +/**
    + * Handles the mouseup DOM event...
    + *
    + * @event drag:mouseup
    + * @bubbles DDM
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Specifies the default target that a custom event bubbles to.
    +        This is a useful tag if your API has a "manager" class that 
    +        is responsible for capturing a set of related custom events.</p>
    +
    +        <p>
    +            See also:
    +            <a href="#event">`@event`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="extensionfor">
    +    <td>`extension`<br>`extensionfor`<br>`extension_for`</td>
    +    <td>
    +```
    +/**
    + * @class PjaxBase
    + * @extensionfor Router
    + */
    +```
    +    </td>
    +    <td>
    +        <p>Indicates that the class is an extension object
    +        designed to be optionally mixed into the specified class.</p>
    +
    +        <p>`@extensionfor` is <em>almost</em> the inverse of <a href="#uses">`@uses`</a>.
    +        The key difference is that `@uses` means, 
    +        "this class <em>always</em> has the 'used' class mixed into its prototype," 
    +        while `@extensionfor` means, 
    +        "this class <em>can</em> be mixed into the 'extensionfor' class, 
    +        but it isn't baked in by default."</p>
    +
    +        <p>
    +            See also:
    +            <a href="#class">`@class`</a>,
    +            <a href="#extends">`@extends`</a>,
    +            <a href="#uses">`@uses`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="parents">
    +    <td>`parents`</td>
    +    <td>
    +```
    +/**
    + * @element x-foo
    + * @parents <body>
    + */
    +```
    +    </td>
    +    <td>
    +        <p>It's a secondary tag for the <a href="#element">`@element`</a> tag.
    +        Indicates that the parent element of the element you specified.</p>
    +
    +        <p>
    +            See also:
    +            <a href="#element">`@element`</a>,
    +            <a href="#attribute">`@attribute`</a>,
    +            <a href="#contents">`@contents`</a>,
    +            <a href="#interface">`@interface`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="contents">
    +    <td>`contents`</td>
    +    <td>
    +```
    +/**
    + * @element x-foo
    + * @contents <x-bar>
    + */
    +```
    +    </td>
    +    <td>
    +        <p>It's a secondary tag for the <a href="#element">`@element`</a> tag.
    +        Indicates that the element contains in the element you specified.</p>
    +
    +        <p>
    +            See also:
    +            <a href="#element">`@element`</a>,
    +            <a href="#attribute">`@attribute`</a>,
    +            <a href="#parents">`@parents`</a>,
    +            <a href="#interface">`@interface`</a>.
    +        </p>
    +    </td>
    +</tr>
    +<tr id="interface">
    +    <td>`interface`</td>
    +    <td>
    +```
    +/**
    + * @element x-foo
    + * @interface XFooElement
    + */
    +```
    +    </td>
    +    <td>
    +        <p>It's a secondary tag for the <a href="#element">`@element`</a> tag.
    +        Indicates that the interface for the element you specified.</p>
    +
    +        <p>
    +            See also:
    +            <a href="#element">`@element`</a>,
    +            <a href="#attribute">`@attribute`</a>,
    +            <a href="#parents">`@parents`</a>,
    +            <a href="#contents">`@contents`</a>.
    +        </p>
    +    </td>
    +</tr>
    +</table>
    +
    +<p>A <strong>*</strong> indicates that you can supply multiple tags of that type in the same block.</p>
    +
    +<h3>Parsed but not in the theme yet</h3>
    +<p>
    +    The following tags are parsed by the `DocParser` but are not in the default theme yet.
    +</p>
    +<table>
    +<tr id="author">
    +    <td>`author`</td>
    +    <td>
    +```
    +```
    +    </td>
    +    <td>Author information about this item</td>
    +</tr>
    +<tr id="broadcast">
    +    <td>`broadcast`</td>
    +    <td>
    +```
    +```
    +    </td>
    +    <td>Event broadcasts to a large audience than scoped</td>
    +</tr>
    +<tr id="category">
    +    <td>`*category`</td>
    +    <td>
    +```
    +```
    +    </td>
    +    <td>Category to place this item into.</td>
    +</tr>
    +</table>
    +
    +<h2 id="comment-styles">Comment Styles</h2>
    +<p>
    +  The comment blocks can start with any amount of whitespace, and
    +  optionally one or more asterisks. Valid examples include:
    +</p>
    +<p>
    +```
    +/**
    + * Description
    + * @method description
    + */
    +```
    +</p>
    +<p>
    +```
    +/**
    + * Description
    + * @method description
    +**/
    +```
    +</p>
    +<p>
    +```
    +/**
    +Description
    +@method description
    +*/
    +```
    +</p>
    +<p>
    +```
    +/**
    +Description
    +@method description
    +**/
    +```
    +</p>
    +
    +<h2>Extra formatting</h2>
    +
    +<p>
    +    YUIDoc supports 3 main forms of formatting your documentation. HTML,
    +    <a href="http://daringfireball.net/projects/markdown/">Markdown</a> &amp; <a href="http://rgrove.github.com/selleck/">Selleck</a>.
    +</p>
    +
    +<table>
    +<tr>
    +    <td>`HTML`</td>
    +    <td>Doc comments may contain standard HTML markup and YUIDoc will display it as is.</td>
    +</tr>
    +<tr>
    +    <td>`Markdown`</td>
    +    <td>Full <a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a>
    +    is also supported.
    +    </td>
    +</tr>
    +<tr>
    +    <td>`Selleck`</td>
    +    <td><a href="http://rgrove.github.com/selleck/">Selleck's</a> additional parsing is also supported.</td>
    +</tr>
    +</table>
    +
    +<h3>Markdown and Code Highlighting</h3>
    +
    +<p>
    +Inside any documentation block you may use Markdown or Selleck based markup. If you indent your code snippets,
    +YUIDoc will automatically wrap them in a code block and syntax highlight them for you.
    +</p>
    +
    +```
    +/**
    + * This is the __module__ description for the `YUIDoc` module.
    + *
    + *     var options = {
    + *         paths: [ './lib' ],
    + *         outdir: './out'
    + *     };
    + *
    + *     var Y = require('yuidoc');
    + *     var json = (new Y.YUIDoc(options)).run();
    + *
    + * @class YUIDoc
    + * @main yuidoc
    + */
    +```
    +
    +<p>
    +This would render as:
    +</p>
    +
    +<div class="intro">
    +<p>This is the <strong>module</strong> description for the <code>YUIDoc</code> module.</p>
    +```
    +    var options = {
    +        paths: [ './lib' ],
    +        outdir: './out'
    +    };
    +
    +    var Y = require('yuidoc');
    +    var json = (new Y.YUIDoc(options)).run();
    +```
    +</div>
    +
    +<h3>Cross-referencing Modules and Classes</h3>
    +
    +<p>YUIDoc also includes a Handlebars `blockHelper` that enables you to 
    +easily cross-reference classes and modules. It uses this pattern: 
    +</p>
    +
    +```
    +#crossLink "Class/item:type"
    +
    +#crossLink "Foo/bar:event"
    +#crossLink "Foo/bar:attribute"
    +#crossLink "Foo/bar:method" --default
    +```
    +
    +<p>
    +So, for example, if you include:
    +</p>
    +
    +```
    +/**
    + *
    + * This module also uses \{{#crossLink "Foo"}}\{{/crossLink}}, where Foo is a class name.
    + * Also see \{{#crossLink "myClass/Foo:method"}}\{{/crossLink}}, where myClass is a class name and Foo is a method on that class.
    + *
    + * This module uses \{{#crossLinkModule "widget"}}\{{/crossLinkModule}}, where widget is a module name
    + *
    + * This module also uses \{{#crossLink "Bar"}} an awesome class \{{/crossLink}} named Bar.
    + */
    +```
    +
    +<p>
    +This automatically generates an internal link to Foo's API reference page:
    +</p>
    +
    +```
    +<p>
    +This module also uses <a href="../classes/Foo.html" class="crosslink">Foo</a>, 
    +where Foo is a class or module name.
    +</p>
    +<p>
    +Also see <a href="../classes/myClass.html#method_Foo">Foo</a>, where myClass 
    +is a class name and Foo is a method on that class.
    +</p>
    +<p>
    +This module uses <a href="../modules/widget.html">widget</a>, where widget is a module name
    +</p>
    +<p>
    +This module also uses <a href="../classes/Bar.html" class="crosslink">an awesome class</a>
    +named Bar.
    +</p>
    +```
    +
    +<p>
    +You can also call `crossLinkRaw` to return only the HREF portion of the link, so you can link it
    +yourself.
    +</p>
    +
    +<h3>Using custom Handlebars block helpers</h3>
    +
    +<p>
    +You can tell `YUIDoc` to include custom `Y.Handlebars` helpers with the `-H` or `--helpers` command line arguments
    +(or `helpers` Array in the `yuidoc.json` file).
    +
    +Here is an example `helper.js` file:
    +
    +```
    +module.exports = {
    +    davglass: function(item) {
    +        return "Dav Glass says: " + item
    +    }
    +};
    +```
    +
    +<p>
    +Now you can use the `davglass` helper inside your own docs like this:
    +</p>
    +
    +```
    +/**
    + * This is also a test \{{#davglass "Foo"}}\{{/davglass}}
    + */
    +```
    +
    +This will output this in your documentation:
    +
    +```
    +<p>
    + This is also a test Dav Glass says: Foo
    +</p>
    +```
    diff --git a/docs/themes/component.json b/docs/themes/component.json
    new file mode 100644
    index 00000000..3a97fad4
    --- /dev/null
    +++ b/docs/themes/component.json
    @@ -0,0 +1,7 @@
    +{
    +    "name"       : "themes",
    +    "displayName": "YUIDoc Themes",
    +    "description": "How to modify the default YUIDoc theme.",
    +    "author"     : "davglass",
    +    "projectBase": "../"
    +}
    diff --git a/docs/themes/index.mustache b/docs/themes/index.mustache
    new file mode 100644
    index 00000000..36d96eaf
    --- /dev/null
    +++ b/docs/themes/index.mustache
    @@ -0,0 +1,119 @@
    +<p>
    +    YUIDoc uses <a href="http://handlebarsjs.com/">Handlebars.js</a> to render its templates. 
    +    For easy customization, YUIDoc's default templates provide a specific set of file overrides.
    +</p>
    +
    +<h2>Directories</h2>
    +
    +<p>
    +    The default theme consists of `assets/`, `layouts/` and `partials/` directories, 
    +    along with a `theme.json` file that describes theme-related variables, 
    +    such as the JS and CSS to load.
    +</p>
    +
    +```terminal
    +
    +themes/
    +    default/
    +        assets/             //Project assets, css, js
    +        layouts/
    +            *.handlebars    //Handlebars files for layouts
    +        partials/
    +            *.handlebars    //Handlebars files for partials
    +        theme.json   //JSON file with theme variables
    +```
    +
    +<h3>Layouts</h3>
    +
    +<p>
    +    A YUIDoc template has two primary layout files: `main.handlebars` and `xhr.handlebars`.
    +</p>
    +
    +<table>
    +<tr>
    +    <th>`main`</th>
    +    <td>
    +        Provides a complete wrapper around every rendered page. 
    +        `main.handlebars` includes the full HTML header and footer markup, CSS, and JS
    +        for every YUIDoc API page.
    +    </td>
    +</tr>
    +<tr>
    +    <th>`xhr`</th>
    +    <td>
    +        Provides a smaller layout for the built-in doc server to use when requesting an individual page via XHR. 
    +        This enables the browser to refresh just the content pane and avoid loading the complete  markup for the entire page.
    +        The `xhr` template enables YUIDoc to progressively enhance the API documentation in an efficient manner.
    +    </td>
    +</tr>
    +</table>
    +
    +<h3>Partials</h3>
    +
    +<p>
    +    For each section of the layout that derives from parsed YUIDoc comment data, 
    +    YUIDoc provides a Handlebars partial. 
    +</p>
    +
    +<table>
    +<tr>
    +    <th>`index`</th>
    +    <td>Renders the main index content.</td>
    +</tr>
    +<tr>
    +    <th>`sidebar`</th>
    +    <td>Renders the tabview containing the lists of classes and modules.</td>
    +</tr>
    +<tr>
    +    <th>`options`</th>
    +    <td>Renders the filter options at the top of the page, which enable the user to hide and show private methods, inherited methods, and so on.</td>
    +</tr>
    +<tr>
    +    <th>`attrs`</th>
    +    <td>Renders documentation for an individual YUI Attribute.</td>
    +</tr>
    +<tr>
    +    <th>`classes`</th>
    +    <td>Renders documentation for an individual class.</td>
    +</tr>
    +<tr>
    +    <th>`events`</th>
    +    <td>Renders documentation for an individual event.</td>
    +</tr>
    +<tr>
    +    <th>`files`</th>
    +    <td>Renders the API's source files.</td>
    +</tr>
    +<tr>
    +    <th>`method`</th>
    +    <td>Renders documentation for an individual method.</td>
    +</tr>
    +<tr>
    +    <th>`module`</th>
    +    <td>Renders documentation for an individual module.</td>
    +</tr>
    +<tr>
    +    <th>`props`</th>
    +    <td>Renders documentation for an individual property.</td>
    +</tr>
    +</table>
    +
    +
    +<h2>Overriding a Partial/Layout</h2>
    +
    +<p>
    +YUIDoc's `--themedir` option specifies a directory containing 
    +layouts and partials that override the default theme. For example:
    +</p>
    +
    +```terminal
    +$ yuidoc --themedir ./mytheme
    +```
    +
    +<p>
    +causes YUIDoc to inspect the directory `./mytheme` for template overrides.
    +If this directory contains an override such as `./mytheme/partials/method.handlebars`,
    +YUI will parse its internal templates first, then apply the custom `method.handlebars` partial.
    +If a theme has no explicit override for a given template file, 
    +YUIDoc simply falls back to using the default layout or partial.
    +</p>
    diff --git a/lib/builder.js b/lib/builder.js
    new file mode 100644
    index 00000000..17ea292c
    --- /dev/null
    +++ b/lib/builder.js
    @@ -0,0 +1,1797 @@
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +'use strict';
    +
    +var MarkdownIt = require('markdown-it');
    +var fs = require('graceful-fs');
    +var mdn = require('mdn-links');
    +var noop = function () {};
    +var path = require('path');
    +var TEMPLATE;
    +
    +/**
    +* Takes the `JSON` data from the `DocParser` class, creates and parses markdown and handlebars
    +based templates to generate static HTML content
    +* @class DocBuilder
    +* @module yuidoc
    +*/
    +
    +YUI.add('doc-builder', function (Y) {
    +    var defaultMarkdownOption = {
    +        html: true,
    +        linkify: true
    +    };
    +
    +    var fixType = Y.Lang.fixType,
    +        print = function (items) {
    +            var out = '<ul>';
    +
    +            Y.each(items, function (i, k) {
    +                out += '<li>';
    +                if (Y.Lang.isObject(i)) {
    +                    if (!i.path) {
    +                        out += k + '/' + print(i);
    +                    } else {
    +                        out += '<a href="../files/' + i.name + '.html">' + k + '</a>';
    +                    }
    +                }
    +                out += '</li>';
    +            });
    +
    +            out += '</ul>';
    +            return out;
    +        };
    +
    +    Y.Handlebars.registerHelper('buildFileTree', function (items) {
    +        return print(items);
    +    });
    +
    +    var DEFAULT_THEME = path.join(__dirname, '../', 'themes', 'default'),
    +        themeDir = DEFAULT_THEME;
    +
    +    Y.DocBuilder = function (options, data) {
    +        this.options = options;
    +        if (options.helpers) {
    +            this._addHelpers(options.helpers);
    +        }
    +        if (options.themedir) {
    +            themeDir = options.themedir;
    +        }
    +        this.md = new MarkdownIt(Y.merge(defaultMarkdownOption, options.markdown));
    +        this.data = data;
    +        Y.log('Building..', 'info', 'builder');
    +        this.files = 0;
    +        var self = this;
    +
    +        Y.Handlebars.registerHelper('crossLink', function (item, helperOptions) {
    +            var str = '';
    +            if (!item) {
    +                item = '';
    +            }
    +            //console.log('CrossLink:', item);
    +            if (item.indexOf('|') > 0) {
    +                var parts = item.split('|'),
    +                    p = [];
    +                Y.each(parts, function (i) {
    +                    p.push(self._parseCrossLink.call(self, i));
    +                });
    +                str = p.join(' | ');
    +            } else {
    +                str = self._parseCrossLink.call(self, item, false, helperOptions.fn(this));
    +            }
    +            return str;
    +        });
    +
    +        Y.Handlebars.registerHelper('crossLinkModule', function (item, helperOptions) {
    +            var str = item;
    +            if (self.data.modules[item]) {
    +                var content = helperOptions.fn(this);
    +                if (content === '') {
    +                    content = item;
    +                }
    +                str = '<a href="../modules/' + item.replace(/\//g, '_') +
    +                    '.html">' + content + '</a>';
    +            }
    +            return str;
    +        });
    +
    +        Y.Handlebars.registerHelper('crossLinkRaw', function (item) {
    +            var str = '';
    +            if (!item) {
    +                item = '';
    +            }
    +            if (item.indexOf('|') > 0) {
    +                var parts = item.split('|'),
    +                    p = [];
    +                Y.each(parts, function (i) {
    +                    p.push(self._parseCrossLink.call(self, i, true));
    +                });
    +                str = p.join(' | ');
    +            } else {
    +                str = self._parseCrossLink.call(self, item, true);
    +            }
    +            return str;
    +        });
    +
    +        this.cacheTemplates = true;
    +        if (options.cacheTemplates === false) {
    +            this.cacheTemplates = false;
    +        }
    +    };
    +
    +    Y.DocBuilder.prototype = {
    +        /**
    +         * Register a `Y.Handlebars` helper method
    +         * @method _addHelpers
    +         * @param {Object} helpers Object containing a hash of names and functions
    +         */
    +        _addHelpers: function (helpers) {
    +            Y.log('Importing helpers: ' + helpers, 'info', 'builder');
    +            helpers.forEach(function (imp) {
    +                if (!Y.Files.exists(imp) || Y.Files.exists(path.join(process.cwd(), imp))) {
    +                    imp = path.join(process.cwd(), imp);
    +                }
    +                var h = require(imp);
    +                Object.keys(h).forEach(function (name) {
    +                    Y.Handlebars.registerHelper(name, h[name]);
    +                });
    +            });
    +        },
    +
    +        /**
    +         * Wrapper around the Markdown parser so it can be normalized or even side stepped
    +         * @method markdown
    +         * @private
    +         * @param {String} data The Markdown string to parse
    +         * @return {HTML} The rendered HTML
    +         */
    +        markdown: function (data) {
    +            var html = this.md.render(data);
    +            //Only reprocess if helpers were asked for
    +            if (this.options.helpers || (html.indexOf('{{#crossLink') > -1)) {
    +                try {
    +                    // markdown-it auto-escapes quotation marks (and unfortunately
    +                    // does not expose the escaping function)
    +                    html = html.replace(/&quot;/g, '"');
    +                    html = (Y.Handlebars.compile(html))({});
    +                } catch (hError) {
    +                    //Remove all the extra escapes
    +                    html = html.replace(/\\{/g, '{').replace(/\\}/g, '}');
    +                    Y.log('Failed to parse Handlebars, probably an unknown helper, skipping..', 'warn', 'builder');
    +                }
    +            }
    +            return html;
    +        },
    +
    +        /**
    +         * Parse the item to be cross linked and return an HREF linked to the item
    +         * @method _parseCrossLink
    +         * @private
    +         * @param {String} item The item to crossLink
    +         * @param {Boolean} [raw=false] Do not wrap it in HTML
    +         * @param {String} [content] crossLink helper content
    +         */
    +        _parseCrossLink: function (item, raw, content) {
    +            var self = this;
    +            var parts,
    +                base = '../',
    +                baseItem,
    +                newWin = false,
    +                group = /&lt;.*(?=&gt;$)/.test(item) ? 'elements' : 'classes',
    +                className = 'crosslink';
    +
    +            if (group === 'classes') {
    +                item = fixType(item);
    +            }
    +
    +            item = baseItem = Y.Lang.trim(item.replace('{', '').replace('}', ''));
    +            //Remove Cruft
    +            item = item.replace('*', '').replace('[', '').replace(']', '').replace('&lt;', '').replace('&gt;', '');
    +
    +            var link = false,
    +                href;
    +
    +            if (self.data[group][item]) {
    +                link = true;
    +            } else {
    +                if (self.data[group][item.replace('.', '')]) {
    +                    link = true;
    +                    item = item.replace('.', '');
    +                }
    +            }
    +            if (self.options.externalData) {
    +                if (self.data[group][item]) {
    +                    if (self.data[group][item].external) {
    +                        href = self.data[group][item].path;
    +                        base = self.options.externalData.base;
    +                        className += ' external';
    +                        newWin = true;
    +                        link = true;
    +                    }
    +                }
    +            }
    +
    +            if (group === 'elements' && item.indexOf(' ') > -1) {
    +                // Fragment link for an attribute is required
    +                parts = item.split(' ');
    +                var el = parts[0],
    +                    attr = parts[1];
    +
    +                if (el && attr) {
    +                    if (self.data.elements[el]) {
    +                        self.data.elements[el].attributes.some(function (i) {
    +                            if (i.name === attr) {
    +                                link = true;
    +                                baseItem = attr;
    +                                href = Y.webpath(base, 'elements', el + '.html#' + attr);
    +                            }
    +                        });
    +                    }
    +                }
    +            } else if (item.indexOf('/') > -1) {
    +                //We have a class + method to parse
    +                parts = item.split('/');
    +                var cls = parts[0],
    +                    method = parts[1],
    +                    type = 'method';
    +
    +                if (method.indexOf(':') > -1) {
    +                    parts = method.split(':');
    +                    method = parts[0];
    +                    type = parts[1];
    +                    if (type.indexOf('attr') === 0) {
    +                        type = 'attribute';
    +                    }
    +                }
    +
    +                if (cls && method) {
    +                    if (self.data.classes[cls]) {
    +                        self.data.classitems.forEach(function (i) {
    +                            if (i.itemtype === type && i.name === method && i.class === cls) {
    +                                link = true;
    +                                baseItem = method;
    +                                var t = type;
    +                                if (t === 'attribute') {
    +                                    t = 'attr';
    +                                }
    +                                href = Y.webpath(base, 'classes', cls + '.html#' + t + '_' + method);
    +                            }
    +                        });
    +                    }
    +                }
    +
    +            }
    +
    +            if (item === 'Object' || item === 'Array') {
    +                link = false;
    +            }
    +            if (!href) {
    +                href = Y.webpath(base, group, item + '.html');
    +                if (base.match(/^https?:\/\//)) {
    +                    href = base + Y.webpath(group, item + '.html');
    +                }
    +            }
    +            if (!link && self.options.linkNatives) {
    +                href = mdn.getLink.apply(mdn, item.split('/'));
    +                if (href) {
    +                    className += ' external';
    +                    newWin = true;
    +                    link = true;
    +                }
    +            }
    +            if (link) {
    +                if (content !== undefined) {
    +                    content = content.trim();
    +                }
    +                if (!content) {
    +                    content = baseItem;
    +                }
    +                item = '<a href="' + href + '" class="' + className + '"' + ((newWin) ? ' target="_blank"' : '') + '>' + content + '</a>';
    +            }
    +            return (raw) ? href : item;
    +        },
    +
    +        /**
    +         * Mixes the various external data soures together into the local data, augmenting
    +         * it with flags.
    +         * @method _mixExternal
    +         * @private
    +         */
    +        _mixExternal: function () {
    +            var self = this;
    +            Y.log('External data received, mixing', 'info', 'builder');
    +            self.options.externalData.forEach(function (exData) {
    +
    +                ['files', 'elements', 'classes', 'modules'].forEach(function (k) {
    +                    Y.each(exData[k], function (item, key) {
    +                        item.external = true;
    +                        var file = item.name;
    +                        if (!item.file) {
    +                            file = self.filterFileName(item.name);
    +                        }
    +
    +                        if (item.type) {
    +                            item.type = fixType(item.type);
    +                        }
    +
    +                        item.path = exData.base + path.join(k, file + '.html');
    +
    +                        self.data[k][key] = item;
    +                    });
    +                });
    +                Y.each(exData.classitems, function (item) {
    +                    item.external = true;
    +                    item.path = exData.base + path.join('files', self.filterFileName(item.file) + '.html');
    +                    if (item.type) {
    +                        item.type = fixType(item.type);
    +                    }
    +                    if (item.params) {
    +                        item.params.forEach(function (p) {
    +                            if (p.type) {
    +                                p.type = fixType(p.type);
    +                            }
    +                        });
    +                    }
    +                    if (item.return) {
    +                        item.return.type = fixType(item.return.type);
    +                    }
    +                    self.data.classitems.push(item);
    +                });
    +            });
    +        },
    +        /**
    +         * Fetches the remote data and fires the callback when it's all complete
    +         * @method mixExternal
    +         * @param {Callback} cb The callback to execute when complete
    +         * @async
    +         */
    +        mixExternal: function (cb) {
    +            var self = this,
    +                info = self.options.external;
    +
    +            if (!info) {
    +                cb();
    +                return;
    +            }
    +            if (!info.merge) {
    +                info.merge = 'mix';
    +            }
    +            if (!info.data) {
    +                Y.log('External config found but no data path defined, skipping import.', 'warn', 'builder');
    +                cb();
    +                return;
    +            }
    +            if (!Y.Lang.isArray(info.data)) {
    +                info.data = [info.data];
    +            }
    +            Y.log('Importing external documentation data.', 'info', 'builder');
    +
    +            var stack = new Y.Parallel();
    +            info.data.forEach(function (i) {
    +                var base;
    +                if (typeof i === 'object') {
    +                    base = i.base;
    +                    i = i.json;
    +                }
    +                if (i.match(/^https?:\/\//)) {
    +                    if (!base) {
    +                        base = i.replace('data.json', '');
    +                    }
    +                    Y.use('io-base', stack.add(function () {
    +                        Y.log('Fetching: ' + i, 'info', 'builder');
    +                        Y.io(i, {
    +                            on: {
    +                                complete: stack.add(function (id, e) {
    +                                    Y.log('Received: ' + i, 'info', 'builder');
    +                                    var parsedData = JSON.parse(e.responseText);
    +                                    parsedData.base = base;
    +                                    //self.options.externalData = Y.mix(self.options.externalData || {}, data);
    +                                    if (!self.options.externalData) {
    +                                        self.options.externalData = [];
    +                                    }
    +                                    self.options.externalData.push(parsedData);
    +                                })
    +                            }
    +                        });
    +                    }));
    +                } else {
    +                    if (!base) {
    +                        base = path.dirname(path.resolve(i));
    +                    }
    +                    var data = Y.Files.getJSON(i);
    +                    data.base = base;
    +                    //self.options.externalData = Y.mix(self.options.externalData || {}, data);
    +                    if (!self.options.externalData) {
    +                        self.options.externalData = [];
    +                    }
    +                    self.options.externalData.push(data);
    +                }
    +            });
    +
    +            stack.done(function () {
    +                Y.log('Finished fetching remote data', 'info', 'builder');
    +                self._mixExternal();
    +                cb();
    +            });
    +        },
    +        /**
    +         * File counter
    +         * @property files
    +         * @type Number
    +         */
    +        files: null,
    +        /**
    +         * Holder for project meta data
    +         * @property _meta
    +         * @type Object
    +         * @private
    +         */
    +        _meta: null,
    +        /**
    +         * Prep the meta data to be fed to Selleck
    +         * @method getProjectMeta
    +         * @return {Object} The project metadata
    +         */
    +        getProjectMeta: function () {
    +            var obj = {
    +                meta: {
    +                    yuiSeedUrl: 'http://yui.yahooapis.com/3.5.0/build/yui/yui-min.js',
    +                    yuiGridsUrl: 'http://yui.yahooapis.com/3.5.0/build/cssgrids/cssgrids-min.css'
    +                }
    +            };
    +            if (!this._meta) {
    +                try {
    +                    var meta,
    +                        theme = path.join(themeDir, 'theme.json');
    +                    if (Y.Files.exists(theme)) {
    +                        Y.log('Loading theme from ' + theme, 'info', 'builder');
    +                        meta = Y.Files.getJSON(theme);
    +                    } else if (DEFAULT_THEME !== themeDir) {
    +                        theme = path.join(DEFAULT_THEME, 'theme.json');
    +                        if (Y.Files.exists(theme)) {
    +                            Y.log('Loading theme from ' + theme, 'info', 'builder');
    +                            meta = Y.Files.getJSON(theme);
    +                        }
    +                    }
    +
    +                    if (meta) {
    +                        obj.meta = meta;
    +                        this._meta = meta;
    +                    }
    +                } catch (e) {
    +                    console.error('Error', e);
    +                }
    +            } else {
    +                obj.meta = this._meta;
    +            }
    +            Y.each(this.data.project, function (v, k) {
    +                var key = k.substring(0, 1).toUpperCase() + k.substring(1, k.length);
    +                obj.meta['project' + key] = v;
    +            });
    +            return obj;
    +        },
    +        /**
    +         * Populate the meta data for classes
    +         * @method populateClasses
    +         * @param {Object} opts The original options
    +         * @return {Object} The modified options
    +         */
    +        populateClasses: function (opts) {
    +            opts.meta.classes = [];
    +            Y.each(this.data.classes, function (v) {
    +                if (v.external) {
    +                    return;
    +                }
    +                opts.meta.classes.push({
    +                    displayName: v.name,
    +                    name: v.name,
    +                    namespace: v.namespace,
    +                    module: v.module,
    +                    description: v.description,
    +                    access: v.access || 'public'
    +                });
    +            });
    +            opts.meta.classes.sort(this.nameSort);
    +            return opts;
    +        },
    +        /**
    +         * Populate the meta data for elements
    +         * @method populateElements
    +         * @param {Object} opts The original options
    +         * @return {Object} The modified options
    +         */
    +        populateElements: function (opts) {
    +            opts.meta.elements = [];
    +            Y.each(this.data.elements, function (v) {
    +                if (v.external) {
    +                    return;
    +                }
    +                opts.meta.elements.push({
    +                    displayName: '<' + v.name + '>',
    +                    name: v.name,
    +                    module: v.module,
    +                    description: v.description
    +                });
    +            });
    +            opts.meta.elements.sort(this.nameSort);
    +            return opts;
    +        },
    +        /**
    +         * Populate the meta data for modules
    +         * @method populateModules
    +         * @param {Object} opts The original options
    +         * @return {Object} The modified options
    +         */
    +        populateModules: function (opts) {
    +            var self = this;
    +            opts.meta.modules = [];
    +            opts.meta.allModules = [];
    +            Y.each(this.data.modules, function (v) {
    +                if (v.external) {
    +                    return;
    +                }
    +                opts.meta.allModules.push({
    +                    displayName: v.displayName || v.name,
    +                    name: self.filterFileName(v.name),
    +                    description: v.description
    +                });
    +                if (!v.is_submodule) {
    +                    var o = {
    +                        displayName: v.displayName || v.name,
    +                        name: self.filterFileName(v.name)
    +                    };
    +                    if (v.submodules) {
    +                        o.submodules = [];
    +                        Y.each(v.submodules, function (i, k) {
    +                            var moddef = self.data.modules[k];
    +                            if (moddef) {
    +                                o.submodules.push({
    +                                    displayName: k,
    +                                    description: moddef.description
    +                                });
    +                                // } else {
    +                                //     Y.log('Submodule data missing: ' + k + ' for ' + v.name, 'warn', 'builder');
    +                            }
    +                        });
    +                        o.submodules.sort(self.nameSort);
    +                    }
    +                    opts.meta.modules.push(o);
    +                }
    +            });
    +            opts.meta.modules.sort(this.nameSort);
    +            opts.meta.allModules.sort(this.nameSort);
    +            return opts;
    +        },
    +        /**
    +         * Populate the meta data for files
    +         * @method populateFiles
    +         * @param {Object} opts The original options
    +         * @return {Object} The modified options
    +         */
    +        populateFiles: function (opts) {
    +            var self = this;
    +            opts.meta.files = [];
    +            Y.each(this.data.files, function (v) {
    +                if (v.external) {
    +                    return;
    +                }
    +                opts.meta.files.push({
    +                    displayName: v.name,
    +                    name: self.filterFileName(v.name),
    +                    path: v.path || v.name
    +                });
    +            });
    +
    +            var tree = {};
    +            var files = [];
    +            Y.each(this.data.files, function (v) {
    +                if (v.external) {
    +                    return;
    +                }
    +                files.push(v.name);
    +            });
    +            files.sort();
    +            Y.each(files, function (v) {
    +                var p = v.split('/'),
    +                    par;
    +                p.forEach(function (i, k) {
    +                    if (!par) {
    +                        if (!tree[i]) {
    +                            tree[i] = {};
    +                        }
    +                        par = tree[i];
    +                    } else {
    +                        if (!par[i]) {
    +                            par[i] = {};
    +                        }
    +                        if (k + 1 === p.length) {
    +                            par[i] = {
    +                                path: v,
    +                                name: self.filterFileName(v)
    +                            };
    +                        }
    +                        par = par[i];
    +                    }
    +                });
    +            });
    +
    +            opts.meta.fileTree = tree;
    +
    +            return opts;
    +        },
    +        /**
    +         * Parses file and line number from an item object and build's an HREF
    +         * @method addFoundAt
    +         * @param {Object} a The item to parse
    +         * @return {String} The parsed HREF
    +         */
    +        addFoundAt: function (a) {
    +            var self = this;
    +            if (a.file && a.line && !self.options.nocode) {
    +                a.foundAt = '../files/' + self.filterFileName(a.file) + '.html#l' + a.line;
    +                if (a.path) {
    +                    a.foundAt = a.path + '#l' + a.line;
    +                }
    +            }
    +            return a;
    +        },
    +        /**
    +         * Augments the **DocParser** meta data to provide default values for certain keys as well as parses all descriptions
    +         * with the `Markdown Parser`
    +         * @method augmentData
    +         * @param {Object} o The object to recurse and augment
    +         * @return {Object} The augmented object
    +         */
    +        augmentData: function (o) {
    +            var self = this;
    +            o = self.addFoundAt(o);
    +            Y.each(o, function (i, k1) {
    +                if (i && i.forEach) {
    +                    Y.each(i, function (a, k) {
    +                        if (!(a instanceof Object)) {
    +                            return;
    +                        }
    +                        if (!a.type) {
    +                            a.type = 'Object'; //Default type is Object
    +                        }
    +                        if (a.final === '') {
    +                            a.final = true;
    +                        }
    +                        if (!a.description) {
    +                            a.description = ' ';
    +                        } else if (!o.extended_from) {
    +                            a.description = self.markdown(a.description);
    +                        }
    +                        if (a.example && !o.extended_from) {
    +                            a.example = self.markdown(a.example);
    +                        }
    +                        a = self.addFoundAt(a);
    +
    +                        Y.each(a, function (c, d) {
    +                            if (c.forEach || (c instanceof Object)) {
    +                                c = self.augmentData(c);
    +                                a[d] = c;
    +                            }
    +                        });
    +
    +                        o[k1][k] = a;
    +                    });
    +                } else if (i instanceof Object) {
    +                    i = self.addFoundAt(i);
    +                    Y.each(i, function (v, k) {
    +                        if (k === 'final') {
    +                            o[k1][k] = true;
    +                        } else if (k === 'description' || k === 'example') {
    +                            if (v.forEach || (v instanceof Object)) {
    +                                o[k1][k] = self.augmentData(v);
    +                            } else {
    +                                o[k1][k] = o.extended_from ? v : self.markdown(v);
    +                            }
    +                        }
    +                    });
    +                } else if (k1 === 'description' || k1 === 'example') {
    +                    o[k1] = o.extended_from ? i : self.markdown(i);
    +                }
    +            });
    +            return o;
    +        },
    +        /**
    +         * Makes the default directories needed
    +         * @method makeDirs
    +         * @param {Callback} cb The callback to execute after it's completed
    +         */
    +        makeDirs: function (cb) {
    +            var self = this;
    +            var dirs = ['classes', 'elements', 'modules', 'files'];
    +            if (self.options.dumpview) {
    +                dirs.push('json');
    +            }
    +            var writeRedirect = function (dir, file, cbWriteRedirect) {
    +                Y.Files.exists(file, function (x) {
    +                    if (x) {
    +                        var out = path.join(dir, 'index.html');
    +                        fs.createReadStream(file).pipe(fs.createWriteStream(out));
    +                    }
    +                    cbWriteRedirect();
    +                });
    +            };
    +            var defaultIndex = path.join(themeDir, 'assets', 'index.html');
    +            var stack = new Y.Parallel();
    +            Y.log('Making default directories: ' + dirs.join(','), 'info', 'builder');
    +            dirs.forEach(function (d) {
    +                var dir = path.join(self.options.outdir, d);
    +                Y.Files.exists(dir, stack.add(function (x) {
    +                    if (!x) {
    +                        fs.mkdir(dir, '0777', stack.add(function () {
    +                            writeRedirect(dir, defaultIndex, stack.add(noop));
    +                        }));
    +                    } else {
    +                        writeRedirect(dir, defaultIndex, stack.add(noop));
    +                    }
    +                }));
    +            });
    +            stack.done(function () {
    +                if (cb) {
    +                    cb();
    +                }
    +            });
    +        },
    +
    +
    +        _resolveUrl: function (url, opts) {
    +            if (!url) {
    +                return null;
    +            }
    +            if (url.indexOf('://') >= 0) {
    +                return url;
    +            }
    +            return path.join(opts.meta.projectRoot, url);
    +        },
    +
    +        /**
    +         * Parses `<pre><code>` tags and adds the __prettyprint__ `className` to them
    +         * @method _parseCode
    +         * @private
    +         * @param {HTML} html The HTML to parse
    +         * @return {HTML} The parsed HTML
    +         */
    +        _parseCode: function (html) {
    +            html = html || '';
    +            //html = html.replace(/<pre><code>/g, '<pre class="code"><code class="prettyprint">');
    +            html = html.replace(/<pre><code/g, '<pre class="code prettyprint"><code');
    +            return html;
    +        },
    +        /**
    +        * Ported from [Selleck](https://github.com/rgrove/selleck), this handles ```'s in fields
    +        that are not parsed by the **Markdown** parser.
    +        * @method _inlineCode
    +        * @private
    +        * @param {HTML} html The HTML to parse
    +        * @return {HTML} The parsed HTML
    +        */
    +        _inlineCode: function (html) {
    +            html = html.replace(/\\`/g, '__{{SELLECK_BACKTICK}}__');
    +
    +            html = html.replace(/`(.+?)`/g, function (match, code) {
    +                return '<code>' + Y.escapeHTML(code) + '</code>';
    +            });
    +
    +            html = html.replace(/__\{\{SELLECK_BACKTICK\}\}__/g, '`');
    +
    +            return html;
    +        },
    +        /**
    +        * Ported from [Selleck](https://github.com/rgrove/selleck)
    +        Renders the handlebars templates with the default View class.
    +        * @method render
    +        * @param {HTML} source The default template to parse
    +        * @param {Class} view The default view handler
    +        * @param {HTML} [layout=null] The HTML from the layout to use.
    +        * @param {Object} [partials=object] List of partials to include in this template
    +        * @param {Callback} callback
    +        * @param {Error} callback.err
    +        * @param {HTML} callback.html The assembled template markup
    +        */
    +        render: function (source, view, layout, partials, callback) {
    +            var html = [];
    +
    +            // function buffer(line) {
    +            //     html.push(line);
    +            // }
    +
    +            // Allow callback as third or fourth param.
    +            if (typeof partials === 'function') {
    +                callback = partials;
    +                partials = {};
    +            } else if (typeof layout === 'function') {
    +                callback = layout;
    +                layout = null;
    +            }
    +            var parts = Y.merge(partials || {}, {
    +                layout_content: source
    +            });
    +            Y.each(parts, function (partialsSource, name) {
    +                Y.Handlebars.registerPartial(name, partialsSource);
    +            });
    +
    +            if (!TEMPLATE || !this.cacheTemplates) {
    +                TEMPLATE = Y.Handlebars.compile(layout);
    +            }
    +
    +
    +            var _v = {};
    +            for (var k in view) {
    +                if (Y.Lang.isFunction(view[k])) {
    +                    _v[k] = view[k]();
    +                } else {
    +                    _v[k] = view[k];
    +                }
    +            }
    +            html = TEMPLATE(_v);
    +            //html = html.replace(/{{&#x2F;/g, '{{/');
    +
    +
    +            //html = (Y.Handlebars.compile(html))({});
    +
    +            html = this._inlineCode(html);
    +            callback(null, html);
    +        },
    +        /**
    +         * Render the index file
    +         * @method renderIndex
    +         * @param {Function} cb The callback fired when complete
    +         * @param {String} cb.html The HTML to render this view
    +         * @param {Object} cb.view The View Data
    +         */
    +        renderIndex: function (cb) {
    +            var self = this;
    +
    +            Y.prepare([DEFAULT_THEME, themeDir], self.getProjectMeta(), function (err, opts) {
    +                if (err) {
    +                    Y.log(err, 'error', 'builder');
    +                    cb(err);
    +                    return;
    +                }
    +                opts.meta.title = self.data.project.name;
    +                opts.meta.projectRoot = './';
    +                opts.meta.projectAssets = './assets';
    +                opts.meta.projectLogo = self._resolveUrl(self.data.project.logo, opts);
    +                opts = self.populateClasses(opts);
    +                opts = self.populateElements(opts);
    +                opts = self.populateModules(opts);
    +
    +                var view = new Y.DocView(opts.meta);
    +                self.render('{{>index}}', view, opts.layouts.main, opts.partials, function (renderErr, html) {
    +                    if (renderErr) {
    +                        Y.log(renderErr, 'error', 'builder');
    +                        cb(renderErr);
    +                        return;
    +                    }
    +                    self.files++;
    +                    cb(html, view);
    +                });
    +            });
    +        },
    +        /**
    +         * Generates the index.html file
    +         * @method writeIndex
    +         * @param {Callback} cb The callback to execute after it's completed
    +         * @param {String} cb.html The HTML to write index view
    +         * @param {Object} cb.view The View Data
    +         */
    +        writeIndex: function (cb) {
    +            var self = this,
    +                stack = new Y.Parallel();
    +
    +            Y.log('Preparing index.html', 'info', 'builder');
    +            self.renderIndex(stack.add(function (html, view) {
    +                stack.html = html;
    +                stack.view = view;
    +                if (self.options.dumpview) {
    +                    Y.Files.writeFile(path.join(self.options.outdir, 'json', 'index.json'), JSON.stringify(view), stack.add(noop));
    +                }
    +                Y.Files.writeFile(path.join(self.options.outdir, 'index.html'), html, stack.add(noop));
    +            }));
    +
    +            stack.done(function ( /* html, view */ ) {
    +                Y.log('Writing index.html', 'info', 'builder');
    +                cb(stack.html, stack.view);
    +            });
    +        },
    +        /**
    +         * Render a module
    +         * @method renderModule
    +         * @param {Function} cb The callback fired when complete
    +         * @param {String} cb.html The HTML to render this view
    +         * @param {Object} cb.view The View Data
    +         */
    +        renderModule: function (cb, data, layout) {
    +            var self = this;
    +            var stack = new Y.Parallel();
    +
    +            data.displayName = data.name;
    +            data.name = self.filterFileName(data.name);
    +            Y.prepare([DEFAULT_THEME, themeDir], self.getProjectMeta(), function (err, opts) {
    +                if (err) {
    +                    Y.log(err, 'error', 'builder');
    +                    cb(err);
    +                    return;
    +                }
    +                opts.meta = Y.merge(opts.meta, data);
    +
    +                //opts.meta.htmlTitle = v.name + ': ' + self.data.project.name;
    +                opts.meta.title = self.data.project.name;
    +
    +                opts.meta.moduleName = data.displayName || data.name;
    +                opts.meta.moduleDescription = self._parseCode(self.markdown(data.description || ' '));
    +                opts.meta.file = data.file;
    +                opts.meta.line = data.line;
    +                opts.meta = self.addFoundAt(opts.meta);
    +                opts.meta.projectRoot = '../';
    +                opts.meta.projectAssets = '../assets';
    +                opts.meta.projectLogo = self._resolveUrl(self.data.project.logo, opts);
    +                opts = self.populateClasses(opts);
    +                opts = self.populateElements(opts);
    +                opts = self.populateModules(opts);
    +                opts = self.populateFiles(opts);
    +
    +                if (data.classes && Object.keys(data.classes).length) {
    +                    opts.meta.moduleClasses = [];
    +                    Y.each(Object.keys(data.classes), function (name) {
    +                        var i = self.data.classes[name];
    +                        if (i) {
    +                            opts.meta.moduleClasses.push({
    +                                name: i.name,
    +                                displayName: i.name
    +                            });
    +                        }
    +                    });
    +                    opts.meta.moduleClasses.sort(self.nameSort);
    +                }
    +                if (data.elements && Object.keys(data.elements).length) {
    +                    opts.meta.moduleElements = [];
    +                    Y.each(Object.keys(data.elements), function (name) {
    +                        var i = self.data.elements[name];
    +                        if (i) {
    +                            opts.meta.moduleElements.push({
    +                                name: i.name,
    +                                displayName: i.name
    +                            });
    +                        }
    +                    });
    +                    opts.meta.moduleElements.sort(self.nameSort);
    +                }
    +                if (data.example && data.example.length) {
    +                    if (data.example.forEach) {
    +                        var e = '';
    +                        data.example.forEach(function (v) {
    +                            e += self._parseCode(self.markdown(v));
    +                        });
    +                        data.example = e;
    +                    } else {
    +                        data.example = self._parseCode(self.markdown(data.example));
    +                    }
    +                    opts.meta.example = data.example;
    +                }
    +                if (data.submodules && Object.keys(data.submodules).length) {
    +                    opts.meta.subModules = [];
    +                    Y.each(Object.keys(data.submodules), function (name) {
    +                        var i = self.data.modules[name];
    +                        if (i) {
    +                            opts.meta.subModules.push({
    +                                name: i.name,
    +                                displayName: i.name,
    +                                description: i.description
    +                            });
    +                        }
    +                    });
    +                    opts.meta.subModules.sort(self.nameSort);
    +                }
    +
    +                var view = new Y.DocView(opts.meta);
    +                var mainLayout = opts.layouts[layout];
    +                self.render('{{>module}}', view, mainLayout, opts.partials, stack.add(function (renderErr, html) {
    +                    if (renderErr) {
    +                        Y.log(renderErr, 'error', 'builder');
    +                        cb(renderErr);
    +                        return;
    +                    }
    +                    self.files++;
    +                    stack.html = html;
    +                    stack.view = view;
    +                }));
    +            });
    +
    +            stack.done(function () {
    +                cb(stack.html, stack.view);
    +            });
    +        },
    +        /**
    +         * Generates the module files under "out"/modules/
    +         * @method writeModules
    +         * @param {Callback} cb The callback to execute after it's completed
    +         * @param {String} cb.html The HTML to write module view
    +         * @param {Object} cb.view The View Data
    +         */
    +        writeModules: function (cb, layout) {
    +            layout = layout || 'main';
    +            var self = this,
    +                stack = new Y.Parallel();
    +            stack.html = [];
    +            stack.view = [];
    +
    +            var counter = 0;
    +            Object.keys(self.data.modules).forEach(function (k) {
    +                if (!self.data.modules[k].external) {
    +                    counter++;
    +                }
    +            });
    +            Y.log('Rendering and writing ' + counter + ' modules pages.', 'info', 'builder');
    +            Y.each(self.data.modules, function (v) {
    +                if (v.external) {
    +                    return;
    +                }
    +                self.renderModule(function (html, view) {
    +                    stack.html.push(html);
    +                    stack.view.push(view);
    +                    if (self.options.dumpview) {
    +                        Y.Files.writeFile(
    +                            path.join(self.options.outdir, 'json', 'module_' + v.name + '.json'),
    +                            JSON.stringify(view),
    +                            stack.add(noop)
    +                        );
    +                    }
    +                    Y.Files.writeFile(path.join(self.options.outdir, 'modules', v.name + '.html'), html, stack.add(noop));
    +                }, v, layout);
    +            });
    +            stack.done(function () {
    +                Y.log('Finished writing module files', 'info', 'builder');
    +                cb(stack.html, stack.view);
    +            });
    +        },
    +        /**
    +         * Checks an array of items (class items) to see if an item is in that list
    +         * @method hasProperty
    +         * @param {Array} a The Array of items to check
    +         * @param {Object} b The object to find
    +         * @return Boolean
    +         */
    +        hasProperty: function (a, b) {
    +            var other = false;
    +            Y.some(a, function (i, k) {
    +                if ((i.itemtype === b.itemtype) && (i.name === b.name)) {
    +                    other = k;
    +                    return true;
    +                }
    +            });
    +            return other;
    +        },
    +        /**
    +         * Counter for stepping into merges
    +         * @private
    +         * @property _mergeCounter
    +         * @type Number
    +         */
    +        _mergeCounter: null,
    +        /**
    +         * Merge superclass data into a child class
    +         * @method mergeExtends
    +         * @param {Object} info The item to extend
    +         * @param {Array} classItems The list of items to merge in
    +         * @param {Boolean} first Set for the first call
    +         */
    +        mergeExtends: function (info, classItems, first) {
    +            var self = this;
    +            self._mergeCounter = (first) ? 0 : (self._mergeCounter + 1);
    +
    +            if (self._mergeCounter === 100) {
    +                throw ('YUIDoc detected a loop extending class ' + info.name);
    +            }
    +            if (info.extends || info.uses) {
    +                var hasItems = {};
    +                hasItems[info.extends] = 1;
    +                if (info.uses) {
    +                    info.uses.forEach(function (v) {
    +                        hasItems[v] = 1;
    +                    });
    +                }
    +                self.data.classitems.forEach(function (v) {
    +                    //console.error(v.class, '==', info.extends);
    +                    if (hasItems[v.class]) {
    +                        if (!v.static) {
    +                            var q,
    +                                override = self.hasProperty(classItems, v);
    +                            if (override === false) {
    +                                //This method was extended from the parent class but not over written
    +                                //console.error('Merging extends from', v.class, 'onto', info.name);
    +                                q = Y.merge({}, v);
    +                                q.extended_from = v.class;
    +                                classItems.push(q);
    +                            } else {
    +                                //This method was extended from the parent and overwritten in this class
    +                                q = Y.merge({}, v);
    +                                q = self.augmentData(q);
    +                                classItems[override].overwritten_from = q;
    +                            }
    +                        }
    +                    }
    +                });
    +                if (self.data.classes[info.extends]) {
    +                    if (self.data.classes[info.extends].extends || self.data.classes[info.extends].uses) {
    +                        //console.error('Stepping down to:', self.data.classes[info.extends]);
    +                        classItems = self.mergeExtends(self.data.classes[info.extends], classItems);
    +                    }
    +                }
    +            }
    +            return classItems;
    +        },
    +        /**
    +         * Render the class file
    +         * @method renderClass
    +         * @param {Function} cb The callback fired when complete
    +         * @param {String} cb.html The HTML to render this view
    +         * @param {Object} cb.view The View Data
    +         */
    +        renderClass: function (cb, data, layout) {
    +            var self = this;
    +            var stack = new Y.Parallel();
    +
    +            Y.prepare([DEFAULT_THEME, themeDir], self.getProjectMeta(), function (err, opts) {
    +                //console.log(opts);
    +                if (err) {
    +                    console.log(err);
    +                }
    +                opts.meta = Y.merge(opts.meta, data);
    +
    +                opts.meta.title = self.data.project.name;
    +                opts.meta.moduleName = data.name;
    +                opts.meta.file = data.file;
    +                opts.meta.line = data.line;
    +                opts.meta = self.addFoundAt(opts.meta);
    +                opts.meta.projectRoot = '../';
    +                opts.meta.projectAssets = '../assets';
    +                opts.meta.projectLogo = self._resolveUrl(self.data.project.logo, opts);
    +
    +                opts = self.populateClasses(opts);
    +                opts = self.populateElements(opts);
    +                opts = self.populateModules(opts);
    +                opts = self.populateFiles(opts);
    +
    +                opts.meta.classDescription = self._parseCode(self.markdown(data.description || ' '));
    +
    +                opts.meta.methods = [];
    +                opts.meta.properties = [];
    +                opts.meta.attrs = [];
    +                opts.meta.events = [];
    +                opts.meta.extension_for = null;
    +                if (data.uses) {
    +                    opts.meta.uses = data.uses;
    +                }
    +                if (data.entension_for && data.extension_for.length) {
    +                    opts.meta.extension_for = data.extension_for;
    +                }
    +
    +                if (data.extends) {
    +                    opts.meta.extends = data.extends;
    +                }
    +
    +                var classItems = [];
    +                self.data.classitems.forEach(function (classItem) {
    +                    if (classItem.class === data.name) {
    +                        classItems.push(classItem);
    +                    }
    +                });
    +
    +                classItems = self.mergeExtends(data, classItems, true);
    +
    +                if (data.is_constructor) {
    +                    var constructor = Y.mix({}, data);
    +                    constructor = self.augmentData(constructor);
    +                    constructor.paramsList = [];
    +                    if (constructor.params) {
    +                        constructor.params.forEach(function (p) {
    +                            var name = p.name;
    +                            if (p.optional) {
    +                                name = '[' + name + ((p.optdefault) ? '=' + p.optdefault : '') + ']';
    +                            }
    +                            constructor.paramsList.push(name);
    +                        });
    +                    }
    +                    //i.methodDescription = self._parseCode(markdown(i.description));
    +                    constructor.hasAccessType = constructor.access;
    +                    constructor.hasParams = constructor.paramsList.length;
    +                    if (constructor.paramsList.length) {
    +                        constructor.paramsList = constructor.paramsList.join(', ');
    +                    } else {
    +                        constructor.paramsList = ' ';
    +                    }
    +                    constructor.returnType = ' ';
    +                    if (constructor.return) {
    +                        constructor.hasReturn = true;
    +                        constructor.returnType = constructor.return.type;
    +                    }
    +                    //console.error(i);
    +                    opts.meta.is_constructor = [constructor];
    +                    if (constructor.example && constructor.example.length) {
    +                        if (constructor.example.forEach) {
    +                            var example = '';
    +                            constructor.example.forEach(function (v) {
    +                                example += self._parseCode(self.markdown(v));
    +                            });
    +                            constructor.example = example;
    +                        } else {
    +                            constructor.example = self._parseCode(self.markdown(constructor.example));
    +                        }
    +                    }
    +                }
    +
    +                classItems.forEach(function (i) {
    +                    var e;
    +                    switch (i.itemtype) {
    +                    case 'method':
    +                        i = self.augmentData(i);
    +                        i.paramsList = [];
    +                        if (i.params && i.params.forEach) {
    +                            i.params.forEach(function (p) {
    +                                var name = p.name;
    +                                if (p.optional) {
    +                                    name = '[' + name + ((p.optdefault) ? '=' + p.optdefault : '') + ']';
    +                                }
    +                                i.paramsList.push(name);
    +                            });
    +                        }
    +                        i.methodDescription = self._parseCode(i.description);
    +                        if (i.example && i.example.length) {
    +                            if (i.example.forEach) {
    +                                e = '';
    +                                i.example.forEach(function (v) {
    +                                    e += self._parseCode(self.markdown(v));
    +                                });
    +                                i.example = e;
    +                            } else if (!i.extended_from) {
    +                                i.example = self._parseCode(self.markdown(i.example));
    +                            }
    +                        }
    +                        i.hasAccessType = i.access;
    +                        i.hasParams = i.paramsList.length;
    +                        if (i.paramsList.length) {
    +                            i.paramsList = i.paramsList.join(', ');
    +                        } else {
    +                            i.paramsList = ' ';
    +                        }
    +                        i.returnType = ' ';
    +                        if (i.return) {
    +                            i.hasReturn = true;
    +                            i.returnType = i.return.type;
    +                        }
    +
    +                        // If this item is provided by a module other
    +                        // than the module that provided the original
    +                        // class, add the original module name to the
    +                        // item's `providedBy` property so we can
    +                        // indicate the relationship.
    +                        if ((i.submodule || i.module) !== (data.submodule || data.module)) {
    +                            i.providedBy = (i.submodule || i.module);
    +                        }
    +
    +                        opts.meta.methods.push(i);
    +                        break;
    +                    case 'property':
    +                        i = self.augmentData(i);
    +                        //i.propertyDescription = self._parseCode(markdown(i.description || ''));
    +                        i.propertyDescription = self._parseCode(i.description);
    +                        if (!i.type) {
    +                            i.type = 'unknown';
    +                        }
    +                        if (i.final === '') {
    +                            i.final = true;
    +                        }
    +                        if (i.example && i.example.length) {
    +                            if (i.example.forEach) {
    +                                e = '';
    +                                i.example.forEach(function (v) {
    +                                    e += self._parseCode(self.markdown(v));
    +                                });
    +                                i.example = e;
    +                            } else {
    +                                i.example = self._parseCode(self.markdown(i.example));
    +                            }
    +                        }
    +
    +                        // If this item is provided by a module other
    +                        // than the module that provided the original
    +                        // class, add the original module name to the
    +                        // item's `providedBy` property so we can
    +                        // indicate the relationship.
    +                        if ((i.submodule || i.module) !== (data.submodule || data.module)) {
    +                            i.providedBy = (i.submodule || i.module);
    +                        }
    +
    +                        opts.meta.properties.push(i);
    +                        break;
    +
    +                    case 'attribute': // fallthru
    +                    case 'config':
    +                        i = self.augmentData(i);
    +                        //i.attrDescription = self._parseCode(markdown(i.description || ''));
    +                        i.attrDescription = self._parseCode(i.description);
    +
    +                        if (i.itemtype === 'config') {
    +                            i.config = true;
    +                        } else {
    +                            i.emit = self.options.attributesEmit;
    +                        }
    +                        if (i.readonly === '') {
    +                            i.readonly = true;
    +                        }
    +
    +                        if (i.example && i.example.length) {
    +                            if (i.example.forEach) {
    +                                e = '';
    +                                i.example.forEach(function (v) {
    +                                    e += self._parseCode(self.markdown(v));
    +                                });
    +                                i.example = e;
    +                            } else {
    +                                i.example = self._parseCode(self.markdown(i.example));
    +                            }
    +                        }
    +
    +                        // If this item is provided by a module other
    +                        // than the module that provided the original
    +                        // class, add the original module name to the
    +                        // item's `providedBy` property so we can
    +                        // indicate the relationship.
    +                        if ((i.submodule || i.module) !== (data.submodule || data.module)) {
    +                            i.providedBy = (i.submodule || i.module);
    +                        }
    +
    +                        opts.meta.attrs.push(i);
    +                        break;
    +                    case 'event':
    +                        i = self.augmentData(i);
    +                        //i.eventDescription = self._parseCode(markdown(i.description || ''));
    +                        i.eventDescription = self._parseCode(i.description);
    +
    +                        if (i.example && i.example.length) {
    +                            if (i.example.forEach) {
    +                                e = '';
    +                                i.example.forEach(function (v) {
    +                                    e += self._parseCode(self.markdown(v));
    +                                });
    +                                i.example = e;
    +                            } else {
    +                                i.example = self._parseCode(self.markdown(i.example));
    +                            }
    +                        }
    +
    +                        // If this item is provided by a module other
    +                        // than the module that provided the original
    +                        // class, add the original module name to the
    +                        // item's `providedBy` property so we can
    +                        // indicate the relationship.
    +                        if ((i.submodule || i.module) !== (data.submodule || data.module)) {
    +                            i.providedBy = (i.submodule || i.module);
    +                        }
    +
    +                        opts.meta.events.push(i);
    +                        break;
    +                    }
    +                });
    +
    +                if (!self.options.dontsortfields) {
    +                    opts.meta.attrs.sort(self.nameSort);
    +                    opts.meta.events.sort(self.nameSort);
    +                    opts.meta.methods.sort(self.nameSort);
    +                    opts.meta.properties.sort(self.nameSort);
    +                }
    +
    +                if (!opts.meta.methods.length) {
    +                    delete opts.meta.methods;
    +                }
    +                if (!opts.meta.properties.length) {
    +                    delete opts.meta.properties;
    +                }
    +                if (!opts.meta.attrs.length) {
    +                    delete opts.meta.attrs;
    +                }
    +                if (!opts.meta.events.length) {
    +                    delete opts.meta.events;
    +                }
    +
    +                var view = new Y.DocView(opts.meta);
    +                var mainLayout = opts.layouts[layout];
    +                self.render('{{>classes}}', view, mainLayout, opts.partials, stack.add(function (renderErr, html) {
    +                    if (renderErr) {
    +                        Y.log(renderErr, 'error', 'builder');
    +                        cb(renderErr);
    +                        return;
    +                    }
    +                    self.files++;
    +                    stack.html = html;
    +                    stack.view = view;
    +                    stack.opts = opts;
    +                }));
    +            });
    +
    +            stack.done(function () {
    +                cb(stack.html, stack.view, stack.opts);
    +            });
    +        },
    +        /**
    +         * Render the element file
    +         * @method renderElement
    +         * @param {Function} cb The callback fired when complete
    +         * @param {String} cb.html The HTML to render this view
    +         * @param {Object} cb.view The View Data
    +         */
    +        renderElement: function (cb, data, layout) {
    +            var self = this;
    +            var stack = new Y.Parallel();
    +
    +            Y.prepare([DEFAULT_THEME, themeDir], self.getProjectMeta(), function (err, opts) {
    +                if (err) {
    +                    console.log(err);
    +                }
    +                opts.meta = Y.merge(opts.meta, data);
    +
    +                opts.meta.title = self.data.project.name;
    +                opts.meta.moduleName = data.name;
    +                opts.meta.file = data.file;
    +                opts.meta.line = data.line;
    +                opts.meta = self.addFoundAt(opts.meta);
    +                opts.meta.projectRoot = '../';
    +                opts.meta.projectAssets = '../assets';
    +                opts.meta.projectLogo = self._resolveUrl(self.data.project.logo, opts);
    +
    +                opts = self.populateClasses(opts);
    +                opts = self.populateElements(opts);
    +                opts = self.populateModules(opts);
    +                opts = self.populateFiles(opts);
    +
    +                opts.meta.elementDescription = self._parseCode(self.markdown(data.description || ' '));
    +
    +                if (data.example && data.example.length) {
    +                    if (data.example.forEach) {
    +                        var e = '';
    +                        data.example.forEach(function (v) {
    +                            e += self._parseCode(self.markdown(v));
    +                        });
    +                        data.example = e;
    +                    } else {
    +                        data.example = self._parseCode(self.markdown(data.example));
    +                    }
    +                    opts.meta.example = data.example;
    +                }
    +
    +                if (!self.options.dontsortfields) {
    +                    opts.meta.attributes.sort(self.nameSort);
    +                }
    +
    +                opts.meta.attributes.forEach(function (a) {
    +                    a.description = self._parseCode(a.description);
    +                });
    +
    +                if (!opts.meta.attributes.length) {
    +                    delete opts.meta.attributes;
    +                }
    +
    +                var view = new Y.DocView(opts.meta);
    +                var mainLayout = opts.layouts[layout];
    +                self.render('{{>elements}}', view, mainLayout, opts.partials, stack.add(function (renderErr, html) {
    +                    if (renderErr) {
    +                        Y.log(renderErr, 'error', 'builder');
    +                        cb(renderErr);
    +                        return;
    +                    }
    +                    self.files++;
    +                    stack.html = html;
    +                    stack.view = view;
    +                    stack.opts = opts;
    +                }));
    +            });
    +
    +            stack.done(function () {
    +                cb(stack.html, stack.view, stack.opts);
    +            });
    +        },
    +        /**
    +         * Generates the class or element files under "out"/classes/ or "out"/elements/
    +         * @method writeComponents
    +         * @param {String} type The component type, "classes" or "elements"
    +         * @param {Callback} cb The callback to execute after it's completed
    +         * @param {String} cb.html The HTML to write class view
    +         * @param {Object} cb.view The View Data
    +         */
    +        writeComponents: function (type, cb, layout) {
    +            layout = layout || 'main';
    +            var self = this,
    +                stack = new Y.Parallel();
    +            stack.html = [];
    +            stack.view = [];
    +
    +            var counter = 0;
    +            Object.keys(self.data[type]).forEach(function (k) {
    +                if (!self.data[type][k].external) {
    +                    counter++;
    +                }
    +            });
    +            Y.log('Rendering and writing ' + counter + ' class pages.', 'info', 'builder');
    +            Y.each(self.data[type], function (v) {
    +                if (v.external) {
    +                    return;
    +                }
    +                self[type === 'classes' ? 'renderClass' : 'renderElement'](stack.add(function (html, view) {
    +                    stack.html.push(html);
    +                    stack.view.push(view);
    +                    if (self.options.dumpview) {
    +                        Y.Files.writeFile(
    +                            path.join(self.options.outdir, 'json', type + '_' + v.name + '.json'),
    +                            JSON.stringify(view),
    +                            stack.add(noop)
    +                        );
    +                    }
    +                    Y.Files.writeFile(path.join(self.options.outdir, type, v.name + '.html'), html, stack.add(noop));
    +                }), v, layout);
    +            });
    +            stack.done(function () {
    +                Y.log('Finished writing ' + type.replace(/e?s$/, '') + ' files', 'info', 'builder');
    +                cb(stack.html, stack.view);
    +            });
    +        },
    +        /**
    +         * Sort method of array of objects with a property called __name__
    +         * @method nameSort
    +         * @param {Object} a First object to compare
    +         * @param {Object} b Second object to compare
    +         * @return {Number} 1, -1 or 0 for sorting.
    +         */
    +        nameSort: function (a, b) {
    +            if (!a.name || !b.name) {
    +                return 0;
    +            }
    +            var an = a.name.toLowerCase(),
    +                bn = b.name.toLowerCase(),
    +                ret = 0;
    +
    +            if (an < bn) {
    +                ret = -1;
    +            }
    +            if (an > bn) {
    +                ret = 1;
    +            }
    +            return ret;
    +        },
    +        /**
    +         * Generates the syntax files under `"out"/files/`
    +         * @method writeFiles
    +         * @param {Callback} cb The callback to execute after it's completed
    +         * @param {String} cb.html The HTML to write file view
    +         * @param {Object} cb.view The View Data
    +         */
    +        writeFiles: function (cb, layout) {
    +            layout = layout || 'main';
    +            var self = this,
    +                stack = new Y.Parallel();
    +            stack.html = [];
    +            stack.view = [];
    +
    +            var counter = 0;
    +            Object.keys(self.data.files).forEach(function (k) {
    +                if (!self.data.files[k].external) {
    +                    counter++;
    +                }
    +            });
    +            Y.log('Rendering and writing ' + counter + ' source files.', 'info', 'builder');
    +            Y.each(self.data.files, function (v) {
    +                if (v.external) {
    +                    return;
    +                }
    +                self.renderFile(stack.add(function (html, view, data) {
    +                    if (!view || !data) {
    +                        return;
    +                    }
    +                    stack.html.push(html);
    +                    stack.view.push(view);
    +                    if (self.options.dumpview) {
    +                        Y.Files.writeFile(
    +                            path.join(self.options.outdir, 'json', 'files_' + self.filterFileName(data.name) + '.json'),
    +                            JSON.stringify(view),
    +                            stack.add(noop)
    +                        );
    +                    }
    +                    Y.Files.writeFile(
    +                        path.join(self.options.outdir, 'files', self.filterFileName(data.name) + '.html'),
    +                        html,
    +                        stack.add(noop)
    +                    );
    +                }), v, layout);
    +            });
    +            stack.done(function () {
    +                Y.log('Finished writing source files', 'info', 'builder');
    +                cb(stack.html, stack.view);
    +            });
    +        },
    +        /**
    +         * Render the source file
    +         * @method renderFile
    +         * @param {Function} cb The callback fired when complete
    +         * @param {String} cb.html The HTML to render this view
    +         * @param {Object} cb.view The View Data
    +         */
    +        renderFile: function (cb, data, layout) {
    +            var self = this;
    +
    +            Y.prepare([DEFAULT_THEME, themeDir], self.getProjectMeta(), function (err, opts) {
    +                if (err) {
    +                    console.log(err);
    +                }
    +                if (!data.name) {
    +                    return;
    +                }
    +
    +                opts.meta = Y.merge(opts.meta, data);
    +
    +                opts.meta.title = self.data.project.name;
    +                opts.meta.moduleName = data.name;
    +                opts.meta.projectRoot = '../';
    +                opts.meta.projectAssets = '../assets';
    +                opts.meta.projectLogo = self._resolveUrl(self.data.project.logo, opts);
    +
    +                opts = self.populateClasses(opts);
    +                opts = self.populateModules(opts);
    +                opts = self.populateFiles(opts);
    +
    +                opts.meta.fileName = data.name;
    +                fs.readFile(opts.meta.fileName, Y.charset, Y.rbind(function (readErr, str, readOpts, readData) {
    +                    if (readErr) {
    +                        Y.log(readErr, 'error', 'builder');
    +                        cb(readErr);
    +                        return;
    +                    }
    +
    +                    if (typeof self.options.tabspace === 'string') {
    +                        str = str.replace(/\t/g, self.options.tabspace);
    +                    }
    +
    +                    readOpts.meta.fileData = str;
    +                    var view = new Y.DocView(readOpts.meta, 'index');
    +                    var mainLayout = readOpts.layouts[layout];
    +                    self.render('{{>files}}', view, mainLayout, readOpts.partials, function (renderErr, html) {
    +                        if (renderErr) {
    +                            Y.log(renderErr, 'error', 'builder');
    +                            cb(renderErr);
    +                            return;
    +                        }
    +                        self.files++;
    +                        cb(html, view, readData);
    +                    });
    +
    +                }, this, opts, data));
    +            });
    +
    +        },
    +        /**
    +         * Write the API meta data used for the AutoComplete widget
    +         * @method writeAPIMeta
    +         * @param {Callback} cb The callback to execute when complete
    +         * @async
    +         */
    +        writeAPIMeta: function (cb) {
    +            Y.log('Writing API Meta Data', 'info', 'builder');
    +            var self = this;
    +            this.renderAPIMeta(function (js) {
    +                fs.writeFile(path.join(self.options.outdir, 'api.js'), js, Y.charset, cb);
    +            });
    +        },
    +        /**
    +         * Render the API meta and return the JavaScript
    +         * @method renderAPIMeta
    +         * @param {Callback} cb The callback
    +         * @param {String} cb.apijs The JavaScript code to write API meta data
    +         * @async
    +         */
    +        renderAPIMeta: function (cb) {
    +
    +            var opts = {
    +                meta: {}
    +            };
    +            opts = this.populateClasses(opts);
    +            opts = this.populateModules(opts);
    +            opts = this.populateElements(opts);
    +
    +            ['classes', 'modules', 'elements'].forEach(function (id) {
    +                opts.meta[id].forEach(function (v, k) {
    +                    opts.meta[id][k] = v.name;
    +                    if (v.submodules) {
    +                        v.submodules.forEach(function (s) {
    +                            opts.meta[id].push(s.displayName);
    +                        });
    +                    }
    +                });
    +                opts.meta[id].sort();
    +            });
    +
    +            var apijs = 'YUI.add("yuidoc-meta", function(Y) {\n' +
    +                '   Y.YUIDoc = { meta: ' + JSON.stringify(opts.meta, null, 4) + ' };\n' +
    +                '});';
    +
    +            cb(apijs);
    +        },
    +        /**
    +         * Normalizes a file path to a writable filename:
    +         *
    +         *    var path = 'lib/file.js';
    +         *    returns 'lib_file.js';
    +         *
    +         * @method filterFileName
    +         * @param {String} f The filename to normalize
    +         * @return {String} The filtered file path
    +         */
    +        filterFileName: function (f) {
    +            return f.replace(/[\/\\]/g, '_');
    +        },
    +        /**
    +         * Compiles the templates from the meta-data provided by DocParser
    +         * @method compile
    +         * @param {Callback} cb The callback to execute after it's completed
    +         */
    +        compile: function (cb) {
    +            var self = this;
    +            var starttime = (new Date()).getTime();
    +            Y.log('Compiling Templates', 'info', 'builder');
    +
    +            this.mixExternal(function () {
    +                self.makeDirs(function () {
    +                    Y.log('Copying Assets', 'info', 'builder');
    +                    if (!Y.Files.isDirectory(path.join(self.options.outdir, 'assets'))) {
    +                        fs.mkdirSync(path.join(self.options.outdir, 'assets'), '0777');
    +                    }
    +                    Y.Files.copyAssets([
    +                            path.join(DEFAULT_THEME, 'assets'),
    +                            path.join(themeDir, 'assets')
    +                        ],
    +                        path.join(self.options.outdir, 'assets'),
    +                        false,
    +                        function () {
    +                            var cstack = new Y.Parallel();
    +
    +                            self.writeModules(cstack.add(function () {
    +                                self.writeComponents('classes', cstack.add(function () {
    +                                    if (!self.options.nocode) {
    +                                        self.writeFiles(cstack.add(noop));
    +                                    }
    +                                }));
    +                                self.writeComponents('elements', cstack.add(function () {
    +                                    if (!self.options.nocode) {
    +                                        self.writeFiles(cstack.add(noop));
    +                                    }
    +                                }));
    +                            }));
    +                            /*
    +                        self.writeModules(cstack.add(noop));
    +                        self.writeClasses(cstack.add(noop));
    +                        if (!self.options.nocode) {
    +                            self.writeFiles(cstack.add(noop));
    +                        }
    +                        */
    +                            self.writeIndex(cstack.add(noop));
    +                            self.writeAPIMeta(cstack.add(noop));
    +
    +                            cstack.done(function () {
    +                                var endtime = (new Date()).getTime();
    +                                var timer = ((endtime - starttime) / 1000) + ' seconds';
    +                                Y.log('Finished writing ' + self.files + ' files in ' + timer, 'info', 'builder');
    +                                if (cb) {
    +                                    cb();
    +                                }
    +                            });
    +                        });
    +                });
    +            });
    +        }
    +    };
    +});
    diff --git a/lib/cli.js b/lib/cli.js
    new file mode 100755
    index 00000000..3142313a
    --- /dev/null
    +++ b/lib/cli.js
    @@ -0,0 +1,49 @@
    +#!/usr/bin/env node
    +'use strict';
    +
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +
    +/**
    + * Parses the arguments, creates the options and passes them to `Y.YUIDoc` and then `Y.DocBuilder`.
    + * @class CLI
    + * @module yuidoc
    + */
    +
    +var Y = require('./index');
    +
    +var options = Y.Options(Y.Array(process.argv, 2));
    +
    +Y.log('Starting YUIDoc@' + Y.packageInfo.version + ' using YUI@' + Y.version + ' with NodeJS@' + process.versions.node, 'info', 'yuidoc');
    +
    +var starttime = (new Date()).getTime();
    +
    +options = Y.Project.init(options);
    +
    +Y.log('Starting YUIDoc with the following options:', 'info', 'yuidoc');
    +var opts = Y.clone(options);
    +if (opts.paths && opts.paths.length && (opts.paths.length > 10)) {
    +    opts.paths = [].concat(opts.paths.slice(0, 5), ['<paths truncated>'], options.paths.slice(-5));
    +}
    +Y.log(opts, 'info', 'yuidoc');
    +
    +if (options.server) {
    +    Y.Server.start(options);
    +} else {
    +    var json = (new Y.YUIDoc(options)).run();
    +    if (json === null) {
    +        return;
    +    }
    +    options = Y.Project.mix(json, options);
    +
    +    if (!options.parseOnly) {
    +        var builder = new Y.DocBuilder(options, json);
    +        builder.compile(function () {
    +            var endtime = (new Date()).getTime();
    +            Y.log('Completed in ' + ((endtime - starttime) / 1000) + ' seconds', 'info', 'yuidoc');
    +        });
    +    }
    +}
    diff --git a/lib/docparser.js b/lib/docparser.js
    new file mode 100644
    index 00000000..896553c3
    --- /dev/null
    +++ b/lib/docparser.js
    @@ -0,0 +1,1581 @@
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +'use strict';
    +
    +YUI.add('docparser', function (Y) {
    +
    +    var Lang = Y.Lang,
    +        trim = Lang.trim,
    +        fixType = Y.Lang.fixType,
    +        /**
    +         * Parses the JSON data and formats it into a nice log string for
    +         * filename and line number: `/file/name.js:123`
    +         * @method stringlog
    +         * @private
    +         * @param {Object} data The data block from the parser
    +         * @return {String} The formatted string.
    +         * @for DocParser
    +         */
    +        stringlog = function (data) {
    +            var line, file;
    +
    +            if (data.file && data.line) {
    +                file = data.file;
    +                line = data.line;
    +            } else {
    +                data.forEach(function (d) {
    +                    if (d.tag === 'file') {
    +                        file = d.value;
    +                    }
    +                    if (d.tag === 'line') {
    +                        line = d.value;
    +                    }
    +                });
    +            }
    +            return ' ' + file + ':' + line;
    +        },
    +        /**
    +         * Flatten a string, remove all line breaks and replace them with a token
    +         * @method implodeString
    +         * @private
    +         * @param {String} str The string to operate on
    +         * @return {String} The modified string
    +         */
    +        implodeString = function (str) {
    +            return str.replace(REGEX_GLOBAL_LINES, '!~YUIDOC_LINE~!');
    +        },
    +        /**
    +         * Un-flatten a string, replace tokens injected with `implodeString`
    +         * @method implodeString
    +         * @private
    +         * @param {String} str The string to operate on
    +         * @return {String} The modified string
    +         */
    +        explodeString = function (str) {
    +            return str.replace(/!~YUIDOC_LINE~!/g, '\n');
    +        },
    +        CURRENT_NAMESPACE = 'currentnamespace',
    +        CURRENT_MODULE = 'currentmodule',
    +        MAIN_MODULE = 'mainmodule',
    +        CURRENT_SUBMODULE = 'currentsubmodule',
    +        CURRENT_FILE = 'currentfile',
    +        CURRENT_CLASS = 'currentclass',
    +        CURRENT_ELEMENT = 'currentelement',
    +
    +        REGEX_TYPE = /(.*?)\{(.*?)\}(.*)/,
    +        REGEX_FIRSTWORD = /^\s*?(\[.+\]\*?|[^\s]+)(.*)/,
    +        REGEX_OPTIONAL = /^\[(.*)\]$/,
    +        REGEX_START_COMMENT = {
    +            js: /^\s*\/\*\*/,
    +            coffee: /^\s*###\*/
    +        },
    +        REGEX_END_COMMENT = {
    +            js: /\*\/\s*$/,
    +            coffee: /###\s*$/
    +        },
    +        REGEX_LINE_HEAD_CHAR = {
    +            js: /^\s*\*/,
    +            coffee: /^\s*[#\*]/
    +        },
    +        REGEX_LINES = /\r\n|\n/,
    +        REGEX_GLOBAL_LINES = /\r\n|\n/g,
    +
    +        SHORT_TAGS = {
    +            'async': 1,
    +            'beta': 1,
    +            'chainable': 1,
    +            'extends': 1,
    +            'final': 1,
    +            'static': 1,
    +            'optional': 1,
    +            'required': 1
    +        },
    +
    +        /**
    +         * A list of known tags.  This populates a member variable
    +         * during initialization, and will be updated if additional
    +         * digesters are added.
    +         * @property TAGLIST
    +         * @type Array
    +         * @final
    +         * @for DocParser
    +         */
    +        TAGLIST = [
    +            'async',        // bool, custom events can fire the listeners in a setTimeout
    +            'author',       // author best for projects and modules, but can be used anywhere // multi
    +            'attribute',    // YUI attributes / custom element attributes
    +            'beta',         // module maturity identifier
    +            'broadcast',    // bool, events
    +            'bubbles',      // custom events that bubble
    +            'category',     // modules can be in multiple categories
    +            'chainable',    // methods that return the host object
    +            'class',        // pseudo class
    +            'conditional',  // conditional module
    +            'config',       // a config param (not an attribute, so no change events)
    +            'const',        // not standardized yet, converts to final property
    +            'constructs',   // factory methods (not yet used)
    +            'constructor',  // this is a constructor
    +            'content',      // permitted content for an @element
    +            'contributor',  // like author
    +            'default',      // property/attribute default value
    +            'deprecated',   // please specify what to use instead
    +            'description',  // can also be free text at the beginning of a comment is
    +            'emitfacade',   // bool, YUI custom event can have a dom-like event facade
    +            'element',      // Web Components custom element
    +            'event',        // YUI custom event
    +            'evil',         // uses eval
    +            'extension',    // this is an extension for [entity]
    +            'extensionfor', // this is an extension for [entity]
    +            'extension_for',// this is an extension for [entity]
    +            'example',      // 0..n code snippets.  snippets can also be embedded in the desc
    +            'experimental', // module maturity identifier
    +            'extends',      // pseudo inheritance
    +            'file',         // file name (used by the parser)
    +            'final',        // not meant to be changed
    +            'fireonce',     // bool, YUI custom event config allows
    +            'for',          // used to change class context
    +            'global',       // declare your globals
    +            'icon',         // project icon(s)
    +            'implements',   // Implements Interface
    +            'in',           // indicates module this lives in (obsolete now)
    +            'initonly',     // attribute writeonce value
    +            'injects',      // injects {HTML|script|CSS}
    +            'interface',    // Is Interface / Interface for an @element
    +            'knownissue',   // 0..n known issues for your consumption
    +            'line',         // line number for the comment block (used by the parser)
    +            'method',       // a method
    +            'module',       // YUI module name
    +            'main',         // Description for the module
    +            'namespace',    // Y.namespace, used to fully qualify class names
    +            'optional',     // For optional attributes
    +            'required',     // For required attributes
    +            'param',        // member param
    +            'parents',      // permitted parents for an @element
    +            'plugin',       // this is a plugin for [entityl]
    +            'preventable',  // YUI custom events can be preventable ala DOM events
    +            'private',      // > access
    +            'project',      // project definition, one per source tree allowed
    +            'property',     // a regular-ole property
    +            'protected',    // > access
    +            'public',       // > access
    +            'queuable',     // bool, events
    +            'readonly',     // YUI attribute config
    +            'requires',     // YUI module requirements
    +            'return',       // {type} return desc -- returns is converted to this
    +            'see',          // 0..n things to look at
    +            'since',        // when it was introduced
    +            'static',       // static
    +            'submodule',    // YUI submodule
    +            'throws',       // {execption type} description
    +            'title',        // this should be something for the project description
    +            'todo',         // 0..n things to revisit eventually (hopefully)
    +            'type',         // the var type
    +            'url',          // project url(s)
    +            'uses',         // 0..n compents mixed (usually, via augment) into the prototype
    +            'value',        // the value of a constant
    +            'writeonce'     // YUI attribute config
    +        ],
    +
    +        /**
    +         * A list of ignored tags. These tags should be ignored because there is
    +         * likely to be used for purposes other than JSDoc tags in JavaScript comments.
    +         * @property IGNORE_TAGLIST
    +         * @type Array
    +         * @final
    +         * @for DocParser
    +         */
    +        IGNORE_TAGLIST = [
    +            'media'
    +        ],
    +
    +        /**
    +         * Common errors will get scrubbed instead of being ignored.
    +         * @property CORRECTIONS
    +         * @type Object
    +         * @final
    +         * @for DocParser
    +         */
    +        CORRECTIONS = {
    +            'augments': 'uses', // YUI convention for prototype mixins
    +            'depreciated': 'deprecated', // subtle difference
    +            'desciption': 'description', // shouldn't need the @description tag at all
    +            'extend': 'extends', // typo
    +            'function': 'method', // we may want standalone inner functions at some point
    +            'member': 'method', // probably meant method
    +            'parm': 'param', // typo
    +            'params': 'param', // typo
    +            'pamra': 'param', // typo
    +            'parma': 'param', // typo
    +            'propery': 'property', // typo
    +            'prop': 'property', // probably meant property
    +            'returns': 'return' // need to standardize on one or the other
    +        },
    +
    +        /**
    +         * A map of the default tag processors, keyed by the
    +         * tag name.  Multiple tags can use the same digester
    +         * by supplying the string name that points to the
    +         * implementation rather than a function.
    +         * @property DIGESTERS
    +         * @type Object
    +         * @final
    +         * @for DocParser
    +         */
    +        DIGESTERS = {
    +            // "params": [
    +            // {
    +            //   "name": "optionalandmultiple",
    +            //   "description": "my desc",
    +            //   "type": "string",
    +            //   "optional": true, // [surroundedbybrackets]
    +            //   "optdefault": "if specified, this is always string to avoid syntax errors @TODO",
    +            //   "multiple": true // endswith* or ...startswith
    +            // }
    +            // ],
    +            // @param {type} name description    -or-
    +            // @param name {type} description
    +            // #2173362 optional w/ or w/o default
    +            // @param {type} [optvar=default] description
    +            // #12 document config objects
    +            // @param {object|config} config description
    +            // @param {type} config.prop1 description
    +            // @param {type} config.prop2 description
    +            // #11 document callback argument signature
    +            // @param {callback|function} callback description
    +            // @param {type} callback.arg1 description
    +            // @param {type} callback.arg2 description
    +            // #2173362 document event facade decorations for custom events
    +            // @param {event} event description
    +            // @param {type}  event.child description
    +            // @param {type}  event.index description
    +            // @param name* {type} 1..n description
    +            // @param [name]* {type} 0..n description
    +            'param': function (tagname, value, target, block) {
    +                // Y.log('param digester' + value);
    +                target.params = target.params || [];
    +
    +                if (!value) {
    +                    this.warnings.push({
    +                        message: 'param name/type/descript missing',
    +                        line: stringlog(block)
    +                    });
    +                    Y.log('param name/type/descript missing: ' + stringlog(block), 'warn', 'docparser');
    +                    return;
    +                }
    +
    +                var type, name, parts, optional, optdefault, parent, multiple, len, result,
    +                    desc = implodeString(trim(value)),
    +                    match = REGEX_TYPE.exec(desc),
    +                    host = target.params;
    +
    +                // Extract {type}
    +                if (match) {
    +                    type = fixType(trim(match[2]));
    +                    desc = trim(match[1] + match[3]);
    +                }
    +
    +                // extract the first word, this is the param name
    +                match = REGEX_FIRSTWORD.exec(desc);
    +                if (match) {
    +                    name = trim(explodeString(match[1]));
    +                    desc = trim(match[2]);
    +                }
    +
    +                if (!name) {
    +                    if (value && value.match(/callback/i)) {
    +                        this.warnings.push({
    +                            message: 'Fixing missing name for callback',
    +                            line: stringlog(block)
    +                        });
    +                        Y.log('Fixing missing name for callback:' + stringlog(block), 'warn', 'docparser');
    +                        name = 'callback';
    +                        type = 'Callback';
    +                    } else {
    +                        this.warnings.push({
    +                            message: 'param name missing: ' + value,
    +                            line: stringlog(block)
    +                        });
    +                        Y.log('param name missing: ' + value + ':' + stringlog(block), 'warn', 'docparser');
    +                        name = 'UNKNOWN';
    +                    }
    +                }
    +
    +                len = name.length - 1;
    +
    +                if (name.charAt(len) === '*') {
    +                    multiple = true;
    +                    name = name.substr(0, len);
    +                }
    +
    +                // extract [name], optional param
    +                if (name.indexOf('[') > -1) {
    +                    match = REGEX_OPTIONAL.exec(name);
    +                    if (match) {
    +                        optional = true;
    +                        name = trim(match[1]);
    +                        // extract optional=defaultvalue
    +                        parts = name.split('=');
    +                        if (parts.length > 1) {
    +                            name = parts[0];
    +                            optdefault = parts[1];
    +                            //Add some shortcuts for object/array defaults
    +                            if (optdefault.toLowerCase() === 'object') {
    +                                optdefault = '{}';
    +                            }
    +                            if (optdefault.toLowerCase() === 'array') {
    +                                optdefault = '[]';
    +                            }
    +                        }
    +                    }
    +                }
    +
    +                // This should run after the check for optional parameters
    +                // and before the check for child parameters
    +                // because the signature for 0..n params is [...args]
    +                if (name.substr(0, 3) === '...') {
    +                    multiple = true;
    +                    name = name.substr(3);
    +                }
    +
    +                // parse object.prop, indicating a child property for object
    +                if (name.indexOf('.') > -1) {
    +                    match = name.split('.');
    +                    parent = trim(match[0]);
    +                    Y.each(target.params, function (param) {
    +                        if (param.name === parent) {
    +                            param.props = param.props || [];
    +                            host = param.props;
    +                            match.shift();
    +                            name = trim(match.join('.'));
    +                            if (match.length > 1) {
    +                                var pname = name.split('.')[0],
    +                                    par;
    +                                Y.each(param.props, function (o) {
    +                                    if (o.name === pname) {
    +                                        par = o;
    +                                    }
    +                                });
    +                                if (par) {
    +                                    match = name.split('.');
    +                                    match.shift();
    +                                    name = match.join('.');
    +                                    par.props = par.props || [];
    +                                    host = par.props;
    +                                }
    +                            }
    +                        }
    +                    });
    +
    +                }
    +
    +                result = {
    +                    name: name,
    +                    description: explodeString(desc)
    +                };
    +
    +                if (type) {
    +                    result.type = type;
    +                }
    +
    +                if (optional) {
    +                    result.optional = true;
    +                    if (optdefault) {
    +                        result.optdefault = optdefault;
    +                    }
    +                }
    +
    +                if (multiple) {
    +                    result.multiple = true;
    +                }
    +
    +                host.push(result);
    +            },
    +
    +            // @return {type} description // methods
    +            // @returns {type} description // methods
    +            // @injects {HTML|CSS|script} description
    +            // can be used by anthing that has an optional {type} and a description
    +            'return': function (tagname, value, target) {
    +
    +                var desc = implodeString(trim(value)),
    +                    type,
    +                    match = REGEX_TYPE.exec(desc),
    +                    result = {};
    +                if (match) {
    +                    type = fixType(trim(match[2]));
    +                    desc = trim(match[1] + match[3]);
    +                }
    +
    +                result = {
    +                    description: Y.unindent(explodeString(desc))
    +                };
    +
    +                if (type) {
    +                    result.type = type;
    +                }
    +
    +                target[tagname] = result;
    +
    +            },
    +
    +            // @throws {type} description
    +            'throws': 'return',
    +
    +            'injects': 'return',
    +
    +            // trying to overwrite the constructor value is a bad idea
    +            'constructor': function (tagname, value, target) {
    +                target.is_constructor = 1;
    +            },
    +
    +            // @author {twitter: @arthurdent | github: ArthurDent}
    +            //    Arthur Dent adent@h2g2.earth #23, multiple // modules/class/method
    +            // 'author': function(tagname, value, target, block) {
    +            //     // Y.log('author digester');
    +            // },
    +
    +            // A key bock type for declaring modules and submodules
    +            // subsequent class and member blocks will be assigned
    +            // to this module.
    +            'module': function (tagname, value, target, block) {
    +                this.set(CURRENT_MODULE, value);
    +                var go = true;
    +                Y.some(block, function (o) {
    +                    if (trim(o.tag) === 'submodule') {
    +                        go = false;
    +                        return true;
    +                    }
    +                });
    +                if (go) {
    +                    if (!this.get(MAIN_MODULE)) {
    +                        this.set(MAIN_MODULE, {
    +                            tag: tagname,
    +                            name: value,
    +                            file: target.file,
    +                            line: target.line,
    +                            description: target.description
    +                        });
    +                    }
    +                    return this.modules[value];
    +                }
    +                return null;
    +            },
    +
    +            //Setting the description for the module..
    +            'main': function (tagname, value, target) {
    +                var o = target;
    +                o.mainName = value;
    +                o.tag = tagname;
    +                o.itemtype = 'main';
    +                o._main = true;
    +                this.set(MAIN_MODULE, o);
    +            },
    +
    +            // accepts a single project definition for the source tree
    +            'project': function () {
    +                return this.project;
    +            },
    +
    +            // A key bock type for declaring submodules.  subsequent class and
    +            // member blocks will be assigned to this submodule.
    +            'submodule': function (tagname, value) {
    +                //console.log('Setting current submodule: ', value, 'on class');
    +                this.set(CURRENT_SUBMODULE, value);
    +                var host = this.modules[value],
    +                    clazz = this.get(CURRENT_CLASS),
    +                    parent = this.get(CURRENT_MODULE);
    +                if (parent) {
    +                    host.module = parent;
    +                }
    +                if (clazz && this.classes[clazz]) {
    +                    //console.log('Adding submodule', value , 'to class', clazz, ' it has submodule', this.classes[clazz].submodule);
    +                    //if (!this.classes[clazz].submodule) {
    +                    //console.log('REALLY Adding submodule', value , 'to class', clazz);
    +                    this.classes[clazz].submodule = value;
    +                    //}
    +                }
    +                return host;
    +            },
    +
    +            // A key bock type for declaring classes, subsequent
    +            // member blocks will be assigned to this class
    +            'class': function (tagname, value, target, block) {
    +                var namespace, fullname, host, parent;
    +
    +                block.forEach(function (def) {
    +                    if (def.tag === 'namespace') {
    +                        //We have a namespace, augment the name
    +                        var name = trim(def.value) + '.' + value;
    +                        if (value.indexOf(trim(def.value) + '.') === -1) {
    +                            value = name;
    +                            namespace = trim(def.value);
    +                        }
    +                    }
    +                });
    +
    +                if (namespace) {
    +                    this.set(CURRENT_NAMESPACE, namespace);
    +                }
    +                this.set(CURRENT_CLASS, value);
    +
    +                fullname = this.get(CURRENT_CLASS);
    +                host = this.classes[fullname];
    +                parent = this.get(CURRENT_MODULE);
    +
    +                if (namespace) {
    +                    host.namespace = namespace;
    +                }
    +                if (parent) {
    +                    host.module = parent;
    +                }
    +
    +                //Merge host and target in case the class was defined in a "for" tag
    +                //before it was defined in a "class" tag
    +                host = Y.merge(host, target);
    +                this.classes[fullname] = host;
    +                parent = this.get(CURRENT_SUBMODULE);
    +                if (parent) {
    +                    //this.set(CURRENT_SUBMODULE, parent);
    +                    host.submodule = parent;
    +                }
    +                return host;
    +            },
    +
    +            // A key bock type for declaring custom elements
    +            'element': function (tagname, value) {
    +                var name, parent, host;
    +
    +                name = value.split(/\s+/)[0];
    +                this.set(CURRENT_ELEMENT, name);
    +                host = this.elements[name];
    +
    +                parent = this.get(CURRENT_MODULE);
    +                if (parent) {
    +                    host.module = parent;
    +                }
    +
    +                parent = this.get(CURRENT_SUBMODULE);
    +                if (parent) {
    +                    host.submodule = parent;
    +                }
    +
    +                return host;
    +            },
    +
    +            // change 'const' to final property
    +            'const': function (tagname, value, target) {
    +                target.itemtype = 'property';
    +                target.name = value;
    +                target.final = '';
    +            },
    +
    +            // supported classitems
    +            'property': function (tagname, value, target, block) {
    +                var match, name, desc, type;
    +
    +                target.itemtype = tagname;
    +                target.name = value;
    +                if (!target.type) {
    +                    desc = implodeString(trim(value));
    +                    match = REGEX_TYPE.exec(desc);
    +
    +                    // Extract {type}
    +                    if (match) {
    +                        type = fixType(trim(match[2]));
    +                        name = trim(match[1] + match[3]);
    +                        target.type = type;
    +                        target.name = name;
    +                    }
    +
    +                }
    +                if (target.type && target.type.toLowerCase() === 'object') {
    +                    block.forEach(function (i, k) {
    +                        if (i.tag === 'property') {
    +                            i.value = trim(i.value);
    +                            i.tag = 'param';
    +                            block[k] = i;
    +                        }
    +                    });
    +                }
    +            },
    +            'method': 'property',
    +            'config': 'property',
    +            'event': 'property',
    +
    +            'attribute': function (tagname, value, target) {
    +                // Use 'property' if not currently parsing an element
    +                if (!this.get(CURRENT_ELEMENT)) {
    +                    return DIGESTERS.property.apply(this, arguments);
    +                }
    +
    +                var nameVal = value.split(/\s+([\s\S]*$)/),
    +                    desc = nameVal[1] || target.description || '';
    +
    +                if (!target.attributes) {
    +                    target.attributes = [];
    +                }
    +                target.attributes.push({
    +                    name: nameVal[0],
    +                    description: desc
    +                });
    +            },
    +
    +            // access fields
    +            'public': function (tagname, value, target) {
    +                target.access = tagname;
    +                target.tagname = value;
    +            },
    +            'private': 'public',
    +            'protected': 'public',
    +            'inner': 'public',
    +
    +            // tags that can have multiple occurances in a single block
    +            'todo': function (tagname, value, target) {
    +                if (!Lang.isArray(target[tagname])) {
    +                    target[tagname] = [];
    +                }
    +                //If the item is @tag one,two
    +                if (value.indexOf(',') > -1) {
    +                    value = value.split(',');
    +                } else {
    +                    value = [value];
    +                }
    +
    +                value.forEach(function (v) {
    +                    v = trim(v);
    +                    target[tagname].push(v);
    +                });
    +            },
    +            'extension_for': 'extensionfor',
    +            'extensionfor': function (tagname, value) {
    +                if (this.classes[this.get(CURRENT_CLASS)]) {
    +                    this.classes[this.get(CURRENT_CLASS)].extension_for.push(value);
    +                }
    +            },
    +            'example': function (tagname, value, target, block) {
    +                if (!Lang.isArray(target[tagname])) {
    +                    target[tagname] = [];
    +                }
    +
    +                var e = value;
    +                block.forEach(function (v) {
    +                    if (v.tag === 'example') {
    +                        if (v.value.indexOf(value) > -1) {
    +                            e = v.value;
    +                        }
    +                    }
    +                });
    +
    +                target[tagname].push(e);
    +            },
    +            'url': 'todo',
    +            'icon': 'todo',
    +            'see': 'todo',
    +            'requires': 'todo',
    +            'knownissue': 'todo',
    +            'uses': 'todo',
    +            'category': 'todo',
    +            'unimplemented': 'todo',
    +
    +            genericValueTag: function (tagname, value, target) {
    +                target[tagname] = value;
    +            },
    +
    +            'author': 'genericValueTag',
    +            'contributor': 'genericValueTag',
    +            'since': 'genericValueTag',
    +
    +            'deprecated': function (tagname, value, target) {
    +                target.deprecated = true;
    +
    +                if (typeof value === 'string' && value.length) {
    +                    target.deprecationMessage = value;
    +                }
    +            },
    +
    +            // updates the current namespace
    +            'namespace': function (tagname, value) {
    +                this.set(CURRENT_NAMESPACE, value);
    +                if (value === '') {
    +                    //Shortcut this if namespace is an empty string.
    +                    return;
    +                }
    +                var m,
    +                    mod,
    +                    name,
    +                    lastNS,
    +                    file = this.get(CURRENT_FILE);
    +                if (file) {
    +                    this.files[file].namespaces[value] = 1;
    +                }
    +                mod = this.get(CURRENT_MODULE);
    +                if (mod) {
    +                    this.modules[mod].namespaces[value] = 1;
    +                }
    +
    +                mod = this.get(CURRENT_SUBMODULE);
    +                if (mod) {
    +                    this.modules[mod].namespaces[value] = 1;
    +                }
    +
    +                mod = this.get(CURRENT_CLASS);
    +                if (mod) {
    +                    lastNS = this.get('lastnamespace');
    +                    if (lastNS && lastNS !== value && (value.indexOf(lastNS + '.') !== 0)) {
    +                        if (this.classes[mod]) {
    +                            m = this.classes[mod];
    +                            delete this.classes[mod];
    +                            mod = value + '.' + mod.replace(lastNS + '.', '');
    +                            m.name = mod;
    +                            m.namespace = value;
    +                            this.classes[mod] = m;
    +                            this.set(CURRENT_CLASS, m.name);
    +                        }
    +                    }
    +                    if (this.classes[mod]) {
    +                        this.classes[mod].namespace = value;
    +                        if (mod === value) {
    +                            return;
    +                        }
    +                        if (mod.indexOf(value + '.') === -1) {
    +                            if (mod.indexOf('.') === -1) {
    +                                m = this.classes[mod];
    +                                delete this.classes[mod];
    +                                name = m.namespace + '.' + m.name;
    +                                m.name = name;
    +                                this.classes[name] = m;
    +                                this.set(CURRENT_CLASS, name);
    +                            } else {
    +                                if (mod.indexOf(this.classes[mod].namespace + '.') === -1) {
    +                                    m = this.classes[mod];
    +                                    delete this.classes[mod];
    +                                    name = m.namespace + '.' + m.shortname;
    +                                    m.name = name;
    +                                    this.classes[name] = m;
    +                                    this.set(CURRENT_CLASS, name);
    +                                }
    +                            }
    +                        }
    +                    }
    +                }
    +            },
    +
    +            // updates the current class only (doesn't create
    +            // a new class definition)
    +            'for': function (tagname, value) {
    +                var ns, file, mod;
    +
    +                value = this._resolveFor(value);
    +                this.set(CURRENT_CLASS, value);
    +
    +                ns = ((this.classes[value]) ? this.classes[value].namespace : '');
    +                this.set(CURRENT_NAMESPACE, ns);
    +
    +                file = this.get(CURRENT_FILE);
    +                if (file) {
    +                    this.files[file].fors[value] = 1;
    +                }
    +
    +                mod = this.get(CURRENT_MODULE);
    +                if (mod) {
    +                    this.modules[mod].fors[value] = 1;
    +                }
    +
    +                mod = this.get(CURRENT_SUBMODULE);
    +                if (mod) {
    +                    this.modules[mod].fors[value] = 1;
    +                }
    +            }
    +        },
    +
    +        /**
    +         * The doc parser accepts a **map** of files to file content.
    +         * Once `parse()` is called, various properties will be populated
    +         * with the parsers data (aggregated in the `'data'` property).
    +         * @class DocParser
    +         * @extends Base
    +         * @constructor
    +         * @param {Object} o the config object
    +         * @module yuidoc
    +         */
    +        DocParser = function () {
    +            this.digesters = Y.merge(DocParser.DIGESTERS);
    +            this.knowntags = Y.Array.hash(DocParser.TAGLIST);
    +            DocParser.superclass.constructor.apply(this, arguments);
    +        };
    +
    +    DocParser.NAME = 'DocParser';
    +
    +    DocParser.DIGESTERS = DIGESTERS;
    +    DocParser.TAGLIST = TAGLIST;
    +    DocParser.CORRECTIONS = CORRECTIONS;
    +
    +    DocParser.ATTRS = {
    +
    +        lint: {
    +            value: false
    +        },
    +
    +        /**
    +         * Digesters process the tag/text pairs found in a
    +         * comment block.  They are looked up by tag name.
    +         * The digester gets the tagname, the value, the
    +         * target object to apply values to, and the full
    +         * block that is being processed.  Digesters can
    +         * be declared as strings instead of a function --
    +         * in that case, the program will try to look up
    +         * the key listed and use the function there instead
    +         * (it is an alias).  Digesters can return a host
    +         * object in the case the tag defines a new key
    +         * block type (modules/classes/methods/events/properties)
    +         * @attribute digesters
    +         */
    +        digesters: {
    +            setter: function (val) {
    +                Y.mix(this.digesters, val, true);
    +                Y.mix(this.knowntags, val, true);
    +                return val;
    +            }
    +        },
    +
    +        /**
    +         * Emitters will be schemas for the types of payloads
    +         * the parser will emit.  Not implemented.
    +         * @attribute emitters
    +         */
    +        emitters: {
    +            setter: function (val) {
    +                Y.mix(this.emitters, val, true);
    +            }
    +        },
    +
    +        /**
    +         * Comment syntax type.
    +         * @attribute syntaxtype
    +         * @type String
    +         */
    +        syntaxtype: {
    +            writeOnce: true
    +        },
    +
    +        /**
    +         * The map of file names to file content.
    +         * @attribute filemap
    +         */
    +        filemap: {
    +            writeOnce: true
    +        },
    +
    +        /**
    +         * A map of file names to directory name.  Provided in
    +         * case this needs to be used to reset the module name
    +         * appropriately -- currently not used
    +         * @attribute dirmap
    +         */
    +        dirmap: {
    +            writeOnce: true
    +        },
    +
    +        /**
    +         * The file currently being parsed
    +         * @attribute currentfile
    +         * @type String
    +         */
    +        currentfile: {
    +            setter: function (val) {
    +                val = trim(val);
    +                // this.set(CURRENT_NAMESPACE, '');
    +                if (!(val in this.files)) {
    +                    this.files[val] = {
    +                        name: val,
    +                        modules: {},
    +                        classes: {},
    +                        fors: {},
    +                        namespaces: {}
    +                    };
    +                }
    +                return val;
    +            }
    +        },
    +        /**
    +         * The main documentation block for the module itself.
    +         * @attribute mainmodule
    +         * @type String
    +         */
    +        mainmodule: {
    +            setter: function (o) {
    +                if (!o) {
    +                    return;
    +                }
    +                //console.log('Main Module Setter: ', o);
    +                var write = true,
    +                    name = o.mainName || o.name;
    +                if (this.get(CURRENT_MODULE) === name) {
    +
    +                    if (name in this.modules) {
    +                        //console.log('In Global Modules', this.modules[name]);
    +                        if (this.modules[name].tag) {
    +                            //The main module has already been added, don't over write it.
    +                            if (this.modules[name].tag === 'main') {
    +                                write = false;
    +                            }
    +                        }
    +                        if (write) {
    +                            //console.log('Writing');
    +                            this.modules[name] = Y.merge(this.modules[name], o);
    +                        }
    +                    } else {
    +                        if (o._main) {
    +                            //console.log('Writing');
    +                            this.modules[name] = o;
    +                        }
    +                    }
    +                }
    +            }
    +        },
    +        /**
    +         * The module currently being parsed
    +         * @attribute currentmodule
    +         * @type String
    +         */
    +        currentmodule: {
    +            setter: function (val) {
    +                if (!val) {
    +                    return val;
    +                }
    +                val = trim(val);
    +
    +                var modMain, clazz;
    +
    +                this.set(CURRENT_SUBMODULE, '');
    +                this.set(CURRENT_NAMESPACE, '');
    +
    +                modMain = this.get(MAIN_MODULE);
    +                if (modMain && modMain.name !== val) {
    +                    this.set(MAIN_MODULE, '');
    +                }
    +
    +                clazz = this.classes[this.get(CURRENT_CLASS)];
    +                if (clazz) {
    +                    //Handles case where @module comes after @class in a new directory of files
    +                    if (clazz.module !== val) {
    +                        if (this.modules[clazz.module]) {
    +                            delete this.modules[clazz.module].submodules[clazz.submodule];
    +                            delete this.modules[clazz.module].classes[clazz.name];
    +                        }
    +                        if (clazz.submodule && this.modules[clazz.submodule]) {
    +                            delete this.modules[clazz.submodule].submodules[clazz.submodule];
    +                            delete this.modules[clazz.submodule].classes[clazz.name];
    +                        }
    +                        clazz.module = val;
    +                        if (this.modules[val]) {
    +                            this.modules[val].submodules[clazz.submodule] = 1;
    +                            this.modules[val].classes[clazz.name] = 1;
    +                        }
    +                        if (clazz.submodule && this.modules[clazz.submodule]) {
    +                            this.modules[clazz.submodule].module = val;
    +                        }
    +                    }
    +                }
    +
    +                if (!(val in this.modules)) {
    +                    this.modules[val] = {
    +                        name: val,
    +                        submodules: {},
    +                        elements: {},
    +                        classes: {},
    +                        fors: {},
    +                        namespaces: {}
    +                    };
    +                }
    +
    +                return val;
    +            }
    +        },
    +
    +        /**
    +         * The submodule currently being parsed
    +         * @attribute currentsubmodule
    +         * @type String
    +         */
    +        currentsubmodule: {
    +            setter: function (val) {
    +                if (!val) {
    +                    return val;
    +                }
    +                val = trim(val);
    +                if (!(val in this.modules)) {
    +                    var mod = this.modules[val] = {
    +                        name: val,
    +                        submodules: {},
    +                        elements: {},
    +                        classes: {},
    +                        fors: {},
    +                        is_submodule: 1,
    +                        namespaces: {}
    +                    };
    +
    +                    mod.module = this.get(CURRENT_MODULE);
    +                    mod.namespace = this.get(CURRENT_NAMESPACE);
    +                }
    +                //console.log('SETTING CURRENT SUBMODULE: ', val, 'ON CLASS', this.get(CURRENT_CLASS));
    +                return val;
    +            }
    +        },
    +        currentnamespace: {
    +            setter: function (val) {
    +                this.set('lastnamespace', this.get(CURRENT_NAMESPACE));
    +                return val;
    +            }
    +        },
    +        lastnamespace: {
    +
    +        },
    +        lastclass: {
    +
    +        },
    +        /**
    +         * The class currently being parsed
    +         * @attribute currentclass
    +         * @type String
    +         */
    +        currentclass: {
    +            setter: function (val) {
    +                if (!val) {
    +                    return val;
    +                }
    +                this.set('lastclass', this.get(CURRENT_CLASS));
    +                val = trim(val);
    +                var name = val,
    +                    ns, clazz;
    +                if (!(val in this.classes)) {
    +                    ns = this.get(CURRENT_NAMESPACE);
    +                    if (ns && ns !== '' && (val.indexOf(ns + '.') !== 0)) {
    +                        name = ns + '.' + val;
    +                    }
    +                    clazz = this.classes[name] = {
    +                        name: name,
    +                        shortname: val,
    +                        classitems: [],
    +                        plugins: [],
    +                        extensions: [],
    +                        plugin_for: [],
    +                        extension_for: []
    +                    };
    +                    clazz.module = this.get(CURRENT_MODULE);
    +                    if (this.get(CURRENT_SUBMODULE)) {
    +                        clazz.submodule = this.get(CURRENT_SUBMODULE);
    +                    }
    +                    clazz.namespace = ns;
    +                }
    +                return name;
    +            }
    +        },
    +        lastelement: {
    +
    +        },
    +        /**
    +         * The element currently being parsed
    +         * @attribute currentelement
    +         * @type String
    +         */
    +        currentelement: {
    +            setter: function (val) {
    +                if (!val) {
    +                    return val;
    +                }
    +                this.set('lastelement', this.get(CURRENT_ELEMENT));
    +                val = trim(val);
    +                var name = val,
    +                    el;
    +                if (!(val in this.elements)) {
    +                    el = this.elements[name] = {
    +                        name: name,
    +                        attributes: []
    +                    };
    +                    el.module = this.get(CURRENT_MODULE);
    +                    if (this.get(CURRENT_SUBMODULE)) {
    +                        el.submodule = this.get(CURRENT_SUBMODULE);
    +                    }
    +                }
    +                return name;
    +            }
    +        }
    +    };
    +
    +    Y.extend(DocParser, Y.Base, {
    +        /**
    +         * Takes a non-namespaced classname and resolves it to a namespace (to support `@for`)
    +         * @private
    +         * @method _resolveFor
    +         * @param {String} value The classname to resolve
    +         * @return {String} The resolved namespace + classname
    +         */
    +        _resolveFor: function (value) {
    +            if (value.indexOf('.') === -1) {
    +                Y.each(this.classes, function (i) {
    +                    if (i.shortname === value) {
    +                        if (i.namespace) {
    +                            value = i.namespace + '.' + i.shortname;
    +                        }
    +                    }
    +                });
    +            }
    +            return value;
    +        },
    +
    +        initializer: function () {
    +            this.warnings = [];
    +
    +            var self = this;
    +            self.after('currentfileChange', function () {
    +                /*
    +                 * File changed, so we reset class and submodule.
    +                 * You should use @for if you want to reference another class
    +                 * in different file.
    +                 */
    +                self.set(CURRENT_SUBMODULE, '');
    +                self.set(CURRENT_CLASS, '');
    +                self.set(CURRENT_ELEMENT, '');
    +            });
    +
    +            self.after('currentmoduleChange', function (e) {
    +                var mod = e.newVal,
    +                    elements = self.elements,
    +                    classes = self.classes,
    +                    addModule = function (c) {
    +                        if (!(c.module)) {
    +                            c.module = mod;
    +                        }
    +                    };
    +
    +                Y.each(classes, addModule);
    +                Y.each(elements, addModule);
    +            });
    +
    +            self.after('currentsubmoduleChange', function (e) {
    +                var mod = e.newVal,
    +                    classes = self.classes,
    +                    elements = self.elements,
    +                    addModule = function (c) {
    +                        if (!(c.submodule)) {
    +                            if (!c.module) {
    +                                c.submodule = mod;
    +                            }
    +                        }
    +                    };
    +
    +                if (mod) {
    +                    Y.each(classes, addModule);
    +                    Y.each(elements, addModule);
    +                }
    +            });
    +
    +            self.after('currentclassChange', function (e) {
    +                var clazz = e.newVal;
    +                Y.each(self.classitems, function (item) {
    +                    if (!(item.class)) {
    +                        item.class = clazz;
    +                    }
    +                });
    +                // Y.log(self.classitems);
    +            });
    +        },
    +
    +        /**
    +        Normalizes the initial indentation of the given _content_ so that the first line
    +        is unindented, and all other lines are unindented to the same degree as the
    +        first line. So if the first line has four spaces at the beginning, then all
    +        lines will be unindented four spaces. Ported from [Selleck](https://github.com/rgrove/selleck)
    +
    +        @method unindent
    +        @param {String} content Text to unindent.
    +        @return {String} Unindented text.
    +        @private
    +        **/
    +        unindent: function (content) {
    +            var indent = content.match(/^(\s+)/);
    +
    +            if (indent) {
    +                content = content.replace(new RegExp('^' + indent[1], 'gm'), '');
    +            }
    +
    +            return content;
    +        },
    +
    +        /**
    +        Transforms a JavaDoc style comment block (less the start and end of it)
    +        into a list of tag/text pairs. The leading space and '*' are removed,
    +        but the remaining whitespace is preserved so that the output should be
    +        friendly for both markdown and html parsers.
    +
    +        @method handlecomment
    +        @param {String} comment The comment to parse
    +        @param {String} file The file it was parsed from
    +        @param {String} line The line number it was found on
    +        **/
    +        handlecomment: function (comment, file, line) {
    +            var lines = comment.split(REGEX_LINES),
    +                len = lines.length,
    +                i,
    +                regex,
    +                parts, part, peek, skip,
    +                tag, value,
    +                results = [{
    +                    tag: 'file',
    +                    value: file
    +                }, {
    +                    tag: 'line',
    +                    value: line
    +                }],
    +                syntaxtype = this.get('syntaxtype'),
    +                lineHeadCharRegex = REGEX_LINE_HEAD_CHAR[syntaxtype],
    +                hasLineHeadChar = lines[0] && lineHeadCharRegex.test(lines[0]);
    +
    +            // trim leading line head char(star or harp) if there are any
    +            if (hasLineHeadChar) {
    +                for (i = 0; i < len; i++) {
    +                    lines[i] = lines[i].replace(lineHeadCharRegex, '');
    +                }
    +            }
    +
    +            // reconsitute and tokenize the comment block
    +            comment = this.unindent(lines.join('\n'));
    +            regex = new RegExp('(?:^|\\n)\\s*((?!@' + IGNORE_TAGLIST.join(')(?!@') + ')@\\w*)');
    +            parts = comment.split(regex);
    +            len = parts.length;
    +            for (i = 0; i < len; i++) {
    +                value = '';
    +                part = parts[i];
    +                if (part === '') {
    +                    continue;
    +                }
    +                skip = false;
    +
    +                // the first token may be the description, otherwise it should be a tag
    +                if (i === 0 && part.substr(0, 1) !== '@') {
    +                    if (part) {
    +                        tag = '@description';
    +                        value = part;
    +                    } else {
    +                        skip = true;
    +                    }
    +                } else {
    +                    tag = part;
    +                    // lookahead for the tag value
    +                    peek = parts[i + 1];
    +                    if (peek) {
    +                        value = peek;
    +                        i++;
    +                    }
    +                }
    +
    +                if (!skip && tag) {
    +                    results.push({
    +                        tag: tag.substr(1).toLowerCase(),
    +                        value: value
    +                    });
    +                }
    +            }
    +
    +            return results;
    +        },
    +
    +        /**
    +         * Accepts a map of filenames to file content.  Returns
    +         * a map of filenames to an array of API comment block
    +         * text.  This expects the comment to start with / **
    +         * on its own line, and end with * / on its own
    +         * line.  Override this function to provide an
    +         * alternative comment parser.
    +         * @method extract
    +         * @param {Object} filemap A map of filenames to file content
    +         * @param {Array} dirmap A map of file names to directory name
    +         * @return {Object} A map of filenames to an array of extracted
    +         * comment text.
    +         */
    +        extract: function (filemap, dirmap) {
    +            filemap = filemap || this.get('filemap');
    +            dirmap = dirmap || this.get('dirmap');
    +            var syntaxtype = this.get('syntaxtype'),
    +                commentmap = {};
    +            Y.each(filemap, function (code, filename) {
    +
    +                var commentlines, comment, line,
    +                    lines = code.split(REGEX_LINES),
    +                    len = lines.length,
    +                    i, linenum;
    +
    +                for (i = 0; i < len; i++) {
    +                    line = lines[i];
    +                    if (REGEX_START_COMMENT[syntaxtype].test(line)) {
    +                        commentlines = [];
    +
    +                        linenum = i + 1;
    +
    +                        while (i < len && (!REGEX_END_COMMENT[syntaxtype].test(line))) {
    +                            commentlines.push(line);
    +                            i++;
    +                            line = lines[i];
    +                        }
    +
    +                        // we can look ahead here if we need to guess the
    +                        // name/type like we do in the python version.
    +
    +                        // remove /**
    +                        commentlines.shift();
    +                        comment = commentlines.join('\n');
    +                        commentmap[filename] = commentmap[filename] || [];
    +                        commentmap[filename]
    +                            .push(this.handlecomment(comment, filename, linenum));
    +                    }
    +                }
    +            }, this);
    +
    +            this.commentmap = commentmap;
    +            return commentmap;
    +        },
    +
    +        /**
    +         * Processes all the tags in a single comment block
    +         * @method processblock
    +         * @param {Array} an array of the tag/text pairs
    +         */
    +        processblock: function (block) {
    +            var target = {},
    +                digestname,
    +                digester,
    +                host;
    +
    +            // Y.log(block);
    +            Y.each(block, function (tag) {
    +                var name = trim(tag.tag),
    +                    value = trim(tag.value),
    +                    ret;
    +
    +                //Convert empty values to a 1 for JSON data parsing later
    +                if (SHORT_TAGS[name] && value === '') {
    +                    value = 1;
    +                }
    +
    +                if (tag && tag.tag) {
    +                    if (!(name in this.knowntags)) {
    +                        if (name in CORRECTIONS) {
    +                            this.warnings.push({
    +                                message: 'replacing incorrect tag: ' + name + ' with ' + CORRECTIONS[name],
    +                                line: stringlog(block)
    +                            });
    +                            Y.log('replacing incorrect tag: ' + name + ' with ' + CORRECTIONS[name] + ': ' + stringlog(block), 'warn', 'docparser');
    +                            name = CORRECTIONS[name];
    +                        } else {
    +                            this.warnings.push({
    +                                message: 'unknown tag: ' + name,
    +                                line: stringlog(block)
    +                            });
    +                            Y.log('unknown tag: ' + name + ',' + stringlog(block), 'warn', 'docparser');
    +                        }
    +                    }
    +
    +                    digestname = name;
    +                    if (digestname in this.digesters) {
    +                        digester = this.digesters[digestname];
    +                        if (Lang.isString(digester)) {
    +                            digester = this.digesters[digester];
    +                        }
    +                        ret = digester.call(this, name, value, target, block);
    +                        host = host || ret;
    +                    } else {
    +                        target[name] = value;
    +                    }
    +                }
    +            }, this);
    +
    +            if (host) {
    +                Y.mix(host, target);
    +
    +                if (host.attributes && target.attributes) {
    +                    host.attributes.push.apply(host.attributes, target.attributes);
    +                }
    +            } else if (target.attributes) {
    +                host = this.elements[this.get(CURRENT_ELEMENT)];
    +                if (host) {
    +                    if (target.deprecated) {
    +                        target.attributes.forEach(function (a) {
    +                            a.deprecated = target.deprecated;
    +
    +                            if (target.deprecationMessage) {
    +                                a.deprecationMessage = target.deprecationMessage;
    +                            }
    +                        });
    +                    }
    +                    host.attributes.push.apply(host.attributes, target.attributes);
    +                }
    +            } else {
    +                this.classitems.push(target);
    +                target.class = this.get(CURRENT_CLASS);
    +                target.module = this.get(CURRENT_MODULE);
    +
    +                host = this.get(CURRENT_SUBMODULE);
    +                if (host) {
    +                    target.submodule = host;
    +                }
    +
    +                host = this.get(CURRENT_NAMESPACE);
    +                if (host) {
    +                    target.namespace = host;
    +                }
    +            }
    +        },
    +
    +        /**
    +         * Transforms a map of filenames to arrays of comment blocks into a
    +         * JSON structure that represents the entire processed API doc info
    +         * and relationships between elements for the entire project.
    +         * @method transform
    +         * @param {object} commentmap The hash of files and parsed comment blocks
    +         * @return {object} The transformed data for the project
    +         */
    +        transform: function (commentmap) {
    +            var self = this,
    +                project = self.project = {},
    +                files = self.files = {},
    +                modules = self.modules = {},
    +                classes = self.classes = {},
    +                elements = self.elements = {},
    +                classitems = self.classitems = [];
    +
    +            self.data = {
    +                project: project,
    +                files: files,
    +                modules: modules,
    +                classes: classes,
    +                elements: elements,
    +                classitems: classitems
    +            };
    +
    +            commentmap = commentmap || self.commentmap;
    +
    +            // process
    +            Y.each(commentmap, function (blocks, file) {
    +                //Y.log('transform: ' + file, 'info', 'docparser');
    +                self.set(CURRENT_FILE, file);
    +                Y.each(blocks, function (block) {
    +                    self.processblock(block);
    +                });
    +            });
    +
    +            // cross reference
    +            Y.each(modules, function (module, name) {
    +                if (module.file) {
    +                    files[module.file].modules[name] = 1;
    +                }
    +                if (module.is_submodule) {
    +                    modules[module.module].submodules[name] = 1;
    +                }
    +                //Clean up processors
    +                delete module.mainName;
    +                delete module._main;
    +            });
    +
    +            Y.each(classes, function (clazz, name) {
    +                if (clazz.module) {
    +                    modules[clazz.module].classes[name] = 1;
    +                }
    +                //console.error('------------------------------');
    +                //console.error(clazz);
    +                //console.error(modules[clazz.submodule]);
    +                //console.error('------------------------------');
    +                if (clazz.submodule) {
    +                    modules[clazz.submodule].classes[name] = 1;
    +                    if (!modules[clazz.submodule].description) {
    +                        modules[clazz.submodule].description = clazz.description;
    +                    }
    +                }
    +
    +                if (clazz.file) {
    +                    files[clazz.file].classes[name] = 1;
    +                    if (modules[clazz.module]) {
    +                        modules[clazz.module].file = clazz.file;
    +                        modules[clazz.module].line = clazz.line;
    +                    }
    +                    if (modules[clazz.submodule]) {
    +                        modules[clazz.submodule].file = clazz.file;
    +                        modules[clazz.submodule].line = clazz.line;
    +                    }
    +                }
    +                if (clazz.uses && clazz.uses.length) {
    +                    clazz.uses.forEach(function (u) {
    +                        var c = classes[u];
    +                        if (c) {
    +                            c.extension_for.push(clazz.name);
    +                        }
    +                    });
    +                }
    +            });
    +
    +            Y.each(elements, function (el, name) {
    +                if (el.module) {
    +                    modules[el.module].elements[name] = 1;
    +                }
    +
    +                if (el.submodule) {
    +                    modules[el.submodule].elements[name] = 1;
    +                    if (!modules[el.submodule].description) {
    +                        modules[el.submodule].description = el.description;
    +                    }
    +                }
    +            });
    +
    +            Y.each(classitems, function (v) {
    +                if (!v.itemtype) {
    +                    self.warnings.push({
    +                        message: 'Missing item type' + (v.description ? '\n' + v.description : ''),
    +                        line: stringlog(v)
    +                    });
    +                    Y.log('Missing item type: ' + stringlog(v), 'warn', 'DocParser');
    +                    if (v.description) {
    +                        Y.log('\t\t' + v.description, 'warn', 'DocParser');
    +                    }
    +                }
    +                if (v.itemtype === 'property' && v.params) {
    +                    v.subprops = v.params;
    +                    v.subprops.forEach(function (i) {
    +                        //Remove top level prop name from sub props (should have been done in the @param parser
    +                        i.name = i.name.replace(v.name + '.', '');
    +                    });
    +                    delete v.params;
    +                }
    +            });
    +
    +            Y.each(modules, function (mod) {
    +                if (!mod.file || !mod.line || !mod.name) {
    +                    console.log('Failed to find lines for', mod);
    +                }
    +            });
    +
    +            return self;
    +        },
    +
    +        /**
    +         * Extracts and transforms the filemap provided to constructor
    +         * @method parse
    +         * @param {Array} filemap A map of filenames to file content
    +         * @param {Array} dirmap A map of file names to directory name
    +         * @return {DocParser} this parser instance.  The total results
    +         * are available in parser.data.
    +         */
    +        parse: function (filemap, dirmap) {
    +            filemap = filemap || this.get('filemap');
    +            dirmap = dirmap || this.get('dirmap');
    +            return this.transform(this.extract(filemap, dirmap));
    +        }
    +    });
    +
    +    Y.DocParser = DocParser;
    +
    +}, '0.1.0', {
    +    requires: ['base-base']
    +});
    diff --git a/lib/docview.js b/lib/docview.js
    new file mode 100644
    index 00000000..298d4536
    --- /dev/null
    +++ b/lib/docview.js
    @@ -0,0 +1,66 @@
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +'use strict';
    +
    +YUI.add('docview', function (Y) {
    +
    +    /*
    +    Selleck
    +    Copyright (c) 2011 Yahoo! Inc.
    +    Licensed under the BSD License.
    +    */
    +
    +    /**
    +    View class borrowed from [Selleck](https://github.com/rgrove/selleck)
    +    The view class is a **`handlebars`** template helper.
    +    @class DocView
    +    @constructor
    +    @param {Object} data Meta data to use in this template
    +    @param {String} templateName The name of the template file to render.
    +    **/
    +    function DocView(data, templateName) {
    +        this.templateName = templateName;
    +        Y.mix(this, data);
    +    }
    +
    +    DocView.prototype = {
    +        /**
    +         * **Mustache** `lambda` method for setting the HTML title
    +         * @method htmlTitle
    +         */
    +        htmlTitle: function () {
    +            var name = this.displayName || this.name,
    +                title = name;
    +
    +            if (title) {
    +                if (this.projectName) {
    +                    title += ' - ' + this.projectName;
    +                }
    +            } else {
    +                title = this.projectName;
    +            }
    +
    +            return title;
    +        },
    +
    +        /**
    +         * **Mustache** `lambda` method for setting the title
    +         * @method title
    +         */
    +        title: function () {
    +            var name = this.displayName || this.name,
    +                title = this.projectName;
    +
    +            if (name) {
    +                title += ': ' + name;
    +            }
    +
    +            return title;
    +        }
    +    };
    +
    +    Y.DocView = DocView;
    +});
    diff --git a/lib/files.js b/lib/files.js
    new file mode 100644
    index 00000000..577dbdb0
    --- /dev/null
    +++ b/lib/files.js
    @@ -0,0 +1,486 @@
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +'use strict';
    +
    +YUI.add('files', function (Y) {
    +
    +    /**
    +     * Ported fileutils methods from [Selleck](http://github.com/rgrove/selleck)
    +     * @class Files
    +     * @module yuidoc
    +     */
    +
    +    Y.Files = {};
    +
    +    /*
    +    Selleck
    +    Copyright (c) 2011 Yahoo! Inc.
    +    Licensed under the BSD License.
    +    */
    +
    +    var fs = require('graceful-fs');
    +    var fsPath = require('path');
    +    var useFS = (fs.exists) ? fs : fsPath;
    +
    +
    +    function exists(file, cb) {
    +        if (cb) {
    +            useFS.exists(file, cb);
    +        } else {
    +            return useFS.existsSync(file);
    +        }
    +    }
    +    Y.Files.exists = exists;
    +
    +
    +    /**
    +    Copy a directory from one location to another
    +    @method copyDirectory
    +    @param {Path} source The source directory
    +    @param {Path} dest The destination directory
    +    @param {Boolean} [overwrite=false] Whether or not to overwrite destination files
    +        if they already exist.
    +    @param {Function} callback The callback to be executed when complete.
    +    **/
    +    function copyDirectory(source, dest, overwrite, callback) {
    +        // Allow callback as third arg.
    +        if (typeof overwrite === 'function') {
    +            callback = overwrite;
    +            overwrite = null;
    +        }
    +
    +        fs.stat(source, afterSourceStat);
    +
    +        function afterSourceStat(err, stats) {
    +            if (err) {
    +                return callback(err);
    +            }
    +
    +            if (!stats.isDirectory()) {
    +                return callback(new Error('Source is not a directory: ' + source));
    +            }
    +
    +            fs.lstat(dest, afterDestStat);
    +        }
    +
    +        function afterDestStat(err, stats) {
    +            if (err && err.code !== 'ENOENT') {
    +                return callback(err);
    +            }
    +
    +            if (stats) {
    +                // If the destination is a file or a link, either delete it or
    +                // bubble an error if overwrite isn't true.
    +                if (stats.isFile() || stats.isSymbolicLink()) {
    +                    if (overwrite) {
    +                        deletePath(dest); // TODO: make this async
    +                    } else {
    +                        callback(new Error('Destination already exists: ' + dest));
    +                        return undefined;
    +                    }
    +                }
    +
    +                afterMkDir();
    +            } else {
    +                fs.mkdir(dest, '0755', afterMkDir);
    +            }
    +        }
    +
    +        function afterMkDir(err) {
    +            if (err && err.code !== 'EEXIST') {
    +                return callback(err);
    +            }
    +            fs.readdir(source, afterReadDir);
    +        }
    +
    +        function afterReadDir(err, files) {
    +            if (err) {
    +                return callback(err);
    +            }
    +
    +            var pending = files.length,
    +                filename;
    +
    +            if (!pending) {
    +                return callback();
    +            }
    +
    +            while ((filename = files.shift())) {
    +                copyPath(fsPath.join(source, filename), fsPath.join(dest, filename), overwrite, function (copyPathErr) {
    +                    if (copyPathErr) {
    +                        return callback(copyPathErr);
    +                    }
    +
    +                    pending -= 1;
    +
    +                    if (!pending) {
    +                        callback();
    +                    }
    +                });
    +            }
    +        }
    +    }
    +    Y.Files.copyDirectory = copyDirectory;
    +
    +    /**
    +    Copy a file from one location to another
    +    @method copyFile
    +    @param {Path} source The source file
    +    @param {Path} dest The destination file
    +    @param {Boolean} [overwrite=false] Whether or not to overwrite destination files
    +        if they already exist.
    +    @param {Callback} callback The callback to be executed when complete.
    +    @param {Error} callback.err The Error returned from Node
    +    **/
    +    function copyFile(source, dest, overwrite, callback) {
    +        // Allow callback as third arg.
    +        if (typeof overwrite === 'function') {
    +            callback = overwrite;
    +            overwrite = null;
    +        }
    +
    +        fs.lstat(source, function (err, sourceStats) {
    +            if (err) {
    +                return callback(err);
    +            }
    +
    +            if (!sourceStats.isFile()) {
    +                return callback(new Error('Source is not a file: ' + source));
    +            }
    +
    +            fs.lstat(dest, function (destStatsErr, destStats) {
    +                var rs;
    +
    +                if (destStatsErr && destStatsErr.code !== 'ENOENT') {
    +                    return callback(destStatsErr);
    +                }
    +
    +                if (destStats) {
    +                    if (overwrite) {
    +                        deletePath(dest); // TODO: make this async
    +                    } else {
    +                        callback(new Error('Destination already exists: ' + dest));
    +                        return undefined;
    +                    }
    +                }
    +
    +                rs = fs.createReadStream(source);
    +                rs.pipe(fs.createWriteStream(dest, {
    +                    mode: '0655'
    +                }));
    +                rs.on('end', callback);
    +            });
    +        });
    +    }
    +    Y.Files.copyFile = copyFile;
    +
    +
    +    /**
    +    If _source_ is a file, copies it to _dest_. If it's a directory, recursively
    +    copies it and all files and directories it contains to _dest_.
    +
    +    Note that when attempting to copy a file into a directory, you should specify
    +    the full path to the new file (including the new filename). Otherwise, it will
    +    be interpreted as an attempt to copy the _source_ file *over* the _dest_
    +    directory instead of *into* it.
    +
    +    Known issues:
    +    - Doesn't preserve ownership or permissions on copied files/directories.
    +
    +    @method copyPath
    +    @param {String} source Source path.
    +    @param {String} dest Destination path.
    +    @param {Boolean} [overwrite=false] Whether or not to overwrite destination files
    +    if they already exist.
    +    @param {Callback} callback The callback to execute when completed.
    +    @param {Error} callback.err
    +    **/
    +    function copyPath(source, dest, overwrite, callback) {
    +        var sourceStats = statSync(source);
    +
    +        // Allow callback as third arg.
    +        if (typeof overwrite === 'function') {
    +            callback = overwrite;
    +            overwrite = null;
    +        }
    +
    +        if (!sourceStats) {
    +            callback(new Error('Source not found: ' + source));
    +            return;
    +        }
    +
    +        if (sourceStats.isFile()) {
    +            copyFile(source, dest, overwrite, callback);
    +        } else if (sourceStats.isDirectory()) {
    +            copyDirectory(source, dest, overwrite, callback);
    +        } else {
    +            callback(new Error('Source is neither a file nor a directory: ' + source));
    +        }
    +    }
    +    Y.Files.copyPath = copyPath;
    +
    +    // TODO: copySymbolicLink()?
    +
    +    /**
    +    If _path_ is a file, deletes it. If _path_ is a directory, recursively deletes
    +    it and all files and directories it contains.
    +
    +    This method is synchronous.
    +
    +    @method deletePath
    +    @param {String} path File or directory to delete.
    +    **/
    +    function deletePath(path) {
    +        var stats = fs.lstatSync(path);
    +
    +        if (stats.isFile() || stats.isSymbolicLink()) {
    +            fs.unlinkSync(path);
    +        } else if (stats.isDirectory()) {
    +            fs.readdirSync(path).forEach(function (filename) {
    +                deletePath(fsPath.join(path, filename));
    +            });
    +
    +            fs.rmdirSync(path);
    +        }
    +    }
    +    Y.Files.deletePath = deletePath;
    +
    +
    +    /**
    +    Check to see if this is a directory
    +
    +    @method isDirectory
    +    @param {Path} path The path to check
    +    @param {Boolean} [link=false] Also validate a symlink
    +    @return {Boolean} True if it is a directory
    +    **/
    +    function isDirectory(path, link) {
    +        var stat,
    +            result = false;
    +
    +        link = (link === false) ? false : true;
    +
    +        try {
    +            stat = fs.lstatSync(path);
    +            if (stat) {
    +                if (stat.isSymbolicLink() && link) {
    +                    stat = fs.statSync(path);
    +                }
    +                result = stat.isDirectory();
    +            }
    +        } catch (e) {
    +            result = false;
    +        }
    +
    +        return result;
    +    }
    +    Y.Files.isDirectory = isDirectory;
    +
    +
    +    /**
    +    Check to see if this is a File
    +
    +    @method isFile
    +    @param {Path} path The path to check
    +    @param {Boolean} [link=false] Also validate a symlink
    +    @return {Boolean} True if it is a file
    +    **/
    +    function isFile(path, link) {
    +        var stat,
    +            result = false;
    +
    +        try {
    +            stat = fs.lstatSync(path);
    +            if (stat) {
    +                if (stat.isSymbolicLink() && link) {
    +                    stat = fs.statSync(path);
    +                }
    +                result = stat.isFile();
    +            }
    +        } catch (e) {
    +            result = false;
    +        }
    +
    +        return result;
    +    }
    +    Y.Files.isFile = isFile;
    +
    +
    +    /**
    +    Check to see if this is a SymLink
    +
    +    @method isSymbolicLink
    +    @param {Path} path The path to check
    +    @return {Boolean} True if it is a link
    +    **/
    +    function isSymbolicLink(path) {
    +        var stats = lstatSync(path);
    +        return stats ? stats.isSymbolicLink() : false;
    +    }
    +    Y.Files.isSymbolicLink = isSymbolicLink;
    +
    +
    +    /**
    +    Like `fs.lstatSync()`, but returns `null` instead of throwing when _path_
    +    doesn't exist. Will still throw on other types of errors.
    +
    +    @method lstatSync
    +    @param {String} path Path to stat.
    +    @return {fs.Stats|null} `fs.Stats` object, or `null` if _path_ doesn't exist.
    +    **/
    +    function lstatSync(path) {
    +        try {
    +            return fs.lstatSync(path);
    +        } catch (ex) {
    +            if (ex.code === 'ENOENT') {
    +                return null;
    +            }
    +
    +            throw ex;
    +        }
    +    }
    +    Y.Files.lstatSync = lstatSync;
    +
    +
    +    /**
    +    Like `fs.statSync()`, but returns `null` instead of throwing when _path_
    +    doesn't exist. Will still throw on other types of errors.
    +
    +    @method statSync
    +    @param {String} path Path to stat.
    +    @return {fs.Stats|null} `fs.Stats` object, or `null` if _path_ doesn't exist.
    +    **/
    +    function statSync(path) {
    +        try {
    +            return fs.statSync(path);
    +        } catch (ex) {
    +            if (ex.code === 'ENOENT') {
    +                return null;
    +            }
    +
    +            throw ex;
    +        }
    +    }
    +    Y.Files.statSync = statSync;
    +
    +    /**
    +    Copy the theme assets directory
    +
    +    @method copyAssets
    +    @param {Path} from The source directory
    +    @param {Path} dest The destination directory
    +    @param {Boolean} deleteFirst Should the directory be deleted if it exists
    +    @param {Function} callback The callback to be executed
    +    */
    +    function copyAssets() {
    +        var args = Array.prototype.slice.call(arguments),
    +            callback = args.pop(),
    +            from = args.shift(),
    +            to = args.shift(),
    +            deleteFirst = args.shift();
    +
    +        if (from[0] === from[1]) {
    +            if (isDirectory(from[0])) {
    +                if (deleteFirst && isDirectory(to)) {
    +                    deletePath(to);
    +                }
    +
    +                copyPath(from[0], to, true, callback);
    +            } else {
    +                callback();
    +            }
    +        } else {
    +            if (isDirectory(from[0])) {
    +                if (deleteFirst && isDirectory(to)) {
    +                    deletePath(to);
    +                }
    +
    +                copyPath(from[0], to, true, function () {
    +                    if (isDirectory(from[1])) {
    +                        copyPath(from[1], to, true, callback);
    +                    } else {
    +                        callback();
    +                    }
    +                });
    +            } else {
    +                callback();
    +            }
    +
    +        }
    +    }
    +    Y.Files.copyAssets = copyAssets;
    +
    +
    +    /**
    +    Helper method for getting JSON data from a local file
    +
    +    @method getJSON
    +    @param {Path} filename The filename to parse JSON from
    +    @return {Object} The JSON data
    +    **/
    +    Y.Files.getJSON = function (filename) {
    +        var data = {};
    +        if (exists(filename)) {
    +            data = JSON.parse(fs.readFileSync(filename, 'utf8'));
    +        }
    +        return data;
    +    };
    +
    +    /**
    +    Helper method for writing files to disk. It wraps the NodeJS file API
    +
    +    @method writeFile
    +    @param {Path} file The filename to write to
    +    @param {String} data The data to write
    +    @param {Callback} callback*
    +    **/
    +    function writeFile(file, data, cb) {
    +        var out,
    +            args = arguments,
    +            flags = {
    +                flags: 'w',
    +                encoding: Y.charset,
    +                mode: '0644'
    +            };
    +
    +        if (cb) {
    +            fs.writeFile(file, data, flags, function (err) {
    +                if (err && err.message.match(/^EMFILE, Too many open files/)) {
    +                    Y.log('Writefile failed, too many open files (' + args[0] + '). Trying again.', 'warn', 'files');
    +                    writeFile.timer++;
    +                    Y.later(writeFile.timer, Y, writeFile, args);
    +                    return;
    +                }
    +                cb();
    +            });
    +        } else {
    +            out = fs.createWriteStream(file, flags);
    +            out.write(data);
    +            out.end();
    +        }
    +    }
    +    writeFile.timer = 100;
    +
    +    Y.Files.writeFile = writeFile;
    +
    +
    +    function readFile(file, enc, cb) {
    +        var args = arguments;
    +        fs.readFile(file, enc, function (err, data) {
    +            if (err && err.message.match(/^EMFILE, Too many open files/)) {
    +                Y.log('Readfile failed, too many open files (' + args[0] + '). Trying again.', 'warn', 'files');
    +                readFile.timer++;
    +                Y.later(readFile.timer, Y, readFile, args);
    +                return;
    +            }
    +            cb(err, data);
    +        });
    +    }
    +    readFile.timer = 100;
    +
    +    Y.Files.readFile = readFile;
    +
    +});
    diff --git a/lib/help.js b/lib/help.js
    new file mode 100644
    index 00000000..91d8c113
    --- /dev/null
    +++ b/lib/help.js
    @@ -0,0 +1,81 @@
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +'use strict';
    +
    +YUI.add('help', function (Y) {
    +
    +    /**
    +     * Shows the help text
    +     * @module yuidoc
    +     * @class Help
    +     */
    +
    +    /**
    +     * The help text to display
    +     * @private
    +     * @property help
    +     * @type Array
    +     */
    +    var help = [
    +        '',
    +        'YUI Doc generates API documentation from a modified JavaDoc syntax.',
    +        '',
    +        'Current version ({VERSION})',
    +        '',
    +        'Usage: yuidoc <options> <input path>',
    +        '',
    +        'Common Options:',
    +        '  -c, --config, --configfile <filename>  A JSON config file to provide configuration data.',
    +        '           You can also create a yuidoc.json file and place it',
    +        '           anywhere under your source tree and YUI Doc will find it',
    +        '           and use it.',
    +        '  -e, --extension <comma sep list of file extensions> The list of file extensions to parse ',
    +        '           for api documentation. (defaults to .js)',
    +        '  -x, --exclude <comma sep list of directories> Directories to exclude from parsing ',
    +        '           (defaults to \'.DS_Store,.svn,CVS,.git,build_rollup_tmp,build_tmp\')',
    +        '  -v, --version Show the current YUIDoc version',
    +        '  --project-version Set the doc version for the template',
    +        '  -N, --no-color Turn off terminal colors (for automation)',
    +        '  -C, --no-code Turn off code generation (don\'t include source files in output)',
    +        '  -n, --norecurse Do not recurse directories (default is to recurse)',
    +        '  --no-sort Do not alphabetical sorting of attributes, events, methods, and properties',
    +        '  -S, --selleck Look for Selleck component data and attach to API meta data',
    +        '  -V, --view Dump the Handlebars.js view data instead of writing template files',
    +        '  -p, --parse-only Only parse the API docs and create the JSON data, do not render templates',
    +        '  -o, --outdir <directory path> Path to put the generated files (defaults to ./out)',
    +        '  -t, --themedir <directory path> Path to a custom theme directory containing Handlebars templates',
    +        '  -H, --helpers <comma separated list of paths to files> Require these file and add Handlebars helpers. See docs for more information',
    +        '  --charset CHARSET Use this as the default charset for all file operations. Defaults to \'utf8\'',
    +        '  -h, --help Show this help',
    +        '  -q, --quiet Supress logging output',
    +        '  -T, --theme <simple|default> Choose one of the built in themes (default is default)',
    +        '  --syntaxtype <js|coffee> Choose comment syntax type (default is js)',
    +        '  --server <port> Fire up the YUIDoc server for faster API doc developement. Pass optional port to listen on. (default is 3000)',
    +        '  --lint Lint your docs, will print parser warnings and exit code 1 if there are any',
    +        '',
    +        '  <input path> Supply a list of paths (shell globbing is handy here)',
    +        ''
    +    ].join('\n');
    +
    +    /**
    +     * Render the help message as a string
    +     * @method renderHelp
    +     * @return {String} The help screen to display
    +     */
    +    Y.renderHelp = function () {
    +        return Y.Lang.sub(help, {
    +            VERSION: Y.packageInfo.version
    +        });
    +    };
    +    /**
    +     * Display the help message, write it to the screen and exit
    +     * @method showHelp
    +     */
    +    Y.showHelp = function () {
    +        console.error(Y.renderHelp());
    +        process.exit(0); //Shouldn't exit one on help
    +    };
    +});
    diff --git a/lib/index.js b/lib/index.js
    new file mode 100644
    index 00000000..6da38ab2
    --- /dev/null
    +++ b/lib/index.js
    @@ -0,0 +1,122 @@
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +'use strict';
    +
    +/**
    +Module creates the YUI instance with the required modules, uses them and exports the **Y** to be used
    +by the _CLI class_ or by extenders: `require('yuidocjs');`
    +You can use it like this:
    +
    +    var options = {
    +        paths: [ './lib' ],
    +        outdir: './out'
    +    };
    +
    +    var Y = require('yuidocjs');
    +    var json = (new Y.YUIDoc(options)).run();
    +
    +@class Main
    +@exports {YUI} Y A YUI instance
    +@module yuidoc
    +*/
    +//Hacking in debug support
    +var args = process.argv.slice(2);
    +var debug = false;
    +
    +args.forEach(function (item) {
    +    if (item.toLowerCase() === '--debug') {
    +        debug = true;
    +    }
    +});
    +
    +var YUI = require('yui' + (debug ? '/debug' : '')).YUI;
    +var path = require('path');
    +var fs = require('graceful-fs');
    +var metaPath = path.join(__dirname, '../', 'package.json');
    +
    +function log (message, level) {
    +    if (!message || !level || typeof console[level] !== 'function') {
    +        return;
    +    }
    +
    +    if (typeof message === 'object') {
    +        message = JSON.stringify(message);
    +    }
    +
    +    console[level]('%s: %s', level, message);
    +}
    +
    +process.on('uncaughtException', function (msg) {
    +    var meta = JSON.parse(fs.readFileSync(metaPath)),
    +        inst = YUI(),
    +        useColor = (Y ? Y.config.useColor : false);
    +
    +    inst.applyConfig({
    +        debug: true,
    +        logFn: log,
    +        useColor: useColor
    +    });
    +
    +    inst.log('--------------------------------------------------------------------------', 'error');
    +    inst.log('An uncaught YUIDoc error has occurred, stack trace given below', 'error');
    +    inst.log('--------------------------------------------------------------------------', 'error');
    +    inst.log(msg.stack || msg.message || msg, 'error');
    +    inst.log('--------------------------------------------------------------------------', 'error');
    +    inst.log('Node.js version: ' + process.version, 'error');
    +    inst.log('YUI version: ' + YUI.version, 'error');
    +    inst.log('YUIDoc version: ' + meta.version, 'error');
    +    inst.log('Please file all tickets here: ' + meta.bugs.url, 'error');
    +    inst.log('--------------------------------------------------------------------------', 'error');
    +
    +    process.exit(1);
    +});
    +
    +var Y = YUI({
    +    modules: {
    +        help: {
    +            fullpath: path.join(__dirname, 'help.js')
    +        },
    +        options: {
    +            fullpath: path.join(__dirname, 'options.js')
    +        },
    +        docparser: {
    +            fullpath: path.join(__dirname, 'docparser.js'),
    +            requires: ['base-base', 'json-stringify']
    +        },
    +        yuidoc: {
    +            fullpath: path.join(__dirname, 'yuidoc.js')
    +        },
    +        'doc-builder': {
    +            fullpath: path.join(__dirname, 'builder.js'),
    +            requires: ['parallel', 'handlebars']
    +        },
    +        utils: {
    +            fullpath: path.join(__dirname, 'utils.js')
    +        },
    +        files: {
    +            fullpath: path.join(__dirname, 'files.js')
    +        },
    +        docview: {
    +            fullpath: path.join(__dirname, 'docview.js')
    +        },
    +        server: {
    +            fullpath: path.join(__dirname, 'server.js')
    +        },
    +        project: {
    +            fullpath: path.join(__dirname, 'project.js')
    +        }
    +    },
    +    logExclude: {
    +        attribute: true,
    +        handlebars: true
    +    },
    +    logFn: log,
    +    useSync: true
    +}).use('utils', 'docparser', 'yuidoc', 'doc-builder', 'docview', 'files', 'help', 'options', 'server', 'project');
    +
    +Y.packageInfo = Y.Files.getJSON(metaPath);
    +
    +module.exports = Y;
    diff --git a/lib/options.js b/lib/options.js
    new file mode 100644
    index 00000000..6a6f0eb2
    --- /dev/null
    +++ b/lib/options.js
    @@ -0,0 +1,186 @@
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +'use strict';
    +
    +YUI.add('options', function (Y) {
    +
    +    var path = require('path');
    +
    +    /**
    +     * Handles argument parsing
    +     * @module yuidoc
    +     * @class Options
    +     */
    +
    +    /**
    +     * Parses arguments and returns an Object of config options
    +     * @method Options
    +     * @param {Array} args Arguments to parse
    +     * @return {Object} The config object
    +     */
    +    Y.Options = function (args) {
    +        var options = {
    +            port: 3000,
    +            ip: '127.0.0.1',
    +            nocode: false
    +        };
    +
    +        while (args.length > 0) {
    +            var v = args.shift();
    +            // options.* defined in ./builder.js
    +            switch (v) {
    +            case '--lint':
    +                options.lint = true;
    +                options.parseOnly = true;
    +                options.writeJSON = false;
    +                options.quiet = true;
    +                break;
    +            case '--debug':
    +                Y.applyConfig({
    +                    debug: true,
    +                    filter: 'debug'
    +                });
    +                break;
    +            case '--charset':
    +                Y.charset = args.shift() || 'utf8';
    +                Y.log('Setting default charset to ' + Y.charset, 'yuidoc', 'warn');
    +                break;
    +            case '-c':
    +            case '--config':
    +            case '--configfile':
    +                options.configfile = args.shift();
    +                break;
    +            case '-e':
    +            case '--extension':
    +                options.extension = args.shift();
    +                break;
    +            case '-x':
    +            case '--exclude':
    +                options.exclude = args.shift();
    +                break;
    +            case '-v':
    +            case '--version':
    +                console.error(Y.packageInfo.version);
    +                process.exit(1);
    +                break;
    +            case '--project-version':
    +                options.version = args.shift();
    +                break;
    +            case '-N':
    +            case '--no-color':
    +                Y.config.useColor = false;
    +                options.nocolor = true;
    +                break;
    +            case '-D':
    +            case '--no-delete-out':
    +                options.nodeleteout = true;
    +                break;
    +            case '-C':
    +            case '--no-code':
    +                options.nocode = true;
    +                break;
    +            case '-n':
    +            case '--norecurse':
    +                options.norecurse = true;
    +                break;
    +            case '-S':
    +            case '--selleck':
    +                options.selleck = true;
    +                break;
    +            case '-V':
    +            case '--view':
    +                options.dumpview = true;
    +                break;
    +            case '-p':
    +            case '--parse-only':
    +                options.parseOnly = true;
    +                break;
    +            case '-o':
    +            case '--outdir':
    +                options.outdir = args.shift();
    +                break;
    +            case '-t':
    +            case '--themedir':
    +                options.themedir = args.shift();
    +                break;
    +            case '--server':
    +                options.server = true;
    +                var a = args.shift();
    +                var delim = a.indexOf(':');
    +                if (delim >= 0) {
    +                    var socket = a.split(':');
    +                    options.ip = socket[0];
    +                    options.port = socket[1];
    +                    break;
    +                }
    +                var p = parseInt(a, 10);
    +                if (isNaN(p) || !p) {
    +                    if (a) {
    +                        args.unshift(a);
    +                    }
    +                    Y.log('Failed to extract socket, setting to the default 127.0.0.1:3000', 'warn', 'yuidoc');
    +                } else {
    +                    options.port = p;
    +                }
    +                break;
    +            case '-h':
    +            case '--help':
    +                Y.showHelp();
    +                break;
    +            case '-H':
    +            case '--helpers':
    +                var list = args.shift();
    +                if (list) {
    +                    options.helpers = list.split(',');
    +                } else {
    +                    throw ('Failed to pass a helper file.');
    +                }
    +                break;
    +            case '-T':
    +            case '--theme':
    +                var theme = args.shift();
    +                options.themedir = path.join(__dirname, '../', 'themes', theme);
    +                break;
    +            case '-q':
    +            case '--quiet':
    +                options.quiet = true;
    +                break;
    +            case '--syntaxtype':
    +                options.syntaxtype = args.shift();
    +                break;
    +            case '--tab-to-space':
    +                options.tabtospace = parseInt(args.shift(), 10);
    +                if (typeof options.tabtospace === 'number') {
    +                    options.tabspace = '';
    +                    for (var s = 0; s < options.tabtospace; s++) {
    +                        options.tabspace += ' ';
    +                    }
    +                }
    +                break;
    +            case '--no-sort':
    +                options.dontsortfields = true;
    +                break;
    +            default:
    +                if (!options.paths) {
    +                    options.paths = [];
    +                }
    +                if (v && v.indexOf('-') === 0) {
    +                    throw ('Unknown option: ' + v);
    +                }
    +                options.paths.push(v);
    +            }
    +        }
    +
    +        if (options.quiet) {
    +            Y.applyConfig({
    +                debug: false
    +            });
    +        }
    +
    +        return options;
    +    };
    +
    +});
    diff --git a/lib/project.js b/lib/project.js
    new file mode 100644
    index 00000000..31d66922
    --- /dev/null
    +++ b/lib/project.js
    @@ -0,0 +1,68 @@
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +'use strict';
    +
    +YUI.add('project', function (Y) {
    +
    +    Y.Project = {
    +        mix: function (json, options) {
    +            if (json.project) {
    +                options = Y.merge(options, json.project);
    +            }
    +
    +            if (options.title && !options.name) {
    +                options.name = options.title;
    +            }
    +
    +            return options;
    +        },
    +        init: function (options) {
    +            var project = {};
    +            if (options.configfile) {
    +                project = Y.Files.getJSON(options.configfile);
    +            } else {
    +                Y.log('Scanning for yuidoc.json file.', 'info', 'yuidoc');
    +                project = Y.getProjectData();
    +                if (!project) {
    +                    project = {};
    +                }
    +            }
    +
    +            if (project.options && Object.keys(project.options).length) {
    +                options = Y.merge(project.options, options);
    +                delete project.options;
    +                options.project = project;
    +            }
    +
    +            if (options.version && options.project) {
    +                options.project.version = options.version;
    +                delete options.version;
    +            }
    +
    +            if (!options.outdir) {
    +                options.outdir = './out';
    +            }
    +
    +            options.paths = Y.validatePaths(options.paths, options.ignorePaths);
    +
    +            if (!options.paths.length) {
    +                Y.log('Paths argument was empty', 'warn', 'yuidoc');
    +                Y.showHelp();
    +                process.exit(1);
    +            }
    +
    +            if (typeof options.tabtospace === 'number') {
    +                options.tabspace = '';
    +                for (var s = 0; s < options.tabtospace; s++) {
    +                    options.tabspace += ' ';
    +                }
    +            }
    +
    +            return options;
    +        }
    +    };
    +
    +});
    diff --git a/lib/server.js b/lib/server.js
    new file mode 100644
    index 00000000..87a03588
    --- /dev/null
    +++ b/lib/server.js
    @@ -0,0 +1,237 @@
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +'use strict';
    +
    +var path = require('path');
    +var express = require('express');
    +
    +YUI.add('server', function (Y) {
    +
    +    /**
    +     * Provides the `--server` server option for YUIDoc
    +     * @class Server
    +     * @module yuidoc
    +     */
    +    var Server = {
    +        /**
    +         * Cache for external mixed in data.
    +         * @property _externalData
    +         * @private
    +         * @type Object
    +         */
    +        _externalData: null,
    +        /**
    +         * Middleware to parse the API docs per request
    +         * @method parse
    +         * @param {Request} req Express request object
    +         * @param {Response} res Express response object
    +         * @param {Function} next Express next callback
    +         */
    +        parse: function (req, res, next) {
    +            var json = (new Y.YUIDoc(Server.options)).run();
    +            Server.options = Y.Project.mix(json, Server.options);
    +            Server.builder = new Y.DocBuilder(Server.options, json);
    +            if (Server._externalData) {
    +                Server.options.externalData = Server._externalData;
    +                Server.builder._mixExternal();
    +            }
    +
    +            next();
    +        },
    +        /**
    +         * Create the routes used to serve YUIDoc files dynamically
    +         * @method routes
    +         */
    +        routes: function () {
    +            var app = Server.app;
    +
    +            app.get('/', Server.parse, function (req, res) {
    +                Server.home(req, res);
    +            });
    +            app.get('/api.js', function (req, res) {
    +                Server.builder.renderAPIMeta(function (js) {
    +                    res.contentType('.js');
    +                    res.send(js);
    +                });
    +            });
    +
    +
    +            app.get('/classes/:class.html', Server.parse, function (req, res, next) {
    +                Server.clazz(req, res, next);
    +            });
    +
    +            app.get('/modules/:module.html', Server.parse, function (req, res, next) {
    +                Server.module(req, res, next);
    +            });
    +
    +            app.get('/files/:file.html', Server.parse, function (req, res, next) {
    +                Server.files(req, res, next);
    +            });
    +
    +            //These routes are special catch routes..
    +
    +            app.get('//api.js', function (req, res) {
    +                res.redirect('/api.js');
    +            });
    +            app.get('//classes/:class.html', Server.parse, function (req, res, next) {
    +                Server.clazz(req, res, next);
    +            });
    +
    +            app.get('//modules/:module.html', Server.parse, function (req, res, next) {
    +                Server.module(req, res, next);
    +            });
    +
    +            app.get('//files/:file.html', Server.parse, function (req, res, next) {
    +                Server.files(req, res, next);
    +            });
    +
    +            app.get('*', function (req, res) {
    +                var type = req.url.split('/')[1],
    +                    html = ['<h1>Item Not Found in internal meta-data</h1>'];
    +
    +                if (type === 'class') {
    +                    type = 'classes';
    +                }
    +                if (Server.builder && Server.builder.data && Server.builder.data[type]) {
    +                    if (Object.keys(Server.builder.data[type]).length) {
    +                        html.push('<p>But I know about these? Misname your module?</p>');
    +                        html.push('<ul>');
    +                        Object.keys(Server.builder.data[type]).forEach(function (item) {
    +                            html.push('<li><a href="../' + path.dirname(req.url) + '/' + item + '.html">' + item + '</a></li>');
    +                        });
    +                        html.push('</ul>');
    +                    }
    +                }
    +
    +
    +                res.status(404).send(html.join('\n'));
    +            });
    +
    +        },
    +        /**
    +         * `/files` endpoint
    +         * @method files
    +         * @param {Request} req Express request object
    +         * @param {Response} res Express response object
    +         */
    +        files: function (req, res, next) {
    +            var fileName = req.params.file,
    +                data;
    +            Object.keys(Server.builder.data.files).forEach(function (file) {
    +                if (fileName === Server.builder.filterFileName(file)) {
    +                    data = Server.builder.data.files[file];
    +                }
    +            });
    +
    +            if (!data) {
    +                return next();
    +            }
    +
    +            Y.log('Serving /files/' + data.name, 'info', 'server');
    +
    +
    +            Server.builder.renderFile(function (html) {
    +                res.send(html);
    +            }, data, (req.xhr ? 'xhr' : 'main'));
    +        },
    +        /**
    +         * `/classes` endpoint
    +         * @method clazz
    +         * @param {Request} req Express request object
    +         * @param {Response} res Express response object
    +         */
    +        clazz: function (req, res, next) {
    +            var className = req.params.class;
    +            Y.log('Serving /classes/' + className + '.html', 'info', 'server');
    +            if (!Server.builder.data.classes[className]) {
    +                return next();
    +            }
    +            Server.builder.renderClass(function (html) {
    +                res.send(html);
    +            }, Server.builder.data.classes[className], (req.xhr ? 'xhr' : 'main'));
    +        },
    +        /**
    +         * `/modules` endpoint
    +         * @method modules
    +         * @param {Request} req Express request object
    +         * @param {Response} res Express response object
    +         */
    +        module: function (req, res, next) {
    +            var modName = req.params.module;
    +            Y.log('Serving /modules/' + modName + '.html', 'info', 'server');
    +            if (!Server.builder.data.modules[modName]) {
    +                return next();
    +            }
    +            Server.builder.renderModule(function (html) {
    +                res.send(html);
    +            }, Server.builder.data.modules[modName], (req.xhr ? 'xhr' : 'main'));
    +        },
    +        /**
    +         * `/` endpoint
    +         * @method home
    +         * @param {Request} req Express request object
    +         * @param {Response} res Express response object
    +         */
    +        home: function (req, res) {
    +            Y.log('Serving index.html', 'info', 'server');
    +            Server.builder.renderIndex(function (html) {
    +                res.send(html);
    +            });
    +        },
    +        /**
    +         * Creates the Express server and prep's YUI for serving
    +         * @method init
    +         */
    +        init: function () {
    +            var stat;
    +
    +            Server.app = express();
    +            //console.log(Server.options);
    +            stat = Server.options.themedir || path.join(__dirname, '../', 'themes', 'default');
    +            Server.app.use(express.static(stat));
    +            Server.routes();
    +            Server.app.listen(Server.options.port, Server.options.ip);
    +
    +            Y.log('Starting server: http://' + Server.options.ip + ':' + Server.options.port, 'info', 'server');
    +        },
    +        /**
    +         * Start the server with the supplied options.
    +         * @method start
    +         * @param {Object} options Server options
    +         */
    +        start: function (options) {
    +            options = Y.Project.init(options);
    +            Server.options = options;
    +
    +            Server.options.cacheTemplates = false; //Don't cache the Handlebars templates
    +            Server.options.writeJSON = false; //Don't write the JSON file out
    +
    +            Y.config.logExclude.yuidoc = true;
    +            Y.config.logExclude.docparser = true;
    +            Y.config.logExclude.builder = true;
    +
    +            if (Server.options.external) {
    +                Y.log('Fetching external data, this may take a minute', 'warn', 'server');
    +                var json, builder;
    +
    +                json = (new Y.YUIDoc(Server.options)).run();
    +                Server.options = Y.Project.mix(json, Server.options);
    +
    +                builder = new Y.DocBuilder(Server.options, json);
    +                builder.mixExternal(function () {
    +                    Y.log('External data fetched, launching server..', 'info', 'server');
    +                    Server._externalData = builder.options.externalData;
    +                    Server.init();
    +                });
    +
    +            } else {
    +                Server.init();
    +            }
    +        }
    +    };
    +
    +    Y.Server = Server;
    +});
    diff --git a/lib/utils.js b/lib/utils.js
    new file mode 100644
    index 00000000..a45264f9
    --- /dev/null
    +++ b/lib/utils.js
    @@ -0,0 +1,498 @@
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +'use strict';
    +
    +var path = require('path'),
    +    minimatch = require('minimatch'),
    +    fs = require('graceful-fs');
    +
    +/**
    + * Utilities Class
    + * @class Utils
    + * @module yuidoc
    + */
    +
    +YUI.add('utils', function (Y) {
    +
    +    Y.charset = 'utf8';
    +
    +    var HTML_CHARS = {
    +        '&': '&amp;',
    +        '<': '&lt;',
    +        '>': '&gt;',
    +        '"': '&quot;',
    +        '\'': '&#x27;',
    +        '/': '&#x2F;',
    +        '`': '&#x60;'
    +    };
    +
    +    /**
    +    Escapes HTML characters in _html_.
    +
    +    @method escapeHTML
    +    @param {String} html String to escape.
    +    @return {String} Escaped string.
    +    **/
    +    Y.escapeHTML = function (html) {
    +        return html.replace(/[&<>"'\/`]/g, function (match) {
    +            return HTML_CHARS[match];
    +        });
    +    };
    +
    +    /**
    +    Normalizes the initial indentation of the given _content_ so that the first line
    +    is unindented, and all other lines are unindented to the same degree as the
    +    first line. So if the first line has four spaces at the beginning, then all
    +    lines will be unindented four spaces.
    +
    +    @method unindent
    +    @param {String} content Text to unindent.
    +    @return {String} Unindented text.
    +    @private
    +    **/
    +    Y.unindent = function (content) {
    +        var indent = content.match(/^(\s+)/);
    +
    +        if (indent) {
    +            content = content.replace(new RegExp('^' + indent[1], 'gm'), '');
    +        }
    +
    +        return content;
    +    };
    +
    +    /**
    +    Like `getPages()`, but returns only the files under the `layout/` subdirectory
    +    of the specified _dir_.
    +
    +    @method getLayouts
    +    @param {String} dir Directory path.
    +    @return {Object} Mapping of layout names to layout content.
    +    **/
    +    function getLayouts(dir) {
    +        return getPages(path.join(dir, 'layouts'));
    +    }
    +    Y.getLayouts = getLayouts;
    +
    +    /**
    +    Loads and returns the content of the specified page file.
    +
    +    @method getPage
    +    @param {String} pagePath Path to a single `.handlebars` page.
    +    @return {String|null} Page content, or `null` if not found.
    +    **/
    +    function getPage(pagePath) {
    +        if (!Y.Files.isFile(pagePath)) {
    +            return null;
    +        }
    +        return fs.readFileSync(pagePath, Y.charset);
    +    }
    +    Y.getPage = getPage;
    +
    +    /**
    +    Loads pages (files with a `.handlebars` extension) in the specified directory and
    +    returns an object containing a mapping of page names (the part of the filename)
    +    preceding the `.handlebars` extension) to page content.
    +
    +    @method getPages
    +    @param {String} dir Directory path.
    +    @return {Object} Mapping of page names to page content.
    +    **/
    +    var cache = {};
    +    function getPages(dir) {
    +        if (cache[dir]) {
    +            return cache[dir];
    +        }
    +        var pages = {};
    +
    +        if (!Y.Files.isDirectory(dir)) {
    +            return pages;
    +        }
    +
    +        fs.readdirSync(dir).forEach(function (filename) {
    +            var filePath = path.join(dir, filename);
    +
    +            if (path.extname(filename) === '.handlebars' && Y.Files.isFile(filePath)) {
    +                pages[path.basename(filename, '.handlebars')] = fs.readFileSync(filePath, Y.charset);
    +            }
    +        });
    +        cache[dir] = pages;
    +
    +        return pages;
    +    }
    +    Y.getPages = getPages;
    +
    +    /**
    +    Like `getPages()`, but returns only the files under the `partial/` subdirectory
    +    of the specified _dir_.
    +
    +    @method getPartials
    +    @param {String} dir Directory path.
    +    @return {Object} Mapping of partial names to partial content.
    +    **/
    +    function getPartials(dir) {
    +        return getPages(path.join(dir, 'partials'));
    +    }
    +    Y.getPartials = getPartials;
    +
    +
    +    /**
    +    Mix/merge/munge data into the template.
    +
    +    @method prepare
    +    @param {String} inDir The starting directory
    +    @param {Object} options The `options` for the meta data.
    +    @param {callback} callback The callback to excecute when complete
    +    @param {Error} callback.err
    +    @param {Object} callback.options Merged options.
    +    **/
    +    function prepare(inDirs, options, callback) {
    +        var layouts,
    +            partials,
    +            type = 'project';
    +
    +        if (options && options.skipLoad) {
    +            // Skip loading layouts, metadata, pages, and partials and assume that
    +            // the caller has provided them if they want them.
    +            options = Y.merge({
    +                layouts: {},
    +                meta: {},
    +                pages: {},
    +                partials: {},
    +                viewClass: Y.DocView
    +            }, options);
    +        } else {
    +            // Gather layouts, metadata, pages, and partials from the specified
    +            // input directory, then merge them into the provided options (if any).
    +            //
    +            // Gathered data will override provided data if there are conflicts, in
    +            // order to support a use case where global data are provided by the
    +            // caller and overridden by more specific component-level data gathered
    +            // from the input directory.
    +            //
    +            // The metadata inheritance chain looks like this:
    +            //
    +            //   - override metadata specified via CLI (highest precedence)
    +            //   - component metadata (if this is a component)
    +            //   - project-level component default metadata (if specified and this is a component)
    +            //   - theme-level component default metadata (if specified and this is a component)
    +            //   - project metadata
    +            //   - theme metadata (lowest precedence)
    +            try {
    +                if (inDirs[0] === inDirs[1]) {
    +                    layouts = getLayouts(inDirs[0]);
    +                    partials = getPartials(inDirs[0]);
    +                } else {
    +                    layouts = Y.merge(getLayouts(inDirs[0]), getLayouts(inDirs[1]));
    +                    partials = Y.merge(getPartials(inDirs[0]), getPartials(inDirs[1]));
    +                }
    +                options = Y.merge({
    +                        viewClass: Y.DocView
    +                    },
    +                    options || {}, {
    +                        layouts: layouts,
    +                        meta: options.meta,
    +                        partials: partials
    +                    }
    +                );
    +            } catch (ex) {
    +                return callback(ex);
    +            }
    +        }
    +
    +        // Mix in the override metadata, if any. It takes precedence over everything
    +        // else.
    +        Y.mix(options.meta, options.overrideMeta);
    +
    +        // Set a default asset path if one isn't specified in the metadata.
    +        if (!options.meta.projectAssets) {
    +            options.meta.projectAssets = options.component ? '../assets' : 'assets';
    +        }
    +
    +        if (!options.meta.componentAssets && options.component) {
    +            options.meta.componentAssets = '../assets/' + options.meta.name;
    +        }
    +
    +        if (typeof options.meta.layout === 'undefined') {
    +            options.meta.layout = options.layouts[type] ? type : 'main';
    +        }
    +
    +        callback(null, options);
    +    }
    +
    +    Y.prepare = prepare;
    +
    +    /**
    +     * Walk the directory tree to locate the yuidoc.json file.
    +     * @method getProjectData
    +     * @param {Path} [directory=process.cwd()] The directory to start from
    +     */
    +    var getProjectData = function (directory) {
    +        var dirs = [directory || process.cwd()];
    +        var projectData, packageData;
    +        var dirCount = 0;
    +        // keep looping until
    +        //  * data is found
    +        //  * there are no more dirs to process
    +        //  * we abort due to failsafe
    +        while (dirs.length && !projectData) {
    +            if (dirCount++ > 5000) {
    +                Y.log('Scanned ' + dirCount + ' directories looking for a yuidoc.json file, something is probably wrong here..', 'error', 'yuidoc');
    +                process.exit(1);
    +            }
    +            // accumulator for directories at this level
    +            var childDirs = [];
    +            // for each directory at the previous level
    +            dirs.forEach(function (dir) {
    +                // abort iterating if we have project data
    +                if (projectData) {
    +                    return;
    +                }
    +                // squelch (but log) any complaints about this particular directory
    +                try {
    +                    // for each item in this directory
    +                    var names = fs.readdirSync(dir);
    +                    names.forEach(function (name) {
    +                        // abort iterating a folder if we have found both data
    +                        if (projectData && packageData) {
    +                            return;
    +                        }
    +                        // build a full path
    +                        var p = path.join(dir, name);
    +                        // acquire project data from this item if possible
    +                        if (Y.Files.isFile(p)) {
    +                            projectData = getFileData(p, name, 'yuidoc.json');
    +                            // 'package.json' is used for auxilliary configuration
    +                            // if it's found. Formerly, it was only found if it
    +                            // came _before_'yuidoc.json' in the folder tree
    +                            // (never in the same folder).
    +                            // This code will find 'package.json' in the same
    +                            // folder as 'yuidoc.json'.
    +                            // If there is no 'yuidoc.json', former algorithm would
    +                            // use the deepest 'package.json' it can find, this one
    +                            // will use the first (most shallow) one.
    +                            packageData = packageData || getFileData(p, name, 'package.json');
    +                        }
    +                        // if we are a folder, but not ., .., or node_modules,
    +                        // then add to directory accumulator
    +                        if (Y.Files.isDirectory(p)) {
    +                            if (name.indexOf('.') === 0) {
    +                                return;
    +                            }
    +                            if (name === 'node_modules') {
    +                                Y.log('Skipping node_modules directory while scanning for yuidoc.json', 'warn', 'yuidoc');
    +                                return;
    +                            }
    +                            childDirs.push(p);
    +                        }
    +                    });
    +                } catch (dirPerm) {
    +                    Y.log('Accessing dir (' + dir + ') threw an error', 'warn', 'yuidoc');
    +                }
    +            });
    +            // iterate over new set of folders
    +            dirs = childDirs;
    +        }
    +        if ((packageData && projectData) || (packageData && packageData.yuidoc)) {
    +            projectData = mergeData(packageData, projectData);
    +        }
    +        return projectData;
    +    };
    +
    +    var getFileData = function (p, name, file) {
    +        if (name === file) {
    +            Y.log('Loading ' + name + ' data from: ' + p, 'info', 'yuidoc');
    +            try {
    +                return Y.Files.getJSON(p);
    +            } catch (e) {
    +                var err = 'Failed to parse ' + name + ' file, please make sure it is valid JSON';
    +                Y.log(err, 'error', 'yuidoc');
    +                throw (e + '');
    +            }
    +        }
    +    };
    +
    +    var mergeData = function (pack, project) {
    +        project = project || {};
    +
    +        if (pack.yuidoc) {
    +            Object.keys(pack.yuidoc).forEach(function (key) {
    +                if (!project[key]) {
    +                    project[key] = pack.yuidoc[key];
    +                }
    +            });
    +        }
    +
    +        ['name', 'description', 'version', 'url'].forEach(function (key) {
    +            if (pack[key] && !project[key]) {
    +                project[key] = pack[key];
    +            }
    +        });
    +
    +        return project;
    +    };
    +
    +    Y.getProjectData = getProjectData;
    +
    +    /**
    +     * Walks the tree from this dir and returns all the subdirs
    +     * @method getDirs
    +     * @param {String} baseDir The dir to begin at
    +     * @param {Array} ignore An array of paths to ignore
    +     * @return {Array} The array of directories..
    +     */
    +    var getDirs = function (baseDir, ignore) {
    +        var inputPaths = [],
    +            paths = [],
    +            i, d, isIgnored, subpath,
    +            stat, possibleDirs, fullPath;
    +
    +        var inputPath = '';
    +        while (inputPath !== undefined) {
    +            fullPath = path.join(baseDir, inputPath);
    +            stat = fs.lstatSync(fullPath);
    +
    +            if (stat.isDirectory()) {
    +                if (fullPath !== baseDir) {
    +                    paths.push(fullPath);
    +                }
    +                possibleDirs = fs.readdirSync(fullPath);
    +                for (d=0;d<possibleDirs.length;d++) {
    +                    subpath = path.join(inputPath, possibleDirs[d]);
    +                    isIgnored = false;
    +                    for (i=0;i<ignore.length;i++) {
    +                        if (subpath.indexOf(ignore[i]) === 0) {
    +                          isIgnored = true;
    +                          break;
    +                        }
    +                    }
    +                    if (!isIgnored) {
    +                      inputPaths.push(subpath);
    +                    }
    +                }
    +            }
    +            inputPath = inputPaths.pop();
    +        }
    +
    +        return paths;
    +    };
    +
    +    Y.getDirs = getDirs;
    +
    +    /**
    +     * Make sure all the paths passed are directories and that they are not in the ignore list.
    +     * @method validatePaths
    +     * @param {Array} paths The array of paths to validate
    +     * @param {String} [ignore=false] A string to call `.indexOf` on a path to determine if it should be ignored
    +     */
    +    var validatePaths = function (paths, ignore) {
    +        if (!ignore) {
    +            ignore = [];
    +        } else if (!(ignore instanceof Array)) {
    +            ignore = [ignore];
    +        }
    +
    +        var newpaths = [];
    +        //Shortcut the *, . & ./ shortcuts that shall globbing fixes for us
    +        if (paths === '*' || paths === '.' || paths === './') {
    +            paths = [process.cwd()];
    +        }
    +
    +        // Ensure that we always have an array of some kind.
    +        paths = paths || [];
    +        if (!Y.Lang.isArray(paths)) {
    +            paths = [paths];
    +        }
    +        paths.forEach(function (validatePath) {
    +            var glob = validatePath || '';
    +
    +            if (process.platform === 'win32') {
    +                glob = validatePath.replace(/\//g, '\\\\');
    +            }
    +
    +            var glob_paths = getDirs('.', ignore),
    +                is_globbed = false;
    +
    +            glob_paths.forEach(function (dir) {
    +                //Don't scan things in node_modules
    +                if (dir.indexOf('node_modules') > -1) {
    +                    return;
    +                }
    +                if (minimatch(dir, glob, {
    +                    period: true
    +                })) {
    +                    newpaths.push(dir);
    +                    is_globbed = true;
    +                }
    +            });
    +
    +            if (!is_globbed && (Y.Files.isDirectory(glob))) {
    +                //If minimatch fails, check to see if it's a relative directory
    +                // if it is, add it directly
    +                newpaths.push(glob);
    +            }
    +        });
    +
    +        paths = newpaths;
    +        paths.forEach(function (newPath) {
    +            try {
    +                if (!Y.Files.isDirectory(newPath)) {
    +                    throw ('Path not a directory: ' + newPath);
    +                }
    +            } catch (e) {
    +                throw new Error(e.message);
    +            }
    +        });
    +
    +        if (!paths || !paths.forEach) {
    +            throw ('Paths should be an array of paths');
    +        }
    +
    +        paths = paths.sort();
    +        return paths;
    +    };
    +
    +    Y.validatePaths = validatePaths;
    +
    +    /**
    +     * Takes a type string and converts it to a "First letter upper cased" type. e.g. `(string -> String, object -> Object)`
    +     * @method fixType
    +     * @param {String} t The type string to convert
    +     * @return {String} The fixed string
    +     */
    +    var fixType = function (t) {
    +        if (t && t.indexOf('.') === -1) {
    +            t = t.replace(/{/g, '').replace(/}/g, '');
    +            var firstChar = t.charAt(0),
    +                upperFirstChar = firstChar.toUpperCase();
    +
    +            if (firstChar !== upperFirstChar) {
    +                return upperFirstChar + t.substring(1);
    +            }
    +        }
    +
    +        return t;
    +    };
    +
    +    Y.Lang.fixType = fixType;
    +
    +    /**
    +     * Produces a normalized web path by joining all the parts and normalizing the
    +     * filesystem-like path into web compatible url.
    +     * Supports relative and absolute paths.
    +     * Courtesy of [Mojito's utils](https://github.com/yahoo/mojito/)
    +     *
    +     * @method webpath
    +     * @param {Array|String*} url the list of parts to be joined and normalized
    +     * @return {String} The joined and normalized url
    +     **/
    +    function webpath() {
    +        var args = [].concat.apply([], arguments),
    +            parts = path.join.apply(path, args).split(/[\\\/]/);
    +        return parts.join('/');
    +    }
    +
    +    Y.webpath = webpath;
    +});
    diff --git a/lib/yuidoc.js b/lib/yuidoc.js
    new file mode 100755
    index 00000000..3c6cc91a
    --- /dev/null
    +++ b/lib/yuidoc.js
    @@ -0,0 +1,418 @@
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +'use strict';
    +
    +var fs = require('graceful-fs');
    +var rimraf = require('rimraf');
    +var path = require('path');
    +
    +/**
    +This is the __module__ description for the `YUIDoc` module.
    +
    +    var options = {
    +        paths: [ './lib' ],
    +        outdir: './out'
    +    };
    +
    +    var Y = require('yuidocjs');
    +    var json = (new Y.YUIDoc(options)).run();
    +
    +@class YUIDoc
    +@main yuidoc
    +*/
    +
    +
    +YUI.add('yuidoc', function (Y) {
    +
    +
    +    /**
    +     * The default list of configuration options
    +     * @property OPTIONS
    +     * @type Object
    +     * @final
    +     * @for YUIDoc
    +     */
    +    var OPTIONS = {
    +        quiet: false,
    +        writeJSON: true,
    +        outdir: path.join(process.cwd(), 'out'),
    +        extension: '.js',
    +        exclude: '.DS_Store,.svn,CVS,.git,build_rollup_tmp,build_tmp,node_modules',
    +        norecurse: false,
    +        version: '0.1.0',
    +        paths: [],
    +        themedir: path.join(__dirname, 'themes', 'default'),
    +        syntaxtype: 'js'
    +    };
    +
    +    /**
    +     * YUIDoc main class
    +
    +        var options = {
    +            paths: [ './lib' ],
    +            outdir: './out'
    +        };
    +
    +        var Y = require('yuidoc');
    +        var json = (new Y.YUIDoc(options)).run();
    +
    +     * @class YUIDoc
    +     * @module yuidoc
    +     * @constructor
    +     * @param config The config object
    +     */
    +    Y.YUIDoc = function (config) {
    +        /**
    +         * Holds the number of files that we are processing.
    +         * @property filecount
    +         * @type Boolean
    +         * @private
    +         */
    +        this.filecount = 0;
    +        /**
    +         * Hash map of dirnames to selleck config options.
    +         * @property selleck
    +         * @type Object
    +         * @private
    +         */
    +        this.selleck = {};
    +        /**
    +         * Holder for the list of files we are processing.
    +         * @property filemap
    +         * @type Object
    +         * @private
    +         */
    +        this.filemap = {};
    +        /**
    +         * Holder for the list of directories we are processing.
    +         * @property dirmap
    +         * @type Object
    +         * @private
    +         */
    +        this.dirmap = {};
    +
    +        /**
    +         * Internal holder for configuration options.
    +         * @property options
    +         * @type Object
    +         * @private
    +         */
    +        this.options = Y.merge(OPTIONS, config);
    +
    +        if (this.options.quiet) {
    +            Y.applyConfig({
    +                debug: false
    +            });
    +        }
    +
    +    };
    +
    +    Y.YUIDoc.prototype = {
    +        /**
    +         * Always exclude these directories
    +         * @method _setDefaultExcludes
    +         * @private
    +         */
    +        _setDefaultExcludes: function () {
    +            //These should always be excluded
    +            var excludes = '.DS_Store,.svn,CVS,.git,build_rollup_tmp,build_tmp,node_modules'.split(','),
    +                self = this;
    +
    +            excludes.forEach(function (item) {
    +                self.options.excludes[item] = true;
    +            });
    +        },
    +
    +        /**
    +         * Does post process on self.options.
    +         * @method _processConfig
    +         * @private
    +         */
    +        _processConfig: function () {
    +            this.options.extensions = Y.Array.hash(this.options.extension.split(','));
    +            this.options.excludes = Y.Array.hash(this.options.exclude.split(','));
    +            this._setDefaultExcludes();
    +        },
    +
    +        /**
    +         * Walks the paths and parses the directory contents
    +         * @method walk
    +         * @private
    +         */
    +        walk: function () {
    +            Y.each(this.options.paths, function (dir) {
    +                this.parsedir(dir);
    +            }, this);
    +        },
    +
    +        /**
    +         * Walks the passed directory and grabs all the files recursively.
    +         * @method parsedir
    +         * @param {String} dir The directory to parse the contents of.
    +         * @private
    +         */
    +        parsedir: function (dir) {
    +            if (!Y.Files.isDirectory(dir)) {
    +                throw ('Can not find directory: ' + dir);
    +            }
    +
    +            var allfiles = fs.readdirSync(dir),
    +                stats,
    +                files = [],
    +                fullpath, self = this;
    +
    +            if (dir in self.options.excludes) {
    +                return;
    +            }
    +
    +            allfiles = allfiles.sort();
    +
    +            Y.each(allfiles, function (filename) {
    +                if (!(filename in self.options.excludes)) {
    +                    fullpath = path.join(dir, filename);
    +
    +                    stats = fs.statSync(fullpath);
    +
    +                    if (stats.isDirectory() && !self.options.norecurse) {
    +                        self.parsedir(fullpath);
    +                    } else {
    +                        files.push(filename);
    +                    }
    +                }
    +            });
    +
    +            if (!(dir in self.options.excludes)) {
    +                this.parsefiles(dir, files);
    +            }
    +        },
    +
    +        /**
    +         * Gathers all the file data and populates the filemap and dirmap hashes.
    +         * @method parsefiles
    +         * @param {String} dir The directory to start from.
    +         * @param {Array} files List of files to parse.
    +         * @private
    +         */
    +        parsefiles: function (dir, files) {
    +            var self = this;
    +            files = files.sort();
    +
    +            Y.each(files, function (filename) {
    +                var ext = path.extname(filename),
    +                    text,
    +                    fullpath;
    +
    +                if (ext) {
    +                    if (ext in self.options.extensions) {
    +                        fullpath = path.join(dir, filename);
    +
    +                        if (Y.Files.exists(fullpath)) {
    +                            self.filecount++;
    +                            text = fs.readFileSync(fullpath, Y.charset);
    +
    +                            self.filemap[fullpath] = text.replace(/\r?\n|\r/g, '\n');
    +                            self.dirmap[fullpath] = dir;
    +                            self.getSelleck(fullpath);
    +
    +                        } else {
    +                            Y.log('File skipped: ' + fullpath, 'warn', 'yuidoc');
    +                        }
    +                    }
    +                }
    +            });
    +        },
    +
    +        getSelleck: function (fullpath) {
    +            var self = this,
    +                base,
    +                comp,
    +                json;
    +
    +            if (self.options.selleck) {
    +                base = path.dirname(fullpath);
    +                comp = path.join(base, '../', 'docs', 'component.json');
    +                //Y.log('Checking for Selleck data: ' + comp, 'info', 'yuidoc');
    +                if (Y.Files.exists(comp)) {
    +                    try {
    +                        json = JSON.parse(fs.readFileSync(comp, 'utf8'));
    +                        delete json.examples; //Remove the selleck example data, we only want the comp info
    +                        self.selleck[fullpath] = json;
    +                    } catch (e) {
    +                        Y.log('JSON parse failed on Selleck component.json file: ' + comp, 'error', 'yuidoc');
    +                    }
    +                }
    +            }
    +        },
    +
    +        /**
    +         * Applies preprocessors to the data tree.
    +         * This function first clones the data and operates on the clone.
    +         * @method runPreprocessors
    +         * @private
    +         * @return {Object} The mutated data
    +         */
    +        runPreprocessors: function (data) {
    +            var self = this,
    +                preprocessors,
    +                preprocessorsRelativeTo;
    +
    +            // We will try to load the preprocessors as npm modules, but we will also
    +            // search for them relative to the process working directory.
    +            // The latter is consistent with how other paths are treated by yuidoc,
    +            // such as the config options 'paths' and 'outdir'.
    +            preprocessorsRelativeTo = process.cwd();
    +
    +            if (self.options.preprocessor) {
    +                data = JSON.parse(JSON.stringify(data));
    +
    +                preprocessors = [].concat(self.options.preprocessor);
    +
    +                preprocessors.forEach(function (preprocessor) {
    +                    var preprocessorModule;
    +
    +                    try {
    +                        preprocessorModule = require(preprocessor);
    +                    } catch (e) {
    +                        preprocessorModule = require(path.resolve(preprocessorsRelativeTo, preprocessor));
    +                    }
    +
    +                    preprocessorModule(data, self.options);
    +                });
    +            }
    +
    +            return data;
    +        },
    +
    +        /**
    +         * Writes the parser JSON data to disk.
    +         * Applies preprocessors, if any.
    +         * @method writeJSON
    +         * @param {Object} parser The DocParser instance to use
    +         * @private
    +         * @return {Object} The JSON data returned from the DocParser
    +         */
    +        writeJSON: function (parser) {
    +            var self = this,
    +                data,
    +                file,
    +                out;
    +
    +            data = parser.data;
    +
    +            data.warnings = parser.warnings;
    +
    +            data = this.runPreprocessors(data);
    +
    +            if (self.selleck && self.options.selleck && data.files && data.modules) {
    +                Object.keys(self.selleck).forEach(function (selleckFile) {
    +                    Object.keys(data.files).forEach(function (f) {
    +                        if (selleckFile === f) {
    +                            var mods = data.files[f].modules;
    +                            if (mods) {
    +                                Object.keys(mods).forEach(function (mod) {
    +                                    if (data.modules[mod]) {
    +                                        if (!data.modules[mod].extra) {
    +                                            data.modules[mod].extra = {};
    +                                        }
    +                                        data.modules[mod].extra.selleck = self.selleck[selleckFile];
    +                                    }
    +                                });
    +                            }
    +                        }
    +                    });
    +                });
    +            }
    +
    +            if (self.options.project) {
    +                data.project = self.options.project;
    +            }
    +
    +            if (self.options.writeJSON) {
    +                // Y.log(Y.JSON.stringify(parser.data, null, 4));
    +                file = path.join(self.options.outdir, 'data.json');
    +
    +                if (Y.Files.exists(self.options.outdir) && !self.options.nodeleteout) {
    +                    Y.log('Found out dir, deleting: ' + self.options.outdir, 'warn', 'yuidoc');
    +                    rimraf.sync(self.options.outdir);
    +                }
    +
    +                if (!Y.Files.exists(self.options.outdir)) {
    +                    Y.log('Making out dir: ' + self.options.outdir, 'info', 'yuidoc');
    +                    try {
    +                        fs.mkdirSync(self.options.outdir, '0777');
    +                    } catch (e) {
    +                        Y.log('Outdir creation failed', 'warn', 'yuidoc');
    +                    }
    +                }
    +
    +                out = fs.createWriteStream(file, {
    +                    flags: 'w',
    +                    encoding: Y.charset,
    +                    mode: '0644'
    +                });
    +                out.write(JSON.stringify(data, null, 4));
    +                out.end();
    +            }
    +
    +            return data;
    +        },
    +
    +        lint: function (warnings) {
    +            var code = 0,
    +                count = 0;
    +
    +            if (warnings && warnings.length) {
    +                code = 1;
    +                console.log('YUIDoc found', warnings.length, 'lint errors in your docs');
    +                warnings.forEach(function (item) {
    +                    count++;
    +                    console.log('#' + count, item.message, item.line + '\n');
    +                });
    +                process.exit(code);
    +            }
    +        },
    +
    +        /**
    +         * Process the config, walk the file tree and write out the JSON data.
    +         * @method run
    +         * @return {Object} The JSON data returned from the DocParser
    +         */
    +        run: function () {
    +            /**
    +             * Timestamp holder so we know when YUIDoc started the parse process.
    +             * @property starttime
    +             * @type Timestamp
    +             */
    +            Y.log('YUIDoc Starting from: ' + this.options.paths.join(','), 'info', 'yuidoc');
    +            this.starttime = new Date().getTime();
    +
    +            this._processConfig();
    +            this.walk();
    +
    +            var json = this.writeJSON(new Y.DocParser({
    +                syntaxtype: this.options.syntaxtype,
    +                filemap: this.filemap,
    +                dirmap: this.dirmap
    +            }).parse());
    +
    +            if (this.options.lint) {
    +                this.lint(json.warnings);
    +                return null;
    +            }
    +
    +            /**
    +             * Timestamp holder so we know when YUIDoc has finished the parse process.
    +             * @property endtime
    +             * @type Timestamp
    +             */
    +            this.endtime = new Date().getTime();
    +            Y.log('Parsed ' + this.filecount + ' files in ' + ((this.endtime - this.starttime) / 1000) + ' seconds', 'info', 'yuidoc');
    +
    +            return json;
    +        }
    +    };
    +
    +});
    diff --git a/output/api/api.js b/output/api/api.js
    new file mode 100644
    index 00000000..7e472516
    --- /dev/null
    +++ b/output/api/api.js
    @@ -0,0 +1,28 @@
    +YUI.add("yuidoc-meta", function(Y) {
    +   Y.YUIDoc = { meta: {
    +    "classes": [
    +        "CLI",
    +        "DocBuilder",
    +        "DocParser",
    +        "DocView",
    +        "Files",
    +        "Help",
    +        "Main",
    +        "Options",
    +        "Server",
    +        "Utils",
    +        "YUIDoc"
    +    ],
    +    "modules": [
    +        "yuidoc"
    +    ],
    +    "allModules": [
    +        {
    +            "displayName": "yuidoc",
    +            "name": "yuidoc",
    +            "description": "This is the __module__ description for the `YUIDoc` module.\n\n    var options = {\n        paths: [ './lib' ],\n        outdir: './out'\n    };\n\n    var Y = require('yuidocjs');\n    var json = (new Y.YUIDoc(options)).run();"
    +        }
    +    ],
    +    "elements": []
    +} };
    +});
    \ No newline at end of file
    diff --git a/output/api/assets/css/external-small.png b/output/api/assets/css/external-small.png
    new file mode 100644
    index 0000000000000000000000000000000000000000..759a1cdcb5b1697e5be290d98b830e279cd71f3c
    GIT binary patch
    literal 491
    zcmV<H0Tlj;P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN;
    zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzjY&j7RCwBA{Qv(y10{fofkHsB0W2_v
    zUBVFtR#sLp=H=xBVFzYr=KaWuf!;khr%J>Ds{zR1^XE?tfB*h@ASKHAa7wwn{MEbP
    z7_^nS7{V*>+A}bS;P%45fB%Ai|Neasi2rl3{=EO;!w318%8Ovl7jArHc=P5Brfr~D
    z0AYimtss2w$hlYlfd>7*aO3TNzw875LBK0xAD9Np|A(oEVYnB*eE9~V6wP%78SXuL
    z&#-X)Er#`zY#Ce<cQE|@_n*NrZu>)^8hM<t@c%yx7=Qlqo#E+=&kU8xDhyfmhZ%Ci
    zB^dtyV`g~#;=9AYe+-T|4Pa;I2jl<${xZmkvoM^x_?{uwM}|RLMTp_`2UZ3)Hogb%
    z@2x(7(}2e(%NV%1Med)x^p}B+U4TJPLyAFJUXtPFBQCJ`lT(!p@9(X`oen;~J|q6|
    z@wSPb3!@4d7=I%C`v334k56{?0OcisymvtS3)uihSYBXcWaI%-d^i%^A0P&W@^_&6
    hzgP_zx|s<ezyP)2!%xqD#*+X5002ovPDHLkV1nUx>>B_8
    
    literal 0
    HcmV?d00001
    
    diff --git a/output/api/assets/css/logo.png b/output/api/assets/css/logo.png
    new file mode 100644
    index 0000000000000000000000000000000000000000..c82444af95895d38bea6fe96cc5354a7419f770c
    GIT binary patch
    literal 7143
    zcmV<D8yMt?P)<h;3K|Lk000e1NJLTq008O$003wR0{{R3$TFO-0007@P)t-s&e7N@
    zH-gsK-M+%iNMNBuSD%THvDVn#HAarCvc0>%$*Zuu-rwWBz{*f-v)|z5tg^kZw!u0~
    zlO{BO($v~UUZfl-b-TdHt+Ku{LW;Gz#LLdsP-?Qy(b!LEv9Y$nGD3^4w7)Dldf3_D
    zJWrO?*4r&RfK6$yJ583Wu)WyY-%Vz%($w19+~LmA*u}}wPinH(*xkX!%}!~sxV^_q
    zWvjTn#y?b@($(9~(%4OAuF%ri)79J4)!T%UyUx+rOJu8sl)L}{0J*)#+1%l+v%b5(
    z$-2JCDmjHHHiIZNf+{$LyTHk>w7$2y#k#-9Co*bXWspKke-IjLOI3=tyTog8ndax{
    zfrq4ae4-vPgC91BB`tFuHGU*4aTX$Tqo}$!K#ZHAwT+d%kCd(;EO`|ra<jO@Av=s%
    zT#X$ne;+M?9xZ_$DR&tseJVte79)5XEPp6Lj^g9yt+Kr*HG-?Kyx`&Gu(rV@HH5FU
    zzalSz-rwW0x5Br(#>vdo#>&#g$k5T#*)~UzNMNGG$Iw7gk2OPn(9+pCNQ5#&jW0in
    z)z{oaS)e;kmr-i6&Cu6AQku`v*g;mFMOvZC%+$-y)y>b=P-?Qy(bvn()y&V<(bL+~
    z*4sy9r%`FK%+A(LW2@KM-r3sV)YjZXRg-CRr^Cn3%FWfv&D2I&m@7Jl*Vx`kU!g)*
    zpG8@r)79HZUZyxolQBJb%gxj~ONT>OpDsFeCOe8YNs=^0kJ8lIJ4}d3U!g`>nmJ6B
    zM`)`mIfm5N++Jv*SYn<+U!=do%sozut+B(jxy0Gq;43z8mYcpTHhw)#iiC@_qo>0{
    zR-Zgfh)PtJ+S}l{zQ`jmeR_efQE9Tcy~o<z;k>}gP*|BOIfd8Q-zz$WhK2J20000(
    zbW%=J`1|?v^!csy@b>TT^5*d9<Ll_|_Tkjm#l~gK(;MZmebTFrYn(xUmwx5Ftj*vt
    zpMNE3N<o$zTX9voJWC7{C<OqevyM>!02s4LL_t(|UewoRZyZ+?2H-YQt9;6b2BfI5
    zRW-F7#Snw6*j}%_&L5kZMP>#wGc$yl%iO=x_fm#-f~K51vOhn1&pG$*7dH;Dx*ctu
    zKYVxP`->O9Iej`9425R?`{&EEXD?j%x~93K-QLyG(|hCi>R_n7j<(h-b?3iIr4otg
    z&6~?x+kg`3^XD5+pZ<DJ%4M_J!NI{|qpha7y{oGCbEHDqSzC90X(^qK%oAu7P#2^W
    zx&i3QjQ6j?WR_S_rBW^)k2l&b6Y%Fl1+%rOdSGa13DSji9_iNB_BM&sx3WT@K)-TI
    zlEE4;6bi}4`VM>5=RkFIHdV(40HxB%Yi*=KpN~p6f?M0SU+ze#$s)4?o6B))A(>1z
    z)^v3BoMft__EIbcs5a6liPVKi0|6%8@FC%uyMt2_sf^w#uqfv_TQj&Pk?Lr@lm}Fe
    zR5PWn-Q6`VU2#DkTK**`$<!*E*lhJXozC*N&Gw!XMa6j5<@0%Mq!AwJGV0;OA8Dq5
    z2BOg|S1|O<DG92SF$`=xskN5N=juDUs!j;C8+mG=kfzh?bV>oe>GgVrbS02TkUMAd
    zH!8)+uz@uO%dJT##qOXQFWbA1o$9DP1E;xn>Eca{jj2*!G?l>h>I(fWXJk0lU{!1B
    zja3uu4y~&-?LEgyZEFHkFU4KTB8`qs3n_~f9gR?f!B;t1)>|{hw>2@xE-voWx3?S<
    zwXKdr4T~4hXmo#{OV^0h=Z!F_YjeB+D6>+p@z#m!H?bNluzh_tWP9XP2NJc4G_gOY
    zlLpooXwuk8!ADuyY|R)3wqR);Jyj3wQBqZ?dGRJ9b2_Qdo2F8>lM1pTi;@J^@N_aS
    zr?RjDJL;^lcOMn?dTm}K)h}K^_0qul(gMkvJSIY84<toaD3&c@NO`bkE7SV5!BQ*g
    zYDddaP_MV1$y-fnVt$WH#YWmi+UufyL(g(>LaJzEl}!Vy3)XLHVp4Z(?Jb8*ZH<XY
    z_0ZRVrrqwnIkAz}NT&Nk<S{JTcN|h;RfLsG-_gW=y;Wet4INd7NOjcZO_7SbG~(7u
    zcadpe3DSjm9%^X$57|Sg{BZ1BHgTmUUKChZ!>5|B9TK&>Hg6GWDv@&cyZ82VbLvIn
    zqJ5WL+nX=59*;-ya4eVdlX?65zj6};J8QG|9s;$kT0qUuqjbMXIz2$7WG6*ws6S08
    z6R?tCwYg?!u)3$yyRE<q>ue+X_+Y8sO?jhqNi5!ZK;3SgG%z=y3pF_NY;|G+R$Z`)
    z@ro^44y?6xHr!lwkW|N|%2P@x_xnLLNQYuXs$Qux_Y}{BM_?6!wI0}#abPW)_|7cR
    zUcPo<)YghqnvT#&Rp~U7`qqe)>?HM~c{K&8LXKjT${CI|3~cFrn;6((oBcqjjwZ`U
    zQ#{f=?S1MUim~>Mya{!D)q_+O?i5Erp`?pxYKm9~t$x?}iM4EAPQ%1H+|b_h$<$UA
    ziqbwBSft{X5z_q_q<kkaY0&jph7+I0C;^$lM-G&z$w^$U_z)<VsCWU;IFtHe<-uBE
    zPoa-Lg^GP-Uc7q<j7;e*Ce>xS7yBK#Yuk5w^X@9Pk(#L3zWC^&ffh-TG(nA*;;fQM
    z(!jL*C}IRvYej`ozz(D8yFQ-ksJ4tW)o+r%!0JV&hW5pzf~uIO6iiYQDI`j)Y)<(~
    z0<{1l%2{@zfBhV~$ZE6?i9$-I6-BKW+K;0`YI&DNZdH)3EeR>!N&J}~ynQ#zg@UPC
    z`8t|HVMIxyw5XGJFQd|eR48%qVuF<v_Aqsh;2UY^`WR|wrMomjf5hC^NvC<HZb-GE
    zLP|o-YSW~{$<xFi{Nvb3Y8@1Fiefhnq_7Gqx00gHe^F2}=?M8oknD$2Yb_&9^h0X8
    zWzfB9`-+`}P;;7nq)@BG788qeHA}V;3QF3(v<MYW_2<nFj(7&cN{h5^STyewa#%Ik
    zKZx4fRPlL~0zpVknL=vVNeK1PYK0*caZVPClSLXQimxNyzDd2+xx)%lbT2X`6-MjM
    z(xRz885sfeXH-Lb?|V}nbyh!OqN#pE_l_Y`GN;D&U551bcurP(S7K0E!pDlNUPw!Y
    zIC_^+{eJ#LB31SiXqj6_!@z=y6CMfEn!O|Xm*vW>e>T{A-jCX8^$v_iF{Z{jh4jS`
    zPha=U4~Bw|SGiLv6&_>?lEj8}ir%Jt9~J$56LMb;g{?cBk-~mDs6g^5{hxBPe~Rk7
    z;&^`OOn-4EGky7~W5${2q?6hvX~t<ZM*BjI3mF&{(3LbInt+R0UUqPYaz)riSmoAI
    zENoXm$=%f@;ilb!sheyf4Ui3cjY8uUhr1R3m7eE3uY2!qY7aZ>O!&o5zUSrpoaYe}
    zH@l$4M{SdOB~2f-tt3G;l~N^?6%Y=IO^Q1%kGiAOPUW&f`d+c`z3>eqWj0@k+KpR6
    zjPb&OiyyAWNH>DdP11;NqM}n%k;19F#~(%s>PW;tH~26bRjZU0>4NT`yL)5GAjzvW
    z4c=Wk@8~9jP0(shprAZ7>!rQrQ8}qsQb~H1glozmsSs6;)QiniB6({&I$J(jAD4?l
    z2z0ygse{Lkp6>X15{lID9|{E8PZ&swtlT%GoqF=C8x;%5q_cde{dD^h5~8B`0aC+O
    zVKr?N!j?zfQBKnNOQcNyC9?Onht$=Rd>|^Do$<!E+uGV%zK)Or9R*D#>ty3Q-QC?C
    zi+X%G(sw7&(-T}ulW9tRq(Rbez6rky9G^Clx_01LPfx3_;BZnK!=jaHA*-z+?DMaD
    z3+k@YYce36=dJhZ=kF0x+Iv3+H;88*uTL6Uj`0&|wCQ(kZJjMAveVO0o*2{yPQ~<-
    z6g4>#&*t7b4XFRgLgKQ>vM^HcD?sftAb(G_18P^V!wc2ofn_Q~16V$Kyr{dpvy|rU
    z?EIIgDQ2%qdK*a<pM<2a<Mu5wQQ;FIsBM6XEtj9vhKaQ|Ici*>rn8E*he)Q=#`!l9
    z^_)Ph?A4T}RK%(k#jCqZq9UogN>L`EDFh|Gj-($lQiiIG)Gt=!tTF+WtBMYAY+Tux
    z8A8>OG*=Z+BSpv4Nr4JehM_*tkP=LiVUv!8V@4HJAa8%ci@M8Ir6?&*4j>iIK_$J8
    zq>9bwKIvlB66v>n)c0jkRgQ{h?{OEZ9*HIeDvZ*sWQ9m@RLeBO5|y@In>JqyO4P<O
    zWj{z8*23Yid-6Q>aw*e*gJYh9LdbcFn*P<@lW6)5&8$Ynp7%<cshTF1emDjp9AF95
    zbQ%cdF{VgWOP8o1DY_&Z{v?VjngS!2HH@^+?kz%nM&_>4c;{z71yY78NkP*=(6ns&
    zUOzX6h6tVRBvUm_4{73t5xy*r8jUP)RHT&07zh<rNnp!jjTiG*f^t<kE5xRqD(Wt#
    zkF-a4*Z=A4)zX>{U}d{({w4Y-tJ|NQCRT{{p-HCd<ams&Qs^=TJ`O`QLDdvRO{%OI
    zy45cdSVcvLMA{Jq2L)n@slvhuPuA*-{H`BTQNAYo<Z9{O``I-vs@LYv4CUjaVycWM
    znX1Vc1i_SN7n`HP@D!+G(*Pd~o1sou7)DX8T3DqOe3oiL&?4S2jct1b>YiuZRZ5ca
    zOHc3RTTm3$WAjne#Vkk)m~^x(FjaM`D2OS-DuJ3rL9zAH1=51WQEdekx-a%#?i&!(
    z!x`qPqOfAv{8E*ak^UJqg^-%!4*xcgN}r_Kd~grG)ifKPxEIrzs=Byk!ywkLl&T9{
    zO>qhrsE#R7*(|M~omU9!l~YFO**(HS5K<;7O~p&h_qyikAQUQu*XE;7^4*WcrZ9#v
    zbgpV#va-8kUaLl0LB-TXLDAB0m=aa08b(sgUJ+bX4vHVaNm!rX&5hw!F-xIJfplKh
    zshYim-(17=_1b(CwdaHm76AiW5LeX{c}pxViL5}KOq=H=Duxb%nufli8%|#dRGT$l
    z-gP1HTbVQ}Xb3(eUfK(&$XfK~a~7wJSJRJGQg=@p>K+&y5gP@l%(%f+HE7Z@e@lJ@
    zs<kj_a8#X8k{T5oL5@1*BoZNtx-X27LQVWqIX$dAp56_p$cl}Z{+%xtpHGqWE9gjr
    zS0$;}=Fjx37<{16Z5X1q5!46<1%;5PiKIX^P09#z>TDk<P@zBts%1%5<doSPE}6lC
    zl^@Nwa7kx|MDvv$2}y4g($Y2`P^*UaW#j5ViCT?JRov<Vr1bKdP&H}vQ&a+qq~^v3
    zv-FxsVA~d`3a4rYrI`3F3zcSYSbO?4v2gh@dzt<CvdCUeI)J1Dl9Zy#^hHq@b<|Qu
    zqLHea;E-}H#!+oOnP8|JCfnJ|aLS^plxo^?T1g6+0Pon_H$$xoRwR8i@2*oudf}Q&
    zRQc+Gi2Ar^)c{aDT}SB_EWuQ@DWHtWWGU2*jRo8Va?pgOjfw=8sGL)L98Zy|9SJbO
    zGg~{c14~xW=FyOvz3StY_pnesK8dC8OxM6vM9dRh;!fD8Do4#K20@@YrfzXm10mH=
    zP%RZzX01CUDC((ccETW+b}zVB-di3&s=Vy!y+}GoOnw=kgrc@SbRy9SQj-&WuW55t
    zxtI*JG-`rxjVut9gq@J6j>Aw33{}E9{1_wtfWWM^4O7R0KnH=SGPZtyR+6fkvh@9v
    zdmSo7^;P9{at51F?#`I1D-I9}W4nOgVU7v~dGiiIy}w~`Qb;&@bkTBewGz}}f!b9F
    z31=k3U8BICFq8Zq>$|U%zOyMcPl0sq^Kb7-k9(GKujl%wN7RzEmr>Ol4zql8W}+1e
    z`P(_Fm7NO!#898Z_hSjZAqzDg>cRgDDk_C@JkDOjE`*SH@4=r=;F;Bf3eLX_sqDVq
    zk$MqGtJYTD$mjEQy@g!gm3TG@UY(eO!Opg}%;jMNoB=olyg>sW1l6M*>_AkFRAg-s
    zfC8%_;(>^sfJzLJQ*qdjsEYvL9G0k#G(~DF(wq%FiK`6d()sz<%3M#qSUP*>2H!{2
    zayEZvf7kKfR_E)g>)<P2y}mD(IyXF#HjUaAkTtWa5hYC%zj2^wy^z0%3I!UfKSqJX
    zwiB(q?P%6qkf5Fj6`{&d@>QSAM#v?I>kZpBDybKBhllhtLOOWsc6m{ew5oNHh+3To
    zSO`Mg`=F4E)i;m~{s_y^gy5Hj;REdq)dI`cNKjjQdP6o12dzAax{SZ@A)W^n2(c#h
    z^hBI^v=P@EHeeN!dT-)>=$WVVA6Hxu-B<P`Bo(5rovg`2)G^pz8il4VK<#W<nH<R`
    zO%ofdVI_<Zii)V@(3zYIU`Zx4+fgDMs%<BtE;*VT)d3lk*=RgQHm$?up2TeDl6p~}
    zbIsFxkiGam{U7f1mHQ+l^>z6g*Yg<Fy?{zs*L&C3fAa=pa3{n{uBMR7rTY7B#-iD@
    z6NO5ps5m+f`$0Wmx}hnqPYWNeKSV?gtR9xAzFs35AC8TWP2)of<z1JTb?3KSI=VU%
    zXo{q_zCu#ZK1ueZ%GP_x$%W;*uIG+45Y$Y|N`G!&O-;>%*K79W`pzC~&oI<vBm$f5
    zzPqQ9btxHgY!Zot6?T9WMIDI@$EL>86m>ZU_j;pO%DpC*tgp&PwO-VhOVufm&b_bt
    zB(|_n(znXj^{yXEwVA<!u62yH=ImEg*36AFg;WZJP4zdQyww4u4Fq-Rd?5!h<_8Rj
    z_WP^3*ciNJ8XrkD9i*hkmp{OJ={U6z%flt#u#LE06aNfnX<5`?J?HVgBzy08dXgu7
    z*D4#U^MbW5FO#@%X0QcO8#+JqH#Igk9XW8fqX9KV)c#zKz@};`YoPUB{mI5NXHM47
    z9Sh=rc(lr1|Bo=#nEUyEi6s7k=K|f^fxn|n8Af_*kbru&`O@ZBb#=X6Ti4tSq#U+a
    zG^h1k(_>)8ByQ;5zrVZVXhSBG>COmLj8ydn07153aBc1F_Vxgx2P^qQaiMCg?|=S7
    ztnHhh;MvD7e)5r<l!@wHhsyL_3;Ju$o+YGpjI~;J;#|`JVa;@ASRm-pFDUAHs%oyk
    z`cx3=l}0OmWA?6I>35@+e>qKApW69^@0Pam$Do{)iR#^)F-Pd@>RMZCsyhp;AT0d2
    zI&pRG_lp^Tm9zlb{m|dRP&sSLUm4_#T;TipG4WI;UdvI-{Tmi!jc?oh#IMnId`~4U
    z64m{XkXP!v_nLuJ)fGJ=@5D8Qrlrn?7S7plwEO;vsUz>Owp3uOxev}PRs}h2Yakey
    zT}hq8=X=OXYxPlnTzO6GW&P3a|Lcw67F=yJ(mSI4N}Df5{Vy$N|Jqg+#&Q1v{b3+O
    zeEFeBDNN?uHf`rd>m|8U@7g$<u%=?l(ik(B(MT-UKw3kQvW>m@j{czj(qk1A6|@RE
    zBywpmBOOCaxQPFX&pCPS{oWi-2s7z(lRx0Y_xn8go|AJfiAtI-r7XAFDe74W8>R{0
    z-`V)>;%oC%TbHhHG<{KHRN?y}tav-Wd;1@PJb(V|n``x~_hC)oF!8&mUpjYosZNmc
    zW4`Ke*Z9;Oo*bPV2{lbzfT&1>5mBEf)Z${&W!AisHP6XuC17nkp1s}7wp!Wdc3gOl
    z6G0`;5O(vO#!j}i+iGt6tD7~!C#ShxQ<uK3+nc5fb}TH$QD0Ql=zXkdf);Oj%*RY3
    z`%2RFSheaBELgdsG0}27Res#I?RZpGPvLS2I^eWPJVJN`3RXh>$X_AMp7(X`KlXnQ
    zw2vs#btS4P=3^#h>XrnRPZiS%X@X-Sl_hJ&rV=44vqoUmmmZz9wn~z!3P~X>nzRq9
    zQQ46{6AAUNu@>`T-xs8PbIQNO3KKWNS_$I>6~q3eqq2$pkX2}~7*6!yNIZUZ5RUE;
    z6|jlk|1h$B$-g%jh*H4@tdJEZW@RNRu>zH4?ZZm6I7Q96qGQL84}N><VTfwldXV<b
    zWo8={*QJlDU=Sxm+G&HXKy?%=Ow0vXW`(dYF^?yl?-&I2fN3{BI+G;oT(Tlr(XZUF
    zNo3+~U8%&JLfsIK!=zwkNKIFRi4`bL?F@walyU3fXXGT=sl~;7g~|;J!%2^c(`_lN
    zLRH%krCs4LD}*)bsta5Dpfidwb_YbAFsxD$^QEY{+|v58TT$ggS41bIiKwtM)(>ey
    zO*cJ9md=WH)mbGcI`$w|FoU8#)+^@2zQs%-S>fV_4QN%nM%OxM*iNgaFK+vBuzH%X
    zqEEvfd>qqgP}C{9q}#{7gnF7$(Xaul!i0%2iM{eG=}xQ4IH6bp3)ZNvfMwRBhoI=-
    zsFMc!-oQ_)A}!|5kbh$g8>os%3=?A#&-k+?DeCV#z8$c_#JydNI8i%#Xt?)R4@X6%
    z>8r(jHIp(IVkcwF3KJtbMe=`=8`iT6uWl((J<A3w!bFeR1XfJlp&5AM0Yf6>1v!hF
    zDKug+2^#C}S5tIKQnh_=;gljhccbB0V1=&CtHXx6V(JbB6|h0f|Hd?v2z9PemaL(&
    zkk!?rQ`>Xm)iW=?T-s9hZF(G?h!wEivq^xJm3;)(9S$mBpL|G<`C(2f%35^G%qk1C
    z$ce$SZe}4>m|g$7)Y)-)tK}gQ_ZOCNk371U?}a!%aR8?tBBJJ$s5h5SmL;o#g|1zb
    zxS?3v3qO_Q+B_tkUNN(R)YpVP^5CAo?c?y+y?V@NQ8TmEvMR}{>8h=DoI(kkOKVvo
    z<>;h0tS+nQeD{w7boi*KsmZZ@TFmdDrt)QGWo5ytt#zzZ^WiR9z2PG|X~G&kd^g_r
    zv3IC2^61#U?&+(hQgyi;TV_@Q)nNl+N!1i}>HK^;z4b@aw|M`*4=dB|KlWcWXS32U
    z5C?I=Q(J@tp^bqOQ$)zA5JE(hN-FCIXuw0jn<7Y0UL-C>&<F75bNB|HMa)6zMMe5D
    z?v~VX{Wo}PwwovTF_~qCh3QOtS}IyyUJ^#dog}hSpG#2A0E_6P+{6hxy1RV5fBGEk
    z93%-Iu_pY)fE8yx+$?DuZB5`V=Az21bjZa?VOR!T{}lE(=7X1PIQ){)DM8mkVW+|l
    zH|*(-5Yc~mrBxq^`g)pjd6@jhy0XdnzbErjrgYeU3=4;rgbI0E^*1T1qAOr&Chld0
    zU5Bz(!ywXWbJUZlL{~<_L~+--rG^!-g0rL9ylTjCsA1_vJQ7vuI@GY+4RC6N>g1Tz
    zu*D^ozUx3(iMgfcXs!iN)vyqj8Wz1yUQTdq)v<kj_kmq-LfC@*kFJya{KfJ3CSGvt
    zc1P=d;2J0kh3!MwT-V<ZJ4xJgL)(wEUw!seP-<9|9nhk%Hykg3n0ljjea|AgG7e!2
    zx{hgu0&;8CX3Lv_=NJksOG$LfRW)5lGB%?bUTF6N+Y2qrHEOjA44YO=(=c4u5`cEl
    dE_aK*`wbys)<9*L9Wej^002ovPDHLkV1mbb3%&pV
    
    literal 0
    HcmV?d00001
    
    diff --git a/output/api/assets/css/main.css b/output/api/assets/css/main.css
    new file mode 100644
    index 00000000..cdfe209e
    --- /dev/null
    +++ b/output/api/assets/css/main.css
    @@ -0,0 +1,783 @@
    +/*
    +Font sizes for all selectors other than the body are given in percentages,
    +with 100% equal to 13px. To calculate a font size percentage, multiply the
    +desired size in pixels by 7.6923076923.
    +
    +Here's a quick lookup table:
    +
    +10px - 76.923%
    +11px - 84.615%
    +12px - 92.308%
    +13px - 100%
    +14px - 107.692%
    +15px - 115.385%
    +16px - 123.077%
    +17px - 130.769%
    +18px - 138.462%
    +19px - 146.154%
    +20px - 153.846%
    +*/
    +
    +html {
    +    background: #fff;
    +    color: #333;
    +    overflow-y: scroll;
    +}
    +
    +body {
    +    /*font: 13px/1.4 'Lucida Grande', 'Lucida Sans Unicode', 'DejaVu Sans', 'Bitstream Vera Sans', 'Helvetica', 'Arial', sans-serif;*/
    +    font: 13px/1.4 'Helvetica', 'Arial', sans-serif;
    +    margin: 0;
    +    padding: 0;
    +}
    +
    +/* -- Links ----------------------------------------------------------------- */
    +a {
    +    color: #356de4;
    +    text-decoration: none;
    +}
    +
    +.hidden {
    +    display: none;
    +}
    +
    +a:hover { text-decoration: underline; }
    +
    +/* "Jump to Table of Contents" link is shown to assistive tools, but hidden from
    +   sight until it's focused. */
    +.jump {
    +    position: absolute;
    +    padding: 3px 6px;
    +    left: -99999px;
    +    top: 0;
    +}
    +
    +.jump:focus { left: 40%; }
    +
    +/* -- Paragraphs ------------------------------------------------------------ */
    +p { margin: 1.3em 0; }
    +dd p, td p { margin-bottom: 0; }
    +dd p:first-child, td p:first-child { margin-top: 0; }
    +
    +/* -- Headings -------------------------------------------------------------- */
    +h1, h2, h3, h4, h5, h6 {
    +    color: #D98527;/*was #f80*/
    +    font-family: 'Trebuchet MS', sans-serif;
    +    font-weight: bold;
    +    line-height: 1.1;
    +    margin: 1.1em 0 0.5em;
    +}
    +
    +h1 {
    +    font-size: 184.6%;
    +    color: #30418C;
    +    margin: 0.75em 0 0.5em;
    +}
    +
    +h2 {
    +    font-size: 153.846%;
    +    color: #E48A2B;
    +}
    +
    +h3 { font-size: 138.462%; }
    +
    +h4 {
    +    border-bottom: 1px solid #DBDFEA;
    +    color: #E48A2B;
    +    font-size: 115.385%;
    +    font-weight: normal;
    +    padding-bottom: 2px;
    +}
    +
    +h5, h6 { font-size: 107.692%; }
    +
    +/* -- Code and examples ----------------------------------------------------- */
    +code, kbd, pre, samp {
    +    font-family: Menlo, Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;
    +    font-size: 92.308%;
    +    line-height: 1.35;
    +}
    +
    +p code, p kbd, p samp, li code {
    +    background: #FCFBFA;
    +    border: 1px solid #EFEEED;
    +    padding: 0 3px;
    +}
    +
    +a code, a kbd, a samp,
    +pre code, pre kbd, pre samp,
    +table code, table kbd, table samp,
    +.intro code, .intro kbd, .intro samp,
    +.toc code, .toc kbd, .toc samp {
    +    background: none;
    +    border: none;
    +    padding: 0;
    +}
    +
    +pre.code, pre.terminal, pre.cmd {
    +    overflow-x: auto;
    +    *overflow-x: scroll;
    +    padding: 0.3em 0.6em;
    +}
    +
    +pre.code {
    +    background: #FCFBFA;
    +    border: 1px solid #EFEEED;
    +    border-left-width: 5px;
    +}
    +
    +pre.terminal, pre.cmd {
    +    background: #F0EFFC;
    +    border: 1px solid #D0CBFB;
    +    border-left: 5px solid #D0CBFB;
    +}
    +
    +/* Don't reduce the font size of <code>/<kbd>/<samp> elements inside <pre>
    +   blocks. */
    +pre code, pre kbd, pre samp { font-size: 100%; }
    +
    +/* Used to denote text that shouldn't be selectable, such as line numbers or
    +   shell prompts. Guess which browser this doesn't work in. */
    +.noselect {
    +    -moz-user-select: -moz-none;
    +    -khtml-user-select: none;
    +    -webkit-user-select: none;
    +    -o-user-select: none;
    +    user-select: none;
    +}
    +
    +/* -- Lists ----------------------------------------------------------------- */
    +dd { margin: 0.2em 0 0.7em 1em; }
    +dl { margin: 1em 0; }
    +dt { font-weight: bold; }
    +
    +/* -- Tables ---------------------------------------------------------------- */
    +caption, th { text-align: left; }
    +
    +table {
    +    border-collapse: collapse;
    +    width: 100%;
    +}
    +
    +td, th {
    +    border: 1px solid #fff;
    +    padding: 5px 12px;
    +    vertical-align: top;
    +}
    +
    +td { background: #E6E9F5; }
    +td dl { margin: 0; }
    +td dl dl { margin: 1em 0; }
    +td pre:first-child { margin-top: 0; }
    +
    +th {
    +    background: #D2D7E6;/*#97A0BF*/
    +    border-bottom: none;
    +    border-top: none;
    +    color: #000;/*#FFF1D5*/
    +    font-family: 'Trebuchet MS', sans-serif;
    +    font-weight: bold;
    +    line-height: 1.3;
    +    white-space: nowrap;
    +}
    +
    +
    +/* -- Layout and Content ---------------------------------------------------- */
    +#doc {
    +    margin: auto;
    +    min-width: 1024px;
    +}
    +
    +.content { padding: 0 20px 0 25px; }
    +
    +.sidebar {
    +    padding: 0 15px 0 10px;
    +}
    +#bd {
    +    padding: 7px 0 130px;
    +    position: relative;
    +    width: 99%;
    +}
    +
    +/* -- Table of Contents ----------------------------------------------------- */
    +
    +/* The #toc id refers to the single global table of contents, while the .toc
    +   class refers to generic TOC lists that could be used throughout the page. */
    +
    +.toc code, .toc kbd, .toc samp { font-size: 100%; }
    +.toc li { font-weight: bold; }
    +.toc li li { font-weight: normal; }
    +
    +/* -- Intro and Example Boxes ----------------------------------------------- */
    +/*
    +.intro, .example { margin-bottom: 2em; }
    +.example {
    +    -moz-border-radius: 4px;
    +    -webkit-border-radius: 4px;
    +    border-radius: 4px;
    +    -moz-box-shadow: 0 0 5px #bfbfbf;
    +    -webkit-box-shadow: 0 0 5px #bfbfbf;
    +    box-shadow: 0 0 5px #bfbfbf;
    +    padding: 1em;
    +}
    +.intro {
    +    background: none repeat scroll 0 0 #F0F1F8; border: 1px solid #D4D8EB; padding: 0 1em;
    +}
    +*/
    +
    +/* -- Other Styles ---------------------------------------------------------- */
    +
    +/* These are probably YUI-specific, and should be moved out of Selleck's default
    +   theme. */
    +
    +.button {
    +    border: 1px solid #dadada;
    +    -moz-border-radius: 3px;
    +    -webkit-border-radius: 3px;
    +    border-radius: 3px;
    +    color: #444;
    +    display: inline-block;
    +    font-family: Helvetica, Arial, sans-serif;
    +    font-size: 92.308%;
    +    font-weight: bold;
    +    padding: 4px 13px 3px;
    +    -moz-text-shadow: 1px 1px 0 #fff;
    +    -webkit-text-shadow: 1px 1px 0 #fff;
    +    text-shadow: 1px 1px 0 #fff;
    +    white-space: nowrap;
    +
    +    background: #EFEFEF; /* old browsers */
    +    background: -moz-linear-gradient(top, #f5f5f5 0%, #efefef 50%, #e5e5e5 51%, #dfdfdf 100%); /* firefox */
    +    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(50%,#efefef), color-stop(51%,#e5e5e5), color-stop(100%,#dfdfdf)); /* webkit */
    +    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#dfdfdf',GradientType=0 ); /* ie */
    +}
    +
    +.button:hover {
    +    border-color: #466899;
    +    color: #fff;
    +    text-decoration: none;
    +    -moz-text-shadow: 1px 1px 0 #222;
    +    -webkit-text-shadow: 1px 1px 0 #222;
    +    text-shadow: 1px 1px 0 #222;
    +
    +    background: #6396D8; /* old browsers */
    +    background: -moz-linear-gradient(top, #6396D8 0%, #5A83BC 50%, #547AB7 51%, #466899 100%); /* firefox */
    +    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#6396D8), color-stop(50%,#5A83BC), color-stop(51%,#547AB7), color-stop(100%,#466899)); /* webkit */
    +    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6396D8', endColorstr='#466899',GradientType=0 ); /* ie */
    +}
    +
    +.newwindow { text-align: center; }
    +
    +.header .version em {
    +    display: block;
    +    text-align: right;
    +}
    +
    +
    +#classdocs .item {
    +    border-bottom: 1px solid #466899;
    +    margin: 1em 0;
    +    padding: 1.5em;
    +}
    +
    +#classdocs .item .params p,
    +    #classdocs .item .returns p,{
    +    display: inline;
    +}
    +
    +#classdocs .item em code, #classdocs .item em.comment {
    +    color: green;
    +}
    +
    +#classdocs .item em.comment a {
    +    color: green;
    +    text-decoration: underline;
    +}
    +
    +#classdocs .foundat {
    +    font-size: 11px;
    +    font-style: normal;
    +}
    +
    +.attrs .emits {
    +    margin-left: 2em;
    +    padding: .5em;
    +    border-left: 1px dashed #ccc;
    +}
    +
    +abbr {
    +    border-bottom: 1px dashed #ccc;
    +    font-size: 80%;
    +    cursor: help;
    +}
    +
    +.prettyprint li.L0, 
    +.prettyprint li.L1, 
    +.prettyprint li.L2, 
    +.prettyprint li.L3, 
    +.prettyprint li.L5, 
    +.prettyprint li.L6, 
    +.prettyprint li.L7, 
    +.prettyprint li.L8 {
    +    list-style: decimal;
    +}
    +
    +ul li p {
    +    margin-top: 0;
    +}
    +
    +.method .name {
    +    font-size: 110%;
    +}
    +
    +.apidocs .methods .extends .method,
    +.apidocs .properties .extends .property,
    +.apidocs .attrs .extends .attr,
    +.apidocs .events .extends .event {
    +    font-weight: bold;
    +}
    +
    +.apidocs .methods .extends .inherited,
    +.apidocs .properties .extends .inherited,
    +.apidocs .attrs .extends .inherited,
    +.apidocs .events .extends .inherited {
    +    font-weight: normal;
    +}
    +
    +#hd {
    +    background: whiteSmoke;
    +    background: -moz-linear-gradient(top,#DCDBD9 0,#F6F5F3 100%);
    +    background: -webkit-gradient(linear,left top,left bottom,color-stop(0%,#DCDBD9),color-stop(100%,#F6F5F3));
    +    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dcdbd9',endColorstr='#F6F5F3',GradientType=0);
    +    border-bottom: 1px solid #DFDFDF;
    +    padding: 0 15px 1px 20px;
    +    margin-bottom: 15px;
    +}
    +
    +#hd img {
    +    margin-right: 10px;
    +    vertical-align: middle;
    +}
    +
    +
    +/* -- API Docs CSS ---------------------------------------------------------- */
    +
    +/*
    +This file is organized so that more generic styles are nearer the top, and more
    +specific styles are nearer the bottom of the file. This allows us to take full
    +advantage of the cascade to avoid redundant style rules. Please respect this
    +convention when making changes.
    +*/
    +
    +/* -- Generic TabView styles ------------------------------------------------ */
    +
    +/*
    +These styles apply to all API doc tabviews. To change styles only for a
    +specific tabview, see the other sections below.
    +*/
    +
    +.yui3-js-enabled .apidocs .tabview {
    +    visibility: hidden; /* Hide until the TabView finishes rendering. */
    +    _visibility: visible;
    +}
    +
    +.apidocs .tabview.yui3-tabview-content { visibility: visible; }
    +.apidocs .tabview .yui3-tabview-panel { background: #fff; }
    +
    +/* -- Generic Content Styles ------------------------------------------------ */
    +
    +/* Headings */
    +h2, h3, h4, h5, h6 {
    +    border: none;
    +    color: #30418C;
    +    font-weight: bold;
    +    text-decoration: none;
    +}
    +
    +.link-docs {
    +    float: right;
    +    font-size: 15px;
    +    margin: 4px 4px 6px;
    +    padding: 6px 30px 5px;
    +}
    +
    +.apidocs { zoom: 1; }
    +
    +/* Generic box styles. */
    +.apidocs .box {
    +    border: 1px solid;
    +    border-radius: 3px;
    +    margin: 1em 0;
    +    padding: 0 1em;
    +}
    +
    +/* A flag is a compact, capsule-like indicator of some kind. It's used to
    +   indicate private and protected items, item return types, etc. in an
    +   attractive and unobtrusive way. */
    +.apidocs .flag {
    +    background: #bababa;
    +    border-radius: 3px;
    +    color: #fff;
    +    font-size: 11px;
    +    margin: 0 0.5em;
    +    padding: 2px 4px 1px;
    +}
    +
    +/* Class/module metadata such as "Uses", "Extends", "Defined in", etc. */
    +.apidocs .meta {
    +    background: #f9f9f9;
    +    border-color: #efefef;
    +    color: #555;
    +    font-size: 11px;
    +    padding: 3px 6px;
    +}
    +
    +.apidocs .meta p { margin: 0; }
    +
    +/* Deprecation warning. */
    +.apidocs .box.deprecated,
    +.apidocs .flag.deprecated {
    +    background: #fdac9f;
    +    border: 1px solid #fd7775;
    +}
    +
    +.apidocs .box.deprecated p { margin: 0.5em 0; }
    +.apidocs .flag.deprecated { color: #333; }
    +
    +/* Module/Class intro description. */
    +.apidocs .intro {
    +    background: #f0f1f8;
    +    border-color: #d4d8eb;
    +}
    +
    +/* Loading spinners. */
    +#bd.loading .apidocs,
    +#api-list.loading .yui3-tabview-panel {
    +    background: #fff url(../img/spinner.gif) no-repeat center 70px;
    +    min-height: 150px;
    +}
    +
    +#bd.loading .apidocs .content,
    +#api-list.loading .yui3-tabview-panel .apis {
    +    display: none;
    +}
    +
    +.apidocs .no-visible-items { color: #666; }
    +
    +/* Generic inline list. */
    +.apidocs ul.inline {
    +    display: inline;
    +    list-style: none;
    +    margin: 0;
    +    padding: 0;
    +}
    +
    +.apidocs ul.inline li { display: inline; }
    +
    +/* Comma-separated list. */
    +.apidocs ul.commas li:after { content: ','; }
    +.apidocs ul.commas li:last-child:after { content: ''; }
    +
    +/* Keyboard shortcuts. */
    +kbd .cmd { font-family: Monaco, Helvetica; }
    +
    +/* -- Generic Access Level styles ------------------------------------------- */
    +.apidocs .item.protected,
    +.apidocs .item.private,
    +.apidocs .index-item.protected,
    +.apidocs .index-item.deprecated,
    +.apidocs .index-item.private {
    +    display: none;
    +}
    +
    +.show-deprecated .item.deprecated,
    +.show-deprecated .index-item.deprecated,
    +.show-protected .item.protected,
    +.show-protected .index-item.protected,
    +.show-private .item.private,
    +.show-private .index-item.private {
    +    display: block;
    +}
    +
    +.hide-inherited .item.inherited,
    +.hide-inherited .index-item.inherited {
    +    display: none;
    +}
    +
    +/* -- Generic Item Index styles --------------------------------------------- */
    +.apidocs .index { margin: 1.5em 0 3em; }
    +
    +.apidocs .index h3 {
    +    border-bottom: 1px solid #efefef;
    +    color: #333;
    +    font-size: 13px;
    +    margin: 2em 0 0.6em;
    +    padding-bottom: 2px;
    +}
    +
    +.apidocs .index .no-visible-items { margin-top: 2em; }
    +
    +.apidocs .index-list {
    +    border-color: #efefef;
    +    font-size: 12px;
    +    list-style: none;
    +    margin: 0;
    +    padding: 0;
    +    -moz-column-count: 4;
    +    -moz-column-gap: 10px;
    +    -moz-column-width: 170px;
    +    -ms-column-count: 4;
    +    -ms-column-gap: 10px;
    +    -ms-column-width: 170px;
    +    -o-column-count: 4;
    +    -o-column-gap: 10px;
    +    -o-column-width: 170px;
    +    -webkit-column-count: 4;
    +    -webkit-column-gap: 10px;
    +    -webkit-column-width: 170px;
    +    column-count: 4;
    +    column-gap: 10px;
    +    column-width: 170px;
    +}
    +
    +.apidocs .no-columns .index-list {
    +    -moz-column-count: 1;
    +    -ms-column-count: 1;
    +    -o-column-count: 1;
    +    -webkit-column-count: 1;
    +    column-count: 1;
    +}
    +
    +.apidocs .index-item { white-space: nowrap; }
    +
    +.apidocs .index-item .flag {
    +    background: none;
    +    border: none;
    +    color: #afafaf;
    +    display: inline;
    +    margin: 0 0 0 0.2em;
    +    padding: 0;
    +}
    +
    +/* -- Generic API item styles ----------------------------------------------- */
    +.apidocs .args {
    +    display: inline;
    +    margin: 0 0.5em;
    +}
    +
    +.apidocs .flag.chainable { background: #46ca3b; }
    +.apidocs .flag.protected { background: #9b86fc; }
    +.apidocs .flag.private { background: #fd6b1b; }
    +.apidocs .flag.async { background: #356de4; }
    +.apidocs .flag.required { background: #e60923; }
    +
    +.apidocs .item {
    +    border-bottom: 1px solid #efefef;
    +    margin: 1.5em 0 2em;
    +    padding-bottom: 2em;
    +}
    +
    +.apidocs .item h4,
    +.apidocs .item h5,
    +.apidocs .item h6 {
    +    color: #333;
    +    font-family: inherit;
    +    font-size: 100%;
    +}
    +
    +.apidocs .item .description p,
    +.apidocs .item pre.code {
    +    margin: 1em 0 0;
    +}
    +
    +.apidocs .item .meta {
    +    background: none;
    +    border: none;
    +    padding: 0;
    +}
    +
    +.apidocs .item .name {
    +    display: inline;
    +    font-size: 14px;
    +}
    +
    +.apidocs .item .type,
    +.apidocs .item .type a,
    +.apidocs .returns-inline {
    +    color: #555;
    +}
    +
    +.apidocs .item .type,
    +.apidocs .returns-inline {
    +    font-size: 11px;
    +    margin: 0 0 0 0;
    +}
    +
    +.apidocs .item .type a { border-bottom: 1px dotted #afafaf; }
    +.apidocs .item .type a:hover { border: none; }
    +
    +/* -- Item Parameter List --------------------------------------------------- */
    +.apidocs .params-list {
    +    list-style: square;
    +    margin: 1em 0 0 2em;
    +    padding: 0;
    +}
    +
    +.apidocs .param { margin-bottom: 1em; }
    +
    +.apidocs .param .type,
    +.apidocs .param .type a {
    +    color: #666;
    +}
    +
    +.apidocs .param .type {
    +    margin: 0 0 0 0.5em;
    +    *margin-left: 0.5em;
    +}
    +
    +.apidocs .param-name { font-weight: bold; }
    +
    +/* -- Item "Emits" block ---------------------------------------------------- */
    +.apidocs .item .emits {
    +    background: #f9f9f9;
    +    border-color: #eaeaea;
    +}
    +
    +/* -- Item "Returns" block -------------------------------------------------- */
    +.apidocs .item .returns .type,
    +.apidocs .item .returns .type a {
    +    font-size: 100%;
    +    margin: 0;
    +}
    +
    +/* -- Class Constructor block ----------------------------------------------- */
    +.apidocs .constructor .item {
    +    border: none;
    +    padding-bottom: 0;
    +}
    +
    +/* -- File Source View ------------------------------------------------------ */
    +.apidocs .file pre.code,
    +#doc .apidocs .file pre.prettyprint {
    +    background: inherit;
    +    border: none;
    +    overflow: visible;
    +    padding: 0;
    +}
    +
    +.apidocs .L0,
    +.apidocs .L1,
    +.apidocs .L2,
    +.apidocs .L3,
    +.apidocs .L4,
    +.apidocs .L5,
    +.apidocs .L6,
    +.apidocs .L7,
    +.apidocs .L8,
    +.apidocs .L9 {
    +    background: inherit;
    +}
    +
    +/* -- Submodule List -------------------------------------------------------- */
    +.apidocs .module-submodule-description {
    +    font-size: 12px;
    +    margin: 0.3em 0 1em;
    +}
    +
    +.apidocs .module-submodule-description p:first-child { margin-top: 0; }
    +
    +/* -- Sidebar TabView ------------------------------------------------------- */
    +#api-tabview { margin-top: 0.6em; }
    +
    +#api-tabview-filter,
    +#api-tabview-panel {
    +    border: 1px solid #dfdfdf;
    +}
    +
    +#api-tabview-filter {
    +    border-bottom: none;
    +    border-top: none;
    +    padding: 0.6em 10px 0 10px;
    +}
    +
    +#api-tabview-panel { border-top: none; }
    +#api-filter { width: 97%; }
    +
    +/* -- Content TabView ------------------------------------------------------- */
    +#classdocs .yui3-tabview-panel { border: none; }
    +
    +/* -- Source File Contents -------------------------------------------------- */
    +.prettyprint li.L0,
    +.prettyprint li.L1,
    +.prettyprint li.L2,
    +.prettyprint li.L3,
    +.prettyprint li.L5,
    +.prettyprint li.L6,
    +.prettyprint li.L7,
    +.prettyprint li.L8 {
    +    list-style: decimal;
    +}
    +
    +/* -- API options ----------------------------------------------------------- */
    +#api-options {
    +    font-size: 11px;
    +    margin-top: 2.2em;
    +    position: absolute;
    +    right: 1.5em;
    +}
    +
    +/*#api-options label { margin-right: 0.6em; }*/
    +
    +/* -- API list -------------------------------------------------------------- */
    +#api-list {
    +    margin-top: 1.5em;
    +    *zoom: 1;
    +}
    +
    +.apis {
    +    font-size: 12px;
    +    line-height: 1.4;
    +    list-style: none;
    +    margin: 0;
    +    padding: 0.5em 0 0.5em 0.4em;
    +}
    +
    +.apis a {
    +    border: 1px solid transparent;
    +    display: block;
    +    margin: 0 0 0 -4px;
    +    padding: 1px 4px 0;
    +    text-decoration: none;
    +    _border: none;
    +    _display: inline;
    +}
    +
    +.apis a:hover,
    +.apis a:focus {
    +    background: #E8EDFC;
    +    background: -moz-linear-gradient(top, #e8edfc 0%, #becef7 100%);
    +    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#E8EDFC), color-stop(100%,#BECEF7));
    +    border-color: #AAC0FA;
    +    border-radius: 3px;
    +    color: #333;
    +    outline: none;
    +}
    +
    +.api-list-item a:hover,
    +.api-list-item a:focus {
    +    font-weight: bold;
    +    text-shadow: 1px 1px 1px #fff;
    +}
    +
    +.apis .message { color: #888; }
    +.apis .result a { padding: 3px 5px 2px; }
    +
    +.apis .result .type {
    +    right: 4px;
    +    top: 7px;
    +}
    +
    +.api-list-item .yui3-highlight {
    +    font-weight: bold;
    +}
    +
    diff --git a/output/api/assets/favicon.ico b/output/api/assets/favicon.ico
    new file mode 100644
    index 0000000000000000000000000000000000000000..414ac4fb9e145171ae8f660e51879e18c401e653
    GIT binary patch
    literal 5430
    zcmdT|c~n&A6@SF^c=}JZwQU+rgHaP#WKr3f0cL=KVVglvkVQZiQDfDk(FA2t0)iWh
    zY=W#JA~S%vRZzjDF`C4MRAU4c7u+h2MgbA{^?q-_;)qB%w&!%tx#zw2&G&uxzWd$#
    zyTAK5PK$ew8$O()>u4_YeUAH#<G9hI)z8H=zKO;r&=}p)4D~o&IF80Oe*n1t<Z1K6
    zKRmqA_(^|rH2-`0;NGZn%A!TPmIm)%XRdcU$xV71U0qt5^ZI&jI#cUW7Akv~AvMGX
    z!4yR3kHKn#@hz%5O(Xl7uQ~Q@VS0>Wt}S-?OOYwFzy>RQteQ9yKUN)d(VW}sS?gZ?
    zPx|>Q!Vau3)9EakCq-qL90hZ1ks>ulgswI!)`q9{n*WN=S|2z6sbrBy(?+QgBE*JB
    zlnJnZksB2AoRK}#3JJogNS28kUOaCb+SeXkot@mC@Q@R^-quL*5MiyIF?RYpVBbPF
    z?DVronzI>VjK-tk)Cp_N^|bcAW9b_=#|x%(<@s2lFu)#3Gp(_~*#hPBT~HA!L*8sL
    z5-cX6B63B6=K7xxlrGM9x4<?xOKf#A!47{B3TTflZe)wQ6)G3Vu{+QS87^i>v^V+X
    z@!h76dhelXtk*db8Fs$J#|HUcwzQ80?IA{iKik6!8Kj%}a)*xu8-<f`EHf#(_j-2U
    z`sl%5j>j)QTIwf8F}-ijENc|feZIeh-y_r024x{G$d+3m-A#1A<x%qp%{@BW+lF2!
    zO5Ic*<bd6NcKq4pdyA1v_v~HLJZSH^4oDK~;&@i_Yc}-kcdzb@P0hN`zhyC0<RwC`
    zrwH4<Y<N31xeDq1gvgKy9;=#eecZD~^V<31#rusX4|yMpTXtL#=-8PfH={E&!3KLH
    zthF`7*MiB|8?}75=DNO~RgG7s{(MmJw_}M>#mc4rKV*4JZ^cW^A4gm2x16n1`1ZBt
    zO=A=*TCJ+)5vp5_WA9%1Y4U@{YvUl~xHfH$Q*}!uT_cBaTn!1wWT;vqhtL>_N{i-`
    zfQE5hjWeU^-jamj5&vVrqw#x_P5&?BEJq*RzBTINkt&-zmoH8FU)Zf`y7|$CeM+xA
    z(W}x^+#S9n9DFkWk3*qYvohtsrN85O+mNd#4m%%+URIj!DtH`gG9FO|pJ4UW(O5P4
    zV=U1gfmAQ~(RZ!C<9X}QhQpQqhr&a@FPv?KZLX$BC)`V-oY`Qlj~LU*h?w>%R!kU$
    zNMoJ*&mJ`of0s5qz27vdJlL^Q8R!6IkPDAj+X?^DoJ_IBb_Ui9bg|ZGBEogYVA<FY
    zP=D&A#k<tc_Bxrc;z-#%2UN^wnCnP*YJ+WZ0bheQiVP5Iu7ju<pJD0f5vWSp{N+2-
    z-v#c6!-wn(!aUDchB{#n;dNPvD_?tZW{HsQVvZz<ArdV0u+C%>R!$g+%(=6w-i7}9
    zGv5f)!~Cij>W#&6W2#YMu2gemybnsLeinM$A#0{3QXNgO*=9Q81XB??Z5*PFr>LIX
    zzxU_C+R*w~HLNN*HaX7TxO0uAF21swh9$;2*fv{4wOdX;U^d8j9+BrM=D9?2cPxHw
    zHko|zA<plwm^m2z&5c(klrEW5mnt(uvbzWyTm)DrF~KUK0V2gSNVf~sOc{R;%3xO%
    z`AV?egK8M%1B=CYp)SIw{1qiD7v~RF|Be8gmONh@WP3}9a}Ylu8`hEyD+LC~q%+^Y
    zkbFSzuZ~406!5iOsE$SPG{hKBK)l%KZj0*Cu))}HxmqzV-$#J_xsq-hM7#~r#C;;j
    z2c<zy*h_KH6N|-u4#*|DGF-c3(Mk_%rfQ?^V5R)m>hEZ8A5t0fRZ5n-33diaUb7+6
    z#t55SEV}ipZBPWMV=<e>B4GlH#pvl{v2#gq*{{)09Pl?4tC#GInl=Ur)_N!k6r*Tf
    z-!^1Z{_k6;)?X1SM@fJq)UimI;9yMos7v{v`|RP3>)Hdcp{uiltBw!PPb3bMOuRP1
    z+JLTx*cC!tXPzDJhb%rGM2IK;$YQcMK&tiwVG@rCzQoTc78y1t+8H96-lKL~@~XG$
    zC;oq7cg~l&Zsy1(PRRIXs*@Qu*~~zO+!Q6DcGwYUhdhdh9vkAE%(33l9Lf-9-Ub$n
    zrNl)UFV7+#wpD6E+*${zGi|T5x3=`jt$XYuo;t2P)VW1TamD<|aE0YmhN}e<B}T}e
    zW%0TVl$&v+f3r+Tama8<j&kDDj7PF}U~7}?4H0AbDe4YXc=YJ%>&iIc<$cAAl>WBF
    z$z7occH!}rohRdzDN<A9%od;|MC}Kb7t9X~A7aUd6zU@wCRBz|U(sEkvb*b30`*CG
    zL7pcWzw1kP?=iArp)!DMAfK{#DWN*k<BK%H`JCB8><YH!&qC9NH1Zeo0Xqlg!<Y4m
    zVlmEiBI^HfOw?P~o9?e3t@J4macn6MmUd$t`GS0!M?621e7${^5XC|2n9TDdKg_XH
    z`$1}sG{S(r>>NU5uhb{jD;6&f{QH}9YL4GIf68+I(%Fs506Vfl#`}WRT;>br*K7|<
    z6b0C*^P;y6j%G-u9*yA=j|nUm2@|$bKCvF`+L>?6HFdq|`IkF4v}<FRR4L|)DJEQA
    z@db;oY<Ei(_=^6Mo8*Ti77tRY8x#-h{B|=;pt+gUb8fWM!OqY9tGl|oUg=NYq@Rs<
    zv_Bv6<L<206~WTBvOq~MUpT4b!rdA<p45*~+_HWwYmVfl4Xht3p?qXL8_$)TO%YFh
    z=H=RIhyHZ-_1}X_=ZtFBEviva??^n1cz_&A%8{O2%l5EBuD9qVKJa-#@eoJ8$R)oN
    zF`htqv_-6k9Dld73}^e&)8AO<i}v^G4=I8UF86L=XHp*QL_IY5nBK7`N3tj`w$CA6
    zM*5fy3?Ep{+A6n1em75uH=l^p#d!<*)79U9ZK~$qUo6l2;^1<h28BQMzVtmp8SKpa
    zg5gCLVP_`ATn6Pr5}nU_!s-aBS#kEJ$Rr=6Iv63v$@~HJsH6JR^S1w<KT-Xzp}NAq
    zCT4Lh;l+zmKl-lXYllLLc^*3{=28hW5~)@)oMtwxww{5F4kp-SIR#Ybir=PVK>t%b
    zH#c0;xmcFBvNm?v(TW8#n|F9wBU@&QH2UU}BAJfOw$l+$H969H8dh59VYN`7xatI4
    z*sJgvkPga)fzEsO;O>V_XHSXilm*Lcw?yStd=Y%2FhF)K)6H77MPm3omN;rS^$N@M
    z#vn?d_vB{XIsJj|J=l5et<Qe@^k4TsXuffET+=_#PrrHYJChq{&zN5Q{<O)XJGTe)
    z?QF2R2e^)=Z3fziF4mB6RIZsss;?c~5U5D5^P)xfT6C|48v4w@ggz%kbc>Llh1W?`
    c9H-qz(m`J;Xu?oLlCTZhNI;9}q1!h68y;F)#sB~S
    
    literal 0
    HcmV?d00001
    
    diff --git a/output/api/assets/img/spinner.gif b/output/api/assets/img/spinner.gif
    new file mode 100644
    index 0000000000000000000000000000000000000000..44f96ba68c8910d19f49e8365bf589ee4e6991e4
    GIT binary patch
    literal 2685
    zcmeH{YfzJC8iv0w0RzSmAjy&hC;`H$F$shaAO<od`S>6#w1ZBuqOP1eV&xzQwK$cK
    zkb?<_1QC!z6+{~vj><7mpp+3&q{5Dt1$U9<3{C|V26e`6+}0U?@ONkSN8g|C`^+=f
    zec#XX!r`F-fpJ8D2y6j>udlD4pC5<AiH(gtdh}>oT3UK~dPYWuR4SFpWW~kBI-Ty)
    zrAvCf-e52^Ha2#4cJ}o23=R&CjEszqjy`(yXliO|W@ct?Ztm&Rr_Y~1-`w1M{ra`P
    zzkftTL}X-Se0+RDLPBO{W_EUVPEL+SqbVvXDlILot*vcoY3b|h8y+6Md-v|chYzQx
    zr)Otp7Z(>-R#u)pd$zv5zO}Wry}hkaD7w13`uqDQCnp;k8k(A#mX?;**48#QHr~8>
    zlai8BUtizc+}zvSJ3l}F;>C+2M~>XPckkuPmqw%U)vH&B4<82pkB{?j=qTvGeqqR`
    z5R2iB1Wl->t8k$(8WzAl-af1_0N4}u*W}bRgf#%9q-JH99w-MtKSV)|0SLen*ai3i
    zKwLs*dgT7l1Mh@}LqbZXsptdIrmkC${_G3<>BH|s@jv$AEj=<WF^LlY6(u4gE;BhL
    zIU|k|m2@KEc+%-OiszX#XBa2b;u4cnzer=GCS`d6&aceC-GC#o_Z{84e+e+JIOb85
    znEdS*?htuZec8qg-YSW`ovrgm>AulRJ-t~vQzbstTBdj1f9x+OI}c{HEGJTIo)-S3
    zvXu@V5Ze5s?o^rjP2oAJZBgJ43EeZab1q+7T3AZ*>`$M~Ip=VyAkWdBfV0!N;IWlu
    zD(gxt-qC?f-Y0OdwW^d52?XMe&uMsja#IsM*&(x|vpcV`xxBXSr!40`V8IVychwC@
    z(!=(Wi*J)OEFo9!i_1H9B3S81`;tp(L9|zFZVRfT#e-Mxsdc=o%{qm6GUnDq8#@+w
    z>zp9;^*C*b0a>)OpldGR<O6#t@SzyTT&f@J`!N<@1+g(M?%tt(-rlt_^?R|{y^T#m
    zpVn4=yQs6v*dy?3x!E@GeZv6k$6~TZMBelXX^$Ucg3kO|z?>YLW-}Rgrhi;mT3&%e
    zb^^cg9z2rK8N!u+qrAU$JXq=Q<ycwRWCj=&IyV}YijR`7H6{|}qP06Z-mjM;6Q&+u
    z-&%eqviCoO#ew#OuRwGz5=DaX3cFB$v)nxnust1TR|PrvqcJ6+<ir?|6cC_~BWj4X
    zVI&j)pbTUJU1JFIHyQ&3eHy|bJY;kn7Th8bV@T#ko#^|HB>$F%*?-T?FD#nCSJ%RJ
    zM8EzX-KiKhdEPdX+W9(2!>6Tj7tGHG(@GXIHcI#ZvuG)z`cvk-VdBK*c|$UxeEHgt
    zh|eHoo#Hc@pK-so^azG|S%hK;SFlf#7sO=2{OEwvn5bYJuJ)RU<z{B)uCE7aW=NzN
    zzEwnPZ^U&A4IRz>!t37+vAHhjqeCDD7^hxtbsYzs?)RgAac-&SQ9q*ejs5N9;>zmK
    zPUNUo2`H82%N0r`1gQ%0iFCS%U#Nn#S`7$YER~j(tMN9rtZI;7tOElDR#vuErF^v%
    z*JNdL`G(A{(F)h2u*1<?f6Rvh1C7H_2!~@e+C%49Sa9ryr4J`Lfzy>gkN>^r%0ek*
    zgATbqYlGa_bGv|KZA}7qZy-^>7P2IOH6RK_p0{{FP*Z?`0Sgup2zfAw7b+2os*;)q
    z+5#lPY#aSu@*Qn1b)Pw6htWZ`zgMBUpw<*<ObYlS1~W`6529Bx%kxE*bVhMC$hs=3
    zld+gV_3{$twK_fxi-m8Ni#o7g`Z{JWw!fMWcXTzCh`OaBcNa`qGamafS;?mYfFnkM
    z=U7^L-3LWZj{#RcnMPxQ*f|b*Qck9<Zn=db-N*;1*2?%pHLet%cKOuM4B!g0>kdk!
    zI2X()g6*)r9wu>OjUHjg4XG}it7AJ{SYC~${GkN#!S<pI62$L${8vd~QL$E6a<NoJ
    z5{8os#1NEELV=)prCMalNoH&MIl*u>q}P9oXlOJoAHCyhZJk<7)Dy2%T-Q`9NtoT?
    zY$ef_KCTe&F^x^D+|KF=eiSu@+>KzjBXCcw!o>=<#ex+Z!{Kbw1y5|(6?AL-F>Q@`
    zuo>r&XN^`QxOtZJWT7R`yM{vkjX0hzY5o_L9GG#?(B^5qQxb*`lhBZP;sO;+aia2c
    zCaZudbVWYTsS0qtA`?@uVQ$EHXcr9BK!#y*gOuzZfplYa;d_x0w1J4;p)O;uTj$;O
    zv99g_E?%o3GlPCna4l!>3Kn6$TmgB^SaLxzk9U(vpJzOlL7uAtVwlUNiF4YB+lX<^
    pE|2Kr%d?-r>ImN9F0EXz^8E;tU2&^Zb%igPc${)^%gY+r_aA#xUsC`8
    
    literal 0
    HcmV?d00001
    
    diff --git a/output/api/assets/index.html b/output/api/assets/index.html
    new file mode 100644
    index 00000000..487fe15b
    --- /dev/null
    +++ b/output/api/assets/index.html
    @@ -0,0 +1,10 @@
    +<!doctype html>
    +<html>
    +    <head>
    +        <title>Redirector</title>
    +        <meta http-equiv="refresh" content="0;url=../">
    +    </head>
    +    <body>
    +        <a href="../">Click here to redirect</a>
    +    </body>
    +</html>
    diff --git a/output/api/assets/js/api-filter.js b/output/api/assets/js/api-filter.js
    new file mode 100644
    index 00000000..d442e543
    --- /dev/null
    +++ b/output/api/assets/js/api-filter.js
    @@ -0,0 +1,56 @@
    +YUI.add('api-filter', function (Y) {
    +
    +Y.APIFilter = Y.Base.create('apiFilter', Y.Base, [Y.AutoCompleteBase], {
    +    // -- Initializer ----------------------------------------------------------
    +    initializer: function () {
    +        this._bindUIACBase();
    +        this._syncUIACBase();
    +    },
    +    getDisplayName: function(name) {
    +
    +        Y.each(Y.YUIDoc.meta.allModules, function(i) {
    +            if (i.name === name && i.displayName) {
    +                name = i.displayName;
    +            }
    +        });
    +
    +        if (this.get('queryType') === 'elements') {
    +            name = '&lt;' + name + '&gt;';
    +        }
    +
    +        return name;
    +    }
    +
    +}, {
    +    // -- Attributes -----------------------------------------------------------
    +    ATTRS: {
    +        resultHighlighter: {
    +            value: 'phraseMatch'
    +        },
    +
    +        // May be set to "classes", "elements" or "modules".
    +        queryType: {
    +            value: 'classes'
    +        },
    +
    +        source: {
    +            valueFn: function() {
    +                var self = this;
    +                return function(q) {
    +                    var data = Y.YUIDoc.meta[self.get('queryType')],
    +                        out = [];
    +                    Y.each(data, function(v) {
    +                        if (v.toLowerCase().indexOf(q.toLowerCase()) > -1) {
    +                            out.push(v);
    +                        }
    +                    });
    +                    return out;
    +                };
    +            }
    +        }
    +    }
    +});
    +
    +}, '3.4.0', {requires: [
    +    'autocomplete-base', 'autocomplete-highlighters', 'autocomplete-sources'
    +]});
    diff --git a/output/api/assets/js/api-list.js b/output/api/assets/js/api-list.js
    new file mode 100644
    index 00000000..e8f650d5
    --- /dev/null
    +++ b/output/api/assets/js/api-list.js
    @@ -0,0 +1,255 @@
    +YUI.add('api-list', function (Y) {
    +
    +var Lang   = Y.Lang,
    +    YArray = Y.Array,
    +
    +    APIList = Y.namespace('APIList'),
    +
    +    classesNode    = Y.one('#api-classes'),
    +    elementsNode   = Y.one('#api-elements'),
    +    inputNode      = Y.one('#api-filter'),
    +    modulesNode    = Y.one('#api-modules'),
    +    tabviewNode    = Y.one('#api-tabview'),
    +
    +    tabs = APIList.tabs = {},
    +
    +    filter = APIList.filter = new Y.APIFilter({
    +        inputNode : inputNode,
    +        maxResults: 1000,
    +
    +        on: {
    +            results: onFilterResults
    +        }
    +    }),
    +
    +    search = APIList.search = new Y.APISearch({
    +        inputNode : inputNode,
    +        maxResults: 100,
    +
    +        on: {
    +            clear  : onSearchClear,
    +            results: onSearchResults
    +        }
    +    }),
    +
    +    tabview = APIList.tabview = new Y.TabView({
    +        srcNode  : tabviewNode,
    +        panelNode: '#api-tabview-panel',
    +        render   : true,
    +
    +        on: {
    +            selectionChange: onTabSelectionChange
    +        }
    +    }),
    +
    +    focusManager = APIList.focusManager = tabviewNode.plug(Y.Plugin.NodeFocusManager, {
    +        circular   : true,
    +        descendants: '#api-filter, .yui3-tab-panel-selected .api-list-item a, .yui3-tab-panel-selected .result a',
    +        keys       : {next: 'down:40', previous: 'down:38'}
    +    }).focusManager,
    +
    +    LIST_ITEM_TEMPLATE =
    +        '<li class="api-list-item {typeSingular}">' +
    +            '<a href="{rootPath}{typePlural}/{name}.html">{displayName}</a>' +
    +        '</li>';
    +
    +// -- Init ---------------------------------------------------------------------
    +
    +// Duckpunch FocusManager's key event handling to prevent it from handling key
    +// events when a modifier is pressed.
    +Y.before(function (e, activeDescendant) {
    +    if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {
    +        return new Y.Do.Prevent();
    +    }
    +}, focusManager, '_focusPrevious', focusManager);
    +
    +Y.before(function (e, activeDescendant) {
    +    if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {
    +        return new Y.Do.Prevent();
    +    }
    +}, focusManager, '_focusNext', focusManager);
    +
    +// Create a mapping of tabs in the tabview so we can refer to them easily later.
    +tabview.each(function (tab, index) {
    +    var name = tab.get('label').toLowerCase();
    +
    +    tabs[name] = {
    +        index: index,
    +        name : name,
    +        tab  : tab
    +    };
    +});
    +
    +// Switch tabs on Ctrl/Cmd-Left/Right arrows.
    +tabviewNode.on('key', onTabSwitchKey, 'down:37,39');
    +
    +// Focus the filter input when the `/` key is pressed.
    +Y.one(Y.config.doc).on('key', onSearchKey, 'down:83');
    +
    +// Keep the Focus Manager up to date.
    +inputNode.on('focus', function () {
    +    focusManager.set('activeDescendant', inputNode);
    +});
    +
    +// Update all tabview links to resolved URLs.
    +tabview.get('panelNode').all('a').each(function (link) {
    +    link.setAttribute('href', link.get('href'));
    +});
    +
    +// -- Private Functions --------------------------------------------------------
    +function getFilterResultNode() {
    +    var queryType = filter.get('queryType');
    +    return queryType === 'classes' ? classesNode
    +            : queryType === 'elements' ? elementsNode : modulesNode;
    +}
    +
    +// -- Event Handlers -----------------------------------------------------------
    +function onFilterResults(e) {
    +    var frag         = Y.one(Y.config.doc.createDocumentFragment()),
    +        resultNode   = getFilterResultNode(),
    +        typePlural   = filter.get('queryType'),
    +        typeSingular = typePlural === 'classes' ? 'class' : typePlural === 'elements' ? 'element' : 'module';
    +
    +    if (e.results.length) {
    +        YArray.each(e.results, function (result) {
    +            frag.append(Lang.sub(LIST_ITEM_TEMPLATE, {
    +                rootPath    : APIList.rootPath,
    +                displayName : filter.getDisplayName(result.highlighted),
    +                name        : result.text,
    +                typePlural  : typePlural,
    +                typeSingular: typeSingular
    +            }));
    +        });
    +    } else {
    +        frag.append(
    +            '<li class="message">' +
    +                'No ' + typePlural + ' found.' +
    +            '</li>'
    +        );
    +    }
    +
    +    resultNode.empty(true);
    +    resultNode.append(frag);
    +
    +    focusManager.refresh();
    +}
    +
    +function onSearchClear(e) {
    +
    +    focusManager.refresh();
    +}
    +
    +function onSearchKey(e) {
    +    var target = e.target;
    +
    +    if (target.test('input,select,textarea')
    +            || target.get('isContentEditable')) {
    +        return;
    +    }
    +
    +    e.preventDefault();
    +
    +    inputNode.focus();
    +    focusManager.refresh();
    +}
    +
    +function onSearchResults(e) {
    +    var frag = Y.one(Y.config.doc.createDocumentFragment());
    +
    +    if (e.results.length) {
    +        YArray.each(e.results, function (result) {
    +            frag.append(result.display);
    +        });
    +    } else {
    +        frag.append(
    +            '<li class="message">' +
    +                'No results found. Maybe you\'ll have better luck with a ' +
    +                'different query?' +
    +            '</li>'
    +        );
    +    }
    +
    +
    +    focusManager.refresh();
    +}
    +
    +function onTabSelectionChange(e) {
    +    var tab  = e.newVal,
    +        name = tab.get('label').toLowerCase();
    +
    +    tabs.selected = {
    +        index: tab.get('index'),
    +        name : name,
    +        tab  : tab
    +    };
    +
    +    switch (name) {
    +    case 'elements':// fallthru
    +    case 'classes': // fallthru
    +    case 'modules':
    +        filter.setAttrs({
    +            minQueryLength: 0,
    +            queryType     : name
    +        });
    +
    +        search.set('minQueryLength', -1);
    +
    +        // Only send a request if this isn't the initially-selected tab.
    +        if (e.prevVal) {
    +            filter.sendRequest(filter.get('value'));
    +        }
    +        break;
    +
    +    case 'everything':
    +        filter.set('minQueryLength', -1);
    +        search.set('minQueryLength', 1);
    +
    +        if (search.get('value')) {
    +            search.sendRequest(search.get('value'));
    +        } else {
    +            inputNode.focus();
    +        }
    +        break;
    +
    +    default:
    +        // WTF? We shouldn't be here!
    +        filter.set('minQueryLength', -1);
    +        search.set('minQueryLength', -1);
    +    }
    +
    +    if (focusManager) {
    +        setTimeout(function () {
    +            focusManager.refresh();
    +        }, 1);
    +    }
    +}
    +
    +function onTabSwitchKey(e) {
    +    var currentTabIndex = tabs.selected.index;
    +
    +    if (!(e.ctrlKey || e.metaKey)) {
    +        return;
    +    }
    +
    +    e.preventDefault();
    +
    +    switch (e.keyCode) {
    +    case 37: // left arrow
    +        if (currentTabIndex > 0) {
    +            tabview.selectChild(currentTabIndex - 1);
    +            inputNode.focus();
    +        }
    +        break;
    +
    +    case 39: // right arrow
    +        if (currentTabIndex < (Y.Object.size(tabs) - 2)) {
    +            tabview.selectChild(currentTabIndex + 1);
    +            inputNode.focus();
    +        }
    +        break;
    +    }
    +}
    +
    +}, '3.4.0', {requires: [
    +    'api-filter', 'api-search', 'event-key', 'node-focusmanager', 'tabview'
    +]});
    diff --git a/output/api/assets/js/api-search.js b/output/api/assets/js/api-search.js
    new file mode 100644
    index 00000000..175f6a61
    --- /dev/null
    +++ b/output/api/assets/js/api-search.js
    @@ -0,0 +1,98 @@
    +YUI.add('api-search', function (Y) {
    +
    +var Lang   = Y.Lang,
    +    Node   = Y.Node,
    +    YArray = Y.Array;
    +
    +Y.APISearch = Y.Base.create('apiSearch', Y.Base, [Y.AutoCompleteBase], {
    +    // -- Public Properties ----------------------------------------------------
    +    RESULT_TEMPLATE:
    +        '<li class="result {resultType}">' +
    +            '<a href="{url}">' +
    +                '<h3 class="title">{name}</h3>' +
    +                '<span class="type">{resultType}</span>' +
    +                '<div class="description">{description}</div>' +
    +                '<span class="className">{class}</span>' +
    +            '</a>' +
    +        '</li>',
    +
    +    // -- Initializer ----------------------------------------------------------
    +    initializer: function () {
    +        this._bindUIACBase();
    +        this._syncUIACBase();
    +    },
    +
    +    // -- Protected Methods ----------------------------------------------------
    +    _apiResultFilter: function (query, results) {
    +        // Filter components out of the results.
    +        return YArray.filter(results, function (result) {
    +            return result.raw.resultType === 'component' ? false : result;
    +        });
    +    },
    +
    +    _apiResultFormatter: function (query, results) {
    +        return YArray.map(results, function (result) {
    +            var raw  = Y.merge(result.raw), // create a copy
    +                desc = raw.description || '';
    +
    +            // Convert description to text and truncate it if necessary.
    +            desc = Node.create('<div>' + desc + '</div>').get('text');
    +
    +            if (desc.length > 65) {
    +                desc = Y.Escape.html(desc.substr(0, 65)) + ' &hellip;';
    +            } else {
    +                desc = Y.Escape.html(desc);
    +            }
    +
    +            raw['class'] || (raw['class'] = '');
    +            raw.description = desc;
    +
    +            // Use the highlighted result name.
    +            raw.name = result.highlighted;
    +
    +            return Lang.sub(this.RESULT_TEMPLATE, raw);
    +        }, this);
    +    },
    +
    +    _apiTextLocator: function (result) {
    +        return result.displayName || result.name;
    +    }
    +}, {
    +    // -- Attributes -----------------------------------------------------------
    +    ATTRS: {
    +        resultFormatter: {
    +            valueFn: function () {
    +                return this._apiResultFormatter;
    +            }
    +        },
    +
    +        resultFilters: {
    +            valueFn: function () {
    +                return this._apiResultFilter;
    +            }
    +        },
    +
    +        resultHighlighter: {
    +            value: 'phraseMatch'
    +        },
    +
    +        resultListLocator: {
    +            value: 'data.results'
    +        },
    +
    +        resultTextLocator: {
    +            valueFn: function () {
    +                return this._apiTextLocator;
    +            }
    +        },
    +
    +        source: {
    +            value: '/api/v1/search?q={query}&count={maxResults}'
    +        }
    +    }
    +});
    +
    +}, '3.4.0', {requires: [
    +    'autocomplete-base', 'autocomplete-highlighters', 'autocomplete-sources',
    +    'escape'
    +]});
    diff --git a/output/api/assets/js/apidocs.js b/output/api/assets/js/apidocs.js
    new file mode 100644
    index 00000000..af9ac322
    --- /dev/null
    +++ b/output/api/assets/js/apidocs.js
    @@ -0,0 +1,376 @@
    +YUI().use(
    +    'yuidoc-meta',
    +    'api-list', 'history-hash', 'node-screen', 'node-style', 'pjax',
    +function (Y) {
    +
    +var win          = Y.config.win,
    +    localStorage = win.localStorage,
    +
    +    bdNode = Y.one('#bd'),
    +
    +    pjax,
    +    defaultRoute,
    +
    +    classTabView,
    +    selectedTab;
    +
    +// Kill pjax functionality unless serving over HTTP.
    +if (!Y.getLocation().protocol.match(/^https?\:/)) {
    +    Y.Router.html5 = false;
    +}
    +
    +// Create the default route with middleware which enables syntax highlighting
    +// on the loaded content.
    +defaultRoute = Y.Pjax.defaultRoute.concat(function (req, res, next) {
    +    prettyPrint();
    +    bdNode.removeClass('loading');
    +
    +    next();
    +});
    +
    +pjax = new Y.Pjax({
    +    container      : '#docs-main',
    +    contentSelector: '#docs-main > .content',
    +    linkSelector   : '#bd a',
    +    titleSelector  : '#xhr-title',
    +
    +    navigateOnHash: true,
    +    root          : '/',
    +    routes        : [
    +        // -- / ----------------------------------------------------------------
    +        {
    +            path     : '/(index.html)?',
    +            callbacks: defaultRoute
    +        },
    +
    +        // -- /elements/* -------------------------------------------------------
    +        {
    +            path     : '/elements/:element.html*',
    +            callbacks: defaultRoute
    +        },
    +
    +        // -- /classes/* -------------------------------------------------------
    +        {
    +            path     : '/classes/:class.html*',
    +            callbacks: [defaultRoute, 'handleClasses']
    +        },
    +
    +        // -- /files/* ---------------------------------------------------------
    +        {
    +            path     : '/files/*file',
    +            callbacks: [defaultRoute, 'handleFiles']
    +        },
    +
    +        // -- /modules/* -------------------------------------------------------
    +        {
    +            path     : '/modules/:module.html*',
    +            callbacks: defaultRoute
    +        }
    +    ]
    +});
    +
    +// -- Utility Functions --------------------------------------------------------
    +
    +pjax.checkVisibility = function (tab) {
    +    tab || (tab = selectedTab);
    +
    +    if (!tab) { return; }
    +
    +    var panelNode = tab.get('panelNode'),
    +        visibleItems;
    +
    +    // If no items are visible in the tab panel due to the current visibility
    +    // settings, display a message to that effect.
    +    visibleItems = panelNode.all('.item,.index-item').some(function (itemNode) {
    +        if (itemNode.getComputedStyle('display') !== 'none') {
    +            return true;
    +        }
    +    });
    +
    +    panelNode.all('.no-visible-items').remove();
    +
    +    if (!visibleItems) {
    +        if (Y.one('#index .index-item')) {
    +            panelNode.append(
    +                '<div class="no-visible-items">' +
    +                    '<p>' +
    +                    'Some items are not shown due to the current visibility ' +
    +                    'settings. Use the checkboxes at the upper right of this ' +
    +                    'page to change the visibility settings.' +
    +                    '</p>' +
    +                '</div>'
    +            );
    +        } else {
    +            panelNode.append(
    +                '<div class="no-visible-items">' +
    +                    '<p>' +
    +                    'This class doesn\'t provide any methods, properties, ' +
    +                    'attributes, or events.' +
    +                    '</p>' +
    +                '</div>'
    +            );
    +        }
    +    }
    +
    +    // Hide index sections without any visible items.
    +    Y.all('.index-section').each(function (section) {
    +        var items        = 0,
    +            visibleItems = 0;
    +
    +        section.all('.index-item').each(function (itemNode) {
    +            items += 1;
    +
    +            if (itemNode.getComputedStyle('display') !== 'none') {
    +                visibleItems += 1;
    +            }
    +        });
    +
    +        section.toggleClass('hidden', !visibleItems);
    +        section.toggleClass('no-columns', visibleItems < 4);
    +    });
    +};
    +
    +pjax.initClassTabView = function () {
    +    if (!Y.all('#classdocs .api-class-tab').size()) {
    +        return;
    +    }
    +
    +    if (classTabView) {
    +        classTabView.destroy();
    +        selectedTab = null;
    +    }
    +
    +    classTabView = new Y.TabView({
    +        srcNode: '#classdocs',
    +
    +        on: {
    +            selectionChange: pjax.onTabSelectionChange
    +        }
    +    });
    +
    +    pjax.updateTabState();
    +    classTabView.render();
    +};
    +
    +pjax.initLineNumbers = function () {
    +    var hash      = win.location.hash.substring(1),
    +        container = pjax.get('container'),
    +        hasLines, node;
    +
    +    // Add ids for each line number in the file source view.
    +    container.all('.linenums>li').each(function (lineNode, index) {
    +        lineNode.set('id', 'l' + (index + 1));
    +        lineNode.addClass('file-line');
    +        hasLines = true;
    +    });
    +
    +    // Scroll to the desired line.
    +    if (hasLines && /^l\d+$/.test(hash)) {
    +        if ((node = container.getById(hash))) {
    +            win.scroll(0, node.getY());
    +        }
    +    }
    +};
    +
    +pjax.initRoot = function () {
    +    var terminators = /^(?:classes|files|elements|modules)$/,
    +        parts       = pjax._getPathRoot().split('/'),
    +        root        = [],
    +        i, len, part;
    +
    +    for (i = 0, len = parts.length; i < len; i += 1) {
    +        part = parts[i];
    +
    +        if (part.match(terminators)) {
    +            // Makes sure the path will end with a "/".
    +            root.push('');
    +            break;
    +        }
    +
    +        root.push(part);
    +    }
    +
    +    pjax.set('root', root.join('/'));
    +};
    +
    +pjax.updateTabState = function (src) {
    +    var hash = win.location.hash.substring(1),
    +        defaultTab, node, tab, tabPanel;
    +
    +    function scrollToNode() {
    +        if (node.hasClass('protected')) {
    +            Y.one('#api-show-protected').set('checked', true);
    +            pjax.updateVisibility();
    +        }
    +
    +        if (node.hasClass('private')) {
    +            Y.one('#api-show-private').set('checked', true);
    +            pjax.updateVisibility();
    +        }
    +
    +        setTimeout(function () {
    +            // For some reason, unless we re-get the node instance here,
    +            // getY() always returns 0.
    +            var node = Y.one('#classdocs').getById(hash);
    +            win.scrollTo(0, node.getY() - 70);
    +        }, 1);
    +    }
    +
    +    if (!classTabView) {
    +        return;
    +    }
    +
    +    if (src === 'hashchange' && !hash) {
    +        defaultTab = 'index';
    +    } else {
    +        if (localStorage) {
    +            defaultTab = localStorage.getItem('tab_' + pjax.getPath()) ||
    +                'index';
    +        } else {
    +            defaultTab = 'index';
    +        }
    +    }
    +
    +    if (hash && (node = Y.one('#classdocs').getById(hash))) {
    +        if ((tabPanel = node.ancestor('.api-class-tabpanel', true))) {
    +            if ((tab = Y.one('#classdocs .api-class-tab.' + tabPanel.get('id')))) {
    +                if (classTabView.get('rendered')) {
    +                    Y.Widget.getByNode(tab).set('selected', 1);
    +                } else {
    +                    tab.addClass('yui3-tab-selected');
    +                }
    +            }
    +        }
    +
    +        // Scroll to the desired element if this is a hash URL.
    +        if (node) {
    +            if (classTabView.get('rendered')) {
    +                scrollToNode();
    +            } else {
    +                classTabView.once('renderedChange', scrollToNode);
    +            }
    +        }
    +    } else {
    +        tab = Y.one('#classdocs .api-class-tab.' + defaultTab);
    +
    +        // When the `defaultTab` node isn't found, `localStorage` is stale.
    +        if (!tab && defaultTab !== 'index') {
    +            tab = Y.one('#classdocs .api-class-tab.index');
    +        }
    +
    +        if (classTabView.get('rendered')) {
    +            Y.Widget.getByNode(tab).set('selected', 1);
    +        } else {
    +            tab.addClass('yui3-tab-selected');
    +        }
    +    }
    +};
    +
    +pjax.updateVisibility = function () {
    +    var container = pjax.get('container');
    +
    +    container.toggleClass('hide-inherited',
    +            !Y.one('#api-show-inherited').get('checked'));
    +
    +    container.toggleClass('show-deprecated',
    +            Y.one('#api-show-deprecated').get('checked'));
    +
    +    container.toggleClass('show-protected',
    +            Y.one('#api-show-protected').get('checked'));
    +
    +    container.toggleClass('show-private',
    +            Y.one('#api-show-private').get('checked'));
    +
    +    pjax.checkVisibility();
    +};
    +
    +// -- Route Handlers -----------------------------------------------------------
    +
    +pjax.handleClasses = function (req, res, next) {
    +    var status = res.ioResponse.status;
    +
    +    // Handles success and local filesystem XHRs.
    +    if (res.ioResponse.readyState === 4 && (!status || (status >= 200 && status < 300))) {
    +        pjax.initClassTabView();
    +    }
    +
    +    next();
    +};
    +
    +pjax.handleFiles = function (req, res, next) {
    +    var status = res.ioResponse.status;
    +
    +    // Handles success and local filesystem XHRs.
    +    if (res.ioResponse.readyState === 4 && (!status || (status >= 200 && status < 300))) {
    +        pjax.initLineNumbers();
    +    }
    +
    +    next();
    +};
    +
    +// -- Event Handlers -----------------------------------------------------------
    +
    +pjax.onNavigate = function (e) {
    +    var hash         = e.hash,
    +        originTarget = e.originEvent && e.originEvent.target,
    +        tab;
    +
    +    if (hash) {
    +        tab = originTarget && originTarget.ancestor('.yui3-tab', true);
    +
    +        if (hash === win.location.hash) {
    +            pjax.updateTabState('hashchange');
    +        } else if (!tab) {
    +            win.location.hash = hash;
    +        }
    +
    +        e.preventDefault();
    +        return;
    +    }
    +
    +    // Only scroll to the top of the page when the URL doesn't have a hash.
    +    this.set('scrollToTop', !e.url.match(/#.+$/));
    +
    +    bdNode.addClass('loading');
    +};
    +
    +pjax.onOptionClick = function (e) {
    +    pjax.updateVisibility();
    +};
    +
    +pjax.onTabSelectionChange = function (e) {
    +    var tab   = e.newVal,
    +        tabId = tab.get('contentBox').getAttribute('href').substring(1);
    +
    +    selectedTab = tab;
    +
    +    // If switching from a previous tab (i.e., this is not the default tab),
    +    // replace the history entry with a hash URL that will cause this tab to
    +    // be selected if the user navigates away and then returns using the back
    +    // or forward buttons.
    +    if (e.prevVal && localStorage) {
    +        localStorage.setItem('tab_' + pjax.getPath(), tabId);
    +    }
    +
    +    pjax.checkVisibility(tab);
    +};
    +
    +// -- Init ---------------------------------------------------------------------
    +
    +pjax.on('navigate', pjax.onNavigate);
    +
    +pjax.initRoot();
    +pjax.upgrade();
    +pjax.initClassTabView();
    +pjax.initLineNumbers();
    +pjax.updateVisibility();
    +
    +Y.APIList.rootPath = pjax.get('root');
    +
    +Y.one('#api-options').delegate('click', pjax.onOptionClick, 'input');
    +
    +Y.on('hashchange', function (e) {
    +    pjax.updateTabState('hashchange');
    +}, win);
    +
    +});
    diff --git a/output/api/assets/js/yui-prettify.js b/output/api/assets/js/yui-prettify.js
    new file mode 100644
    index 00000000..18de8649
    --- /dev/null
    +++ b/output/api/assets/js/yui-prettify.js
    @@ -0,0 +1,17 @@
    +YUI().use('node', function(Y) {
    +    var code = Y.all('.prettyprint.linenums');
    +    if (code.size()) {
    +        code.each(function(c) {
    +            var lis = c.all('ol li'),
    +                l = 1;
    +            lis.each(function(n) {
    +                n.prepend('<a name="LINENUM_' + l + '"></a>');
    +                l++;
    +            });
    +        });
    +        var h = location.hash;
    +        location.hash = '';
    +        h = h.replace('LINE_', 'LINENUM_');
    +        location.hash = h;
    +    }
    +});
    diff --git a/output/api/assets/vendor/prettify/CHANGES.html b/output/api/assets/vendor/prettify/CHANGES.html
    new file mode 100644
    index 00000000..b50b8414
    --- /dev/null
    +++ b/output/api/assets/vendor/prettify/CHANGES.html
    @@ -0,0 +1,130 @@
    +<html>
    +  <head>
    +    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    +    <title>Change Log</title>
    +  </head>
    +  <body bgcolor="white">
    +    <a style="float:right" href="README.html">README</a>
    +
    +    <h1>Known Issues</h1>
    +    <ul>
    +      <li>Perl formatting is really crappy.  Partly because the author is lazy and
    +      partly because Perl is
    +      <a href="http://www.perlmonks.org/?node_id=663393">hard</a> to parse.
    +      <li>On some browsers, <code>&lt;code&gt;</code> elements with newlines in the text
    +      which use CSS to specify <code>white-space:pre</code> will have the newlines
    +      improperly stripped if the element is not attached to the document at the time
    +      the stripping is done.  Also, on IE 6, all newlines will be stripped from
    +      <code>&lt;code&gt;</code> elements because of the way IE6 produces
    +      <code>innerHTML</code>.  Workaround: use <code>&lt;pre&gt;</code> for code with
    +      newlines.
    +    </ul>
    +
    +    <h1>Change Log</h1>
    +    <h2>29 March 2007</h2>
    +    <ul>
    +      <li>Added <a href="tests/prettify_test.html#PHP">tests</a> for PHP support
    +        to address 
    +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=3"
    +       >issue 3</a>.
    +      <li>Fixed
    +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=6"
    +       >bug</a>: <code>prettyPrintOne</code> was not halting.  This was not
    +        reachable through the normal entry point.
    +      <li>Fixed
    +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=4"
    +       >bug</a>: recursing into a script block or PHP tag that was not properly
    +        closed would not silently drop the content.
    +        (<a href="tests/prettify_test.html#issue4">test</a>)
    +      <li>Fixed
    +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=8"
    +       >bug</a>: was eating tabs
    +        (<a href="tests/prettify_test.html#issue8">test</a>)
    +      <li>Fixed entity handling so that the caveat
    +        <blockquote>
    +          <p>Caveats: please properly escape less-thans.  <tt>x&amp;lt;y</tt>
    +          instead of <tt>x&lt;y</tt>, and use <tt>&quot;</tt> instead of 
    +          <tt>&amp;quot;</tt> for string delimiters.</p>
    +        </blockquote>
    +        is no longer applicable.
    +      <li>Added noisefree's C#
    +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=4"
    +       >patch</a>
    +      <li>Added a <a href="http://google-code-prettify.googlecode.com/files/prettify-small.zip">distribution</a> that has comments and
    +        whitespace removed to reduce download size from 45.5kB to 12.8kB.
    +    </ul>
    +    <h2>4 Jul 2008</h2>
    +    <ul>
    +      <li>Added <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=17">language specific formatters</a> that are triggered by the presence
    +      of a <code>lang-&lt;language-file-extension&gt;</code></li>
    +      <li>Fixed <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=29">bug</a>: python handling of <code>'''string'''</code>
    +      <li>Fixed bug: <code>/</code> in regex <code>[charsets] should not end regex</code>
    +    </ul>
    +    <h2>5 Jul 2008</h2>
    +    <ul>
    +      <li>Defined language extensions for Lisp and Lua</code>
    +    </ul>
    +    <h2>14 Jul 2008</h2>
    +    <ul>
    +      <li>Language handlers for F#, OCAML, SQL</code>
    +      <li>Support for <code>nocode</code> spans to allow embedding of line
    +      numbers and code annotations which should not be styled or otherwise
    +      affect the tokenization of prettified code.
    +      See the issue 22
    +      <a href="tests/prettify_test.html#issue22">testcase</a>.</code>
    +    </ul>
    +    <h2>6 Jan 2009</h2>
    +    <ul>
    +      <li>Language handlers for Visual Basic, Haskell, CSS, and WikiText</li>
    +      <li>Added <tt>.mxml</tt> extension to the markup style handler for
    +        Flex <a href="http://en.wikipedia.org/wiki/MXML">MXML files</a>.  See
    +        <a
    +        href="http://code.google.com/p/google-code-prettify/issues/detail?id=37"
    +        >issue 37</a>.
    +      <li>Added <tt>.m</tt> extension to the C style handler so that Objective
    +        C source files properly highlight.  See
    +        <a
    +        href="http://code.google.com/p/google-code-prettify/issues/detail?id=58"
    +       >issue 58</a>.
    +      <li>Changed HTML lexer to use the same embedded source mechanism as the
    +        wiki language handler, and changed to use the registered
    +        CSS handler for STYLE element content.
    +    </ul>
    +    <h2>21 May 2009</h2>
    +    <ul>
    +      <li>Rewrote to improve performance on large files.
    +        See <a href="http://mikesamuel.blogspot.com/2009/05/efficient-parsing-in-javascript.html">benchmarks</a>.</li>
    +      <li>Fixed bugs with highlighting of Haskell line comments, Lisp
    +        number literals, Lua strings, C preprocessor directives,
    +        newlines in Wiki code on Windows, and newlines in IE6.</li>
    +    </ul>
    +    <h2>14 August 2009</h2>
    +    <ul>
    +      <li>Fixed prettifying of <code>&lt;code&gt;</code> blocks with embedded newlines.
    +    </ul>
    +    <h2>3 October 2009</h2>
    +    <ul>
    +      <li>Fixed prettifying of XML/HTML tags that contain uppercase letters.
    +    </ul>
    +    <h2>19 July 2010</h2>
    +    <ul>
    +      <li>Added support for line numbers.  Bug
    +        <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=22"
    +         >22</a></li>
    +      <li>Added YAML support.  Bug
    +        <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=123"
    +         >123</a></li>
    +      <li>Added VHDL support courtesy Le Poussin.</li>
    +      <li>IE performance improvements.  Bug
    +        <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=102"
    +         >102</a> courtesy jacobly.</li>
    +      <li>A variety of markup formatting fixes courtesy smain and thezbyg.</li>
    +      <li>Fixed copy and paste in IE[678].
    +      <li>Changed output to use <code>&amp;#160;</code> instead of
    +        <code>&amp;nbsp;</code> so that the output works when embedded in XML.
    +        Bug
    +        <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=108"
    +         >108</a>.</li>
    +    </ul>
    +  </body>
    +</html>
    diff --git a/output/api/assets/vendor/prettify/COPYING b/output/api/assets/vendor/prettify/COPYING
    new file mode 100644
    index 00000000..d6456956
    --- /dev/null
    +++ b/output/api/assets/vendor/prettify/COPYING
    @@ -0,0 +1,202 @@
    +
    +                                 Apache License
    +                           Version 2.0, January 2004
    +                        http://www.apache.org/licenses/
    +
    +   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
    +
    +   1. Definitions.
    +
    +      "License" shall mean the terms and conditions for use, reproduction,
    +      and distribution as defined by Sections 1 through 9 of this document.
    +
    +      "Licensor" shall mean the copyright owner or entity authorized by
    +      the copyright owner that is granting the License.
    +
    +      "Legal Entity" shall mean the union of the acting entity and all
    +      other entities that control, are controlled by, or are under common
    +      control with that entity. For the purposes of this definition,
    +      "control" means (i) the power, direct or indirect, to cause the
    +      direction or management of such entity, whether by contract or
    +      otherwise, or (ii) ownership of fifty percent (50%) or more of the
    +      outstanding shares, or (iii) beneficial ownership of such entity.
    +
    +      "You" (or "Your") shall mean an individual or Legal Entity
    +      exercising permissions granted by this License.
    +
    +      "Source" form shall mean the preferred form for making modifications,
    +      including but not limited to software source code, documentation
    +      source, and configuration files.
    +
    +      "Object" form shall mean any form resulting from mechanical
    +      transformation or translation of a Source form, including but
    +      not limited to compiled object code, generated documentation,
    +      and conversions to other media types.
    +
    +      "Work" shall mean the work of authorship, whether in Source or
    +      Object form, made available under the License, as indicated by a
    +      copyright notice that is included in or attached to the work
    +      (an example is provided in the Appendix below).
    +
    +      "Derivative Works" shall mean any work, whether in Source or Object
    +      form, that is based on (or derived from) the Work and for which the
    +      editorial revisions, annotations, elaborations, or other modifications
    +      represent, as a whole, an original work of authorship. For the purposes
    +      of this License, Derivative Works shall not include works that remain
    +      separable from, or merely link (or bind by name) to the interfaces of,
    +      the Work and Derivative Works thereof.
    +
    +      "Contribution" shall mean any work of authorship, including
    +      the original version of the Work and any modifications or additions
    +      to that Work or Derivative Works thereof, that is intentionally
    +      submitted to Licensor for inclusion in the Work by the copyright owner
    +      or by an individual or Legal Entity authorized to submit on behalf of
    +      the copyright owner. For the purposes of this definition, "submitted"
    +      means any form of electronic, verbal, or written communication sent
    +      to the Licensor or its representatives, including but not limited to
    +      communication on electronic mailing lists, source code control systems,
    +      and issue tracking systems that are managed by, or on behalf of, the
    +      Licensor for the purpose of discussing and improving the Work, but
    +      excluding communication that is conspicuously marked or otherwise
    +      designated in writing by the copyright owner as "Not a Contribution."
    +
    +      "Contributor" shall mean Licensor and any individual or Legal Entity
    +      on behalf of whom a Contribution has been received by Licensor and
    +      subsequently incorporated within the Work.
    +
    +   2. Grant of Copyright License. Subject to the terms and conditions of
    +      this License, each Contributor hereby grants to You a perpetual,
    +      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
    +      copyright license to reproduce, prepare Derivative Works of,
    +      publicly display, publicly perform, sublicense, and distribute the
    +      Work and such Derivative Works in Source or Object form.
    +
    +   3. Grant of Patent License. Subject to the terms and conditions of
    +      this License, each Contributor hereby grants to You a perpetual,
    +      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
    +      (except as stated in this section) patent license to make, have made,
    +      use, offer to sell, sell, import, and otherwise transfer the Work,
    +      where such license applies only to those patent claims licensable
    +      by such Contributor that are necessarily infringed by their
    +      Contribution(s) alone or by combination of their Contribution(s)
    +      with the Work to which such Contribution(s) was submitted. If You
    +      institute patent litigation against any entity (including a
    +      cross-claim or counterclaim in a lawsuit) alleging that the Work
    +      or a Contribution incorporated within the Work constitutes direct
    +      or contributory patent infringement, then any patent licenses
    +      granted to You under this License for that Work shall terminate
    +      as of the date such litigation is filed.
    +
    +   4. Redistribution. You may reproduce and distribute copies of the
    +      Work or Derivative Works thereof in any medium, with or without
    +      modifications, and in Source or Object form, provided that You
    +      meet the following conditions:
    +
    +      (a) You must give any other recipients of the Work or
    +          Derivative Works a copy of this License; and
    +
    +      (b) You must cause any modified files to carry prominent notices
    +          stating that You changed the files; and
    +
    +      (c) You must retain, in the Source form of any Derivative Works
    +          that You distribute, all copyright, patent, trademark, and
    +          attribution notices from the Source form of the Work,
    +          excluding those notices that do not pertain to any part of
    +          the Derivative Works; and
    +
    +      (d) If the Work includes a "NOTICE" text file as part of its
    +          distribution, then any Derivative Works that You distribute must
    +          include a readable copy of the attribution notices contained
    +          within such NOTICE file, excluding those notices that do not
    +          pertain to any part of the Derivative Works, in at least one
    +          of the following places: within a NOTICE text file distributed
    +          as part of the Derivative Works; within the Source form or
    +          documentation, if provided along with the Derivative Works; or,
    +          within a display generated by the Derivative Works, if and
    +          wherever such third-party notices normally appear. The contents
    +          of the NOTICE file are for informational purposes only and
    +          do not modify the License. You may add Your own attribution
    +          notices within Derivative Works that You distribute, alongside
    +          or as an addendum to the NOTICE text from the Work, provided
    +          that such additional attribution notices cannot be construed
    +          as modifying the License.
    +
    +      You may add Your own copyright statement to Your modifications and
    +      may provide additional or different license terms and conditions
    +      for use, reproduction, or distribution of Your modifications, or
    +      for any such Derivative Works as a whole, provided Your use,
    +      reproduction, and distribution of the Work otherwise complies with
    +      the conditions stated in this License.
    +
    +   5. Submission of Contributions. Unless You explicitly state otherwise,
    +      any Contribution intentionally submitted for inclusion in the Work
    +      by You to the Licensor shall be under the terms and conditions of
    +      this License, without any additional terms or conditions.
    +      Notwithstanding the above, nothing herein shall supersede or modify
    +      the terms of any separate license agreement you may have executed
    +      with Licensor regarding such Contributions.
    +
    +   6. Trademarks. This License does not grant permission to use the trade
    +      names, trademarks, service marks, or product names of the Licensor,
    +      except as required for reasonable and customary use in describing the
    +      origin of the Work and reproducing the content of the NOTICE file.
    +
    +   7. Disclaimer of Warranty. Unless required by applicable law or
    +      agreed to in writing, Licensor provides the Work (and each
    +      Contributor provides its Contributions) on an "AS IS" BASIS,
    +      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
    +      implied, including, without limitation, any warranties or conditions
    +      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
    +      PARTICULAR PURPOSE. You are solely responsible for determining the
    +      appropriateness of using or redistributing the Work and assume any
    +      risks associated with Your exercise of permissions under this License.
    +
    +   8. Limitation of Liability. In no event and under no legal theory,
    +      whether in tort (including negligence), contract, or otherwise,
    +      unless required by applicable law (such as deliberate and grossly
    +      negligent acts) or agreed to in writing, shall any Contributor be
    +      liable to You for damages, including any direct, indirect, special,
    +      incidental, or consequential damages of any character arising as a
    +      result of this License or out of the use or inability to use the
    +      Work (including but not limited to damages for loss of goodwill,
    +      work stoppage, computer failure or malfunction, or any and all
    +      other commercial damages or losses), even if such Contributor
    +      has been advised of the possibility of such damages.
    +
    +   9. Accepting Warranty or Additional Liability. While redistributing
    +      the Work or Derivative Works thereof, You may choose to offer,
    +      and charge a fee for, acceptance of support, warranty, indemnity,
    +      or other liability obligations and/or rights consistent with this
    +      License. However, in accepting such obligations, You may act only
    +      on Your own behalf and on Your sole responsibility, not on behalf
    +      of any other Contributor, and only if You agree to indemnify,
    +      defend, and hold each Contributor harmless for any liability
    +      incurred by, or claims asserted against, such Contributor by reason
    +      of your accepting any such warranty or additional liability.
    +
    +   END OF TERMS AND CONDITIONS
    +
    +   APPENDIX: How to apply the Apache License to your work.
    +
    +      To apply the Apache License to your work, attach the following
    +      boilerplate notice, with the fields enclosed by brackets "[]"
    +      replaced with your own identifying information. (Don't include
    +      the brackets!)  The text should be enclosed in the appropriate
    +      comment syntax for the file format. We also recommend that a
    +      file or class name and description of purpose be included on the
    +      same "printed page" as the copyright notice for easier
    +      identification within third-party archives.
    +
    +   Copyright [yyyy] [name of copyright owner]
    +
    +   Licensed under the Apache License, Version 2.0 (the "License");
    +   you may not use this file except in compliance with the License.
    +   You may obtain a copy of the License at
    +
    +       http://www.apache.org/licenses/LICENSE-2.0
    +
    +   Unless required by applicable law or agreed to in writing, software
    +   distributed under the License is distributed on an "AS IS" BASIS,
    +   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +   See the License for the specific language governing permissions and
    +   limitations under the License.
    diff --git a/output/api/assets/vendor/prettify/README.html b/output/api/assets/vendor/prettify/README.html
    new file mode 100644
    index 00000000..c6fe1a32
    --- /dev/null
    +++ b/output/api/assets/vendor/prettify/README.html
    @@ -0,0 +1,203 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +
    +<html>
    +  <head>
    +    <title>Javascript code prettifier</title>
    +
    +    <link href="src/prettify.css" type="text/css" rel="stylesheet" />
    +
    +    <script src="src/prettify.js" type="text/javascript"></script>
    +
    +    <style type="text/css">
    +      body { margin-left: .5in }
    +      h1, h2, h3, h4, .footer { margin-left: -.4in; }
    +    </style>
    +  </head>
    +
    +  <body onload="prettyPrint()" bgcolor="white">
    +    <small style="float: right">Languages : <a href="README-zh-Hans.html">CH</a></small>
    +    <h1>Javascript code prettifier</h1>
    +
    +    <h2>Setup</h2>
    +    <ol>
    +      <li><a href="http://code.google.com/p/google-code-prettify/downloads/list">Download</a> a distribution
    +      <li>Include the script and stylesheets in your document
    +        (you will need to make sure the css and js file are on your server, and
    +         adjust the paths in the <tt>script</tt> and <tt>link</tt> tag)
    +        <pre class="prettyprint">
    +&lt;link href="prettify.css" type="text/css" rel="stylesheet" />
    +&lt;script type="text/javascript" src="prettify.js">&lt;/script></pre>
    +      <li>Add <code class="prettyprint lang-html">onload="prettyPrint()"</code> to your
    +      document's body tag.
    +      <li>Modify the stylesheet to get the coloring you prefer</li>
    +    </ol>
    +
    +    <h2>Usage</h2>
    +    <p>Put code snippets in
    +    <tt>&lt;pre class="prettyprint"&gt;...&lt;/pre&gt;</tt>
    +    or <tt>&lt;code class="prettyprint"&gt;...&lt;/code&gt;</tt>
    +    and it will automatically be pretty printed.
    +
    +    <table summary="code examples">
    +      <tr>
    +        <th>The original
    +        <th>Prettier
    +      <tr>
    +        <td><pre style="border: 1px solid #888;padding: 2px"
    +             ><a name="voila1"></a>class Voila {
    +public:
    +  // Voila
    +  static const string VOILA = "Voila";
    +
    +  // will not interfere with embedded <a href="#voila1">tags</a>.
    +}</pre>
    +
    +        <td><pre class="prettyprint"><a name="voila2"></a>class Voila {
    +public:
    +  // Voila
    +  static const string VOILA = "Voila";
    +
    +  // will not interfere with embedded <a href="#voila2">tags</a>.
    +}</pre>
    +    </table>
    +
    +    <h2>FAQ</h2>
    +    <h3 id="langs">Which languages does it work for?</h3>
    +    <p>The comments in <tt>prettify.js</tt> are authoritative but the lexer
    +    should work on a number of languages including C and friends,
    +    Java, Python, Bash, SQL, HTML, XML, CSS, Javascript, and Makefiles.
    +    It works passably on Ruby, PHP, VB, and Awk and a decent subset of Perl
    +    and Ruby, but, because of commenting conventions, doesn't work on
    +    Smalltalk, or CAML-like languages.</p>
    +
    +    <p>LISPy languages are supported via an extension:
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-lisp.js"
    +     ><code>lang-lisp.js</code></a>.</p>
    +    <p>And similarly for
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-css.js"
    +     ><code>CSS</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-hs.js"
    +     ><code>Haskell</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-lua.js"
    +     ><code>Lua</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-ml.js"
    +     ><code>OCAML, SML, F#</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-vb.js"
    +     ><code>Visual Basic</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-sql.js"
    +     ><code>SQL</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-proto.js"
    +     ><code>Protocol Buffers</code></a>, and
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-wiki.js"
    +     ><code>WikiText</code></a>..
    +
    +    <p>If you'd like to add an extension for your favorite language, please
    +    look at <tt>src/lang-lisp.js</tt> and file an
    +    <a href="http://code.google.com/p/google-code-prettify/issues/list"
    +     >issue</a> including your language extension, and a testcase.</p>
    +
    +    <h3>How do I specify which language my code is in?</h3>
    +    <p>You don't need to specify the language since <code>prettyprint()</code>
    +    will guess.  You can specify a language by specifying the language extension
    +    along with the <code>prettyprint</code> class like so:</p>
    +    <pre class="prettyprint lang-html"
    +>&lt;pre class=&quot;prettyprint <b>lang-html</b>&quot;&gt;
    +  The lang-* class specifies the language file extensions.
    +  File extensions supported by default include
    +    "bsh", "c", "cc", "cpp", "cs", "csh", "cyc", "cv", "htm", "html",
    +    "java", "js", "m", "mxml", "perl", "pl", "pm", "py", "rb", "sh",
    +    "xhtml", "xml", "xsl".
    +&lt;/pre&gt;</pre>
    +
    +    <h3>It doesn't work on <tt>&lt;obfuscated code sample&gt;</tt>?</h3>
    +    <p>Yes.  Prettifying obfuscated code is like putting lipstick on a pig
    +    &mdash; i.e. outside the scope of this tool.</p>
    +
    +    <h3>Which browsers does it work with?</h3>
    +    <p>It's been tested with IE 6, Firefox 1.5 &amp; 2, and Safari 2.0.4.
    +    Look at <a href="tests/prettify_test.html">the test page</a> to see if it
    +    works in your browser.</p>
    +
    +    <h3>What's changed?</h3>
    +    <p>See the <a href="CHANGES.html">change log</a></p>
    +
    +    <h3>Why doesn't Prettyprinting of strings work on WordPress?</h3>
    +    <p>Apparently wordpress does "smart quoting" which changes close quotes.
    +    This causes end quotes to not match up with open quotes.
    +    <p>This breaks prettifying as well as copying and pasting of code samples.
    +    See
    +    <a href="http://wordpress.org/support/topic/125038"
    +    >WordPress's help center</a> for info on how to stop smart quoting of code
    +    snippets.</p>
    +
    +    <h3 id="linenums">How do I put line numbers in my code?</h3>
    +    <p>You can use the <code>linenums</code> class to turn on line
    +    numbering.  If your code doesn't start at line number 1, you can
    +    add a colon and a line number to the end of that class as in
    +    <code>linenums:52</code>.
    +
    +    <p>For example
    +<pre class="prettyprint">&lt;pre class="prettyprint linenums:<b>4</b>"
    +&gt;// This is line 4.
    +foo();
    +bar();
    +baz();
    +boo();
    +far();
    +faz();
    +&lt;pre&gt;</pre>
    +    produces
    +<pre class="prettyprint linenums:4"
    +>// This is line 4.
    +foo();
    +bar();
    +baz();
    +boo();
    +far();
    +faz();
    +</pre>
    +
    +    <h3>How do I prevent a portion of markup from being marked as code?</h3>
    +    <p>You can use the <code>nocode</code> class to identify a span of markup
    +    that is not code.
    +<pre class="prettyprint">&lt;pre class=prettyprint&gt;
    +int x = foo();  /* This is a comment  &lt;span class="nocode"&gt;This is not code&lt;/span&gt;
    +  Continuation of comment */
    +int y = bar();
    +&lt;/pre&gt;</pre>
    +produces
    +<pre class="prettyprint">
    +int x = foo();  /* This is a comment  <span class="nocode">This is not code</span>
    +  Continuation of comment */
    +int y = bar();
    +</pre>
    +
    +    <p>For a more complete example see the issue22
    +    <a href="tests/prettify_test.html#issue22">testcase</a>.</p>
    +
    +    <h3>I get an error message "a is not a function" or "opt_whenDone is not a function"</h3>
    +    <p>If you are calling <code>prettyPrint</code> via an event handler, wrap it in a function.
    +    Instead of doing
    +    <blockquote>
    +      <code class="prettyprint lang-js"
    +       >addEventListener('load', prettyPrint, false);</code>
    +    </blockquote>
    +    wrap it in a closure like
    +    <blockquote>
    +      <code class="prettyprint lang-js"
    +       >addEventListener('load', function (event) { prettyPrint() }, false);</code>
    +    </blockquote>
    +    so that the browser does not pass an event object to <code>prettyPrint</code> which
    +    will confuse it.
    +
    +    <br><br><br>
    +
    +    <div class="footer">
    +<!-- Created: Tue Oct  3 17:51:56 PDT 2006 -->
    +<!-- hhmts start -->
    +Last modified: Wed Jul 19 13:56:00 PST 2010
    +<!-- hhmts end -->
    +    </div>
    +  </body>
    +</html>
    diff --git a/output/api/assets/vendor/prettify/prettify-min.css b/output/api/assets/vendor/prettify/prettify-min.css
    new file mode 100644
    index 00000000..d44b3a22
    --- /dev/null
    +++ b/output/api/assets/vendor/prettify/prettify-min.css
    @@ -0,0 +1 @@
    +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
    \ No newline at end of file
    diff --git a/output/api/assets/vendor/prettify/prettify-min.js b/output/api/assets/vendor/prettify/prettify-min.js
    new file mode 100644
    index 00000000..4845d05d
    --- /dev/null
    +++ b/output/api/assets/vendor/prettify/prettify-min.js
    @@ -0,0 +1 @@
    +window.PR_SHOULD_USE_CONTINUATION=true;var prettyPrintOne;var prettyPrint;(function(){var O=window;var j=["break,continue,do,else,for,if,return,while"];var v=[j,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var q=[v,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var m=[q,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var y=[q,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var T=[y,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"];var s="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes";var x=[q,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var t="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var J=[j,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var g=[j,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var I=[j,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var B=[m,T,x,t+J,g,I];var f=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/;var D="str";var A="kwd";var k="com";var Q="typ";var H="lit";var M="pun";var G="pln";var n="tag";var F="dec";var K="src";var R="atn";var o="atv";var P="nocode";var N="(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function l(ab){var af=0;var U=false;var ae=false;for(var X=0,W=ab.length;X<W;++X){var ag=ab[X];if(ag.ignoreCase){ae=true}else{if(/[a-z]/i.test(ag.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){U=true;ae=false;break}}}var aa={b:8,t:9,n:10,v:11,f:12,r:13};function ad(aj){var ai=aj.charCodeAt(0);if(ai!==92){return ai}var ah=aj.charAt(1);ai=aa[ah];if(ai){return ai}else{if("0"<=ah&&ah<="7"){return parseInt(aj.substring(1),8)}else{if(ah==="u"||ah==="x"){return parseInt(aj.substring(2),16)}else{return aj.charCodeAt(1)}}}}function V(ah){if(ah<32){return(ah<16?"\\x0":"\\x")+ah.toString(16)}var ai=String.fromCharCode(ah);return(ai==="\\"||ai==="-"||ai==="]"||ai==="^")?"\\"+ai:ai}function Z(an){var ar=an.substring(1,an.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ah=[];var ap=ar[0]==="^";var ao=["["];if(ap){ao.push("^")}for(var at=ap?1:0,al=ar.length;at<al;++at){var aj=ar[at];if(/\\[bdsw]/i.test(aj)){ao.push(aj)}else{var ai=ad(aj);var am;if(at+2<al&&"-"===ar[at+1]){am=ad(ar[at+2]);at+=2}else{am=ai}ah.push([ai,am]);if(!(am<65||ai>122)){if(!(am<65||ai>90)){ah.push([Math.max(65,ai)|32,Math.min(am,90)|32])}if(!(am<97||ai>122)){ah.push([Math.max(97,ai)&~32,Math.min(am,122)&~32])}}}}ah.sort(function(aw,av){return(aw[0]-av[0])||(av[1]-aw[1])});var ak=[];var aq=[];for(var at=0;at<ah.length;++at){var au=ah[at];if(au[0]<=aq[1]+1){aq[1]=Math.max(aq[1],au[1])}else{ak.push(aq=au)}}for(var at=0;at<ak.length;++at){var au=ak[at];ao.push(V(au[0]));if(au[1]>au[0]){if(au[1]+1>au[0]){ao.push("-")}ao.push(V(au[1]))}}ao.push("]");return ao.join("")}function Y(an){var al=an.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var aj=al.length;var ap=[];for(var am=0,ao=0;am<aj;++am){var ai=al[am];if(ai==="("){++ao}else{if("\\"===ai.charAt(0)){var ah=+ai.substring(1);if(ah){if(ah<=ao){ap[ah]=-1}else{al[am]=V(ah)}}}}}for(var am=1;am<ap.length;++am){if(-1===ap[am]){ap[am]=++af}}for(var am=0,ao=0;am<aj;++am){var ai=al[am];if(ai==="("){++ao;if(!ap[ao]){al[am]="(?:"}}else{if("\\"===ai.charAt(0)){var ah=+ai.substring(1);if(ah&&ah<=ao){al[am]="\\"+ap[ah]}}}}for(var am=0;am<aj;++am){if("^"===al[am]&&"^"!==al[am+1]){al[am]=""}}if(an.ignoreCase&&U){for(var am=0;am<aj;++am){var ai=al[am];var ak=ai.charAt(0);if(ai.length>=2&&ak==="["){al[am]=Z(ai)}else{if(ak!=="\\"){al[am]=ai.replace(/[a-zA-Z]/g,function(aq){var ar=aq.charCodeAt(0);return"["+String.fromCharCode(ar&~32,ar|32)+"]"})}}}}return al.join("")}var ac=[];for(var X=0,W=ab.length;X<W;++X){var ag=ab[X];if(ag.global||ag.multiline){throw new Error(""+ag)}ac.push("(?:"+Y(ag)+")")}return new RegExp(ac.join("|"),ae?"gi":"g")}function b(aa,Y){var W=/(?:^|\s)nocode(?:\s|$)/;var ab=[];var Z=0;var X=[];var V=0;function U(ac){switch(ac.nodeType){case 1:if(W.test(ac.className)){return}for(var af=ac.firstChild;af;af=af.nextSibling){U(af)}var ae=ac.nodeName.toLowerCase();if("br"===ae||"li"===ae){ab[V]="\n";X[V<<1]=Z++;X[(V++<<1)|1]=ac}break;case 3:case 4:var ad=ac.nodeValue;if(ad.length){if(!Y){ad=ad.replace(/[ \t\r\n]+/g," ")}else{ad=ad.replace(/\r\n?/g,"\n")}ab[V]=ad;X[V<<1]=Z;Z+=ad.length;X[(V++<<1)|1]=ac}break}}U(aa);return{sourceCode:ab.join("").replace(/\n$/,""),spans:X}}function C(U,W,Y,V){if(!W){return}var X={sourceCode:W,basePos:U};Y(X);V.push.apply(V,X.decorations)}var w=/\S/;function p(U){var X=undefined;for(var W=U.firstChild;W;W=W.nextSibling){var V=W.nodeType;X=(V===1)?(X?U:W):(V===3)?(w.test(W.nodeValue)?U:X):X}return X===U?undefined:X}function h(W,V){var U={};var X;(function(){var af=W.concat(V);var aj=[];var ai={};for(var ad=0,ab=af.length;ad<ab;++ad){var aa=af[ad];var ae=aa[3];if(ae){for(var ag=ae.length;--ag>=0;){U[ae.charAt(ag)]=aa}}var ah=aa[1];var ac=""+ah;if(!ai.hasOwnProperty(ac)){aj.push(ah);ai[ac]=null}}aj.push(/[\0-\uffff]/);X=l(aj)})();var Z=V.length;var Y=function(aj){var ab=aj.sourceCode,aa=aj.basePos;var af=[aa,G];var ah=0;var ap=ab.match(X)||[];var al={};for(var ag=0,at=ap.length;ag<at;++ag){var ai=ap[ag];var ar=al[ai];var ak=void 0;var ao;if(typeof ar==="string"){ao=false}else{var ac=U[ai.charAt(0)];if(ac){ak=ai.match(ac[1]);ar=ac[0]}else{for(var aq=0;aq<Z;++aq){ac=V[aq];ak=ai.match(ac[1]);if(ak){ar=ac[0];break}}if(!ak){ar=G}}ao=ar.length>=5&&"lang-"===ar.substring(0,5);if(ao&&!(ak&&typeof ak[1]==="string")){ao=false;ar=K}if(!ao){al[ai]=ar}}var ad=ah;ah+=ai.length;if(!ao){af.push(aa+ad,ar)}else{var an=ak[1];var am=ai.indexOf(an);var ae=am+an.length;if(ak[2]){ae=ai.length-ak[2].length;am=ae-an.length}var au=ar.substring(5);C(aa+ad,ai.substring(0,am),Y,af);C(aa+ad+am,an,r(au,an),af);C(aa+ad+ae,ai.substring(ae),Y,af)}}aj.decorations=af};return Y}function i(V){var Y=[],U=[];if(V.tripleQuotedStrings){Y.push([D,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(V.multiLineStrings){Y.push([D,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{Y.push([D,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(V.verbatimStrings){U.push([D,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var ab=V.hashComments;if(ab){if(V.cStyleComments){if(ab>1){Y.push([k,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{Y.push([k,/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}U.push([D,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,null])}else{Y.push([k,/^#[^\r\n]*/,null,"#"])}}if(V.cStyleComments){U.push([k,/^\/\/[^\r\n]*/,null]);U.push([k,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(V.regexLiterals){var aa=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");U.push(["lang-regex",new RegExp("^"+N+"("+aa+")")])}var X=V.types;if(X){U.push([Q,X])}var W=(""+V.keywords).replace(/^ | $/g,"");if(W.length){U.push([A,new RegExp("^(?:"+W.replace(/[\s,]+/g,"|")+")\\b"),null])}Y.push([G,/^\s+/,null," \r\n\t\xA0"]);var Z=/^.[^\s\w\.$@\'\"\`\/\\]*/;U.push([H,/^@[a-z_$][a-z_$@0-9]*/i,null],[Q,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[G,/^[a-z_$][a-z_$@0-9]*/i,null],[H,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[G,/^\\[\s\S]?/,null],[M,Z,null]);return h(Y,U)}var L=i({keywords:B,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function S(W,ah,aa){var V=/(?:^|\s)nocode(?:\s|$)/;var ac=/\r\n?|\n/;var ad=W.ownerDocument;var ag=ad.createElement("li");while(W.firstChild){ag.appendChild(W.firstChild)}var X=[ag];function af(am){switch(am.nodeType){case 1:if(V.test(am.className)){break}if("br"===am.nodeName){ae(am);if(am.parentNode){am.parentNode.removeChild(am)}}else{for(var ao=am.firstChild;ao;ao=ao.nextSibling){af(ao)}}break;case 3:case 4:if(aa){var an=am.nodeValue;var ak=an.match(ac);if(ak){var aj=an.substring(0,ak.index);am.nodeValue=aj;var ai=an.substring(ak.index+ak[0].length);if(ai){var al=am.parentNode;al.insertBefore(ad.createTextNode(ai),am.nextSibling)}ae(am);if(!aj){am.parentNode.removeChild(am)}}}break}}function ae(al){while(!al.nextSibling){al=al.parentNode;if(!al){return}}function aj(am,at){var ar=at?am.cloneNode(false):am;var ap=am.parentNode;if(ap){var aq=aj(ap,1);var ao=am.nextSibling;aq.appendChild(ar);for(var an=ao;an;an=ao){ao=an.nextSibling;aq.appendChild(an)}}return ar}var ai=aj(al.nextSibling,0);for(var ak;(ak=ai.parentNode)&&ak.nodeType===1;){ai=ak}X.push(ai)}for(var Z=0;Z<X.length;++Z){af(X[Z])}if(ah===(ah|0)){X[0].setAttribute("value",ah)}var ab=ad.createElement("ol");ab.className="linenums";var Y=Math.max(0,((ah-1))|0)||0;for(var Z=0,U=X.length;Z<U;++Z){ag=X[Z];ag.className="L"+((Z+Y)%10);if(!ag.firstChild){ag.appendChild(ad.createTextNode("\xA0"))}ab.appendChild(ag)}W.appendChild(ab)}function E(af){var X=/\bMSIE\s(\d+)/.exec(navigator.userAgent);X=X&&+X[1]<=8;var ao=/\n/g;var an=af.sourceCode;var ap=an.length;var Y=0;var ad=af.spans;var V=ad.length;var aj=0;var aa=af.decorations;var ab=aa.length;var ac=0;aa[ab]=ap;var av,at;for(at=av=0;at<ab;){if(aa[at]!==aa[at+2]){aa[av++]=aa[at++];aa[av++]=aa[at++]}else{at+=2}}ab=av;for(at=av=0;at<ab;){var aw=aa[at];var ae=aa[at+1];var Z=at+2;while(Z+2<=ab&&aa[Z+1]===ae){Z+=2}aa[av++]=aw;aa[av++]=ae;at=Z}ab=aa.length=av;var au=af.sourceNode;var ak;if(au){ak=au.style.display;au.style.display="none"}try{var ah=null;while(aj<V){var ai=ad[aj];var U=ad[aj+2]||ap;var ar=aa[ac+2]||ap;var Z=Math.min(U,ar);var am=ad[aj+1];var W;if(am.nodeType!==1&&(W=an.substring(Y,Z))){if(X){W=W.replace(ao,"\r")}am.nodeValue=W;var al=am.ownerDocument;var aq=al.createElement("span");aq.className=aa[ac+1];var ag=am.parentNode;ag.replaceChild(aq,am);aq.appendChild(am);if(Y<U){ad[aj+1]=am=al.createTextNode(an.substring(Z,U));ag.insertBefore(am,aq.nextSibling)}}Y=Z;if(Y>=U){aj+=2}if(Y>=ar){ac+=2}}}finally{if(au){au.style.display=ak}}}var u={};function d(W,X){for(var U=X.length;--U>=0;){var V=X[U];if(!u.hasOwnProperty(V)){u[V]=W}else{if(O.console){console.warn("cannot override language handler %s",V)}}}}function r(V,U){if(!(V&&u.hasOwnProperty(V))){V=/^\s*</.test(U)?"default-markup":"default-code"}return u[V]}d(L,["default-code"]);d(h([],[[G,/^[^<?]+/],[F,/^<!\w[^>]*(?:>|$)/],[k,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[M,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);d(h([[G,/^[\s]+/,null," \t\r\n"],[o,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[n,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[R,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[M,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);d(h([],[[o,/^[\s\S]+/]]),["uq.val"]);d(i({keywords:m,hashComments:true,cStyleComments:true,types:f}),["c","cc","cpp","cxx","cyc","m"]);d(i({keywords:"null,true,false"}),["json"]);d(i({keywords:T,hashComments:true,cStyleComments:true,verbatimStrings:true,types:f}),["cs"]);d(i({keywords:y,cStyleComments:true}),["java"]);d(i({keywords:I,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);d(i({keywords:J,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);d(i({keywords:t,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);d(i({keywords:g,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);d(i({keywords:x,cStyleComments:true,regexLiterals:true}),["js"]);d(i({keywords:s,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);d(h([],[[D,/^[\s\S]+/]]),["regex"]);function e(X){var W=X.langExtension;try{var U=b(X.sourceNode,X.pre);var V=U.sourceCode;X.sourceCode=V;X.spans=U.spans;X.basePos=0;r(W,V)(X);E(X)}catch(Y){if(O.console){console.log(Y&&Y.stack?Y.stack:Y)}}}function z(Y,X,W){var U=document.createElement("pre");U.innerHTML=Y;if(W){S(U,W,true)}var V={langExtension:X,numberLines:W,sourceNode:U,pre:1};e(V);return U.innerHTML}function c(aj){function ab(al){return document.getElementsByTagName(al)}var ah=[ab("pre"),ab("code"),ab("xmp")];var V=[];for(var ae=0;ae<ah.length;++ae){for(var ac=0,Y=ah[ae].length;ac<Y;++ac){V.push(ah[ae][ac])}}ah=null;var Z=Date;if(!Z.now){Z={now:function(){return +(new Date)}}}var aa=0;var U;var af=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ak=/\bprettyprint\b/;var W=/\bprettyprinted\b/;var ag=/pre|xmp/i;var ai=/^code$/i;var ad=/^(?:pre|code|xmp)$/i;function X(){var ar=(O.PR_SHOULD_USE_CONTINUATION?Z.now()+250:Infinity);for(;aa<V.length&&Z.now()<ar;aa++){var at=V[aa];var au=at.className;if(ak.test(au)&&!W.test(au)){var aw=false;for(var ao=at.parentNode;ao;ao=ao.parentNode){var ax=ao.tagName;if(ad.test(ax)&&ao.className&&ak.test(ao.className)){aw=true;break}}if(!aw){at.className+=" prettyprinted";var aq=au.match(af);var am;if(!aq&&(am=p(at))&&ai.test(am.tagName)){aq=am.className.match(af)}if(aq){aq=aq[1]}var ap;if(ag.test(at.tagName)){ap=1}else{var an=at.currentStyle;var al=(an?an.whiteSpace:(document.defaultView&&document.defaultView.getComputedStyle)?document.defaultView.getComputedStyle(at,null).getPropertyValue("white-space"):0);ap=al&&"pre"===al.substring(0,3)}var av=at.className.match(/\blinenums\b(?::(\d+))?/);av=av?av[1]&&av[1].length?+av[1]:true:false;if(av){S(at,av,ap)}U={langExtension:aq,sourceNode:at,numberLines:av,pre:ap};e(U)}}}if(aa<V.length){setTimeout(X,250)}else{if(aj){aj()}}}X()}var a=O.PR={createSimpleLexer:h,registerLangHandler:d,sourceDecorator:i,PR_ATTRIB_NAME:R,PR_ATTRIB_VALUE:o,PR_COMMENT:k,PR_DECLARATION:F,PR_KEYWORD:A,PR_LITERAL:H,PR_NOCODE:P,PR_PLAIN:G,PR_PUNCTUATION:M,PR_SOURCE:K,PR_STRING:D,PR_TAG:n,PR_TYPE:Q,prettyPrintOne:O.prettyPrintOne=z,prettyPrint:O.prettyPrint=c};if(typeof define==="function"&&define.amd){define("google-code-prettify",[],function(){return a})}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);
    \ No newline at end of file
    diff --git a/output/api/classes/CLI.html b/output/api/classes/CLI.html
    new file mode 100644
    index 00000000..a43b2504
    --- /dev/null
    +++ b/output/api/classes/CLI.html
    @@ -0,0 +1,144 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>CLI - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1>CLI Class</h1>
    +<div class="box meta">
    +
    +
    +        <div class="foundat">
    +            Defined in: <a href="../files/lib_cli.js.html#l10"><code>lib&#x2F;cli.js:10</code></a>
    +        </div>
    +
    +            Module: <a href="../modules/yuidoc.html">yuidoc</a>
    +
    +</div>
    +
    +
    +<div class="box intro">
    +    <p>Parses the arguments, creates the options and passes them to <code>Y.YUIDoc</code> and then <code>Y.DocBuilder</code>.</p>
    +
    +</div>
    +
    +
    +<div id="classdocs" class="tabview">
    +    <ul class="api-class-tabs">
    +        <li class="api-class-tab index"><a href="#index">Index</a></li>
    +
    +    </ul>
    +
    +    <div>
    +        <div id="index" class="api-class-tabpanel index">
    +            <h2 class="off-left">Item Index</h2>
    +
    +
    +
    +
    +        </div>
    +
    +
    +
    +
    +    </div>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/classes/DocBuilder.html b/output/api/classes/DocBuilder.html
    new file mode 100644
    index 00000000..8a329f5f
    --- /dev/null
    +++ b/output/api/classes/DocBuilder.html
    @@ -0,0 +1,2623 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>DocBuilder - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1>DocBuilder Class</h1>
    +<div class="box meta">
    +
    +
    +        <div class="foundat">
    +            Defined in: <a href="../files/lib_builder.js.html#l15"><code>lib&#x2F;builder.js:15</code></a>
    +        </div>
    +
    +            Module: <a href="../modules/yuidoc.html">yuidoc</a>
    +
    +</div>
    +
    +
    +<div class="box intro">
    +    <p>Takes the <code>JSON</code> data from the <code>DocParser</code> class, creates and parses markdown and handlebars
    +based templates to generate static HTML content</p>
    +
    +</div>
    +
    +
    +<div id="classdocs" class="tabview">
    +    <ul class="api-class-tabs">
    +        <li class="api-class-tab index"><a href="#index">Index</a></li>
    +
    +            <li class="api-class-tab methods"><a href="#methods">Methods</a></li>
    +            <li class="api-class-tab properties"><a href="#properties">Properties</a></li>
    +    </ul>
    +
    +    <div>
    +        <div id="index" class="api-class-tabpanel index">
    +            <h2 class="off-left">Item Index</h2>
    +
    +                <div class="index-section methods">
    +                    <h3>Methods</h3>
    +
    +                    <ul class="index-list methods">
    +                            <li class="index-item method">
    +                                <a href="#method__addHelpers">_addHelpers</a>
    +
    +                            </li>
    +                            <li class="index-item method private">
    +                                <a href="#method__inlineCode">_inlineCode</a>
    +
    +                            </li>
    +                            <li class="index-item method private">
    +                                <a href="#method__mixExternal">_mixExternal</a>
    +
    +                            </li>
    +                            <li class="index-item method private">
    +                                <a href="#method__parseCode">_parseCode</a>
    +
    +                            </li>
    +                            <li class="index-item method private">
    +                                <a href="#method__parseCrossLink">_parseCrossLink</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_addFoundAt">addFoundAt</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_augmentData">augmentData</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_compile">compile</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_filterFileName">filterFileName</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_getProjectMeta">getProjectMeta</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_hasProperty">hasProperty</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_makeDirs">makeDirs</a>
    +
    +                            </li>
    +                            <li class="index-item method private">
    +                                <a href="#method_markdown">markdown</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_mergeExtends">mergeExtends</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_mixExternal">mixExternal</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_nameSort">nameSort</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_populateClasses">populateClasses</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_populateElements">populateElements</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_populateFiles">populateFiles</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_populateModules">populateModules</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_render">render</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_renderAPIMeta">renderAPIMeta</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_renderClass">renderClass</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_renderElement">renderElement</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_renderFile">renderFile</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_renderIndex">renderIndex</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_renderModule">renderModule</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_writeAPIMeta">writeAPIMeta</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_writeComponents">writeComponents</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_writeFiles">writeFiles</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_writeIndex">writeIndex</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_writeModules">writeModules</a>
    +
    +                            </li>
    +                    </ul>
    +                </div>
    +
    +                <div class="index-section properties">
    +                    <h3>Properties</h3>
    +
    +                    <ul class="index-list properties">
    +                            <li class="index-item property private">
    +                                <a href="#property__mergeCounter">_mergeCounter</a>
    +
    +                            </li>
    +                            <li class="index-item property private">
    +                                <a href="#property__meta">_meta</a>
    +
    +                            </li>
    +                            <li class="index-item property">
    +                                <a href="#property_files">files</a>
    +
    +                            </li>
    +                    </ul>
    +                </div>
    +
    +
    +        </div>
    +
    +            <div id="methods" class="api-class-tabpanel">
    +                <h2 class="off-left">Methods</h2>
    +
    +<div id="method__addHelpers" class="method item">
    +    <h3 class="name"><code>_addHelpers</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>helpers</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l126"><code>lib&#x2F;builder.js:126</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Register a <code>Y.Handlebars</code> helper method</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">helpers</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Object containing a hash of names and functions</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method__inlineCode" class="method item private">
    +    <h3 class="name"><code>_inlineCode</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>html</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type">HTML</span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l768"><code>lib&#x2F;builder.js:768</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Ported from <a href="https://github.com/rgrove/selleck">Selleck</a>, this handles <code>&#x60;</code>'s in fields
    +that are not parsed by the <strong>Markdown</strong> parser.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">html</code>
    +                        <span class="type">HTML</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The HTML to parse</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type">HTML</span>:
    +                    <p>The parsed HTML</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__mixExternal" class="method item private">
    +    <h3 class="name"><code>_mixExternal</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l297"><code>lib&#x2F;builder.js:297</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Mixes the various external data soures together into the local data, augmenting
    +it with flags.</p>
    +
    +    </div>
    +
    +
    +
    +
    +</div>
    +<div id="method__parseCode" class="method item private">
    +    <h3 class="name"><code>_parseCode</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>html</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type">HTML</span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l755"><code>lib&#x2F;builder.js:755</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Parses <code>&lt;pre&gt;&lt;code&gt;</code> tags and adds the <strong>prettyprint</strong> <code>className</code> to them</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">html</code>
    +                        <span class="type">HTML</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The HTML to parse</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type">HTML</span>:
    +                    <p>The parsed HTML</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__parseCrossLink" class="method item private">
    +    <h3 class="name"><code>_parseCrossLink</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>item</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[raw=false]</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[content]</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l169"><code>lib&#x2F;builder.js:169</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Parse the item to be cross linked and return an HREF linked to the item</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">item</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The item to crossLink</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[raw=false]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Do not wrap it in HTML</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[content]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>crossLink helper content</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_addFoundAt" class="method item">
    +    <h3 class="name"><code>addFoundAt</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>a</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l626"><code>lib&#x2F;builder.js:626</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Parses file and line number from an item object and build's an HREF</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">a</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The item to parse</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>:
    +                    <p>The parsed HREF</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_augmentData" class="method item">
    +    <h3 class="name"><code>augmentData</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>o</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l642"><code>lib&#x2F;builder.js:642</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Augments the <strong>DocParser</strong> meta data to provide default values for certain keys as well as parses all descriptions
    +with the <code>Markdown Parser</code></p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">o</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The object to recurse and augment</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    <p>The augmented object</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_compile" class="method item">
    +    <h3 class="name"><code>compile</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>cb</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l1738"><code>lib&#x2F;builder.js:1738</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Compiles the templates from the meta-data provided by DocParser</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">cb</code>
    +                        <span class="type">Callback</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The callback to execute after it's completed</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_filterFileName" class="method item">
    +    <h3 class="name"><code>filterFileName</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>f</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l1725"><code>lib&#x2F;builder.js:1725</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Normalizes a file path to a writable filename:</p>
    +<p>var path = 'lib/file.js';
    +returns 'lib_file.js';</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">f</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The filename to normalize</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>:
    +                    <p>The filtered file path</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_getProjectMeta" class="method item">
    +    <h3 class="name"><code>getProjectMeta</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l434"><code>lib&#x2F;builder.js:434</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Prep the meta data to be fed to Selleck</p>
    +
    +    </div>
    +
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    <p>The project metadata</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_hasProperty" class="method item">
    +    <h3 class="name"><code>hasProperty</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>a</code>
    +                </li>
    +                <li class="arg">
    +                        <code>b</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l1056"><code>lib&#x2F;builder.js:1056</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Checks an array of items (class items) to see if an item is in that list</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">a</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="crosslink external external" target="_blank">Array</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The Array of items to check</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">b</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The object to find</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                    <p>Boolean</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_makeDirs" class="method item">
    +    <h3 class="name"><code>makeDirs</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>cb</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l702"><code>lib&#x2F;builder.js:702</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Makes the default directories needed</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">cb</code>
    +                        <span class="type">Callback</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The callback to execute after it's completed</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_markdown" class="method item private">
    +    <h3 class="name"><code>markdown</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>data</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type">HTML</span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l144"><code>lib&#x2F;builder.js:144</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Wrapper around the Markdown parser so it can be normalized or even side stepped</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">data</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The Markdown string to parse</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type">HTML</span>:
    +                    <p>The rendered HTML</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_mergeExtends" class="method item">
    +    <h3 class="name"><code>mergeExtends</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>info</code>
    +                </li>
    +                <li class="arg">
    +                        <code>classItems</code>
    +                </li>
    +                <li class="arg">
    +                        <code>first</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l1080"><code>lib&#x2F;builder.js:1080</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Merge superclass data into a child class</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">info</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The item to extend</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">classItems</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="crosslink external external" target="_blank">Array</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The list of items to merge in</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">first</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Set for the first call</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_mixExternal" class="method item">
    +    <h3 class="name"><code>mixExternal</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>cb</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +        <span class="flag async">async</span>
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l345"><code>lib&#x2F;builder.js:345</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Fetches the remote data and fires the callback when it's all complete</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">cb</code>
    +                        <span class="type">Callback</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The callback to execute when complete</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_nameSort" class="method item">
    +    <h3 class="name"><code>nameSort</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>a</code>
    +                </li>
    +                <li class="arg">
    +                        <code>b</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/Number.html" class="crosslink external" target="_blank">Number</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l1546"><code>lib&#x2F;builder.js:1546</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Sort method of array of objects with a property called <strong>name</strong></p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">a</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>First object to compare</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">b</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Second object to compare</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/Number.html" class="crosslink external" target="_blank">Number</a></span>:
    +                    <p>1, -1 or 0 for sorting.</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_populateClasses" class="method item">
    +    <h3 class="name"><code>populateClasses</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>opts</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l477"><code>lib&#x2F;builder.js:477</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Populate the meta data for classes</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">opts</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The original options</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    <p>The modified options</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_populateElements" class="method item">
    +    <h3 class="name"><code>populateElements</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>opts</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l501"><code>lib&#x2F;builder.js:501</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Populate the meta data for elements</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">opts</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The original options</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    <p>The modified options</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_populateFiles" class="method item">
    +    <h3 class="name"><code>populateFiles</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>opts</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l569"><code>lib&#x2F;builder.js:569</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Populate the meta data for files</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">opts</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The original options</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    <p>The modified options</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_populateModules" class="method item">
    +    <h3 class="name"><code>populateModules</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>opts</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l523"><code>lib&#x2F;builder.js:523</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Populate the meta data for modules</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">opts</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The original options</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    <p>The modified options</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_render" class="method item">
    +    <h3 class="name"><code>render</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>source</code>
    +                </li>
    +                <li class="arg">
    +                        <code>view</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[layout=null]</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[partials={}]</code>
    +                </li>
    +                <li class="arg">
    +                        <code>callback</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l787"><code>lib&#x2F;builder.js:787</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Ported from <a href="https://github.com/rgrove/selleck">Selleck</a>
    +Renders the handlebars templates with the default View class.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">source</code>
    +                        <span class="type">HTML</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The default template to parse</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">view</code>
    +                        <span class="type">Class</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The default view handler</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[layout=null]</code>
    +                        <span class="type">HTML</span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The HTML from the layout to use.</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[partials={}]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>List of partials to include in this template</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">callback</code>
    +                        <span class="type">Callback</span>
    +
    +
    +                    <div class="param-description">
    +                         
    +                    </div>
    +
    +                        <ul class="params-list">
    +                            <li class="param">
    +                                    <code class="param-name">err</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error" class="crosslink external" target="_blank">Error</a></span>
    +
    +                                <div class="param-description">
    +                                    
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name">html</code>
    +                                    <span class="type">HTML</span>
    +
    +                                <div class="param-description">
    +                                    <p>The assembled template markup</p>
    +
    +                                </div>
    +
    +                            </li>
    +                        </ul>
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_renderAPIMeta" class="method item">
    +    <h3 class="name"><code>renderAPIMeta</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>cb</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +        <span class="flag async">async</span>
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l1691"><code>lib&#x2F;builder.js:1691</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Render the API meta and return the JavaScript</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">cb</code>
    +                        <span class="type">Callback</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The callback</p>
    +
    +                    </div>
    +
    +                        <ul class="params-list">
    +                            <li class="param">
    +                                    <code class="param-name">apijs</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The JavaScript code to write API meta data</p>
    +
    +                                </div>
    +
    +                            </li>
    +                        </ul>
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_renderClass" class="method item">
    +    <h3 class="name"><code>renderClass</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>cb</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l1132"><code>lib&#x2F;builder.js:1132</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Render the class file</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">cb</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="crosslink external" target="_blank">Function</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The callback fired when complete</p>
    +
    +                    </div>
    +
    +                        <ul class="params-list">
    +                            <li class="param">
    +                                    <code class="param-name">html</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The HTML to render this view</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name">view</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The View Data</p>
    +
    +                                </div>
    +
    +                            </li>
    +                        </ul>
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_renderElement" class="method item">
    +    <h3 class="name"><code>renderElement</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>cb</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l1425"><code>lib&#x2F;builder.js:1425</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Render the element file</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">cb</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="crosslink external" target="_blank">Function</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The callback fired when complete</p>
    +
    +                    </div>
    +
    +                        <ul class="params-list">
    +                            <li class="param">
    +                                    <code class="param-name">html</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The HTML to render this view</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name">view</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The View Data</p>
    +
    +                                </div>
    +
    +                            </li>
    +                        </ul>
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_renderFile" class="method item">
    +    <h3 class="name"><code>renderFile</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>cb</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l1619"><code>lib&#x2F;builder.js:1619</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Render the source file</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">cb</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="crosslink external" target="_blank">Function</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The callback fired when complete</p>
    +
    +                    </div>
    +
    +                        <ul class="params-list">
    +                            <li class="param">
    +                                    <code class="param-name">html</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The HTML to render this view</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name">view</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The View Data</p>
    +
    +                                </div>
    +
    +                            </li>
    +                        </ul>
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_renderIndex" class="method item">
    +    <h3 class="name"><code>renderIndex</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>cb</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l843"><code>lib&#x2F;builder.js:843</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Render the index file</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">cb</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="crosslink external" target="_blank">Function</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The callback fired when complete</p>
    +
    +                    </div>
    +
    +                        <ul class="params-list">
    +                            <li class="param">
    +                                    <code class="param-name">html</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The HTML to render this view</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name">view</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The View Data</p>
    +
    +                                </div>
    +
    +                            </li>
    +                        </ul>
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_renderModule" class="method item">
    +    <h3 class="name"><code>renderModule</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>cb</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l905"><code>lib&#x2F;builder.js:905</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Render a module</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">cb</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="crosslink external" target="_blank">Function</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The callback fired when complete</p>
    +
    +                    </div>
    +
    +                        <ul class="params-list">
    +                            <li class="param">
    +                                    <code class="param-name">html</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The HTML to render this view</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name">view</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The View Data</p>
    +
    +                                </div>
    +
    +                            </li>
    +                        </ul>
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_writeAPIMeta" class="method item">
    +    <h3 class="name"><code>writeAPIMeta</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>cb</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +        <span class="flag async">async</span>
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l1678"><code>lib&#x2F;builder.js:1678</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Write the API meta data used for the AutoComplete widget</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">cb</code>
    +                        <span class="type">Callback</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The callback to execute when complete</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_writeComponents" class="method item">
    +    <h3 class="name"><code>writeComponents</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>type</code>
    +                </li>
    +                <li class="arg">
    +                        <code>cb</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l1502"><code>lib&#x2F;builder.js:1502</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Generates the class or element files under &quot;out&quot;/classes/ or &quot;out&quot;/elements/</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">type</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The component type, &quot;classes&quot; or &quot;elements&quot;</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">cb</code>
    +                        <span class="type">Callback</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The callback to execute after it's completed</p>
    +
    +                    </div>
    +
    +                        <ul class="params-list">
    +                            <li class="param">
    +                                    <code class="param-name">html</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The HTML to write class view</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name">view</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The View Data</p>
    +
    +                                </div>
    +
    +                            </li>
    +                        </ul>
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_writeFiles" class="method item">
    +    <h3 class="name"><code>writeFiles</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>cb</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l1569"><code>lib&#x2F;builder.js:1569</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Generates the syntax files under <code>&quot;out&quot;/files/</code></p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">cb</code>
    +                        <span class="type">Callback</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The callback to execute after it's completed</p>
    +
    +                    </div>
    +
    +                        <ul class="params-list">
    +                            <li class="param">
    +                                    <code class="param-name">html</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The HTML to write file view</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name">view</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The View Data</p>
    +
    +                                </div>
    +
    +                            </li>
    +                        </ul>
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_writeIndex" class="method item">
    +    <h3 class="name"><code>writeIndex</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>cb</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l879"><code>lib&#x2F;builder.js:879</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Generates the index.html file</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">cb</code>
    +                        <span class="type">Callback</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The callback to execute after it's completed</p>
    +
    +                    </div>
    +
    +                        <ul class="params-list">
    +                            <li class="param">
    +                                    <code class="param-name">html</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The HTML to write index view</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name">view</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The View Data</p>
    +
    +                                </div>
    +
    +                            </li>
    +                        </ul>
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_writeModules" class="method item">
    +    <h3 class="name"><code>writeModules</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>cb</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l1013"><code>lib&#x2F;builder.js:1013</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Generates the module files under &quot;out&quot;/modules/</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">cb</code>
    +                        <span class="type">Callback</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The callback to execute after it's completed</p>
    +
    +                    </div>
    +
    +                        <ul class="params-list">
    +                            <li class="param">
    +                                    <code class="param-name">html</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The HTML to write module view</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name">view</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The View Data</p>
    +
    +                                </div>
    +
    +                            </li>
    +                        </ul>
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +            </div>
    +
    +            <div id="properties" class="api-class-tabpanel">
    +                <h2 class="off-left">Properties</h2>
    +
    +<div id="property__mergeCounter" class="property item private">
    +    <h3 class="name"><code>_mergeCounter</code></h3>
    +    <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/Number.html" class="crosslink external" target="_blank">Number</a></span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l1073"><code>lib&#x2F;builder.js:1073</code></a>
    +        </p>
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Counter for stepping into merges</p>
    +
    +    </div>
    +
    +
    +
    +</div>
    +<div id="property__meta" class="property item private">
    +    <h3 class="name"><code>_meta</code></h3>
    +    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l427"><code>lib&#x2F;builder.js:427</code></a>
    +        </p>
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Holder for project meta data</p>
    +
    +    </div>
    +
    +
    +
    +</div>
    +<div id="property_files" class="property item">
    +    <h3 class="name"><code>files</code></h3>
    +    <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/Number.html" class="crosslink external" target="_blank">Number</a></span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_builder.js.html#l421"><code>lib&#x2F;builder.js:421</code></a>
    +        </p>
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>File counter</p>
    +
    +    </div>
    +
    +
    +
    +</div>
    +            </div>
    +
    +
    +    </div>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/classes/DocParser.html b/output/api/classes/DocParser.html
    new file mode 100644
    index 00000000..e76e359f
    --- /dev/null
    +++ b/output/api/classes/DocParser.html
    @@ -0,0 +1,8032 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>DocParser - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1>DocParser Class</h1>
    +<div class="box meta">
    +
    +        <div class="extends">
    +            Extends <a href="http://yuilibrary.com/yui/docs/api/classes/Base.html" class="crosslink external" target="_blank">Base</a>
    +        </div>
    +
    +        <div class="foundat">
    +            Defined in: <a href="../files/lib_docparser.js.html#l794"><code>lib&#x2F;docparser.js:794</code></a>
    +        </div>
    +
    +            Module: <a href="../modules/yuidoc.html">yuidoc</a>
    +
    +</div>
    +
    +
    +<div class="box intro">
    +    <p>The doc parser accepts a <strong>map</strong> of files to file content.
    +Once <code>parse()</code> is called, various properties will be populated
    +with the parsers data (aggregated in the <code>'data'</code> property).</p>
    +
    +</div>
    +
    +    <div class="constructor">
    +        <h2>Constructor</h2>
    +<div id="method_DocParser" class="method item">
    +    <h3 class="name"><code>DocParser</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>o</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_docparser.js.html#l794"><code>lib&#x2F;docparser.js:794</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">o</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>the config object</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +    </div>
    +
    +<div id="classdocs" class="tabview">
    +    <ul class="api-class-tabs">
    +        <li class="api-class-tab index"><a href="#index">Index</a></li>
    +
    +            <li class="api-class-tab methods"><a href="#methods">Methods</a></li>
    +            <li class="api-class-tab properties"><a href="#properties">Properties</a></li>
    +            <li class="api-class-tab attrs"><a href="#attrs">Attributes</a></li>
    +            <li class="api-class-tab events"><a href="#events">Events</a></li>
    +    </ul>
    +
    +    <div>
    +        <div id="index" class="api-class-tabpanel index">
    +            <h2 class="off-left">Item Index</h2>
    +
    +                <div class="index-section methods">
    +                    <h3>Methods</h3>
    +
    +                    <ul class="index-list methods extends">
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__addAttrs">_addAttrs</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__addLazyAttr">_addLazyAttr</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__addOutOfOrder">_addOutOfOrder</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__aggregateAttrs">_aggregateAttrs</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__attrCfgHash">_attrCfgHash</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__baseDestroy">_baseDestroy</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__baseInit">_baseInit</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__cloneDefaultValue">_cloneDefaultValue</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__defAttrChangeFn">_defAttrChangeFn</a>
    +
    +                            </li>
    +                            <li class="index-item method protected inherited">
    +                                <a href="#method__defDestroyFn">_defDestroyFn</a>
    +
    +                            </li>
    +                            <li class="index-item method protected inherited">
    +                                <a href="#method__defInitFn">_defInitFn</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__destroyHierarchy">_destroyHierarchy</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__filterAdHocAttrs">_filterAdHocAttrs</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__fireAttrChange">_fireAttrChange</a>
    +
    +                            </li>
    +                            <li class="index-item method protected inherited">
    +                                <a href="#method__getAttr">_getAttr</a>
    +
    +                            </li>
    +                            <li class="index-item method protected inherited">
    +                                <a href="#method__getAttrCfg">_getAttrCfg</a>
    +
    +                            </li>
    +                            <li class="index-item method protected inherited">
    +                                <a href="#method__getAttrCfgs">_getAttrCfgs</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__getAttrInitVal">_getAttrInitVal</a>
    +
    +                            </li>
    +                            <li class="index-item method protected inherited">
    +                                <a href="#method__getAttrs">_getAttrs</a>
    +
    +                            </li>
    +                            <li class="index-item method protected inherited">
    +                                <a href="#method__getClasses">_getClasses</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__getFullType">_getFullType</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__getInstanceAttrCfgs">_getInstanceAttrCfgs</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__getStateVal">_getStateVal</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__getType">_getType</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__hasPotentialSubscribers">_hasPotentialSubscribers</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__initAttrHost">_initAttrHost</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited inherited">
    +                                <a href="#method__initAttribute">_initAttribute</a>
    +
    +                            </li>
    +                            <li class="index-item method protected inherited">
    +                                <a href="#method__initAttrs">_initAttrs</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__initBase">_initBase</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__initHierarchy">_initHierarchy</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__initHierarchyData">_initHierarchyData</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__isLazyAttr">_isLazyAttr</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__monitor">_monitor</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__normAttrVals">_normAttrVals</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__parseType">_parseType</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__preInitEventCfg">_preInitEventCfg</a>
    +
    +                            </li>
    +                            <li class="index-item method protected deprecated inherited">
    +                                <a href="#method__protectAttrs">_protectAttrs</a>
    +
    +                                    <span class="flag deprecated">deprecated</span>
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__publish">_publish</a>
    +
    +                            </li>
    +                            <li class="index-item method private">
    +                                <a href="#method__resolveFor">_resolveFor</a>
    +
    +                            </li>
    +                            <li class="index-item method protected inherited inherited">
    +                                <a href="#method__set">_set</a>
    +
    +                            </li>
    +                            <li class="index-item method protected inherited">
    +                                <a href="#method__setAttr">_setAttr</a>
    +
    +                            </li>
    +                            <li class="index-item method protected inherited inherited">
    +                                <a href="#method__setAttrs">_setAttrs</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__setAttrVal">_setAttrVal</a>
    +
    +                            </li>
    +                            <li class="index-item method private inherited">
    +                                <a href="#method__setStateVal">_setStateVal</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_addAttr">addAttr</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_addAttrs">addAttrs</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_addTarget">addTarget</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_after">after</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_attrAdded">attrAdded</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_before">before</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_bubble">bubble</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited inherited">
    +                                <a href="#method_destroy">destroy</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_detach">detach</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_detachAll">detachAll</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_extract">extract</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_fire">fire</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_get">get</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_getAttrs">getAttrs</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_getEvent">getEvent</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_getTargets">getTargets</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_handlecomment">handlecomment</a>
    +
    +                            </li>
    +                            <li class="index-item method private">
    +                                <a href="#method_implodeString">implodeString</a>
    +
    +                            </li>
    +                            <li class="index-item method private">
    +                                <a href="#method_implodeString">implodeString</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited inherited">
    +                                <a href="#method_init">init</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_modifyAttr">modifyAttr</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_on">on</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_once">once</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_onceAfter">onceAfter</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_parse">parse</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_parseType">parseType</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_processblock">processblock</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_publish">publish</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_removeAttr">removeAttr</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_removeTarget">removeTarget</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_reset">reset</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited inherited">
    +                                <a href="#method_set">set</a>
    +
    +                            </li>
    +                            <li class="index-item method inherited inherited">
    +                                <a href="#method_setAttrs">setAttrs</a>
    +
    +                            </li>
    +                            <li class="index-item method private">
    +                                <a href="#method_stringlog">stringlog</a>
    +
    +                            </li>
    +                            <li class="index-item method deprecated inherited">
    +                                <a href="#method_subscribe">subscribe</a>
    +
    +                                    <span class="flag deprecated">deprecated</span>
    +                            </li>
    +                            <li class="index-item method inherited">
    +                                <a href="#method_toString">toString</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_transform">transform</a>
    +
    +                            </li>
    +                            <li class="index-item method private">
    +                                <a href="#method_unindent">unindent</a>
    +
    +                            </li>
    +                            <li class="index-item method deprecated inherited">
    +                                <a href="#method_unsubscribe">unsubscribe</a>
    +
    +                                    <span class="flag deprecated">deprecated</span>
    +                            </li>
    +                            <li class="index-item method deprecated inherited">
    +                                <a href="#method_unsubscribeAll">unsubscribeAll</a>
    +
    +                                    <span class="flag deprecated">deprecated</span>
    +                            </li>
    +                    </ul>
    +                </div>
    +
    +                <div class="index-section properties">
    +                    <h3>Properties</h3>
    +
    +                    <ul class="index-list properties extends">
    +                            <li class="index-item property protected inherited">
    +                                <a href="#property__allowAdHocAttrs">_allowAdHocAttrs</a>
    +
    +                            </li>
    +                            <li class="index-item property">
    +                                <a href="#property_CORRECTIONS">CORRECTIONS</a>
    +
    +                            </li>
    +                            <li class="index-item property">
    +                                <a href="#property_DIGESTERS">DIGESTERS</a>
    +
    +                            </li>
    +                            <li class="index-item property">
    +                                <a href="#property_IGNORE_TAGLIST">IGNORE_TAGLIST</a>
    +
    +                            </li>
    +                            <li class="index-item property deprecated inherited">
    +                                <a href="#property_name">name</a>
    +
    +                                    <span class="flag deprecated">deprecated</span>
    +                            </li>
    +                            <li class="index-item property">
    +                                <a href="#property_TAGLIST">TAGLIST</a>
    +
    +                            </li>
    +                    </ul>
    +                </div>
    +
    +                <div class="index-section attrs">
    +                    <h3>Attributes</h3>
    +
    +                    <ul class="index-list attrs extends">
    +                            <li class="index-item attr">
    +                                <a href="#attr_currentclass">currentclass</a>
    +                            </li>
    +                            <li class="index-item attr">
    +                                <a href="#attr_currentelement">currentelement</a>
    +                            </li>
    +                            <li class="index-item attr">
    +                                <a href="#attr_currentfile">currentfile</a>
    +                            </li>
    +                            <li class="index-item attr">
    +                                <a href="#attr_currentmodule">currentmodule</a>
    +                            </li>
    +                            <li class="index-item attr">
    +                                <a href="#attr_currentsubmodule">currentsubmodule</a>
    +                            </li>
    +                            <li class="index-item attr inherited">
    +                                <a href="#attr_destroyed">destroyed</a>
    +                            </li>
    +                            <li class="index-item attr">
    +                                <a href="#attr_digesters">digesters</a>
    +                            </li>
    +                            <li class="index-item attr">
    +                                <a href="#attr_dirmap">dirmap</a>
    +                            </li>
    +                            <li class="index-item attr">
    +                                <a href="#attr_emitters">emitters</a>
    +                            </li>
    +                            <li class="index-item attr">
    +                                <a href="#attr_filemap">filemap</a>
    +                            </li>
    +                            <li class="index-item attr inherited">
    +                                <a href="#attr_initialized">initialized</a>
    +                            </li>
    +                            <li class="index-item attr">
    +                                <a href="#attr_mainmodule">mainmodule</a>
    +                            </li>
    +                            <li class="index-item attr">
    +                                <a href="#attr_syntaxtype">syntaxtype</a>
    +                            </li>
    +                    </ul>
    +                </div>
    +
    +                <div class="index-section events">
    +                    <h3>Events</h3>
    +
    +                    <ul class="index-list events extends">
    +                            <li class="index-item event inherited">
    +                                <a href="#event_destroy">destroy</a>
    +
    +                            </li>
    +                            <li class="index-item event inherited">
    +                                <a href="#event_init">init</a>
    +
    +                            </li>
    +                    </ul>
    +                </div>
    +        </div>
    +
    +            <div id="methods" class="api-class-tabpanel">
    +                <h2 class="off-left">Methods</h2>
    +
    +<div id="method__addAttrs" class="method item private inherited">
    +    <h3 class="name"><code>_addAttrs</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>cfgs</code>
    +                </li>
    +                <li class="arg">
    +                        <code>values</code>
    +                </li>
    +                <li class="arg">
    +                        <code>lazy</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method__addAttrs">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l854"><code>attribute&#x2F;js&#x2F;AttributeCore.js:854</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Implementation behind the public addAttrs method.
    +
    +This method is invoked directly by get if it encounters a scenario
    +in which an attribute's valueFn attempts to obtain the
    +value an attribute in the same group of attributes, which has not yet
    +been added (on demand initialization).
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">cfgs</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        An object with attribute name/configuration pairs.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">values</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        An object with attribute name/value pairs, defining the initial values to apply.
    +Values defined in the cfgs argument will be over-written by values in this argument unless defined as read only.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">lazy</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +
    +
    +                    <div class="param-description">
    +                        Whether or not to delay the intialization of these attributes until the first call to get/set.
    +Individual attributes can over-ride this behavior by defining a lazyAdd configuration property in their configuration.
    +See <a href="#method_addAttr">addAttr</a>.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method__addLazyAttr" class="method item private inherited">
    +    <h3 class="name"><code>_addLazyAttr</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>name</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[lazyCfg]</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method__addLazyAttr">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l360"><code>attribute&#x2F;js&#x2F;AttributeCore.js:360</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Finishes initializing an attribute which has been lazily added.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">name</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The name of the attribute
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[lazyCfg]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        Optional config hash for the attribute. This is added for performance
    +along the critical path, where the calling method has already obtained lazy config from state.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method__addOutOfOrder" class="method item private inherited">
    +    <h3 class="name"><code>_addOutOfOrder</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>name</code>
    +                </li>
    +                <li class="arg">
    +                        <code>cfg</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method__addOutOfOrder">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l527"><code>attribute&#x2F;js&#x2F;AttributeCore.js:527</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Utility method used by get/set to add attributes
    +encountered out of order when calling addAttrs().
    +
    +For example, if:
    +
    +    this.addAttrs({
    +         foo: {
    +             setter: function() {
    +                // make sure this bar is available when foo is added
    +                this.get("bar");
    +             }
    +         },
    +         bar: {
    +             value: ...
    +         }
    +    });
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">name</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        attribute name
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">cfg</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        attribute configuration
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method__aggregateAttrs" class="method item private inherited">
    +    <h3 class="name"><code>_aggregateAttrs</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>allAttrs</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html#method__aggregateAttrs">BaseCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l618"><code>base&#x2F;js&#x2F;BaseCore.js:618</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        A helper method, used by _initHierarchyData to aggregate
    +attribute configuration across the instances class hierarchy.
    +
    +The method will protect the attribute configuration value to protect the statically defined
    +default value in ATTRS if required (if the value is an object literal, array or the
    +attribute configuration has cloneDefaultValue set to shallow or deep).
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">allAttrs</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="crosslink external external" target="_blank">Array</a></span>
    +
    +
    +                    <div class="param-description">
    +                        An array of ATTRS definitions across classes in the hierarchy
    +(subclass first, Base last)
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    The aggregate set of ATTRS definitions for the instance
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__attrCfgHash" class="method item private inherited">
    +    <h3 class="name"><code>_attrCfgHash</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html#method__attrCfgHash">BaseCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l581"><code>base&#x2F;js&#x2F;BaseCore.js:581</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Utility method to define the attribute hash used to filter/whitelist property mixes for
    +this class for iteration performance reasons.
    +    </div>
    +
    +
    +
    +
    +</div>
    +<div id="method__baseDestroy" class="method item private inherited">
    +    <h3 class="name"><code>_baseDestroy</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html#method__baseDestroy">BaseCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l364"><code>base&#x2F;js&#x2F;BaseCore.js:364</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Internal destroy implementation for BaseCore
    +    </div>
    +
    +
    +
    +
    +</div>
    +<div id="method__baseInit" class="method item private inherited">
    +    <h3 class="name"><code>_baseInit</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html#method__baseInit">BaseCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l336"><code>base&#x2F;js&#x2F;BaseCore.js:336</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Internal initialization implementation for BaseCore
    +    </div>
    +
    +
    +
    +
    +</div>
    +<div id="method__cloneDefaultValue" class="method item private inherited">
    +    <h3 class="name"><code>_cloneDefaultValue</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>cfg</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html#method__cloneDefaultValue">BaseCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l592"><code>base&#x2F;js&#x2F;BaseCore.js:592</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        This method assumes that the value has already been checked to be an object.
    +Since it's on a critical path, we don't want to re-do the check.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">cfg</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                         
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method__defAttrChangeFn" class="method item private inherited">
    +    <h3 class="name"><code>_defAttrChangeFn</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>e</code>
    +                </li>
    +                <li class="arg">
    +                        <code>eventFastPath</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeObservable.html#method__defAttrChangeFn">AttributeObservable</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeObservable.js.html#l185"><code>attribute&#x2F;js&#x2F;AttributeObservable.js:185</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Default function for attribute change events.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">e</code>
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventFacade.html" class="crosslink external" target="_blank">EventFacade</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The event object for attribute change events.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">eventFastPath</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +
    +
    +                    <div class="param-description">
    +                        Whether or not we're using this as a fast path in the case of no listeners or not
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method__defDestroyFn" class="method item protected inherited">
    +    <h3 class="name"><code>_defDestroyFn</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>e</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +        <span class="flag protected">protected</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/BaseObservable.html#method__defDestroyFn">BaseObservable</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseObservable.js.html#l202"><code>base&#x2F;js&#x2F;BaseObservable.js:202</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Default destroy event handler
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">e</code>
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventFacade.html" class="crosslink external" target="_blank">EventFacade</a></span>
    +
    +
    +                    <div class="param-description">
    +                        Event object
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method__defInitFn" class="method item protected inherited">
    +    <h3 class="name"><code>_defInitFn</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>e</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +        <span class="flag protected">protected</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/BaseObservable.html#method__defInitFn">BaseObservable</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseObservable.js.html#l190"><code>base&#x2F;js&#x2F;BaseObservable.js:190</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Default init event handler
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">e</code>
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventFacade.html" class="crosslink external" target="_blank">EventFacade</a></span>
    +
    +
    +                    <div class="param-description">
    +                        Event object, with a cfg property which
    +refers to the configuration object passed to the constructor.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method__destroyHierarchy" class="method item private inherited">
    +    <h3 class="name"><code>_destroyHierarchy</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html#method__destroyHierarchy">BaseCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l782"><code>base&#x2F;js&#x2F;BaseCore.js:782</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Destroys the class hierarchy for this instance by invoking
    +the destructor method on the prototype of each class in the hierarchy.
    +    </div>
    +
    +
    +
    +
    +</div>
    +<div id="method__filterAdHocAttrs" class="method item private inherited">
    +    <h3 class="name"><code>_filterAdHocAttrs</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>allAttrs</code>
    +                </li>
    +                <li class="arg">
    +                        <code>userVals</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html#method__filterAdHocAttrs">BaseCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l470"><code>base&#x2F;js&#x2F;BaseCore.js:470</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">allAttrs</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The set of all attribute configurations for this instance.
    +Attributes will be removed from this set, if they belong to the filtered class, so
    +that by the time all classes are processed, allCfgs will be empty.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">userVals</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The config object passed in by the user, from which adhoc attrs are to be filtered.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    The set of adhoc attributes passed in, in the form
    +of an object with attribute name/configuration pairs.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__fireAttrChange" class="method item private inherited">
    +    <h3 class="name"><code>_fireAttrChange</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>attrName</code>
    +                </li>
    +                <li class="arg">
    +                        <code>subAttrName</code>
    +                </li>
    +                <li class="arg">
    +                        <code>currVal</code>
    +                </li>
    +                <li class="arg">
    +                        <code>newVal</code>
    +                </li>
    +                <li class="arg">
    +                        <code>opts</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[cfg]</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeObservable.html#method__fireAttrChange">AttributeObservable</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeObservable.js.html#l120"><code>attribute&#x2F;js&#x2F;AttributeObservable.js:120</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Utility method to help setup the event payload and fire the attribute change event.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">attrName</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The name of the attribute
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">subAttrName</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The full path of the property being changed,
    +if this is a sub-attribute value being change. Otherwise null.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">currVal</code>
    +                        <span class="type">Any</span>
    +
    +
    +                    <div class="param-description">
    +                        The current value of the attribute
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">newVal</code>
    +                        <span class="type">Any</span>
    +
    +
    +                    <div class="param-description">
    +                        The new value of the attribute
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">opts</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        Any additional event data to mix into the attribute change event's event facade.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[cfg]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        The attribute config stored in State, if already available.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method__getAttr" class="method item protected inherited">
    +    <h3 class="name"><code>_getAttr</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>name</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type">Any</span>
    +        </span>
    +
    +
    +        <span class="flag protected">protected</span>
    +
    +
    +
    +        <span class="flag chainable">chainable</span>
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method__getAttr">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l564"><code>attribute&#x2F;js&#x2F;AttributeCore.js:564</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Provides the common implementation for the public get method,
    +allowing Attribute hosts to over-ride either method.
    +
    +See <a href="#method_get">get</a> for argument details.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">name</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The name of the attribute.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type">Any</span>:
    +                    The value of the attribute.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__getAttrCfg" class="method item protected inherited">
    +    <h3 class="name"><code>_getAttrCfg</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>name</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +        <span class="flag protected">protected</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeExtras.html#method__getAttrCfg">AttributeExtras</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeExtras.js.html#l125"><code>attribute&#x2F;js&#x2F;AttributeExtras.js:125</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Returns an object with the configuration properties (and value)
    +for the given attribute. If attrName is not provided, returns the
    +configuration properties for all attributes.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">name</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        Optional. The attribute name. If not provided, the method will return the configuration for all attributes.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    The configuration properties for the given attribute, or all attributes.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__getAttrCfgs" class="method item protected inherited">
    +    <h3 class="name"><code>_getAttrCfgs</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +        <span class="flag protected">protected</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html#method__getAttrCfgs">BaseCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l394"><code>base&#x2F;js&#x2F;BaseCore.js:394</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Returns an aggregated set of attribute configurations, by traversing
    +the class hierarchy.
    +    </div>
    +
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    The hash of attribute configurations, aggregated across classes in the hierarchy
    +This value is cached the first time the method, or _getClasses, is invoked. Subsequent invocations return
    +the cached value.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__getAttrInitVal" class="method item private inherited">
    +    <h3 class="name"><code>_getAttrInitVal</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>attr</code>
    +                </li>
    +                <li class="arg">
    +                        <code>cfg</code>
    +                </li>
    +                <li class="arg">
    +                        <code>initValues</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type">Any</span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method__getAttrInitVal">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l963"><code>attribute&#x2F;js&#x2F;AttributeCore.js:963</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Returns the initial value of the given attribute from
    +either the default configuration provided, or the
    +over-ridden value if it exists in the set of initValues
    +provided and the attribute is not read-only.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">attr</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The name of the attribute
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">cfg</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The attribute configuration object
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">initValues</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The object with simple and complex attribute name/value pairs returned from _normAttrVals
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type">Any</span>:
    +                    The initial value of the attribute.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__getAttrs" class="method item protected inherited">
    +    <h3 class="name"><code>_getAttrs</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>attrs</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +        <span class="flag protected">protected</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method__getAttrs">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l792"><code>attribute&#x2F;js&#x2F;AttributeCore.js:792</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Implementation behind the public getAttrs method, to get multiple attribute values.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">attrs</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String[]</a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +
    +
    +                    <div class="param-description">
    +                        Optional. An array of attribute names. If omitted, all attribute values are
    +returned. If set to true, all attributes modified from their initial values are returned.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    An object with attribute name/value pairs.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__getClasses" class="method item protected inherited">
    +    <h3 class="name"><code>_getClasses</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="crosslink external" target="_blank">Function[]</a></span>
    +        </span>
    +
    +
    +        <span class="flag protected">protected</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html#method__getClasses">BaseCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l378"><code>base&#x2F;js&#x2F;BaseCore.js:378</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Returns the class hierarchy for this object, with BaseCore being the last class in the array.
    +    </div>
    +
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="crosslink external" target="_blank">Function[]</a></span>:
    +                    An array of classes (constructor functions), making up the class hierarchy for this object.
    +This value is cached the first time the method, or _getAttrCfgs, is invoked. Subsequent invocations return the
    +cached value.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__getFullType" class="method item private inherited">
    +    <h3 class="name"><code>_getFullType</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>type</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method__getFullType">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-target.js.html#l564"><code>event-custom&#x2F;js&#x2F;event-target.js:564</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Returns the fully qualified type, given a short type string.
    +That is, returns "foo:bar" when given "bar" if "foo" is the configured prefix.
    +
    +NOTE: This method, unlike _getType, does no checking of the value passed in, and
    +is designed to be used with the low level _publish() method, for critical path
    +implementations which need to fast-track publish for performance reasons.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">type</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The short type to prefix
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>:
    +                    The prefixed type, if a prefix is set, otherwise the type passed in
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__getInstanceAttrCfgs" class="method item private inherited">
    +    <h3 class="name"><code>_getInstanceAttrCfgs</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>allCfgs</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html#method__getInstanceAttrCfgs">BaseCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l411"><code>base&#x2F;js&#x2F;BaseCore.js:411</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        A helper method used to isolate the attrs config for this instance to pass to <code>addAttrs</code>,
    +from the static cached ATTRS for the class.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">allCfgs</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The set of all attribute configurations for this instance.
    +Attributes will be removed from this set, if they belong to the filtered class, so
    +that by the time all classes are processed, allCfgs will be empty.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    The set of attributes to be added for this instance, suitable
    +for passing through to <code>addAttrs</code>.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__getStateVal" class="method item private inherited">
    +    <h3 class="name"><code>_getStateVal</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>name</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[cfg]</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type">Any</span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method__getStateVal">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l618"><code>attribute&#x2F;js&#x2F;AttributeCore.js:618</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Gets the stored value for the attribute, from either the
    +internal state object, or the state proxy if it exits
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">name</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The name of the attribute
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[cfg]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        Optional config hash for the attribute. This is added for performance along the critical path,
    +where the calling method has already obtained the config from state.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type">Any</span>:
    +                    The stored value of the attribute
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__getType" class="method item private inherited">
    +    <h3 class="name"><code>_getType</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method__getType">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-target.js.html#l36"><code>event-custom&#x2F;js&#x2F;event-target.js:36</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        If the instance has a prefix attribute and the
    +event type is not prefixed, the instance prefix is
    +applied to the supplied type.
    +    </div>
    +
    +
    +
    +
    +</div>
    +<div id="method__hasPotentialSubscribers" class="method item private inherited">
    +    <h3 class="name"><code>_hasPotentialSubscribers</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>fullType</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method__hasPotentialSubscribers">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-facade.js.html#l643"><code>event-custom&#x2F;js&#x2F;event-facade.js:643</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">fullType</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The fully prefixed type name
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>:
    +                    Whether the event has potential subscribers or not
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__initAttrHost" class="method item private inherited">
    +    <h3 class="name"><code>_initAttrHost</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>attrs</code>
    +                </li>
    +                <li class="arg">
    +                        <code>values</code>
    +                </li>
    +                <li class="arg">
    +                        <code>lazy</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method__initAttrHost">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l140"><code>attribute&#x2F;js&#x2F;AttributeCore.js:140</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Constructor logic for attributes. Initializes the host state, and sets up the inital attributes passed to the
    +constructor.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">attrs</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The attributes to add during construction (passed through to <a href="#method_addAttrs">addAttrs</a>).
    +       These can also be defined on the constructor being augmented with Attribute by defining the ATTRS property on the constructor.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">values</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The initial attribute values to apply (passed through to <a href="#method_addAttrs">addAttrs</a>).
    +       These are not merged/cloned. The caller is responsible for isolating user provided values if required.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">lazy</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +
    +
    +                    <div class="param-description">
    +                        Whether or not to add attributes lazily (passed through to <a href="#method_addAttrs">addAttrs</a>).
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method__initAttribute" class="method item private inherited">
    +    <h3 class="name"><code>_initAttribute</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +            <p>Inherited from
    +            <a href="http://yuilibrary.com/yui/docs/api/classes/BaseObservable.html#method__initAttribute">
    +                BaseObservable
    +            </a>
    +            but overwritten in
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l309"><code>base&#x2F;js&#x2F;BaseCore.js:309</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Initializes AttributeCore
    +    </div>
    +
    +
    +
    +
    +</div>
    +<div id="method__initAttrs" class="method item protected inherited">
    +    <h3 class="name"><code>_initAttrs</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>attrs</code>
    +                </li>
    +                <li class="arg">
    +                        <code>values</code>
    +                </li>
    +                <li class="arg">
    +                        <code>lazy</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +        <span class="flag protected">protected</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method__initAttrs">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l1029"><code>attribute&#x2F;js&#x2F;AttributeCore.js:1029</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Utility method to set up initial attributes defined during construction,
    +either through the constructor.ATTRS property, or explicitly passed in.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">attrs</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The attributes to add during construction (passed through to <a href="#method_addAttrs">addAttrs</a>).
    +       These can also be defined on the constructor being augmented with Attribute by defining the ATTRS property on the constructor.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">values</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The initial attribute values to apply (passed through to <a href="#method_addAttrs">addAttrs</a>).
    +       These are not merged/cloned. The caller is responsible for isolating user provided values if required.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">lazy</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +
    +
    +                    <div class="param-description">
    +                        Whether or not to add attributes lazily (passed through to <a href="#method_addAttrs">addAttrs</a>).
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method__initBase" class="method item private inherited">
    +    <h3 class="name"><code>_initBase</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>config</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html#method__initBase">BaseCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l274"><code>base&#x2F;js&#x2F;BaseCore.js:274</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Internal construction logic for BaseCore.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">config</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The constructor configuration object
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method__initHierarchy" class="method item private inherited">
    +    <h3 class="name"><code>_initHierarchy</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>userVals</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html#method__initHierarchy">BaseCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l702"><code>base&#x2F;js&#x2F;BaseCore.js:702</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Initializes the class hierarchy for the instance, which includes
    +initializing attributes for each class defined in the class's
    +static <a href="#property_BaseCore.ATTRS">ATTRS</a> property and
    +invoking the initializer method on the prototype of each class in the hierarchy.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">userVals</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        Object with configuration property name/value pairs
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method__initHierarchyData" class="method item private inherited">
    +    <h3 class="name"><code>_initHierarchyData</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html#method__initHierarchyData">BaseCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l500"><code>base&#x2F;js&#x2F;BaseCore.js:500</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        A helper method used by _getClasses and _getAttrCfgs, which determines both
    +the array of classes and aggregate set of attribute configurations
    +across the class hierarchy for the instance.
    +    </div>
    +
    +
    +
    +
    +</div>
    +<div id="method__isLazyAttr" class="method item private inherited">
    +    <h3 class="name"><code>_isLazyAttr</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>name</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method__isLazyAttr">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l347"><code>attribute&#x2F;js&#x2F;AttributeCore.js:347</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Checks whether or not the attribute is one which has been
    +added lazily and still requires initialization.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">name</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The name of the attribute
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>:
    +                    true if it's a lazily added attribute, false otherwise.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__monitor" class="method item private inherited">
    +    <h3 class="name"><code>_monitor</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>what</code>
    +                </li>
    +                <li class="arg">
    +                        <code>eventType</code>
    +                </li>
    +                <li class="arg">
    +                        <code>o</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method__monitor">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-target.js.html#l636"><code>event-custom&#x2F;js&#x2F;event-target.js:636</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        This is the entry point for the event monitoring system.
    +You can monitor 'attach', 'detach', 'fire', and 'publish'.
    +When configured, these events generate an event.  click ->
    +click_attach, click_detach, click_publish -- these can
    +be subscribed to like other events to monitor the event
    +system.  Inividual published events can have monitoring
    +turned on or off (publish can't be turned off before it
    +it published) by setting the events 'monitor' config.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">what</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        'attach', 'detach', 'fire', or 'publish'
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">eventType</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a> | <a href="http://yuilibrary.com/yui/docs/api/classes/CustomEvent.html" class="crosslink external" target="_blank">CustomEvent</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The prefixed name of the event being monitored, or the CustomEvent object.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">o</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        Information about the event interaction, such as
    +                 fire() args, subscription category, publish config
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method__normAttrVals" class="method item private inherited">
    +    <h3 class="name"><code>_normAttrVals</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>valueHash</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method__normAttrVals">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l915"><code>attribute&#x2F;js&#x2F;AttributeCore.js:915</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Utility method to normalize attribute values. The base implementation
    +simply merges the hash to protect the original.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">valueHash</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        An object with attribute name/value pairs
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    An object literal with 2 properties - "simple" and "complex",
    +containing simple and complex attribute values respectively keyed
    +by the top level attribute name, or null, if valueHash is falsey.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__parseType" class="method item private inherited">
    +    <h3 class="name"><code>_parseType</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method__parseType">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-target.js.html#l52"><code>event-custom&#x2F;js&#x2F;event-target.js:52</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Returns an array with the detach key (if provided),
    +and the prefixed event name from _getType
    +Y.on('detachcategory| menu:click', fn)
    +    </div>
    +
    +
    +
    +
    +</div>
    +<div id="method__preInitEventCfg" class="method item private inherited">
    +    <h3 class="name"><code>_preInitEventCfg</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>config</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/BaseObservable.html#method__preInitEventCfg">BaseObservable</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseObservable.js.html#l110"><code>base&#x2F;js&#x2F;BaseObservable.js:110</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Handles the special on, after and target properties which allow the user to
    +easily configure on and after listeners as well as bubble targets during
    +construction, prior to init.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">config</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The user configuration object
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method__protectAttrs" class="method item protected deprecated inherited">
    +    <h3 class="name"><code>_protectAttrs</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>attrs</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +        <span class="flag deprecated" title="Use &#x60;AttributeCore.protectAttrs()&#x60; or
    +  &#x60;Attribute.protectAttrs()&#x60; which are the same static utility method.">deprecated</span>
    +
    +        <span class="flag protected">protected</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method__protectAttrs">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l901"><code>attribute&#x2F;js&#x2F;AttributeCore.js:901</code></a>
    +        </p>
    +
    +
    +            <p>Deprecated: Use &#x60;AttributeCore.protectAttrs()&#x60; or
    +  &#x60;Attribute.protectAttrs()&#x60; which are the same static utility method.</p>
    +
    +    </div>
    +
    +    <div class="description">
    +        Utility method to protect an attribute configuration
    +hash, by merging the entire object and the individual
    +attr config objects.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">attrs</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        A hash of attribute to configuration object pairs.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    A protected version of the attrs argument.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__publish" class="method item private inherited">
    +    <h3 class="name"><code>_publish</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>fullType</code>
    +                </li>
    +                <li class="arg">
    +                        <code>etOpts</code>
    +                </li>
    +                <li class="arg">
    +                        <code>ceOpts</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/CustomEvent.html" class="crosslink external" target="_blank">CustomEvent</a></span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method__publish">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-target.js.html#l588"><code>event-custom&#x2F;js&#x2F;event-target.js:588</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        The low level event publish implementation. It expects all the massaging to have been done
    +outside of this method. e.g. the <code>type</code> to <code>fullType</code> conversion. It's designed to be a fast
    +path publish, which can be used by critical code paths to improve performance.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">fullType</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The prefixed type of the event to publish.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">etOpts</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The EventTarget specific configuration to mix into the published event.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">ceOpts</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The publish specific configuration to mix into the published event.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/CustomEvent.html" class="crosslink external" target="_blank">CustomEvent</a></span>:
    +                    The published event. If called without <code>etOpts</code> or <code>ceOpts</code>, this will
    +be the default <code>CustomEvent</code> instance, and can be configured independently.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__resolveFor" class="method item private">
    +    <h3 class="name"><code>_resolveFor</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>value</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_docparser.js.html#l1110"><code>lib&#x2F;docparser.js:1110</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Takes a non-namespaced classname and resolves it to a namespace (to support <code>@for</code>)</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">value</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The classname to resolve</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>:
    +                    <p>The resolved namespace + classname</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__set" class="method item protected inherited">
    +    <h3 class="name"><code>_set</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>name</code>
    +                </li>
    +                <li class="arg">
    +                        <code>val</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[opts]</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +        <span class="flag protected">protected</span>
    +
    +
    +
    +        <span class="flag chainable">chainable</span>
    +
    +
    +    <div class="meta">
    +            <p>Inherited from
    +            <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeObservable.html#method__set">
    +                AttributeObservable
    +            </a>
    +            but overwritten in
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l405"><code>attribute&#x2F;js&#x2F;AttributeCore.js:405</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Allows setting of readOnly/writeOnce attributes. See <a href="#method_set">set</a> for argument details.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">name</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The name of the attribute.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">val</code>
    +                        <span class="type">Any</span>
    +
    +
    +                    <div class="param-description">
    +                        The value to set the attribute to.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[opts]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        Optional data providing the circumstances for the change.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    A reference to the host object.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__setAttr" class="method item protected inherited">
    +    <h3 class="name"><code>_setAttr</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>name</code>
    +                </li>
    +                <li class="arg">
    +                        <code>value</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[opts]</code>
    +                </li>
    +                <li class="arg">
    +                        <code>force</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +        <span class="flag protected">protected</span>
    +
    +
    +
    +        <span class="flag chainable">chainable</span>
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method__setAttr">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l421"><code>attribute&#x2F;js&#x2F;AttributeCore.js:421</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Provides the common implementation for the public set and protected _set methods.
    +
    +See <a href="#method_set">set</a> for argument details.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">name</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The name of the attribute.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">value</code>
    +                        <span class="type">Any</span>
    +
    +
    +                    <div class="param-description">
    +                        The value to set the attribute to.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[opts]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        Optional data providing the circumstances for the change.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">force</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +
    +
    +                    <div class="param-description">
    +                        If true, allows the caller to set values for
    +readOnly or writeOnce attributes which have already been set.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    A reference to the host object.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__setAttrs" class="method item protected inherited">
    +    <h3 class="name"><code>_setAttrs</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>attrs</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[opts]</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +        <span class="flag protected">protected</span>
    +
    +
    +
    +        <span class="flag chainable">chainable</span>
    +
    +
    +    <div class="meta">
    +            <p>Inherited from
    +            <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeObservable.html#method__setAttrs">
    +                AttributeObservable
    +            </a>
    +            but overwritten in
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l760"><code>attribute&#x2F;js&#x2F;AttributeCore.js:760</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Implementation behind the public setAttrs method, to set multiple attribute values.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">attrs</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        An object with attributes name/value pairs.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[opts]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        Optional data providing the circumstances for the change
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    A reference to the host object.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__setAttrVal" class="method item private inherited">
    +    <h3 class="name"><code>_setAttrVal</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>attrName</code>
    +                </li>
    +                <li class="arg">
    +                        <code>subAttrName</code>
    +                </li>
    +                <li class="arg">
    +                        <code>prevVal</code>
    +                </li>
    +                <li class="arg">
    +                        <code>newVal</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[opts]</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[attrCfg]</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method__setAttrVal">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l658"><code>attribute&#x2F;js&#x2F;AttributeCore.js:658</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Updates the stored value of the attribute in the privately held State object,
    +if validation and setter passes.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">attrName</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The attribute name.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">subAttrName</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The sub-attribute name, if setting a sub-attribute property ("x.y.z").
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">prevVal</code>
    +                        <span class="type">Any</span>
    +
    +
    +                    <div class="param-description">
    +                        The currently stored value of the attribute.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">newVal</code>
    +                        <span class="type">Any</span>
    +
    +
    +                    <div class="param-description">
    +                        The value which is going to be stored.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[opts]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        Optional data providing the circumstances for the change.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[attrCfg]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        Optional config hash for the attribute. This is added for performance along the critical path,
    +where the calling method has already obtained the config from state.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>:
    +                    true if the new attribute value was stored, false if not.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method__setStateVal" class="method item private inherited">
    +    <h3 class="name"><code>_setStateVal</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>name</code>
    +                </li>
    +                <li class="arg">
    +                        <code>value</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method__setStateVal">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l640"><code>attribute&#x2F;js&#x2F;AttributeCore.js:640</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Sets the stored value for the attribute, in either the
    +internal state object, or the state proxy if it exits
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">name</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The name of the attribute
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">value</code>
    +                        <span class="type">Any</span>
    +
    +
    +                    <div class="param-description">
    +                        The value of the attribute
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_addAttr" class="method item inherited">
    +    <h3 class="name"><code>addAttr</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>name</code>
    +                </li>
    +                <li class="arg">
    +                        <code>config</code>
    +                </li>
    +                <li class="arg">
    +                        <code>lazy</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +        <span class="flag chainable">chainable</span>
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method_addAttr">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l157"><code>attribute&#x2F;js&#x2F;AttributeCore.js:157</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>
    +Adds an attribute with the provided configuration to the host object.
    +</p>
    +<p>
    +The config argument object supports the following properties:
    +</p>
    +
    +<dl>
    +   <dt>value &#60;Any&#62;</dt>
    +   <dd>The initial value to set on the attribute</dd>
    +
    +   <dt>valueFn &#60;Function | String&#62;</dt>
    +   <dd>
    +   <p>A function, which will return the initial value to set on the attribute. This is useful
    +   for cases where the attribute configuration is defined statically, but needs to
    +   reference the host instance ("this") to obtain an initial value. If both the value and valueFn properties are defined,
    +   the value returned by the valueFn has precedence over the value property, unless it returns undefined, in which
    +   case the value property is used.</p>
    +
    +   <p>valueFn can also be set to a string, representing the name of the instance method to be used to retrieve the value.</p>
    +   </dd>
    +
    +   <dt>readOnly &#60;boolean&#62;</dt>
    +   <dd>Whether or not the attribute is read only. Attributes having readOnly set to true
    +       cannot be modified by invoking the set method.</dd>
    +
    +   <dt>writeOnce &#60;boolean&#62; or &#60;string&#62;</dt>
    +   <dd>
    +       Whether or not the attribute is "write once". Attributes having writeOnce set to true,
    +       can only have their values set once, be it through the default configuration,
    +       constructor configuration arguments, or by invoking set.
    +       <p>The writeOnce attribute can also be set to the string "initOnly",
    +        in which case the attribute can only be set during initialization
    +       (when used with Base, this means it can only be set during construction)</p>
    +   </dd>
    +
    +   <dt>setter &#60;Function | String&#62;</dt>
    +   <dd>
    +   <p>The setter function used to massage or normalize the value passed to the set method for the attribute.
    +   The value returned by the setter will be the final stored value. Returning
    +   <a href="#property_Attribute.INVALID_VALUE">Attribute.INVALID_VALUE</a>, from the setter will prevent
    +   the value from being stored.
    +   </p>
    +
    +   <p>setter can also be set to a string, representing the name of the instance method to be used as the setter function.</p>
    +   </dd>
    +
    +   <dt>getter &#60;Function | String&#62;</dt>
    +   <dd>
    +   <p>
    +   The getter function used to massage or normalize the value returned by the get method for the attribute.
    +   The value returned by the getter function is the value which will be returned to the user when they
    +   invoke get.
    +   </p>
    +
    +   <p>getter can also be set to a string, representing the name of the instance method to be used as the getter function.</p>
    +   </dd>
    +
    +   <dt>validator &#60;Function | String&#62;</dt>
    +   <dd>
    +   <p>
    +   The validator function invoked prior to setting the stored value. Returning
    +   false from the validator function will prevent the value from being stored.
    +   </p>
    +
    +   <p>validator can also be set to a string, representing the name of the instance method to be used as the validator function.</p>
    +   </dd>
    +
    +   <dt>lazyAdd &#60;boolean&#62;</dt>
    +   <dd>Whether or not to delay initialization of the attribute until the first call to get/set it.
    +   This flag can be used to over-ride lazy initialization on a per attribute basis, when adding multiple attributes through
    +   the <a href="#method_addAttrs">addAttrs</a> method.</dd>
    +
    +</dl>
    +
    +<p>The setter, getter and validator are invoked with the value and name passed in as the first and second arguments, and with
    +the context ("this") set to the host object.</p>
    +
    +<p>Configuration properties outside of the list mentioned above are considered private properties used internally by attribute,
    +and are not intended for public use.</p>
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">name</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The name of the attribute.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">config</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        An object with attribute configuration property/value pairs, specifying the configuration for the attribute.
    +
    +<p>
    +<strong>NOTE:</strong> The configuration object is modified when adding an attribute, so if you need
    +to protect the original values, you will need to merge the object.
    +</p>
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">lazy</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +
    +
    +                    <div class="param-description">
    +                        (optional) Whether or not to add this attribute lazily (on the first call to get/set).
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    A reference to the host object.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_addAttrs" class="method item inherited">
    +    <h3 class="name"><code>addAttrs</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>cfgs</code>
    +                </li>
    +                <li class="arg">
    +                        <code>values</code>
    +                </li>
    +                <li class="arg">
    +                        <code>lazy</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +        <span class="flag chainable">chainable</span>
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method_addAttrs">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l823"><code>attribute&#x2F;js&#x2F;AttributeCore.js:823</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Configures a group of attributes, and sets initial values.
    +
    +<p>
    +<strong>NOTE:</strong> This method does not isolate the configuration object by merging/cloning.
    +The caller is responsible for merging/cloning the configuration object if required.
    +</p>
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">cfgs</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        An object with attribute name/configuration pairs.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">values</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        An object with attribute name/value pairs, defining the initial values to apply.
    +Values defined in the cfgs argument will be over-written by values in this argument unless defined as read only.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">lazy</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +
    +
    +                    <div class="param-description">
    +                        Whether or not to delay the intialization of these attributes until the first call to get/set.
    +Individual attributes can over-ride this behavior by defining a lazyAdd configuration property in their configuration.
    +See <a href="#method_addAttr">addAttr</a>.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    A reference to the host object.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_addTarget" class="method item inherited">
    +    <h3 class="name"><code>addTarget</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>o</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +        <span class="flag chainable">chainable</span>
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method_addTarget">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-facade.js.html#l496"><code>event-custom&#x2F;js&#x2F;event-facade.js:496</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Registers another EventTarget as a bubble target.  Bubble order
    +is determined by the order registered.  Multiple targets can
    +be specified.
    +
    +Events can only bubble if emitFacade is true.
    +
    +Included in the event-custom-complex submodule.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">o</code>
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html" class="crosslink external" target="_blank">EventTarget</a></span>
    +
    +
    +                    <div class="param-description">
    +                        the target to add
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_after" class="method item inherited">
    +    <h3 class="name"><code>after</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>type</code>
    +                </li>
    +                <li class="arg">
    +                        <code>fn</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[context]</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[arg*]</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventHandle.html" class="crosslink external" target="_blank">EventHandle</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method_after">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-target.js.html#l812"><code>event-custom&#x2F;js&#x2F;event-target.js:812</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Subscribe to a custom event hosted by this object.  The
    +supplied callback will execute after any listeners add
    +via the subscribe method, and after the default function,
    +if configured for the event, has executed.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">type</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The name of the event
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">fn</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="crosslink external" target="_blank">Function</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The callback to execute in response to the event
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[context]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        Override <code>this</code> object in callback
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[arg*]</code>
    +                        <span class="type">Any</span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        0..n additional arguments to supply to the subscriber
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventHandle.html" class="crosslink external" target="_blank">EventHandle</a></span>:
    +                    A subscription handle capable of detaching the
    +                      subscription
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_attrAdded" class="method item inherited">
    +    <h3 class="name"><code>attrAdded</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>name</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method_attrAdded">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l319"><code>attribute&#x2F;js&#x2F;AttributeCore.js:319</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Checks if the given attribute has been added to the host
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">name</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The name of the attribute to check.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>:
    +                    true if an attribute with the given name has been added, false if it hasn't.
    +        This method will return true for lazily added attributes.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_before" class="method item inherited">
    +    <h3 class="name"><code>before</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +        <span class="returns-inline">
    +            <span class="type"></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method_before">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-target.js.html#l849"><code>event-custom&#x2F;js&#x2F;event-target.js:849</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Executes the callback before a DOM event, custom event
    +or method.  If the first argument is a function, it
    +is assumed the target is a method.  For DOM and custom
    +events, this is an alias for Y.on.
    +
    +For DOM and custom events:
    +type, callback, context, 0-n arguments
    +
    +For methods:
    +callback, object (method host), methodName, context, 0-n arguments
    +    </div>
    +
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                    detach handle
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_bubble" class="method item inherited">
    +    <h3 class="name"><code>bubble</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>evt</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method_bubble">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-facade.js.html#l554"><code>event-custom&#x2F;js&#x2F;event-facade.js:554</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Propagate an event.  Requires the event-custom-complex module.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">evt</code>
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/CustomEvent.html" class="crosslink external" target="_blank">CustomEvent</a></span>
    +
    +
    +                    <div class="param-description">
    +                        the custom event to propagate
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>:
    +                    the aggregated return value from Event.Custom.fire
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_destroy" class="method item inherited">
    +    <h3 class="name"><code>destroy</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html" class="crosslink external" target="_blank">BaseCore</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +        <span class="flag chainable">chainable</span>
    +
    +
    +    <div class="meta">
    +            <p>Inherited from
    +            <a href="http://yuilibrary.com/yui/docs/api/classes/BaseObservable.html#method_destroy">
    +                BaseObservable
    +            </a>
    +            but overwritten in
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l352"><code>base&#x2F;js&#x2F;BaseCore.js:352</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Destroy lifecycle method. Invokes destructors for the class hierarchy.
    +    </div>
    +
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html" class="crosslink external" target="_blank">BaseCore</a></span>:
    +                    A reference to this object
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_detach" class="method item inherited">
    +    <h3 class="name"><code>detach</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>type</code>
    +                </li>
    +                <li class="arg">
    +                        <code>fn</code>
    +                </li>
    +                <li class="arg">
    +                        <code>context</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html" class="crosslink external" target="_blank">EventTarget</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method_detach">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-target.js.html#l356"><code>event-custom&#x2F;js&#x2F;event-target.js:356</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Detach one or more listeners the from the specified event
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">type</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        Either the handle to the subscriber or the
    +                       type of event.  If the type
    +                       is not specified, it will attempt to remove
    +                       the listener from all hosted events.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">fn</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="crosslink external" target="_blank">Function</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The subscribed function to unsubscribe, if not
    +                         supplied, all subscribers will be removed.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">context</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The custom object passed to subscribe.  This is
    +                       optional, but if supplied will be used to
    +                       disambiguate multiple listeners that are the same
    +                       (e.g., you subscribe many object using a function
    +                       that lives on the prototype)
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html" class="crosslink external" target="_blank">EventTarget</a></span>:
    +                    the host
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_detachAll" class="method item inherited">
    +    <h3 class="name"><code>detachAll</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>type</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method_detachAll">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-target.js.html#l479"><code>event-custom&#x2F;js&#x2F;event-target.js:479</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Removes all listeners from the specified event.  If the event type
    +is not specified, all listeners from all hosted custom events will
    +be removed.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">type</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The type, or name of the event
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_extract" class="method item">
    +    <h3 class="name"><code>extract</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>filemap</code>
    +                </li>
    +                <li class="arg">
    +                        <code>dirmap</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_docparser.js.html#l1287"><code>lib&#x2F;docparser.js:1287</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Accepts a map of filenames to file content.  Returns
    +a map of filenames to an array of API comment block
    +text.  This expects the comment to start with / **
    +on its own line, and end with * / on its own
    +line.  Override this function to provide an
    +alternative comment parser.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">filemap</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>A map of filenames to file content</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">dirmap</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="crosslink external external" target="_blank">Array</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>A map of file names to directory name</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    <p>A map of filenames to an array of extracted
    +comment text.</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_fire" class="method item inherited">
    +    <h3 class="name"><code>fire</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>type</code>
    +                </li>
    +                <li class="arg">
    +                        <code>arguments</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method_fire">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-target.js.html#l673"><code>event-custom&#x2F;js&#x2F;event-target.js:673</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Fire a custom event by name.  The callback functions will be executed
    +from the context specified when the event was created, and with the
    +following parameters.
    +
    +The first argument is the event type, and any additional arguments are
    +passed to the listeners as parameters.  If the first of these is an
    +object literal, and the event is configured to emit an event facade,
    +that object is mixed into the event facade and the facade is provided
    +in place of the original object.
    +
    +If the custom event object hasn't been created, then the event hasn't
    +been published and it has no subscribers.  For performance sake, we
    +immediate exit in this case.  This means the event won't bubble, so
    +if the intention is that a bubble target be notified, the event must
    +be published on this object first.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">type</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The type of the event, or an object that contains
    +a 'type' property.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">arguments</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object*</a></span>
    +
    +
    +                    <div class="param-description">
    +                        an arbitrary set of parameters to pass to
    +the handler.  If the first of these is an object literal and the event is
    +configured to emit an event facade, the event facade will replace that
    +parameter after the properties the object literal contains are copied to
    +the event facade.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>:
    +                    True if the whole lifecycle of the event went through,
    +false if at any point the event propagation was halted.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_get" class="method item inherited">
    +    <h3 class="name"><code>get</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>name</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type">Any</span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method_get">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l331"><code>attribute&#x2F;js&#x2F;AttributeCore.js:331</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Returns the current value of the attribute. If the attribute
    +has been configured with a 'getter' function, this method will delegate
    +to the 'getter' to obtain the value of the attribute.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">name</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The name of the attribute. If the value of the attribute is an Object,
    +dot notation can be used to obtain the value of a property of the object (e.g. <code>get("x.y.z")</code>)
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type">Any</span>:
    +                    The value of the attribute
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_getAttrs" class="method item inherited">
    +    <h3 class="name"><code>getAttrs</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>attrs</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeCore.html#method_getAttrs">AttributeCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l780"><code>attribute&#x2F;js&#x2F;AttributeCore.js:780</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Gets multiple attribute values.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">attrs</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String[]</a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +
    +
    +                    <div class="param-description">
    +                        Optional. An array of attribute names. If omitted, all attribute values are
    +returned. If set to true, all attributes modified from their initial values are returned.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    An object with attribute name/value pairs.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_getEvent" class="method item inherited">
    +    <h3 class="name"><code>getEvent</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>type</code>
    +                </li>
    +                <li class="arg">
    +                        <code>prefixed</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/CustomEvent.html" class="crosslink external" target="_blank">CustomEvent</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method_getEvent">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-target.js.html#l793"><code>event-custom&#x2F;js&#x2F;event-target.js:793</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Returns the custom event of the provided type has been created, a
    +falsy value otherwise
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">type</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        the type, or name of the event
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">prefixed</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        if true, the type is prefixed already
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/CustomEvent.html" class="crosslink external" target="_blank">CustomEvent</a></span>:
    +                    the custom event or null
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_getTargets" class="method item inherited">
    +    <h3 class="name"><code>getTargets</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +        <span class="returns-inline">
    +            <span class="type"></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method_getTargets">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-facade.js.html#l523"><code>event-custom&#x2F;js&#x2F;event-facade.js:523</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Returns an array of bubble targets for this object.
    +    </div>
    +
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                    EventTarget[]
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_handlecomment" class="method item">
    +    <h3 class="name"><code>handlecomment</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>comment</code>
    +                </li>
    +                <li class="arg">
    +                        <code>file</code>
    +                </li>
    +                <li class="arg">
    +                        <code>line</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_docparser.js.html#l1209"><code>lib&#x2F;docparser.js:1209</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Transforms a JavaDoc style comment block (less the start and end of it)
    +into a list of tag/text pairs. The leading space and '*' are removed,
    +but the remaining whitespace is preserved so that the output should be
    +friendly for both markdown and html parsers.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">comment</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The comment to parse</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">file</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The file it was parsed from</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">line</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The line number it was found on</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_implodeString" class="method item private">
    +    <h3 class="name"><code>implodeString</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>str</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_docparser.js.html#l40"><code>lib&#x2F;docparser.js:40</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Flatten a string, remove all line breaks and replace them with a token</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">str</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The string to operate on</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>:
    +                    <p>The modified string</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_implodeString" class="method item private">
    +    <h3 class="name"><code>implodeString</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>str</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_docparser.js.html#l50"><code>lib&#x2F;docparser.js:50</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Un-flatten a string, replace tokens injected with <code>implodeString</code></p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">str</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The string to operate on</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>:
    +                    <p>The modified string</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_init" class="method item inherited">
    +    <h3 class="name"><code>init</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>cfg</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html" class="crosslink external" target="_blank">BaseCore</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +        <span class="flag chainable">chainable</span>
    +
    +
    +    <div class="meta">
    +            <p>Inherited from
    +            <a href="http://yuilibrary.com/yui/docs/api/classes/BaseObservable.html#method_init">
    +                BaseObservable
    +            </a>
    +            but overwritten in
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l319"><code>base&#x2F;js&#x2F;BaseCore.js:319</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Init lifecycle method, invoked during construction. Sets up attributes
    +and invokes initializers for the class hierarchy.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">cfg</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        Object with configuration property name/value pairs
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html" class="crosslink external" target="_blank">BaseCore</a></span>:
    +                    A reference to this object
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_modifyAttr" class="method item inherited">
    +    <h3 class="name"><code>modifyAttr</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>name</code>
    +                </li>
    +                <li class="arg">
    +                        <code>config</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeExtras.html#method_modifyAttr">AttributeExtras</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeExtras.js.html#l40"><code>attribute&#x2F;js&#x2F;AttributeExtras.js:40</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Updates the configuration of an attribute which has already been added.
    +<p>
    +The properties which can be modified through this interface are limited
    +to the following subset of attributes, which can be safely modified
    +after a value has already been set on the attribute:
    +</p>
    +<dl>
    + <dt>readOnly;</dt>
    + <dt>writeOnce;</dt>
    + <dt>broadcast; and</dt>
    + <dt>getter.</dt>
    +</dl>
    +<p>
    +Note: New attributes cannot be added using this interface. New attributes must be
    +added using {{#crossLink "AttributeCore/addAttr:method"}}addAttr{{/crossLink}}, or an
    +appropriate manner for a class which utilises Attributes (e.g. the
    +{{#crossLink "Base/ATTRS:property"}}ATTRS{{/crossLink}} property in
    +{{#crossLink "Base"}}Base{{/crossLink}}).
    +</p>
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">name</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The name of the attribute whose configuration is to be updated.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">config</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        An object with configuration property/value pairs, specifying the configuration properties to modify.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_on" class="method item inherited">
    +    <h3 class="name"><code>on</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>type</code>
    +                </li>
    +                <li class="arg">
    +                        <code>fn</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[context]</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[arg*]</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventHandle.html" class="crosslink external" target="_blank">EventHandle</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method_on">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-target.js.html#l188"><code>event-custom&#x2F;js&#x2F;event-target.js:188</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Subscribe a callback function to a custom event fired by this object or
    +from an object that bubbles its events to this object.
    +
    +     this.on("change", this._onChange, this);
    +
    +Callback functions for events published with <code>emitFacade = true</code> will
    +receive an <code>EventFacade</code> as the first argument (typically named "e").
    +These callbacks can then call <code>e.preventDefault()</code> to disable the
    +behavior published to that event's <code>defaultFn</code>.  See the <code>EventFacade</code>
    +API for all available properties and methods. Subscribers to
    +non-<code>emitFacade</code> events will receive the arguments passed to <code>fire()</code>
    +after the event name.
    +
    +To subscribe to multiple events at once, pass an object as the first
    +argument, where the key:value pairs correspond to the eventName:callback.
    +
    +     this.on({
    +         "attrChange" : this._onAttrChange,
    +         "change"     : this._onChange
    +     });
    +
    +You can also pass an array of event names as the first argument to
    +subscribe to all listed events with the same callback.
    +
    +     this.on([ "change", "attrChange" ], this._onChange);
    +
    +Returning <code>false</code> from a callback is supported as an alternative to
    +calling <code>e.preventDefault(); e.stopPropagation();</code>.  However, it is
    +recommended to use the event methods whenever possible.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">type</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The name of the event
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">fn</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="crosslink external" target="_blank">Function</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The callback to execute in response to the event
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[context]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        Override <code>this</code> object in callback
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[arg*]</code>
    +                        <span class="type">Any</span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        0..n additional arguments to supply to the subscriber
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventHandle.html" class="crosslink external" target="_blank">EventHandle</a></span>:
    +                    A subscription handle capable of detaching that
    +                      subscription
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_once" class="method item inherited">
    +    <h3 class="name"><code>once</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>type</code>
    +                </li>
    +                <li class="arg">
    +                        <code>fn</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[context]</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[arg*]</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventHandle.html" class="crosslink external" target="_blank">EventHandle</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method_once">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-target.js.html#l124"><code>event-custom&#x2F;js&#x2F;event-target.js:124</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Listen to a custom event hosted by this object one time.
    +This is the equivalent to <code>on</code> except the
    +listener is immediatelly detached when it is executed.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">type</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The name of the event
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">fn</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="crosslink external" target="_blank">Function</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The callback to execute in response to the event
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[context]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        Override <code>this</code> object in callback
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[arg*]</code>
    +                        <span class="type">Any</span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        0..n additional arguments to supply to the subscriber
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventHandle.html" class="crosslink external" target="_blank">EventHandle</a></span>:
    +                    A subscription handle capable of detaching the
    +                      subscription
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_onceAfter" class="method item inherited">
    +    <h3 class="name"><code>onceAfter</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>type</code>
    +                </li>
    +                <li class="arg">
    +                        <code>fn</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[context]</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[arg*]</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventHandle.html" class="crosslink external" target="_blank">EventHandle</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method_onceAfter">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-target.js.html#l146"><code>event-custom&#x2F;js&#x2F;event-target.js:146</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Listen to a custom event hosted by this object one time.
    +This is the equivalent to <code>after</code> except the
    +listener is immediatelly detached when it is executed.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">type</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The name of the event
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">fn</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="crosslink external" target="_blank">Function</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The callback to execute in response to the event
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[context]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        Override <code>this</code> object in callback
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[arg*]</code>
    +                        <span class="type">Any</span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        0..n additional arguments to supply to the subscriber
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventHandle.html" class="crosslink external" target="_blank">EventHandle</a></span>:
    +                    A subscription handle capable of detaching that
    +                      subscription
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_parse" class="method item">
    +    <h3 class="name"><code>parse</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>filemap</code>
    +                </li>
    +                <li class="arg">
    +                        <code>dirmap</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="../classes/DocParser.html" class="crosslink">DocParser</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_docparser.js.html#l1562"><code>lib&#x2F;docparser.js:1562</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Extracts and transforms the filemap provided to constructor</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">filemap</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="crosslink external external" target="_blank">Array</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>A map of filenames to file content</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">dirmap</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="crosslink external external" target="_blank">Array</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>A map of file names to directory name</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="../classes/DocParser.html" class="crosslink">DocParser</a></span>:
    +                    <p>this parser instance.  The total results
    +are available in parser.data.</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_parseType" class="method item inherited">
    +    <h3 class="name"><code>parseType</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>type</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[pre]</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="crosslink external external" target="_blank">Array</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method_parseType">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-target.js.html#l168"><code>event-custom&#x2F;js&#x2F;event-target.js:168</code></a>
    +        </p>
    +
    +
    +
    +            <p>Available since 3.3.0</p>
    +    </div>
    +
    +    <div class="description">
    +        Takes the type parameter passed to 'on' and parses out the
    +various pieces that could be included in the type.  If the
    +event type is passed without a prefix, it will be expanded
    +to include the prefix one is supplied or the event target
    +is configured with a default prefix.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">type</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        the type
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[pre]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        The prefix. Defaults to this._yuievt.config.prefix
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="crosslink external external" target="_blank">Array</a></span>:
    +                    an array containing:
    + * the detach category, if supplied,
    + * the prefixed event type,
    + * whether or not this is an after listener,
    + * the supplied event type
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_processblock" class="method item">
    +    <h3 class="name"><code>processblock</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>an</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_docparser.js.html#l1342"><code>lib&#x2F;docparser.js:1342</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Processes all the tags in a single comment block</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">an</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="crosslink external external" target="_blank">Array</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>array of the tag/text pairs</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_publish" class="method item inherited">
    +    <h3 class="name"><code>publish</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>type</code>
    +                </li>
    +                <li class="arg">
    +                        <code>opts</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/CustomEvent.html" class="crosslink external" target="_blank">CustomEvent</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method_publish">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-target.js.html#l503"><code>event-custom&#x2F;js&#x2F;event-target.js:503</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Creates a new custom event of the specified type.  If a custom event
    +by that name already exists, it will not be re-created.  In either
    +case the custom event is returned.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">type</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        the type, or name of the event
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">opts</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        optional config params.  Valid properties are:
    +                    </div>
    +
    +                        <ul class="params-list">
    +                            <li class="param">
    +                                    <code class="param-name optional">[broadcast=false]</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +                                    <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +                                <div class="param-description">
    +                                    <p>whether or not the YUI instance and YUI global
    +are notified when the event is fired.</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name optional">[bubbles=true]</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +                                    <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +                                <div class="param-description">
    +                                    <p>Whether or not this event bubbles. Events can
    +only bubble if <code>emitFacade</code> is true.</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name optional">[context=this]</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +                                    <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +                                <div class="param-description">
    +                                    <p>the default execution context for the listeners.</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name optional">[defaultFn]</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="crosslink external" target="_blank">Function</a></span>
    +                                    <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +                                <div class="param-description">
    +                                    <p>the default function to execute when this event
    +fires if preventDefault was not called.</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name optional">[emitFacade=false]</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +                                    <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +                                <div class="param-description">
    +                                    <p>whether or not this event emits a facade.</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name optional">[prefix]</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                    <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +                                <div class="param-description">
    +                                    <p>the prefix for this targets events, e.g., 'menu' in 'menu:click'.</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name optional">[fireOnce=false]</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +                                    <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +                                <div class="param-description">
    +                                    <p>if an event is configured to fire once,
    +new subscribers after the fire will be notified immediately.</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name optional">[async=false]</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +                                    <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +                                <div class="param-description">
    +                                    <p>fireOnce event listeners will fire synchronously
    +if the event has already fired unless <code>async</code> is <code>true</code>.</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name optional">[preventable=true]</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +                                    <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +                                <div class="param-description">
    +                                    <p>whether or not <code>preventDefault()</code> has an effect.</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name optional">[preventedFn]</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="crosslink external" target="_blank">Function</a></span>
    +                                    <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +                                <div class="param-description">
    +                                    <p>a function that is executed when <code>preventDefault()</code> is called.</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name optional">[queuable=false]</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +                                    <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +                                <div class="param-description">
    +                                    <p>whether or not this event can be queued during bubbling.</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name optional">[silent]</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +                                    <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +                                <div class="param-description">
    +                                    <p>if silent is true, debug messages are not provided for this event.</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name optional">[stoppedFn]</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="crosslink external" target="_blank">Function</a></span>
    +                                    <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +                                <div class="param-description">
    +                                    <p>a function that is executed when stopPropagation is called.</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name optional">[monitored]</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +                                    <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +                                <div class="param-description">
    +                                    <p>specifies whether or not this event should send notifications about
    +when the event has been attached, detached, or published.</p>
    +
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name optional">[type]</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                    <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +                                <div class="param-description">
    +                                    <p>the event type (valid option if not provided as the first parameter to publish).</p>
    +
    +                                </div>
    +
    +                            </li>
    +                        </ul>
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/CustomEvent.html" class="crosslink external" target="_blank">CustomEvent</a></span>:
    +                    the custom event
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_removeAttr" class="method item inherited">
    +    <h3 class="name"><code>removeAttr</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>name</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeExtras.html#method_removeAttr">AttributeExtras</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeExtras.js.html#l90"><code>attribute&#x2F;js&#x2F;AttributeExtras.js:90</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Removes an attribute from the host object
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">name</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The name of the attribute to be removed.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_removeTarget" class="method item inherited">
    +    <h3 class="name"><code>removeTarget</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>o</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +        <span class="flag chainable">chainable</span>
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method_removeTarget">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-facade.js.html#l533"><code>event-custom&#x2F;js&#x2F;event-facade.js:533</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Removes a bubble target
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">o</code>
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html" class="crosslink external" target="_blank">EventTarget</a></span>
    +
    +
    +                    <div class="param-description">
    +                        the target to remove
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_reset" class="method item inherited">
    +    <h3 class="name"><code>reset</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>name</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +        <span class="flag chainable">chainable</span>
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeExtras.html#method_reset">AttributeExtras</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeExtras.js.html#l100"><code>attribute&#x2F;js&#x2F;AttributeExtras.js:100</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Resets the attribute (or all attributes) to its initial value, as long as
    +the attribute is not readOnly, or writeOnce.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">name</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        Optional. The name of the attribute to reset.  If omitted, all attributes are reset.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    A reference to the host object.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_set" class="method item inherited">
    +    <h3 class="name"><code>set</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>name</code>
    +                </li>
    +                <li class="arg">
    +                        <code>value</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[opts]</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +        <span class="flag chainable">chainable</span>
    +
    +
    +    <div class="meta">
    +            <p>Inherited from
    +            <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeObservable.html#method_set">
    +                AttributeObservable
    +            </a>
    +            but overwritten in
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l388"><code>attribute&#x2F;js&#x2F;AttributeCore.js:388</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Sets the value of an attribute.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">name</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The name of the attribute. If the
    +current value of the attribute is an Object, dot notation can be used
    +to set the value of a property within the object (e.g. <code>set("x.y.z", 5)</code>).
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">value</code>
    +                        <span class="type">Any</span>
    +
    +
    +                    <div class="param-description">
    +                        The value to set the attribute to.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[opts]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        Optional data providing the circumstances for the change.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    A reference to the host object.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_setAttrs" class="method item inherited">
    +    <h3 class="name"><code>setAttrs</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>attrs</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[opts]</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +        <span class="flag chainable">chainable</span>
    +
    +
    +    <div class="meta">
    +            <p>Inherited from
    +            <a href="http://yuilibrary.com/yui/docs/api/classes/AttributeObservable.html#method_setAttrs">
    +                AttributeObservable
    +            </a>
    +            but overwritten in
    +        <a href="http://yuilibrary.com/yui/docs/api/files/attribute_js_AttributeCore.js.html#l747"><code>attribute&#x2F;js&#x2F;AttributeCore.js:747</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Sets multiple attribute values.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">attrs</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        An object with attributes name/value pairs.
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[opts]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        Optional data providing the circumstances for the change.
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    A reference to the host object.
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_stringlog" class="method item private">
    +    <h3 class="name"><code>stringlog</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>data</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_docparser.js.html#l13"><code>lib&#x2F;docparser.js:13</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Parses the JSON data and formats it into a nice log string for
    +filename and line number: <code>/file/name.js:123</code></p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">data</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The data block from the parser</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>:
    +                    <p>The formatted string.</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_subscribe" class="method item deprecated inherited">
    +    <h3 class="name"><code>subscribe</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +
    +        <span class="flag deprecated" title="use on">deprecated</span>
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method_subscribe">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-target.js.html#l346"><code>event-custom&#x2F;js&#x2F;event-target.js:346</code></a>
    +        </p>
    +
    +
    +            <p>Deprecated: use on</p>
    +
    +    </div>
    +
    +    <div class="description">
    +        subscribe to an event
    +    </div>
    +
    +
    +
    +
    +</div>
    +<div id="method_toString" class="method item inherited">
    +    <h3 class="name"><code>toString</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html#method_toString">BaseCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l815"><code>base&#x2F;js&#x2F;BaseCore.js:815</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        Default toString implementation. Provides the constructor NAME
    +and the instance guid, if set.
    +    </div>
    +
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>:
    +                    String representation for this object
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_transform" class="method item">
    +    <h3 class="name"><code>transform</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>commentmap</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_docparser.js.html#l1433"><code>lib&#x2F;docparser.js:1433</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Transforms a map of filenames to arrays of comment blocks into a
    +JSON structure that represents the entire processed API doc info
    +and relationships between elements for the entire project.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">commentmap</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The hash of files and parsed comment blocks</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    <p>The transformed data for the project</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_unindent" class="method item private">
    +    <h3 class="name"><code>unindent</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>content</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_docparser.js.html#l1188"><code>lib&#x2F;docparser.js:1188</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Normalizes the initial indentation of the given <em>content</em> so that the first line
    +is unindented, and all other lines are unindented to the same degree as the
    +first line. So if the first line has four spaces at the beginning, then all
    +lines will be unindented four spaces. Ported from <a href="https://github.com/rgrove/selleck">Selleck</a></p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">content</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Text to unindent.</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>:
    +                    <p>Unindented text.</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_unsubscribe" class="method item deprecated inherited">
    +    <h3 class="name"><code>unsubscribe</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +
    +        <span class="flag deprecated" title="use detach">deprecated</span>
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method_unsubscribe">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-target.js.html#l469"><code>event-custom&#x2F;js&#x2F;event-target.js:469</code></a>
    +        </p>
    +
    +
    +            <p>Deprecated: use detach</p>
    +
    +    </div>
    +
    +    <div class="description">
    +        detach a listener
    +    </div>
    +
    +
    +
    +
    +</div>
    +<div id="method_unsubscribeAll" class="method item deprecated inherited">
    +    <h3 class="name"><code>unsubscribeAll</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>type</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +        <span class="flag deprecated" title="use detachAll">deprecated</span>
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/EventTarget.html#method_unsubscribeAll">EventTarget</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/event-custom_js_event-target.js.html#l490"><code>event-custom&#x2F;js&#x2F;event-target.js:490</code></a>
    +        </p>
    +
    +
    +            <p>Deprecated: use detachAll</p>
    +
    +    </div>
    +
    +    <div class="description">
    +        Removes all listeners from the specified event.  If the event type
    +is not specified, all listeners from all hosted custom events will
    +be removed.
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">type</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        The type, or name of the event
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +            </div>
    +
    +            <div id="properties" class="api-class-tabpanel">
    +                <h2 class="off-left">Properties</h2>
    +
    +<div id="property__allowAdHocAttrs" class="property item protected inherited">
    +    <h3 class="name"><code>_allowAdHocAttrs</code></h3>
    +    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +
    +
    +        <span class="flag protected">protected</span>
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html#property__allowAdHocAttrs">BaseCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l155"><code>base&#x2F;js&#x2F;BaseCore.js:155</code></a>
    +        </p>
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        This property controls whether or not instances of this class should
    +allow users to add ad-hoc attributes through the constructor configuration
    +hash.
    +
    +AdHoc attributes are attributes which are not defined by the class, and are
    +not handled by the MyClass._NON_ATTRS_CFG
    +    </div>
    +
    +        <p><strong>Default:</strong> undefined (false)</p>
    +
    +
    +</div>
    +<div id="property_CORRECTIONS" class="property item">
    +    <h3 class="name"><code>CORRECTIONS</code></h3>
    +    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +
    +        <span class="flag final">final</span>
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_docparser.js.html#l194"><code>lib&#x2F;docparser.js:194</code></a>
    +        </p>
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Common errors will get scrubbed instead of being ignored.</p>
    +
    +    </div>
    +
    +
    +
    +</div>
    +<div id="property_DIGESTERS" class="property item">
    +    <h3 class="name"><code>DIGESTERS</code></h3>
    +    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +
    +        <span class="flag final">final</span>
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_docparser.js.html#l217"><code>lib&#x2F;docparser.js:217</code></a>
    +        </p>
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>A map of the default tag processors, keyed by the
    +tag name.  Multiple tags can use the same digester
    +by supplying the string name that points to the
    +implementation rather than a function.</p>
    +
    +    </div>
    +
    +
    +
    +</div>
    +<div id="property_IGNORE_TAGLIST" class="property item">
    +    <h3 class="name"><code>IGNORE_TAGLIST</code></h3>
    +    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="crosslink external external" target="_blank">Array</a></span>
    +
    +
    +
    +        <span class="flag final">final</span>
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_docparser.js.html#l182"><code>lib&#x2F;docparser.js:182</code></a>
    +        </p>
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>A list of ignored tags. These tags should be ignored because there is
    +likely to be used for purposes other than JSDoc tags in JavaScript comments.</p>
    +
    +    </div>
    +
    +
    +
    +</div>
    +<div id="property_name" class="property item deprecated inherited">
    +    <h3 class="name"><code>name</code></h3>
    +    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +        <span class="flag deprecated" title="Use this.constructor.NAME">deprecated</span>
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>Inherited from
    +                <a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html#property_name">BaseCore</a>:
    +        <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l297"><code>base&#x2F;js&#x2F;BaseCore.js:297</code></a>
    +        </p>
    +
    +            <p>Deprecated: Use this.constructor.NAME</p>
    +
    +    </div>
    +
    +    <div class="description">
    +        The string used to identify the class of this object.
    +    </div>
    +
    +
    +
    +</div>
    +<div id="property_TAGLIST" class="property item">
    +    <h3 class="name"><code>TAGLIST</code></h3>
    +    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="crosslink external external" target="_blank">Array</a></span>
    +
    +
    +
    +        <span class="flag final">final</span>
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_docparser.js.html#l97"><code>lib&#x2F;docparser.js:97</code></a>
    +        </p>
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>A list of known tags.  This populates a member variable
    +during initialization, and will be updated if additional
    +digesters are added.</p>
    +
    +    </div>
    +
    +
    +
    +</div>
    +            </div>
    +
    +            <div id="attrs" class="api-class-tabpanel">
    +                <h2 class="off-left">Attributes</h2>
    +
    +                    <div id="attr_currentclass" class="attr item">
    +                        <a name="config_currentclass"></a> 
    +                        <h3 class="name"><code>currentclass</code></h3>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                        <div class="meta">
    +                                    <p>
    +                                    Defined in
    +                            <a href="../files/lib_docparser.js.html#l1040"><code>lib&#x2F;docparser.js:1040</code></a>
    +                            </p>
    +                    
    +                    
    +                        </div>
    +                    
    +                        <div class="description">
    +                            <p>The class currently being parsed</p>
    +                    
    +                        </div>
    +                    
    +                    
    +                            <div class="emits box">
    +                                <h4>Fires event <code>currentclassChange</code></h4>
    +                    
    +                                <p>
    +                                Fires when the value for the configuration attribute <code>currentclass</code> is
    +                                changed. You can listen for the event using the <code>on</code> method if you
    +                                wish to be notified before the attribute's value has changed, or
    +                                using the <code>after</code> method if you wish to be notified after the
    +                                attribute's value has changed.
    +                                </p>
    +                    
    +                                <div class="params">
    +                                    <h4>Parameters:</h4>
    +                    
    +                                    <ul class="params-list">
    +                                        <li class="param">
    +                                            <code class="param-name">e</code>
    +                                            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventFacade.html" class="crosslink external" target="_blank">EventFacade</a></span>
    +                    
    +                                            <div class="param-description">
    +                                                An Event Facade object with the following
    +                                                attribute-specific properties added:
    +                                            </div>
    +                    
    +                                            <ul class="params-list">
    +                                                <li class="param">
    +                                                    <code class="param-name">prevVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value of the attribute, prior to it being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">newVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value the attribute is to be set to.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">attrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">The name of the attribute being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">subAttrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">If setting a property within the attribute's value, the name of the sub-attribute property being set.</div>
    +                                                </li>
    +                                            </ul>
    +                                        </li>
    +                                    </ul>
    +                                </div>
    +                            </div>
    +                    
    +                    </div>
    +                    <div id="attr_currentelement" class="attr item">
    +                        <a name="config_currentelement"></a> 
    +                        <h3 class="name"><code>currentelement</code></h3>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                        <div class="meta">
    +                                    <p>
    +                                    Defined in
    +                            <a href="../files/lib_docparser.js.html#l1080"><code>lib&#x2F;docparser.js:1080</code></a>
    +                            </p>
    +                    
    +                    
    +                        </div>
    +                    
    +                        <div class="description">
    +                            <p>The element currently being parsed</p>
    +                    
    +                        </div>
    +                    
    +                    
    +                            <div class="emits box">
    +                                <h4>Fires event <code>currentelementChange</code></h4>
    +                    
    +                                <p>
    +                                Fires when the value for the configuration attribute <code>currentelement</code> is
    +                                changed. You can listen for the event using the <code>on</code> method if you
    +                                wish to be notified before the attribute's value has changed, or
    +                                using the <code>after</code> method if you wish to be notified after the
    +                                attribute's value has changed.
    +                                </p>
    +                    
    +                                <div class="params">
    +                                    <h4>Parameters:</h4>
    +                    
    +                                    <ul class="params-list">
    +                                        <li class="param">
    +                                            <code class="param-name">e</code>
    +                                            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventFacade.html" class="crosslink external" target="_blank">EventFacade</a></span>
    +                    
    +                                            <div class="param-description">
    +                                                An Event Facade object with the following
    +                                                attribute-specific properties added:
    +                                            </div>
    +                    
    +                                            <ul class="params-list">
    +                                                <li class="param">
    +                                                    <code class="param-name">prevVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value of the attribute, prior to it being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">newVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value the attribute is to be set to.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">attrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">The name of the attribute being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">subAttrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">If setting a property within the attribute's value, the name of the sub-attribute property being set.</div>
    +                                                </li>
    +                                            </ul>
    +                                        </li>
    +                                    </ul>
    +                                </div>
    +                            </div>
    +                    
    +                    </div>
    +                    <div id="attr_currentfile" class="attr item">
    +                        <a name="config_currentfile"></a> 
    +                        <h3 class="name"><code>currentfile</code></h3>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                        <div class="meta">
    +                                    <p>
    +                                    Defined in
    +                            <a href="../files/lib_docparser.js.html#l882"><code>lib&#x2F;docparser.js:882</code></a>
    +                            </p>
    +                    
    +                    
    +                        </div>
    +                    
    +                        <div class="description">
    +                            <p>The file currently being parsed</p>
    +                    
    +                        </div>
    +                    
    +                    
    +                            <div class="emits box">
    +                                <h4>Fires event <code>currentfileChange</code></h4>
    +                    
    +                                <p>
    +                                Fires when the value for the configuration attribute <code>currentfile</code> is
    +                                changed. You can listen for the event using the <code>on</code> method if you
    +                                wish to be notified before the attribute's value has changed, or
    +                                using the <code>after</code> method if you wish to be notified after the
    +                                attribute's value has changed.
    +                                </p>
    +                    
    +                                <div class="params">
    +                                    <h4>Parameters:</h4>
    +                    
    +                                    <ul class="params-list">
    +                                        <li class="param">
    +                                            <code class="param-name">e</code>
    +                                            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventFacade.html" class="crosslink external" target="_blank">EventFacade</a></span>
    +                    
    +                                            <div class="param-description">
    +                                                An Event Facade object with the following
    +                                                attribute-specific properties added:
    +                                            </div>
    +                    
    +                                            <ul class="params-list">
    +                                                <li class="param">
    +                                                    <code class="param-name">prevVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value of the attribute, prior to it being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">newVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value the attribute is to be set to.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">attrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">The name of the attribute being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">subAttrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">If setting a property within the attribute's value, the name of the sub-attribute property being set.</div>
    +                                                </li>
    +                                            </ul>
    +                                        </li>
    +                                    </ul>
    +                                </div>
    +                            </div>
    +                    
    +                    </div>
    +                    <div id="attr_currentmodule" class="attr item">
    +                        <a name="config_currentmodule"></a> 
    +                        <h3 class="name"><code>currentmodule</code></h3>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                        <div class="meta">
    +                                    <p>
    +                                    Defined in
    +                            <a href="../files/lib_docparser.js.html#l939"><code>lib&#x2F;docparser.js:939</code></a>
    +                            </p>
    +                    
    +                    
    +                        </div>
    +                    
    +                        <div class="description">
    +                            <p>The module currently being parsed</p>
    +                    
    +                        </div>
    +                    
    +                    
    +                            <div class="emits box">
    +                                <h4>Fires event <code>currentmoduleChange</code></h4>
    +                    
    +                                <p>
    +                                Fires when the value for the configuration attribute <code>currentmodule</code> is
    +                                changed. You can listen for the event using the <code>on</code> method if you
    +                                wish to be notified before the attribute's value has changed, or
    +                                using the <code>after</code> method if you wish to be notified after the
    +                                attribute's value has changed.
    +                                </p>
    +                    
    +                                <div class="params">
    +                                    <h4>Parameters:</h4>
    +                    
    +                                    <ul class="params-list">
    +                                        <li class="param">
    +                                            <code class="param-name">e</code>
    +                                            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventFacade.html" class="crosslink external" target="_blank">EventFacade</a></span>
    +                    
    +                                            <div class="param-description">
    +                                                An Event Facade object with the following
    +                                                attribute-specific properties added:
    +                                            </div>
    +                    
    +                                            <ul class="params-list">
    +                                                <li class="param">
    +                                                    <code class="param-name">prevVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value of the attribute, prior to it being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">newVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value the attribute is to be set to.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">attrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">The name of the attribute being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">subAttrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">If setting a property within the attribute's value, the name of the sub-attribute property being set.</div>
    +                                                </li>
    +                                            </ul>
    +                                        </li>
    +                                    </ul>
    +                                </div>
    +                            </div>
    +                    
    +                    </div>
    +                    <div id="attr_currentsubmodule" class="attr item">
    +                        <a name="config_currentsubmodule"></a> 
    +                        <h3 class="name"><code>currentsubmodule</code></h3>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                        <div class="meta">
    +                                    <p>
    +                                    Defined in
    +                            <a href="../files/lib_docparser.js.html#l999"><code>lib&#x2F;docparser.js:999</code></a>
    +                            </p>
    +                    
    +                    
    +                        </div>
    +                    
    +                        <div class="description">
    +                            <p>The submodule currently being parsed</p>
    +                    
    +                        </div>
    +                    
    +                    
    +                            <div class="emits box">
    +                                <h4>Fires event <code>currentsubmoduleChange</code></h4>
    +                    
    +                                <p>
    +                                Fires when the value for the configuration attribute <code>currentsubmodule</code> is
    +                                changed. You can listen for the event using the <code>on</code> method if you
    +                                wish to be notified before the attribute's value has changed, or
    +                                using the <code>after</code> method if you wish to be notified after the
    +                                attribute's value has changed.
    +                                </p>
    +                    
    +                                <div class="params">
    +                                    <h4>Parameters:</h4>
    +                    
    +                                    <ul class="params-list">
    +                                        <li class="param">
    +                                            <code class="param-name">e</code>
    +                                            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventFacade.html" class="crosslink external" target="_blank">EventFacade</a></span>
    +                    
    +                                            <div class="param-description">
    +                                                An Event Facade object with the following
    +                                                attribute-specific properties added:
    +                                            </div>
    +                    
    +                                            <ul class="params-list">
    +                                                <li class="param">
    +                                                    <code class="param-name">prevVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value of the attribute, prior to it being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">newVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value the attribute is to be set to.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">attrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">The name of the attribute being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">subAttrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">If setting a property within the attribute's value, the name of the sub-attribute property being set.</div>
    +                                                </li>
    +                                            </ul>
    +                                        </li>
    +                                    </ul>
    +                                </div>
    +                            </div>
    +                    
    +                    </div>
    +                    <div id="attr_destroyed" class="attr item inherited">
    +                        <a name="config_destroyed"></a> 
    +                        <h3 class="name"><code>destroyed</code></h3>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                            <span class="flag readonly">readonly</span>
    +                    
    +                        <div class="meta">
    +                                    <p>Inherited from
    +                                    <a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html#attr_destroyed">BaseCore</a>:
    +                            <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l212"><code>base&#x2F;js&#x2F;BaseCore.js:212</code></a>
    +                            </p>
    +                    
    +                    
    +                        </div>
    +                    
    +                        <div class="description">
    +                            Flag indicating whether or not this object
    +                    has been through the destroy lifecycle phase.
    +                        </div>
    +                    
    +                            <p><strong>Default:</strong> false</p>
    +                    
    +                            <div class="emits box">
    +                                <h4>Fires event <code>destroyedChange</code></h4>
    +                    
    +                                <p>
    +                                Fires when the value for the configuration attribute <code>destroyed</code> is
    +                                changed. You can listen for the event using the <code>on</code> method if you
    +                                wish to be notified before the attribute's value has changed, or
    +                                using the <code>after</code> method if you wish to be notified after the
    +                                attribute's value has changed.
    +                                </p>
    +                    
    +                                <div class="params">
    +                                    <h4>Parameters:</h4>
    +                    
    +                                    <ul class="params-list">
    +                                        <li class="param">
    +                                            <code class="param-name">e</code>
    +                                            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventFacade.html" class="crosslink external" target="_blank">EventFacade</a></span>
    +                    
    +                                            <div class="param-description">
    +                                                An Event Facade object with the following
    +                                                attribute-specific properties added:
    +                                            </div>
    +                    
    +                                            <ul class="params-list">
    +                                                <li class="param">
    +                                                    <code class="param-name">prevVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value of the attribute, prior to it being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">newVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value the attribute is to be set to.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">attrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">The name of the attribute being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">subAttrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">If setting a property within the attribute's value, the name of the sub-attribute property being set.</div>
    +                                                </li>
    +                                            </ul>
    +                                        </li>
    +                                    </ul>
    +                                </div>
    +                            </div>
    +                    
    +                    </div>
    +                    <div id="attr_digesters" class="attr item">
    +                        <a name="config_digesters"></a> 
    +                        <h3 class="name"><code>digesters</code></h3>
    +                        <span class="type"></span>
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                        <div class="meta">
    +                                    <p>
    +                                    Defined in
    +                            <a href="../files/lib_docparser.js.html#l822"><code>lib&#x2F;docparser.js:822</code></a>
    +                            </p>
    +                    
    +                    
    +                        </div>
    +                    
    +                        <div class="description">
    +                            <p>Digesters process the tag/text pairs found in a
    +                    comment block.  They are looked up by tag name.
    +                    The digester gets the tagname, the value, the
    +                    target object to apply values to, and the full
    +                    block that is being processed.  Digesters can
    +                    be declared as strings instead of a function --
    +                    in that case, the program will try to look up
    +                    the key listed and use the function there instead
    +                    (it is an alias).  Digesters can return a host
    +                    object in the case the tag defines a new key
    +                    block type (modules/classes/methods/events/properties)</p>
    +                    
    +                        </div>
    +                    
    +                    
    +                            <div class="emits box">
    +                                <h4>Fires event <code>digestersChange</code></h4>
    +                    
    +                                <p>
    +                                Fires when the value for the configuration attribute <code>digesters</code> is
    +                                changed. You can listen for the event using the <code>on</code> method if you
    +                                wish to be notified before the attribute's value has changed, or
    +                                using the <code>after</code> method if you wish to be notified after the
    +                                attribute's value has changed.
    +                                </p>
    +                    
    +                                <div class="params">
    +                                    <h4>Parameters:</h4>
    +                    
    +                                    <ul class="params-list">
    +                                        <li class="param">
    +                                            <code class="param-name">e</code>
    +                                            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventFacade.html" class="crosslink external" target="_blank">EventFacade</a></span>
    +                    
    +                                            <div class="param-description">
    +                                                An Event Facade object with the following
    +                                                attribute-specific properties added:
    +                                            </div>
    +                    
    +                                            <ul class="params-list">
    +                                                <li class="param">
    +                                                    <code class="param-name">prevVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value of the attribute, prior to it being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">newVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value the attribute is to be set to.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">attrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">The name of the attribute being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">subAttrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">If setting a property within the attribute's value, the name of the sub-attribute property being set.</div>
    +                                                </li>
    +                                            </ul>
    +                                        </li>
    +                                    </ul>
    +                                </div>
    +                            </div>
    +                    
    +                    </div>
    +                    <div id="attr_dirmap" class="attr item">
    +                        <a name="config_dirmap"></a> 
    +                        <h3 class="name"><code>dirmap</code></h3>
    +                        <span class="type"></span>
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                        <div class="meta">
    +                                    <p>
    +                                    Defined in
    +                            <a href="../files/lib_docparser.js.html#l872"><code>lib&#x2F;docparser.js:872</code></a>
    +                            </p>
    +                    
    +                    
    +                        </div>
    +                    
    +                        <div class="description">
    +                            <p>A map of file names to directory name.  Provided in
    +                    case this needs to be used to reset the module name
    +                    appropriately -- currently not used</p>
    +                    
    +                        </div>
    +                    
    +                    
    +                            <div class="emits box">
    +                                <h4>Fires event <code>dirmapChange</code></h4>
    +                    
    +                                <p>
    +                                Fires when the value for the configuration attribute <code>dirmap</code> is
    +                                changed. You can listen for the event using the <code>on</code> method if you
    +                                wish to be notified before the attribute's value has changed, or
    +                                using the <code>after</code> method if you wish to be notified after the
    +                                attribute's value has changed.
    +                                </p>
    +                    
    +                                <div class="params">
    +                                    <h4>Parameters:</h4>
    +                    
    +                                    <ul class="params-list">
    +                                        <li class="param">
    +                                            <code class="param-name">e</code>
    +                                            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventFacade.html" class="crosslink external" target="_blank">EventFacade</a></span>
    +                    
    +                                            <div class="param-description">
    +                                                An Event Facade object with the following
    +                                                attribute-specific properties added:
    +                                            </div>
    +                    
    +                                            <ul class="params-list">
    +                                                <li class="param">
    +                                                    <code class="param-name">prevVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value of the attribute, prior to it being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">newVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value the attribute is to be set to.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">attrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">The name of the attribute being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">subAttrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">If setting a property within the attribute's value, the name of the sub-attribute property being set.</div>
    +                                                </li>
    +                                            </ul>
    +                                        </li>
    +                                    </ul>
    +                                </div>
    +                            </div>
    +                    
    +                    </div>
    +                    <div id="attr_emitters" class="attr item">
    +                        <a name="config_emitters"></a> 
    +                        <h3 class="name"><code>emitters</code></h3>
    +                        <span class="type"></span>
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                        <div class="meta">
    +                                    <p>
    +                                    Defined in
    +                            <a href="../files/lib_docparser.js.html#l844"><code>lib&#x2F;docparser.js:844</code></a>
    +                            </p>
    +                    
    +                    
    +                        </div>
    +                    
    +                        <div class="description">
    +                            <p>Emitters will be schemas for the types of payloads
    +                    the parser will emit.  Not implemented.</p>
    +                    
    +                        </div>
    +                    
    +                    
    +                            <div class="emits box">
    +                                <h4>Fires event <code>emittersChange</code></h4>
    +                    
    +                                <p>
    +                                Fires when the value for the configuration attribute <code>emitters</code> is
    +                                changed. You can listen for the event using the <code>on</code> method if you
    +                                wish to be notified before the attribute's value has changed, or
    +                                using the <code>after</code> method if you wish to be notified after the
    +                                attribute's value has changed.
    +                                </p>
    +                    
    +                                <div class="params">
    +                                    <h4>Parameters:</h4>
    +                    
    +                                    <ul class="params-list">
    +                                        <li class="param">
    +                                            <code class="param-name">e</code>
    +                                            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventFacade.html" class="crosslink external" target="_blank">EventFacade</a></span>
    +                    
    +                                            <div class="param-description">
    +                                                An Event Facade object with the following
    +                                                attribute-specific properties added:
    +                                            </div>
    +                    
    +                                            <ul class="params-list">
    +                                                <li class="param">
    +                                                    <code class="param-name">prevVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value of the attribute, prior to it being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">newVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value the attribute is to be set to.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">attrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">The name of the attribute being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">subAttrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">If setting a property within the attribute's value, the name of the sub-attribute property being set.</div>
    +                                                </li>
    +                                            </ul>
    +                                        </li>
    +                                    </ul>
    +                                </div>
    +                            </div>
    +                    
    +                    </div>
    +                    <div id="attr_filemap" class="attr item">
    +                        <a name="config_filemap"></a> 
    +                        <h3 class="name"><code>filemap</code></h3>
    +                        <span class="type"></span>
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                        <div class="meta">
    +                                    <p>
    +                                    Defined in
    +                            <a href="../files/lib_docparser.js.html#l864"><code>lib&#x2F;docparser.js:864</code></a>
    +                            </p>
    +                    
    +                    
    +                        </div>
    +                    
    +                        <div class="description">
    +                            <p>The map of file names to file content.</p>
    +                    
    +                        </div>
    +                    
    +                    
    +                            <div class="emits box">
    +                                <h4>Fires event <code>filemapChange</code></h4>
    +                    
    +                                <p>
    +                                Fires when the value for the configuration attribute <code>filemap</code> is
    +                                changed. You can listen for the event using the <code>on</code> method if you
    +                                wish to be notified before the attribute's value has changed, or
    +                                using the <code>after</code> method if you wish to be notified after the
    +                                attribute's value has changed.
    +                                </p>
    +                    
    +                                <div class="params">
    +                                    <h4>Parameters:</h4>
    +                    
    +                                    <ul class="params-list">
    +                                        <li class="param">
    +                                            <code class="param-name">e</code>
    +                                            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventFacade.html" class="crosslink external" target="_blank">EventFacade</a></span>
    +                    
    +                                            <div class="param-description">
    +                                                An Event Facade object with the following
    +                                                attribute-specific properties added:
    +                                            </div>
    +                    
    +                                            <ul class="params-list">
    +                                                <li class="param">
    +                                                    <code class="param-name">prevVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value of the attribute, prior to it being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">newVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value the attribute is to be set to.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">attrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">The name of the attribute being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">subAttrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">If setting a property within the attribute's value, the name of the sub-attribute property being set.</div>
    +                                                </li>
    +                                            </ul>
    +                                        </li>
    +                                    </ul>
    +                                </div>
    +                            </div>
    +                    
    +                    </div>
    +                    <div id="attr_initialized" class="attr item inherited">
    +                        <a name="config_initialized"></a> 
    +                        <h3 class="name"><code>initialized</code></h3>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                            <span class="flag readonly">readonly</span>
    +                    
    +                        <div class="meta">
    +                                    <p>Inherited from
    +                                    <a href="http://yuilibrary.com/yui/docs/api/classes/BaseCore.html#attr_initialized">BaseCore</a>:
    +                            <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseCore.js.html#l198"><code>base&#x2F;js&#x2F;BaseCore.js:198</code></a>
    +                            </p>
    +                    
    +                    
    +                        </div>
    +                    
    +                        <div class="description">
    +                            Flag indicating whether or not this object
    +                    has been through the init lifecycle phase.
    +                        </div>
    +                    
    +                            <p><strong>Default:</strong> false</p>
    +                    
    +                            <div class="emits box">
    +                                <h4>Fires event <code>initializedChange</code></h4>
    +                    
    +                                <p>
    +                                Fires when the value for the configuration attribute <code>initialized</code> is
    +                                changed. You can listen for the event using the <code>on</code> method if you
    +                                wish to be notified before the attribute's value has changed, or
    +                                using the <code>after</code> method if you wish to be notified after the
    +                                attribute's value has changed.
    +                                </p>
    +                    
    +                                <div class="params">
    +                                    <h4>Parameters:</h4>
    +                    
    +                                    <ul class="params-list">
    +                                        <li class="param">
    +                                            <code class="param-name">e</code>
    +                                            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventFacade.html" class="crosslink external" target="_blank">EventFacade</a></span>
    +                    
    +                                            <div class="param-description">
    +                                                An Event Facade object with the following
    +                                                attribute-specific properties added:
    +                                            </div>
    +                    
    +                                            <ul class="params-list">
    +                                                <li class="param">
    +                                                    <code class="param-name">prevVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value of the attribute, prior to it being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">newVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value the attribute is to be set to.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">attrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">The name of the attribute being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">subAttrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">If setting a property within the attribute's value, the name of the sub-attribute property being set.</div>
    +                                                </li>
    +                                            </ul>
    +                                        </li>
    +                                    </ul>
    +                                </div>
    +                            </div>
    +                    
    +                    </div>
    +                    <div id="attr_mainmodule" class="attr item">
    +                        <a name="config_mainmodule"></a> 
    +                        <h3 class="name"><code>mainmodule</code></h3>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                        <div class="meta">
    +                                    <p>
    +                                    Defined in
    +                            <a href="../files/lib_docparser.js.html#l903"><code>lib&#x2F;docparser.js:903</code></a>
    +                            </p>
    +                    
    +                    
    +                        </div>
    +                    
    +                        <div class="description">
    +                            <p>The main documentation block for the module itself.</p>
    +                    
    +                        </div>
    +                    
    +                    
    +                            <div class="emits box">
    +                                <h4>Fires event <code>mainmoduleChange</code></h4>
    +                    
    +                                <p>
    +                                Fires when the value for the configuration attribute <code>mainmodule</code> is
    +                                changed. You can listen for the event using the <code>on</code> method if you
    +                                wish to be notified before the attribute's value has changed, or
    +                                using the <code>after</code> method if you wish to be notified after the
    +                                attribute's value has changed.
    +                                </p>
    +                    
    +                                <div class="params">
    +                                    <h4>Parameters:</h4>
    +                    
    +                                    <ul class="params-list">
    +                                        <li class="param">
    +                                            <code class="param-name">e</code>
    +                                            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventFacade.html" class="crosslink external" target="_blank">EventFacade</a></span>
    +                    
    +                                            <div class="param-description">
    +                                                An Event Facade object with the following
    +                                                attribute-specific properties added:
    +                                            </div>
    +                    
    +                                            <ul class="params-list">
    +                                                <li class="param">
    +                                                    <code class="param-name">prevVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value of the attribute, prior to it being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">newVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value the attribute is to be set to.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">attrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">The name of the attribute being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">subAttrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">If setting a property within the attribute's value, the name of the sub-attribute property being set.</div>
    +                                                </li>
    +                                            </ul>
    +                                        </li>
    +                                    </ul>
    +                                </div>
    +                            </div>
    +                    
    +                    </div>
    +                    <div id="attr_syntaxtype" class="attr item">
    +                        <a name="config_syntaxtype"></a> 
    +                        <h3 class="name"><code>syntaxtype</code></h3>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                    
    +                        <div class="meta">
    +                                    <p>
    +                                    Defined in
    +                            <a href="../files/lib_docparser.js.html#l855"><code>lib&#x2F;docparser.js:855</code></a>
    +                            </p>
    +                    
    +                    
    +                        </div>
    +                    
    +                        <div class="description">
    +                            <p>Comment syntax type.</p>
    +                    
    +                        </div>
    +                    
    +                    
    +                            <div class="emits box">
    +                                <h4>Fires event <code>syntaxtypeChange</code></h4>
    +                    
    +                                <p>
    +                                Fires when the value for the configuration attribute <code>syntaxtype</code> is
    +                                changed. You can listen for the event using the <code>on</code> method if you
    +                                wish to be notified before the attribute's value has changed, or
    +                                using the <code>after</code> method if you wish to be notified after the
    +                                attribute's value has changed.
    +                                </p>
    +                    
    +                                <div class="params">
    +                                    <h4>Parameters:</h4>
    +                    
    +                                    <ul class="params-list">
    +                                        <li class="param">
    +                                            <code class="param-name">e</code>
    +                                            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventFacade.html" class="crosslink external" target="_blank">EventFacade</a></span>
    +                    
    +                                            <div class="param-description">
    +                                                An Event Facade object with the following
    +                                                attribute-specific properties added:
    +                                            </div>
    +                    
    +                                            <ul class="params-list">
    +                                                <li class="param">
    +                                                    <code class="param-name">prevVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value of the attribute, prior to it being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">newVal</code>
    +                                                    <span class="type">Any</span>
    +                                                    <div class="param-description">The value the attribute is to be set to.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">attrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">The name of the attribute being set.</div>
    +                                                </li>
    +                                                <li class="param">
    +                                                    <code class="param-name">subAttrName</code>
    +                                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                                                    <div class="param-description">If setting a property within the attribute's value, the name of the sub-attribute property being set.</div>
    +                                                </li>
    +                                            </ul>
    +                                        </li>
    +                                    </ul>
    +                                </div>
    +                            </div>
    +                    
    +                    </div>
    +            </div>
    +
    +            <div id="events" class="api-class-tabpanel">
    +                <h2 class="off-left">Events</h2>
    +
    +                    <div id="event_destroy" class="events item inherited">
    +                        <h3 class="name"><code>destroy</code></h3>
    +                        <span class="type"></span>
    +                    
    +                    
    +                    
    +                    
    +                    
    +                        <div class="meta">
    +                                    <p>Inherited from
    +                                    <a href="http://yuilibrary.com/yui/docs/api/classes/BaseObservable.html#event_destroy">BaseObservable</a>:
    +                            <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseObservable.js.html#l163"><code>base&#x2F;js&#x2F;BaseObservable.js:163</code></a>
    +                            </p>
    +                    
    +                    
    +                        </div>
    +                    
    +                        <div class="description">
    +                            <p>
    +                    Lifecycle event for the destroy phase,
    +                    fired prior to destruction. Invoking the preventDefault
    +                    method on the event object provided to subscribers will
    +                    prevent destruction from proceeding.
    +                    </p>
    +                    <p>
    +                    Subscribers to the "after" moment of this event, will be notified
    +                    after destruction is complete (and as a result cannot prevent
    +                    destruction).
    +                    </p>
    +                        </div>
    +                    
    +                            <div class="params">
    +                                <h4>Event Payload:</h4>
    +                    
    +                                <ul class="params-list">
    +                                    <li class="param">
    +                                            <code class="param-name">e</code>
    +                                            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventFacade.html" class="crosslink external" target="_blank">EventFacade</a></span>
    +                    
    +                    
    +                                        <div class="param-description">
    +                                            Event object
    +                                        </div>
    +                    
    +                                    </li>
    +                                </ul>
    +                            </div>
    +                    
    +                    
    +                    </div>
    +                    <div id="event_init" class="events item inherited">
    +                        <h3 class="name"><code>init</code></h3>
    +                        <span class="type"></span>
    +                    
    +                    
    +                    
    +                    
    +                    
    +                        <div class="meta">
    +                                    <p>Inherited from
    +                                    <a href="http://yuilibrary.com/yui/docs/api/classes/BaseObservable.html#event_init">BaseObservable</a>:
    +                            <a href="http://yuilibrary.com/yui/docs/api/files/base_js_BaseObservable.js.html#l62"><code>base&#x2F;js&#x2F;BaseObservable.js:62</code></a>
    +                            </p>
    +                    
    +                    
    +                        </div>
    +                    
    +                        <div class="description">
    +                            <p>
    +                    Lifecycle event for the init phase, fired prior to initialization.
    +                    Invoking the preventDefault() method on the event object provided
    +                    to subscribers will prevent initialization from occuring.
    +                    </p>
    +                    <p>
    +                    Subscribers to the "after" momemt of this event, will be notified
    +                    after initialization of the object is complete (and therefore
    +                    cannot prevent initialization).
    +                    </p>
    +                        </div>
    +                    
    +                            <div class="params">
    +                                <h4>Event Payload:</h4>
    +                    
    +                                <ul class="params-list">
    +                                    <li class="param">
    +                                            <code class="param-name">e</code>
    +                                            <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/EventFacade.html" class="crosslink external" target="_blank">EventFacade</a></span>
    +                    
    +                    
    +                                        <div class="param-description">
    +                                            Event object, with a cfg property which
    +                    refers to the configuration object passed to the constructor.
    +                                        </div>
    +                    
    +                                    </li>
    +                                </ul>
    +                            </div>
    +                    
    +                    
    +                    </div>
    +            </div>
    +    </div>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/classes/DocView.html b/output/api/classes/DocView.html
    new file mode 100644
    index 00000000..fee116f9
    --- /dev/null
    +++ b/output/api/classes/DocView.html
    @@ -0,0 +1,296 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>DocView - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1>DocView Class</h1>
    +<div class="box meta">
    +
    +
    +        <div class="foundat">
    +            Defined in: <a href="../files/lib_docview.js.html#l16"><code>lib&#x2F;docview.js:16</code></a>
    +        </div>
    +
    +            Module: <a href="../modules/yuidoc.html">yuidoc</a>
    +
    +</div>
    +
    +
    +<div class="box intro">
    +    <p>View class borrowed from <a href="https://github.com/rgrove/selleck">Selleck</a>
    +The view class is a <strong><code>handlebars</code></strong> template helper.</p>
    +
    +</div>
    +
    +    <div class="constructor">
    +        <h2>Constructor</h2>
    +<div id="method_DocView" class="method item">
    +    <h3 class="name"><code>DocView</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>data</code>
    +                </li>
    +                <li class="arg">
    +                        <code>templateName</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_docview.js.html#l16"><code>lib&#x2F;docview.js:16</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">data</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Meta data to use in this template</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">templateName</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The name of the template file to render.</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +    </div>
    +
    +<div id="classdocs" class="tabview">
    +    <ul class="api-class-tabs">
    +        <li class="api-class-tab index"><a href="#index">Index</a></li>
    +
    +            <li class="api-class-tab methods"><a href="#methods">Methods</a></li>
    +    </ul>
    +
    +    <div>
    +        <div id="index" class="api-class-tabpanel index">
    +            <h2 class="off-left">Item Index</h2>
    +
    +                <div class="index-section methods">
    +                    <h3>Methods</h3>
    +
    +                    <ul class="index-list methods">
    +                            <li class="index-item method">
    +                                <a href="#method_htmlTitle">htmlTitle</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_title">title</a>
    +
    +                            </li>
    +                    </ul>
    +                </div>
    +
    +
    +
    +        </div>
    +
    +            <div id="methods" class="api-class-tabpanel">
    +                <h2 class="off-left">Methods</h2>
    +
    +<div id="method_htmlTitle" class="method item">
    +    <h3 class="name"><code>htmlTitle</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_docview.js.html#l30"><code>lib&#x2F;docview.js:30</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p><strong>Mustache</strong> <code>lambda</code> method for setting the HTML title</p>
    +
    +    </div>
    +
    +
    +
    +
    +</div>
    +<div id="method_title" class="method item">
    +    <h3 class="name"><code>title</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_docview.js.html#l49"><code>lib&#x2F;docview.js:49</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p><strong>Mustache</strong> <code>lambda</code> method for setting the title</p>
    +
    +    </div>
    +
    +
    +
    +
    +</div>
    +            </div>
    +
    +
    +
    +    </div>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/classes/Files.html b/output/api/classes/Files.html
    new file mode 100644
    index 00000000..3b6d24f8
    --- /dev/null
    +++ b/output/api/classes/Files.html
    @@ -0,0 +1,1191 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>Files - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1>Files Class</h1>
    +<div class="box meta">
    +
    +
    +        <div class="foundat">
    +            Defined in: <a href="../files/lib_files.js.html#l10"><code>lib&#x2F;files.js:10</code></a>
    +        </div>
    +
    +            Module: <a href="../modules/yuidoc.html">yuidoc</a>
    +
    +</div>
    +
    +
    +<div class="box intro">
    +    <p>Ported fileutils methods from <a href="http://github.com/rgrove/selleck">Selleck</a></p>
    +
    +</div>
    +
    +
    +<div id="classdocs" class="tabview">
    +    <ul class="api-class-tabs">
    +        <li class="api-class-tab index"><a href="#index">Index</a></li>
    +
    +            <li class="api-class-tab methods"><a href="#methods">Methods</a></li>
    +    </ul>
    +
    +    <div>
    +        <div id="index" class="api-class-tabpanel index">
    +            <h2 class="off-left">Item Index</h2>
    +
    +                <div class="index-section methods">
    +                    <h3>Methods</h3>
    +
    +                    <ul class="index-list methods">
    +                            <li class="index-item method">
    +                                <a href="#method_copyAssets">copyAssets</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_copyDirectory">copyDirectory</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_copyFile">copyFile</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_copyPath">copyPath</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_deletePath">deletePath</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_getJSON">getJSON</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_isDirectory">isDirectory</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_isFile">isFile</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_isSymbolicLink">isSymbolicLink</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_lstatSync">lstatSync</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_statSync">statSync</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_writeFile">writeFile</a>
    +
    +                            </li>
    +                    </ul>
    +                </div>
    +
    +
    +
    +        </div>
    +
    +            <div id="methods" class="api-class-tabpanel">
    +                <h2 class="off-left">Methods</h2>
    +
    +<div id="method_copyAssets" class="method item">
    +    <h3 class="name"><code>copyAssets</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>from</code>
    +                </li>
    +                <li class="arg">
    +                        <code>dest</code>
    +                </li>
    +                <li class="arg">
    +                        <code>deleteFirst</code>
    +                </li>
    +                <li class="arg">
    +                        <code>callback</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_files.js.html#l369"><code>lib&#x2F;files.js:369</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Copy the theme assets directory</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">from</code>
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/Path.html" class="crosslink external" target="_blank">Path</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The source directory</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">dest</code>
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/Path.html" class="crosslink external" target="_blank">Path</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The destination directory</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">deleteFirst</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Should the directory be deleted if it exists</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">callback</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="crosslink external" target="_blank">Function</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The callback to be executed</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_copyDirectory" class="method item">
    +    <h3 class="name"><code>copyDirectory</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>source</code>
    +                </li>
    +                <li class="arg">
    +                        <code>dest</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[overwrite=false]</code>
    +                </li>
    +                <li class="arg">
    +                        <code>callback</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_files.js.html#l39"><code>lib&#x2F;files.js:39</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Copy a directory from one location to another</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">source</code>
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/Path.html" class="crosslink external" target="_blank">Path</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The source directory</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">dest</code>
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/Path.html" class="crosslink external" target="_blank">Path</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The destination directory</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[overwrite=false]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Whether or not to overwrite destination files
    +if they already exist.</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">callback</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="crosslink external" target="_blank">Function</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The callback to be executed when complete.</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_copyFile" class="method item">
    +    <h3 class="name"><code>copyFile</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>source</code>
    +                </li>
    +                <li class="arg">
    +                        <code>dest</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[overwrite=false]</code>
    +                </li>
    +                <li class="arg">
    +                        <code>callback</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_files.js.html#l128"><code>lib&#x2F;files.js:128</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Copy a file from one location to another</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">source</code>
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/Path.html" class="crosslink external" target="_blank">Path</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The source file</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">dest</code>
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/Path.html" class="crosslink external" target="_blank">Path</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The destination file</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[overwrite=false]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Whether or not to overwrite destination files
    +if they already exist.</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">callback</code>
    +                        <span class="type">Callback</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The callback to be executed when complete.</p>
    +
    +                    </div>
    +
    +                        <ul class="params-list">
    +                            <li class="param">
    +                                    <code class="param-name">err</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error" class="crosslink external" target="_blank">Error</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>The Error returned from Node</p>
    +
    +                                </div>
    +
    +                            </li>
    +                        </ul>
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_copyPath" class="method item">
    +    <h3 class="name"><code>copyPath</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>source</code>
    +                </li>
    +                <li class="arg">
    +                        <code>dest</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[overwrite=false]</code>
    +                </li>
    +                <li class="arg">
    +                        <code>callback</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_files.js.html#l181"><code>lib&#x2F;files.js:181</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>If <em>source</em> is a file, copies it to <em>dest</em>. If it's a directory, recursively
    +copies it and all files and directories it contains to <em>dest</em>.</p>
    +<p>Note that when attempting to copy a file into a directory, you should specify
    +the full path to the new file (including the new filename). Otherwise, it will
    +be interpreted as an attempt to copy the <em>source</em> file <em>over</em> the <em>dest</em>
    +directory instead of <em>into</em> it.</p>
    +<p>Known issues:</p>
    +<ul>
    +<li>Doesn't preserve ownership or permissions on copied files/directories.</li>
    +</ul>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">source</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Source path.</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">dest</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Destination path.</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[overwrite=false]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Whether or not to overwrite destination files
    +if they already exist.</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">callback</code>
    +                        <span class="type">Callback</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The callback to execute when completed.</p>
    +
    +                    </div>
    +
    +                        <ul class="params-list">
    +                            <li class="param">
    +                                    <code class="param-name">err</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error" class="crosslink external" target="_blank">Error</a></span>
    +
    +                                <div class="param-description">
    +                                    
    +                                </div>
    +
    +                            </li>
    +                        </ul>
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_deletePath" class="method item">
    +    <h3 class="name"><code>deletePath</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>path</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_files.js.html#l227"><code>lib&#x2F;files.js:227</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>If <em>path</em> is a file, deletes it. If <em>path</em> is a directory, recursively deletes
    +it and all files and directories it contains.</p>
    +<p>This method is synchronous.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">path</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>File or directory to delete.</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_getJSON" class="method item">
    +    <h3 class="name"><code>getJSON</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>filename</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_files.js.html#l417"><code>lib&#x2F;files.js:417</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Helper method for getting JSON data from a local file</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">filename</code>
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/Path.html" class="crosslink external" target="_blank">Path</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The filename to parse JSON from</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    <p>The JSON data</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_isDirectory" class="method item">
    +    <h3 class="name"><code>isDirectory</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>path</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[link=false]</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_files.js.html#l252"><code>lib&#x2F;files.js:252</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Check to see if this is a directory</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">path</code>
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/Path.html" class="crosslink external" target="_blank">Path</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The path to check</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[link=false]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Also validate a symlink</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>:
    +                    <p>True if it is a directory</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_isFile" class="method item">
    +    <h3 class="name"><code>isFile</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>path</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[link=false]</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_files.js.html#l283"><code>lib&#x2F;files.js:283</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Check to see if this is a File</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">path</code>
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/Path.html" class="crosslink external" target="_blank">Path</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The path to check</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[link=false]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Also validate a symlink</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>:
    +                    <p>True if it is a file</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_isSymbolicLink" class="method item">
    +    <h3 class="name"><code>isSymbolicLink</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>path</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_files.js.html#l312"><code>lib&#x2F;files.js:312</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Check to see if this is a SymLink</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">path</code>
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/Path.html" class="crosslink external" target="_blank">Path</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The path to check</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>:
    +                    <p>True if it is a link</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_lstatSync" class="method item">
    +    <h3 class="name"><code>lstatSync</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>path</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type">fs.Stats | Null</span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_files.js.html#l326"><code>lib&#x2F;files.js:326</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Like <code>fs.lstatSync()</code>, but returns <code>null</code> instead of throwing when <em>path</em>
    +doesn't exist. Will still throw on other types of errors.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">path</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Path to stat.</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type">fs.Stats | Null</span>:
    +                    <p><code>fs.Stats</code> object, or <code>null</code> if <em>path</em> doesn't exist.</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_statSync" class="method item">
    +    <h3 class="name"><code>statSync</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>path</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type">fs.Stats | Null</span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_files.js.html#l348"><code>lib&#x2F;files.js:348</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Like <code>fs.statSync()</code>, but returns <code>null</code> instead of throwing when <em>path</em>
    +doesn't exist. Will still throw on other types of errors.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">path</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Path to stat.</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type">fs.Stats | Null</span>:
    +                    <p><code>fs.Stats</code> object, or <code>null</code> if <em>path</em> doesn't exist.</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_writeFile" class="method item">
    +    <h3 class="name"><code>writeFile</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>file</code>
    +                </li>
    +                <li class="arg">
    +                        <code>data</code>
    +                </li>
    +                <li class="arg">
    +                        <code>callback</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_files.js.html#l432"><code>lib&#x2F;files.js:432</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Helper method for writing files to disk. It wraps the NodeJS file API</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">file</code>
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/Path.html" class="crosslink external" target="_blank">Path</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The filename to write to</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">data</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The data to write</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">callback</code>
    +                        <span class="type">Callback</span>
    +
    +                        <span class="flag multiple" title="This argument may occur one or more times.">multiple</span>
    +
    +                    <div class="param-description">
    +                         
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +            </div>
    +
    +
    +
    +    </div>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/classes/Help.html b/output/api/classes/Help.html
    new file mode 100644
    index 00000000..809c3d92
    --- /dev/null
    +++ b/output/api/classes/Help.html
    @@ -0,0 +1,278 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>Help - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1>Help Class</h1>
    +<div class="box meta">
    +
    +
    +        <div class="foundat">
    +            Defined in: <a href="../files/lib_help.js.html#l10"><code>lib&#x2F;help.js:10</code></a>
    +        </div>
    +
    +            Module: <a href="../modules/yuidoc.html">yuidoc</a>
    +
    +</div>
    +
    +
    +<div class="box intro">
    +    <p>Shows the help text</p>
    +
    +</div>
    +
    +
    +<div id="classdocs" class="tabview">
    +    <ul class="api-class-tabs">
    +        <li class="api-class-tab index"><a href="#index">Index</a></li>
    +
    +            <li class="api-class-tab methods"><a href="#methods">Methods</a></li>
    +            <li class="api-class-tab properties"><a href="#properties">Properties</a></li>
    +    </ul>
    +
    +    <div>
    +        <div id="index" class="api-class-tabpanel index">
    +            <h2 class="off-left">Item Index</h2>
    +
    +                <div class="index-section methods">
    +                    <h3>Methods</h3>
    +
    +                    <ul class="index-list methods">
    +                            <li class="index-item method">
    +                                <a href="#method_renderHelp">renderHelp</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_showHelp">showHelp</a>
    +
    +                            </li>
    +                    </ul>
    +                </div>
    +
    +                <div class="index-section properties">
    +                    <h3>Properties</h3>
    +
    +                    <ul class="index-list properties">
    +                            <li class="index-item property private">
    +                                <a href="#property_help">help</a>
    +
    +                            </li>
    +                    </ul>
    +                </div>
    +
    +
    +        </div>
    +
    +            <div id="methods" class="api-class-tabpanel">
    +                <h2 class="off-left">Methods</h2>
    +
    +<div id="method_renderHelp" class="method item">
    +    <h3 class="name"><code>renderHelp</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_help.js.html#l63"><code>lib&#x2F;help.js:63</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Render the help message as a string</p>
    +
    +    </div>
    +
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>:
    +                    <p>The help screen to display</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_showHelp" class="method item">
    +    <h3 class="name"><code>showHelp</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_help.js.html#l73"><code>lib&#x2F;help.js:73</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Display the help message, write it to the screen and exit</p>
    +
    +    </div>
    +
    +
    +
    +
    +</div>
    +            </div>
    +
    +            <div id="properties" class="api-class-tabpanel">
    +                <h2 class="off-left">Properties</h2>
    +
    +<div id="property_help" class="property item private">
    +    <h3 class="name"><code>help</code></h3>
    +    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="crosslink external external" target="_blank">Array</a></span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_help.js.html#l16"><code>lib&#x2F;help.js:16</code></a>
    +        </p>
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>The help text to display</p>
    +
    +    </div>
    +
    +
    +
    +</div>
    +            </div>
    +
    +
    +    </div>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/classes/Main.html b/output/api/classes/Main.html
    new file mode 100644
    index 00000000..181191e0
    --- /dev/null
    +++ b/output/api/classes/Main.html
    @@ -0,0 +1,153 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>Main - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1>Main Class</h1>
    +<div class="box meta">
    +
    +
    +        <div class="foundat">
    +            Defined in: <a href="../files/lib_index.js.html#l8"><code>lib&#x2F;index.js:8</code></a>
    +        </div>
    +
    +            Module: <a href="../modules/yuidoc.html">yuidoc</a>
    +
    +</div>
    +
    +
    +<div class="box intro">
    +    <p>Module creates the YUI instance with the required modules, uses them and exports the <strong>Y</strong> to be used
    +by the <em>CLI class</em> or by extenders: <code>require('yuidocjs');</code>
    +You can use it like this:</p>
    +<pre class="code prettyprint"><code>var options = {
    +    paths: [ './lib' ],
    +    outdir: './out'
    +};
    +
    +var Y = require('yuidocjs');
    +var json = (new Y.YUIDoc(options)).run();</code></pre>
    +
    +</div>
    +
    +
    +<div id="classdocs" class="tabview">
    +    <ul class="api-class-tabs">
    +        <li class="api-class-tab index"><a href="#index">Index</a></li>
    +
    +    </ul>
    +
    +    <div>
    +        <div id="index" class="api-class-tabpanel index">
    +            <h2 class="off-left">Item Index</h2>
    +
    +
    +
    +
    +        </div>
    +
    +
    +
    +
    +    </div>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/classes/Options.html b/output/api/classes/Options.html
    new file mode 100644
    index 00000000..d457638b
    --- /dev/null
    +++ b/output/api/classes/Options.html
    @@ -0,0 +1,225 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>Options - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1>Options Class</h1>
    +<div class="box meta">
    +
    +
    +        <div class="foundat">
    +            Defined in: <a href="../files/lib_options.js.html#l12"><code>lib&#x2F;options.js:12</code></a>
    +        </div>
    +
    +            Module: <a href="../modules/yuidoc.html">yuidoc</a>
    +
    +</div>
    +
    +
    +<div class="box intro">
    +    <p>Handles argument parsing</p>
    +
    +</div>
    +
    +
    +<div id="classdocs" class="tabview">
    +    <ul class="api-class-tabs">
    +        <li class="api-class-tab index"><a href="#index">Index</a></li>
    +
    +            <li class="api-class-tab methods"><a href="#methods">Methods</a></li>
    +    </ul>
    +
    +    <div>
    +        <div id="index" class="api-class-tabpanel index">
    +            <h2 class="off-left">Item Index</h2>
    +
    +                <div class="index-section methods">
    +                    <h3>Methods</h3>
    +
    +                    <ul class="index-list methods">
    +                            <li class="index-item method">
    +                                <a href="#method_Options">Options</a>
    +
    +                            </li>
    +                    </ul>
    +                </div>
    +
    +
    +
    +        </div>
    +
    +            <div id="methods" class="api-class-tabpanel">
    +                <h2 class="off-left">Methods</h2>
    +
    +<div id="method_Options" class="method item">
    +    <h3 class="name"><code>Options</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>args</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_options.js.html#l18"><code>lib&#x2F;options.js:18</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Parses arguments and returns an Object of config options</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">args</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="crosslink external external" target="_blank">Array</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Arguments to parse</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    <p>The config object</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +            </div>
    +
    +
    +
    +    </div>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/classes/Server.html b/output/api/classes/Server.html
    new file mode 100644
    index 00000000..b75374a8
    --- /dev/null
    +++ b/output/api/classes/Server.html
    @@ -0,0 +1,698 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>Server - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1>Server Class</h1>
    +<div class="box meta">
    +
    +
    +        <div class="foundat">
    +            Defined in: <a href="../files/lib_server.js.html#l13"><code>lib&#x2F;server.js:13</code></a>
    +        </div>
    +
    +            Module: <a href="../modules/yuidoc.html">yuidoc</a>
    +
    +</div>
    +
    +
    +<div class="box intro">
    +    <p>Provides the <code>--server</code> server option for YUIDoc</p>
    +
    +</div>
    +
    +
    +<div id="classdocs" class="tabview">
    +    <ul class="api-class-tabs">
    +        <li class="api-class-tab index"><a href="#index">Index</a></li>
    +
    +            <li class="api-class-tab methods"><a href="#methods">Methods</a></li>
    +            <li class="api-class-tab properties"><a href="#properties">Properties</a></li>
    +    </ul>
    +
    +    <div>
    +        <div id="index" class="api-class-tabpanel index">
    +            <h2 class="off-left">Item Index</h2>
    +
    +                <div class="index-section methods">
    +                    <h3>Methods</h3>
    +
    +                    <ul class="index-list methods">
    +                            <li class="index-item method">
    +                                <a href="#method_clazz">clazz</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_files">files</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_home">home</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_init">init</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_modules">modules</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_parse">parse</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_routes">routes</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_start">start</a>
    +
    +                            </li>
    +                    </ul>
    +                </div>
    +
    +                <div class="index-section properties">
    +                    <h3>Properties</h3>
    +
    +                    <ul class="index-list properties">
    +                            <li class="index-item property private">
    +                                <a href="#property__externalData">_externalData</a>
    +
    +                            </li>
    +                    </ul>
    +                </div>
    +
    +
    +        </div>
    +
    +            <div id="methods" class="api-class-tabpanel">
    +                <h2 class="off-left">Methods</h2>
    +
    +<div id="method_clazz" class="method item">
    +    <h3 class="name"><code>clazz</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>req</code>
    +                </li>
    +                <li class="arg">
    +                        <code>res</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_server.js.html#l140"><code>lib&#x2F;server.js:140</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p><code>/classes</code> endpoint</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">req</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/API/Request" class="crosslink external" target="_blank">Request</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Express request object</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">res</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/API/Response" class="crosslink external" target="_blank">Response</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Express response object</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_files" class="method item">
    +    <h3 class="name"><code>files</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>req</code>
    +                </li>
    +                <li class="arg">
    +                        <code>res</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_server.js.html#l114"><code>lib&#x2F;server.js:114</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p><code>/files</code> endpoint</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">req</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/API/Request" class="crosslink external" target="_blank">Request</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Express request object</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">res</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/API/Response" class="crosslink external" target="_blank">Response</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Express response object</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_home" class="method item">
    +    <h3 class="name"><code>home</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>req</code>
    +                </li>
    +                <li class="arg">
    +                        <code>res</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_server.js.html#l172"><code>lib&#x2F;server.js:172</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p><code>/</code> endpoint</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">req</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/API/Request" class="crosslink external" target="_blank">Request</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Express request object</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">res</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/API/Response" class="crosslink external" target="_blank">Response</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Express response object</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_init" class="method item">
    +    <h3 class="name"><code>init</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_server.js.html#l184"><code>lib&#x2F;server.js:184</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Creates the Express server and prep's YUI for serving</p>
    +
    +    </div>
    +
    +
    +
    +
    +</div>
    +<div id="method_modules" class="method item">
    +    <h3 class="name"><code>modules</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>req</code>
    +                </li>
    +                <li class="arg">
    +                        <code>res</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_server.js.html#l156"><code>lib&#x2F;server.js:156</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p><code>/modules</code> endpoint</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">req</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/API/Request" class="crosslink external" target="_blank">Request</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Express request object</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">res</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/API/Response" class="crosslink external" target="_blank">Response</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Express response object</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_parse" class="method item">
    +    <h3 class="name"><code>parse</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>req</code>
    +                </li>
    +                <li class="arg">
    +                        <code>res</code>
    +                </li>
    +                <li class="arg">
    +                        <code>next</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_server.js.html#l26"><code>lib&#x2F;server.js:26</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Middleware to parse the API docs per request</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">req</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/API/Request" class="crosslink external" target="_blank">Request</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Express request object</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">res</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/API/Response" class="crosslink external" target="_blank">Response</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Express response object</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">next</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="crosslink external" target="_blank">Function</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Express next callback</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_routes" class="method item">
    +    <h3 class="name"><code>routes</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_server.js.html#l44"><code>lib&#x2F;server.js:44</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Create the routes used to serve YUIDoc files dynamically</p>
    +
    +    </div>
    +
    +
    +
    +
    +</div>
    +<div id="method_start" class="method item">
    +    <h3 class="name"><code>start</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>options</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_server.js.html#l200"><code>lib&#x2F;server.js:200</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Start the server with the supplied options.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">options</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Server options</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +            </div>
    +
    +            <div id="properties" class="api-class-tabpanel">
    +                <h2 class="off-left">Properties</h2>
    +
    +<div id="property__externalData" class="property item private">
    +    <h3 class="name"><code>_externalData</code></h3>
    +    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_server.js.html#l19"><code>lib&#x2F;server.js:19</code></a>
    +        </p>
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Cache for external mixed in data.</p>
    +
    +    </div>
    +
    +
    +
    +</div>
    +            </div>
    +
    +
    +    </div>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/classes/Utils.html b/output/api/classes/Utils.html
    new file mode 100644
    index 00000000..9aac66d3
    --- /dev/null
    +++ b/output/api/classes/Utils.html
    @@ -0,0 +1,1049 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>Utils - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1>Utils Class</h1>
    +<div class="box meta">
    +
    +
    +        <div class="foundat">
    +            Defined in: <a href="../files/lib_utils.js.html#l12"><code>lib&#x2F;utils.js:12</code></a>
    +        </div>
    +
    +            Module: <a href="../modules/yuidoc.html">yuidoc</a>
    +
    +</div>
    +
    +
    +<div class="box intro">
    +    <p>Utilities Class</p>
    +
    +</div>
    +
    +
    +<div id="classdocs" class="tabview">
    +    <ul class="api-class-tabs">
    +        <li class="api-class-tab index"><a href="#index">Index</a></li>
    +
    +            <li class="api-class-tab methods"><a href="#methods">Methods</a></li>
    +    </ul>
    +
    +    <div>
    +        <div id="index" class="api-class-tabpanel index">
    +            <h2 class="off-left">Item Index</h2>
    +
    +                <div class="index-section methods">
    +                    <h3>Methods</h3>
    +
    +                    <ul class="index-list methods">
    +                            <li class="index-item method">
    +                                <a href="#method_escapeHTML">escapeHTML</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_fixType">fixType</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_getDirs">getDirs</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_getLayouts">getLayouts</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_getPage">getPage</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_getPages">getPages</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_getPartials">getPartials</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_getProjectData">getProjectData</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_prepare">prepare</a>
    +
    +                            </li>
    +                            <li class="index-item method private">
    +                                <a href="#method_unindent">unindent</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_validatePaths">validatePaths</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_webpath">webpath</a>
    +
    +                            </li>
    +                    </ul>
    +                </div>
    +
    +
    +
    +        </div>
    +
    +            <div id="methods" class="api-class-tabpanel">
    +                <h2 class="off-left">Methods</h2>
    +
    +<div id="method_escapeHTML" class="method item">
    +    <h3 class="name"><code>escapeHTML</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>html</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_utils.js.html#l32"><code>lib&#x2F;utils.js:32</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Escapes HTML characters in <em>html</em>.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">html</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>String to escape.</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>:
    +                    <p>Escaped string.</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_fixType" class="method item">
    +    <h3 class="name"><code>fixType</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>t</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_utils.js.html#l459"><code>lib&#x2F;utils.js:459</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Takes a type string and converts it to a &quot;First letter upper cased&quot; type. e.g. <code>(string -&gt; String, object -&gt; Object)</code></p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">t</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The type string to convert</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>:
    +                    <p>The fixed string</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_getDirs" class="method item">
    +    <h3 class="name"><code>getDirs</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>baseDir</code>
    +                </li>
    +                <li class="arg">
    +                        <code>ignore</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="crosslink external external" target="_blank">Array</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_utils.js.html#l339"><code>lib&#x2F;utils.js:339</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Walks the tree from this dir and returns all the subdirs</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">baseDir</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The dir to begin at</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">ignore</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="crosslink external external" target="_blank">Array</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>An array of paths to ignore</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="crosslink external external" target="_blank">Array</a></span>:
    +                    <p>The array of directories..</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_getLayouts" class="method item">
    +    <h3 class="name"><code>getLayouts</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>dir</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_utils.js.html#l66"><code>lib&#x2F;utils.js:66</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Like <code>getPages()</code>, but returns only the files under the <code>layout/</code> subdirectory
    +of the specified <em>dir</em>.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">dir</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Directory path.</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    <p>Mapping of layout names to layout content.</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_getPage" class="method item">
    +    <h3 class="name"><code>getPage</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>pagePath</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a> | Null</span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_utils.js.html#l79"><code>lib&#x2F;utils.js:79</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Loads and returns the content of the specified page file.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">pagePath</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Path to a single <code>.handlebars</code> page.</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a> | Null</span>:
    +                    <p>Page content, or <code>null</code> if not found.</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_getPages" class="method item">
    +    <h3 class="name"><code>getPages</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>dir</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_utils.js.html#l94"><code>lib&#x2F;utils.js:94</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Loads pages (files with a <code>.handlebars</code> extension) in the specified directory and
    +returns an object containing a mapping of page names (the part of the filename)
    +preceding the <code>.handlebars</code> extension) to page content.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">dir</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Directory path.</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    <p>Mapping of page names to page content.</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_getPartials" class="method item">
    +    <h3 class="name"><code>getPartials</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>dir</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_utils.js.html#l127"><code>lib&#x2F;utils.js:127</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Like <code>getPages()</code>, but returns only the files under the <code>partial/</code> subdirectory
    +of the specified <em>dir</em>.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">dir</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Directory path.</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    <p>Mapping of partial names to partial content.</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_getProjectData" class="method item">
    +    <h3 class="name"><code>getProjectData</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code class="optional">[directory=process.cwd()]</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_utils.js.html#l227"><code>lib&#x2F;utils.js:227</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Walk the directory tree to locate the yuidoc.json file.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name optional">[directory=process.cwd()]</code>
    +                        <span class="type"><a href="http://yuilibrary.com/yui/docs/api/classes/Path.html" class="crosslink external" target="_blank">Path</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The directory to start from</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_prepare" class="method item">
    +    <h3 class="name"><code>prepare</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>inDir</code>
    +                </li>
    +                <li class="arg">
    +                        <code>options</code>
    +                </li>
    +                <li class="arg">
    +                        <code>callback</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_utils.js.html#l141"><code>lib&#x2F;utils.js:141</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Mix/merge/munge data into the template.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">inDir</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The starting directory</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">options</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The <code>options</code> for the meta data.</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">callback</code>
    +                        <span class="type">Callback</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The callback to excecute when complete</p>
    +
    +                    </div>
    +
    +                        <ul class="params-list">
    +                            <li class="param">
    +                                    <code class="param-name">err</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error" class="crosslink external" target="_blank">Error</a></span>
    +
    +                                <div class="param-description">
    +                                    
    +                                </div>
    +
    +                            </li>
    +                            <li class="param">
    +                                    <code class="param-name">options</code>
    +                                    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +                                <div class="param-description">
    +                                    <p>Merged options.</p>
    +
    +                                </div>
    +
    +                            </li>
    +                        </ul>
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_unindent" class="method item private">
    +    <h3 class="name"><code>unindent</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>content</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_utils.js.html#l45"><code>lib&#x2F;utils.js:45</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Normalizes the initial indentation of the given <em>content</em> so that the first line
    +is unindented, and all other lines are unindented to the same degree as the
    +first line. So if the first line has four spaces at the beginning, then all
    +lines will be unindented four spaces.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">content</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>Text to unindent.</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>:
    +                    <p>Unindented text.</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_validatePaths" class="method item">
    +    <h3 class="name"><code>validatePaths</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>paths</code>
    +                </li>
    +                <li class="arg">
    +                        <code class="optional">[ignore=false]</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_utils.js.html#l384"><code>lib&#x2F;utils.js:384</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Make sure all the paths passed are directories and that they are not in the ignore list.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">paths</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="crosslink external external" target="_blank">Array</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The array of paths to validate</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name optional">[ignore=false]</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +                        <span class="flag optional" title="This parameter is optional.">optional</span>
    +
    +
    +                    <div class="param-description">
    +                        <p>A string to call <code>.indexOf</code> on a path to determine if it should be ignored</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_webpath" class="method item">
    +    <h3 class="name"><code>webpath</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>url</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_utils.js.html#l481"><code>lib&#x2F;utils.js:481</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Produces a normalized web path by joining all the parts and normalizing the
    +filesystem-like path into web compatible url.
    +Supports relative and absolute paths.
    +Courtesy of <a href="https://github.com/yahoo/mojito/">Mojito's utils</a></p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">url</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="crosslink external external" target="_blank">Array</a> | <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String*</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>the list of parts to be joined and normalized</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>:
    +                    <p>The joined and normalized url</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +            </div>
    +
    +
    +
    +    </div>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/classes/YUIDoc.html b/output/api/classes/YUIDoc.html
    new file mode 100644
    index 00000000..2f5ed824
    --- /dev/null
    +++ b/output/api/classes/YUIDoc.html
    @@ -0,0 +1,875 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>YUIDoc - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1>YUIDoc Class</h1>
    +<div class="box meta">
    +
    +
    +        <div class="foundat">
    +            Defined in: <a href="../files/lib_yuidoc.js.html#l51"><code>lib&#x2F;yuidoc.js:51</code></a>
    +        </div>
    +
    +            Module: <a href="../modules/yuidoc.html">yuidoc</a>
    +
    +</div>
    +
    +
    +<div class="box intro">
    +    <p>YUIDoc main class</p>
    +<pre class="code prettyprint"><code>   var options = {
    +       paths: [ './lib' ],
    +       outdir: './out'
    +   };
    +
    +   var Y = require('yuidoc');
    +   var json = (new Y.YUIDoc(options)).run();</code></pre>
    +
    +</div>
    +
    +    <div class="constructor">
    +        <h2>Constructor</h2>
    +<div id="method_YUIDoc" class="method item">
    +    <h3 class="name"><code>YUIDoc</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>config</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_yuidoc.js.html#l51"><code>lib&#x2F;yuidoc.js:51</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">config</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The config object</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +    </div>
    +
    +<div id="classdocs" class="tabview">
    +    <ul class="api-class-tabs">
    +        <li class="api-class-tab index"><a href="#index">Index</a></li>
    +
    +            <li class="api-class-tab methods"><a href="#methods">Methods</a></li>
    +            <li class="api-class-tab properties"><a href="#properties">Properties</a></li>
    +    </ul>
    +
    +    <div>
    +        <div id="index" class="api-class-tabpanel index">
    +            <h2 class="off-left">Item Index</h2>
    +
    +                <div class="index-section methods">
    +                    <h3>Methods</h3>
    +
    +                    <ul class="index-list methods">
    +                            <li class="index-item method private">
    +                                <a href="#method__processConfig">_processConfig</a>
    +
    +                            </li>
    +                            <li class="index-item method private">
    +                                <a href="#method__setDefaultExcludes">_setDefaultExcludes</a>
    +
    +                            </li>
    +                            <li class="index-item method private">
    +                                <a href="#method_parsedir">parsedir</a>
    +
    +                            </li>
    +                            <li class="index-item method private">
    +                                <a href="#method_parsefiles">parsefiles</a>
    +
    +                            </li>
    +                            <li class="index-item method">
    +                                <a href="#method_run">run</a>
    +
    +                            </li>
    +                            <li class="index-item method private">
    +                                <a href="#method_runPreprocessors">runPreprocessors</a>
    +
    +                            </li>
    +                            <li class="index-item method private">
    +                                <a href="#method_walk">walk</a>
    +
    +                            </li>
    +                            <li class="index-item method private">
    +                                <a href="#method_writeJSON">writeJSON</a>
    +
    +                            </li>
    +                    </ul>
    +                </div>
    +
    +                <div class="index-section properties">
    +                    <h3>Properties</h3>
    +
    +                    <ul class="index-list properties">
    +                            <li class="index-item property private">
    +                                <a href="#property_dirmap">dirmap</a>
    +
    +                            </li>
    +                            <li class="index-item property">
    +                                <a href="#property_endtime">endtime</a>
    +
    +                            </li>
    +                            <li class="index-item property private">
    +                                <a href="#property_filecount">filecount</a>
    +
    +                            </li>
    +                            <li class="index-item property private">
    +                                <a href="#property_filemap">filemap</a>
    +
    +                            </li>
    +                            <li class="index-item property">
    +                                <a href="#property_OPTIONS">OPTIONS</a>
    +
    +                            </li>
    +                            <li class="index-item property private">
    +                                <a href="#property_options">options</a>
    +
    +                            </li>
    +                            <li class="index-item property private">
    +                                <a href="#property_selleck">selleck</a>
    +
    +                            </li>
    +                            <li class="index-item property">
    +                                <a href="#property_starttime">starttime</a>
    +
    +                            </li>
    +                    </ul>
    +                </div>
    +
    +
    +        </div>
    +
    +            <div id="methods" class="api-class-tabpanel">
    +                <h2 class="off-left">Methods</h2>
    +
    +<div id="method__processConfig" class="method item private">
    +    <h3 class="name"><code>_processConfig</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_yuidoc.js.html#l129"><code>lib&#x2F;yuidoc.js:129</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Does post process on self.options.</p>
    +
    +    </div>
    +
    +
    +
    +
    +</div>
    +<div id="method__setDefaultExcludes" class="method item private">
    +    <h3 class="name"><code>_setDefaultExcludes</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_yuidoc.js.html#l114"><code>lib&#x2F;yuidoc.js:114</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Always exclude these directories</p>
    +
    +    </div>
    +
    +
    +
    +
    +</div>
    +<div id="method_parsedir" class="method item private">
    +    <h3 class="name"><code>parsedir</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>dir</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_yuidoc.js.html#l151"><code>lib&#x2F;yuidoc.js:151</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Walks the passed directory and grabs all the files recursively.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">dir</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The directory to parse the contents of.</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_parsefiles" class="method item private">
    +    <h3 class="name"><code>parsefiles</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>dir</code>
    +                </li>
    +                <li class="arg">
    +                        <code>files</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_yuidoc.js.html#l192"><code>lib&#x2F;yuidoc.js:192</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Gathers all the file data and populates the filemap and dirmap hashes.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">dir</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The directory to start from.</p>
    +
    +                    </div>
    +
    +                </li>
    +                <li class="param">
    +                        <code class="param-name">files</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array" class="crosslink external external" target="_blank">Array</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>List of files to parse.</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +
    +
    +</div>
    +<div id="method_run" class="method item">
    +    <h3 class="name"><code>run</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_yuidoc.js.html#l378"><code>lib&#x2F;yuidoc.js:378</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Process the config, walk the file tree and write out the JSON data.</p>
    +
    +    </div>
    +
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    <p>The JSON data returned from the DocParser</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_runPreprocessors" class="method item private">
    +    <h3 class="name"><code>runPreprocessors</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_yuidoc.js.html#l250"><code>lib&#x2F;yuidoc.js:250</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Applies preprocessors to the data tree.
    +This function first clones the data and operates on the clone.</p>
    +
    +    </div>
    +
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    <p>The mutated data</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +<div id="method_walk" class="method item private">
    +    <h3 class="name"><code>walk</code></h3>
    +
    +        <span class="paren">()</span>
    +
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_yuidoc.js.html#l140"><code>lib&#x2F;yuidoc.js:140</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Walks the paths and parses the directory contents</p>
    +
    +    </div>
    +
    +
    +
    +
    +</div>
    +<div id="method_writeJSON" class="method item private">
    +    <h3 class="name"><code>writeJSON</code></h3>
    +
    +        <div class="args">
    +            <span class="paren">(</span><ul class="args-list inline commas">
    +                <li class="arg">
    +                        <code>parser</code>
    +                </li>
    +            </ul><span class="paren">)</span>
    +        </div>
    +
    +        <span class="returns-inline">
    +            <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +        </span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_yuidoc.js.html#l289"><code>lib&#x2F;yuidoc.js:289</code></a>
    +        </p>
    +
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Writes the parser JSON data to disk.
    +Applies preprocessors, if any.</p>
    +
    +    </div>
    +
    +        <div class="params">
    +            <h4>Parameters:</h4>
    +
    +            <ul class="params-list">
    +                <li class="param">
    +                        <code class="param-name">parser</code>
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +                    <div class="param-description">
    +                        <p>The DocParser instance to use</p>
    +
    +                    </div>
    +
    +                </li>
    +            </ul>
    +        </div>
    +
    +        <div class="returns">
    +            <h4>Returns:</h4>
    +
    +            <div class="returns-description">
    +                        <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>:
    +                    <p>The JSON data returned from the DocParser</p>
    +
    +            </div>
    +        </div>
    +
    +
    +</div>
    +            </div>
    +
    +            <div id="properties" class="api-class-tabpanel">
    +                <h2 class="off-left">Properties</h2>
    +
    +<div id="property_dirmap" class="property item private">
    +    <h3 class="name"><code>dirmap</code></h3>
    +    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_yuidoc.js.html#l89"><code>lib&#x2F;yuidoc.js:89</code></a>
    +        </p>
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Holder for the list of directories we are processing.</p>
    +
    +    </div>
    +
    +
    +
    +</div>
    +<div id="property_endtime" class="property item">
    +    <h3 class="name"><code>endtime</code></h3>
    +    <span class="type">Timestamp</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_yuidoc.js.html#l406"><code>lib&#x2F;yuidoc.js:406</code></a>
    +        </p>
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Timestamp holder so we know when YUIDoc has finished the parse process.</p>
    +
    +    </div>
    +
    +
    +
    +</div>
    +<div id="property_filecount" class="property item private">
    +    <h3 class="name"><code>filecount</code></h3>
    +    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean" class="crosslink external" target="_blank">Boolean</a></span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_yuidoc.js.html#l68"><code>lib&#x2F;yuidoc.js:68</code></a>
    +        </p>
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Holds the number of files that we are processing.</p>
    +
    +    </div>
    +
    +
    +
    +</div>
    +<div id="property_filemap" class="property item private">
    +    <h3 class="name"><code>filemap</code></h3>
    +    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_yuidoc.js.html#l82"><code>lib&#x2F;yuidoc.js:82</code></a>
    +        </p>
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Holder for the list of files we are processing.</p>
    +
    +    </div>
    +
    +
    +
    +</div>
    +<div id="property_OPTIONS" class="property item">
    +    <h3 class="name"><code>OPTIONS</code></h3>
    +    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +
    +        <span class="flag final">final</span>
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_yuidoc.js.html#l31"><code>lib&#x2F;yuidoc.js:31</code></a>
    +        </p>
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>The default list of configuration options</p>
    +
    +    </div>
    +
    +
    +
    +</div>
    +<div id="property_options" class="property item private">
    +    <h3 class="name"><code>options</code></h3>
    +    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_yuidoc.js.html#l97"><code>lib&#x2F;yuidoc.js:97</code></a>
    +        </p>
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Internal holder for configuration options.</p>
    +
    +    </div>
    +
    +
    +
    +</div>
    +<div id="property_selleck" class="property item private">
    +    <h3 class="name"><code>selleck</code></h3>
    +    <span class="type"><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="crosslink external external" target="_blank">Object</a></span>
    +
    +
    +        <span class="flag private">private</span>
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_yuidoc.js.html#l75"><code>lib&#x2F;yuidoc.js:75</code></a>
    +        </p>
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Hash map of dirnames to selleck config options.</p>
    +
    +    </div>
    +
    +
    +
    +</div>
    +<div id="property_starttime" class="property item">
    +    <h3 class="name"><code>starttime</code></h3>
    +    <span class="type">Timestamp</span>
    +
    +
    +
    +
    +
    +    <div class="meta">
    +                <p>
    +                Defined in
    +        <a href="../files/lib_yuidoc.js.html#l384"><code>lib&#x2F;yuidoc.js:384</code></a>
    +        </p>
    +
    +
    +    </div>
    +
    +    <div class="description">
    +        <p>Timestamp holder so we know when YUIDoc started the parse process.</p>
    +
    +    </div>
    +
    +
    +
    +</div>
    +            </div>
    +
    +
    +    </div>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/classes/index.html b/output/api/classes/index.html
    new file mode 100644
    index 00000000..487fe15b
    --- /dev/null
    +++ b/output/api/classes/index.html
    @@ -0,0 +1,10 @@
    +<!doctype html>
    +<html>
    +    <head>
    +        <title>Redirector</title>
    +        <meta http-equiv="refresh" content="0;url=../">
    +    </head>
    +    <body>
    +        <a href="../">Click here to redirect</a>
    +    </body>
    +</html>
    diff --git a/output/api/data.json b/output/api/data.json
    new file mode 100644
    index 00000000..095bc2ca
    --- /dev/null
    +++ b/output/api/data.json
    @@ -0,0 +1,2667 @@
    +{
    +    "project": {
    +        "name": "YUIDoc",
    +        "description": "YUIDoc, YUI's JavaScript Documentation engine.",
    +        "version": "0.10.0"
    +    },
    +    "files": {
    +        "lib/builder.js": {
    +            "name": "lib/builder.js",
    +            "modules": {},
    +            "classes": {
    +                "DocBuilder": 1
    +            },
    +            "fors": {},
    +            "namespaces": {}
    +        },
    +        "lib/cli.js": {
    +            "name": "lib/cli.js",
    +            "modules": {},
    +            "classes": {
    +                "CLI": 1
    +            },
    +            "fors": {},
    +            "namespaces": {}
    +        },
    +        "lib/docparser.js": {
    +            "name": "lib/docparser.js",
    +            "modules": {},
    +            "classes": {
    +                "DocParser": 1
    +            },
    +            "fors": {
    +                "DocParser": 1
    +            },
    +            "namespaces": {}
    +        },
    +        "lib/docview.js": {
    +            "name": "lib/docview.js",
    +            "modules": {},
    +            "classes": {
    +                "DocView": 1
    +            },
    +            "fors": {},
    +            "namespaces": {}
    +        },
    +        "lib/files.js": {
    +            "name": "lib/files.js",
    +            "modules": {},
    +            "classes": {
    +                "Files": 1
    +            },
    +            "fors": {},
    +            "namespaces": {}
    +        },
    +        "lib/help.js": {
    +            "name": "lib/help.js",
    +            "modules": {},
    +            "classes": {
    +                "Help": 1
    +            },
    +            "fors": {},
    +            "namespaces": {}
    +        },
    +        "lib/index.js": {
    +            "name": "lib/index.js",
    +            "modules": {},
    +            "classes": {
    +                "Main": 1
    +            },
    +            "fors": {},
    +            "namespaces": {}
    +        },
    +        "lib/options.js": {
    +            "name": "lib/options.js",
    +            "modules": {},
    +            "classes": {
    +                "Options": 1
    +            },
    +            "fors": {},
    +            "namespaces": {}
    +        },
    +        "lib/project.js": {
    +            "name": "lib/project.js",
    +            "modules": {},
    +            "classes": {},
    +            "fors": {},
    +            "namespaces": {}
    +        },
    +        "lib/server.js": {
    +            "name": "lib/server.js",
    +            "modules": {},
    +            "classes": {
    +                "Server": 1
    +            },
    +            "fors": {},
    +            "namespaces": {}
    +        },
    +        "lib/utils.js": {
    +            "name": "lib/utils.js",
    +            "modules": {},
    +            "classes": {
    +                "Utils": 1
    +            },
    +            "fors": {},
    +            "namespaces": {}
    +        },
    +        "lib/yuidoc.js": {
    +            "name": "lib/yuidoc.js",
    +            "modules": {
    +                "yuidoc": 1
    +            },
    +            "classes": {
    +                "YUIDoc": 1
    +            },
    +            "fors": {
    +                "YUIDoc": 1
    +            },
    +            "namespaces": {}
    +        }
    +    },
    +    "modules": {
    +        "yuidoc": {
    +            "name": "yuidoc",
    +            "submodules": {},
    +            "elements": {},
    +            "classes": {
    +                "DocBuilder": 1,
    +                "CLI": 1,
    +                "DocParser": 1,
    +                "DocView": 1,
    +                "Files": 1,
    +                "Help": 1,
    +                "Main": 1,
    +                "Options": 1,
    +                "Server": 1,
    +                "Utils": 1,
    +                "YUIDoc": 1
    +            },
    +            "fors": {
    +                "DocParser": 1,
    +                "YUIDoc": 1
    +            },
    +            "namespaces": {},
    +            "tag": "main",
    +            "file": "lib/yuidoc.js",
    +            "line": 51,
    +            "description": "This is the __module__ description for the `YUIDoc` module.\n\n    var options = {\n        paths: [ './lib' ],\n        outdir: './out'\n    };\n\n    var Y = require('yuidocjs');\n    var json = (new Y.YUIDoc(options)).run();",
    +            "itemtype": "main"
    +        }
    +    },
    +    "classes": {
    +        "DocBuilder": {
    +            "name": "DocBuilder",
    +            "shortname": "DocBuilder",
    +            "classitems": [],
    +            "plugins": [],
    +            "extensions": [],
    +            "plugin_for": [],
    +            "extension_for": [],
    +            "module": "yuidoc",
    +            "file": "lib/builder.js",
    +            "line": 15,
    +            "description": "Takes the `JSON` data from the `DocParser` class, creates and parses markdown and handlebars\nbased templates to generate static HTML content"
    +        },
    +        "CLI": {
    +            "name": "CLI",
    +            "shortname": "CLI",
    +            "classitems": [],
    +            "plugins": [],
    +            "extensions": [],
    +            "plugin_for": [],
    +            "extension_for": [],
    +            "module": "yuidoc",
    +            "namespace": "",
    +            "file": "lib/cli.js",
    +            "line": 10,
    +            "description": "Parses the arguments, creates the options and passes them to `Y.YUIDoc` and then `Y.DocBuilder`."
    +        },
    +        "DocParser": {
    +            "name": "DocParser",
    +            "shortname": "DocParser",
    +            "classitems": [],
    +            "plugins": [],
    +            "extensions": [],
    +            "plugin_for": [],
    +            "extension_for": [],
    +            "module": "yuidoc",
    +            "namespace": "",
    +            "file": "lib/docparser.js",
    +            "line": 794,
    +            "description": "The doc parser accepts a **map** of files to file content.\nOnce `parse()` is called, various properties will be populated\nwith the parsers data (aggregated in the `'data'` property).",
    +            "extends": "Base",
    +            "is_constructor": 1,
    +            "params": [
    +                {
    +                    "name": "o",
    +                    "description": "the config object",
    +                    "type": "Object"
    +                }
    +            ]
    +        },
    +        "DocView": {
    +            "name": "DocView",
    +            "shortname": "DocView",
    +            "classitems": [],
    +            "plugins": [],
    +            "extensions": [],
    +            "plugin_for": [],
    +            "extension_for": [],
    +            "module": "yuidoc",
    +            "namespace": "",
    +            "file": "lib/docview.js",
    +            "line": 16,
    +            "description": "View class borrowed from [Selleck](https://github.com/rgrove/selleck)\nThe view class is a **`handlebars`** template helper.",
    +            "is_constructor": 1,
    +            "params": [
    +                {
    +                    "name": "data",
    +                    "description": "Meta data to use in this template",
    +                    "type": "Object"
    +                },
    +                {
    +                    "name": "templateName",
    +                    "description": "The name of the template file to render.",
    +                    "type": "String"
    +                }
    +            ]
    +        },
    +        "Files": {
    +            "name": "Files",
    +            "shortname": "Files",
    +            "classitems": [],
    +            "plugins": [],
    +            "extensions": [],
    +            "plugin_for": [],
    +            "extension_for": [],
    +            "module": "yuidoc",
    +            "namespace": "",
    +            "file": "lib/files.js",
    +            "line": 10,
    +            "description": "Ported fileutils methods from [Selleck](http://github.com/rgrove/selleck)"
    +        },
    +        "Help": {
    +            "name": "Help",
    +            "shortname": "Help",
    +            "classitems": [],
    +            "plugins": [],
    +            "extensions": [],
    +            "plugin_for": [],
    +            "extension_for": [],
    +            "module": "yuidoc",
    +            "namespace": "",
    +            "file": "lib/help.js",
    +            "line": 10,
    +            "description": "Shows the help text"
    +        },
    +        "Main": {
    +            "name": "Main",
    +            "shortname": "Main",
    +            "classitems": [],
    +            "plugins": [],
    +            "extensions": [],
    +            "plugin_for": [],
    +            "extension_for": [],
    +            "module": "yuidoc",
    +            "namespace": "",
    +            "file": "lib/index.js",
    +            "line": 8,
    +            "description": "Module creates the YUI instance with the required modules, uses them and exports the **Y** to be used\nby the _CLI class_ or by extenders: `require('yuidocjs');`\nYou can use it like this:\n\n    var options = {\n        paths: [ './lib' ],\n        outdir: './out'\n    };\n\n    var Y = require('yuidocjs');\n    var json = (new Y.YUIDoc(options)).run();",
    +            "exports": "{YUI} Y A YUI instance"
    +        },
    +        "Options": {
    +            "name": "Options",
    +            "shortname": "Options",
    +            "classitems": [],
    +            "plugins": [],
    +            "extensions": [],
    +            "plugin_for": [],
    +            "extension_for": [],
    +            "module": "yuidoc",
    +            "namespace": "",
    +            "file": "lib/options.js",
    +            "line": 12,
    +            "description": "Handles argument parsing"
    +        },
    +        "Server": {
    +            "name": "Server",
    +            "shortname": "Server",
    +            "classitems": [],
    +            "plugins": [],
    +            "extensions": [],
    +            "plugin_for": [],
    +            "extension_for": [],
    +            "module": "yuidoc",
    +            "namespace": "",
    +            "file": "lib/server.js",
    +            "line": 13,
    +            "description": "Provides the `--server` server option for YUIDoc"
    +        },
    +        "Utils": {
    +            "name": "Utils",
    +            "shortname": "Utils",
    +            "classitems": [],
    +            "plugins": [],
    +            "extensions": [],
    +            "plugin_for": [],
    +            "extension_for": [],
    +            "module": "yuidoc",
    +            "namespace": "",
    +            "file": "lib/utils.js",
    +            "line": 12,
    +            "description": "Utilities Class"
    +        },
    +        "YUIDoc": {
    +            "name": "YUIDoc",
    +            "shortname": "YUIDoc",
    +            "classitems": [],
    +            "plugins": [],
    +            "extensions": [],
    +            "plugin_for": [],
    +            "extension_for": [],
    +            "module": "yuidoc",
    +            "namespace": "",
    +            "file": "lib/yuidoc.js",
    +            "line": 51,
    +            "description": "YUIDoc main class\n\n       var options = {\n           paths: [ './lib' ],\n           outdir: './out'\n       };\n\n       var Y = require('yuidoc');\n       var json = (new Y.YUIDoc(options)).run();",
    +            "mainName": "yuidoc",
    +            "tag": "main",
    +            "itemtype": "main",
    +            "_main": true,
    +            "is_constructor": 1,
    +            "params": [
    +                {
    +                    "name": "config",
    +                    "description": "The config object"
    +                }
    +            ]
    +        }
    +    },
    +    "elements": {},
    +    "classitems": [
    +        {
    +            "file": "lib/builder.js",
    +            "line": 1,
    +            "description": "Copyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "class": "DocBuilder"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 126,
    +            "description": "Register a `Y.Handlebars` helper method",
    +            "itemtype": "method",
    +            "name": "_addHelpers",
    +            "params": [
    +                {
    +                    "name": "helpers",
    +                    "description": "Object containing a hash of names and functions",
    +                    "type": "Object"
    +                }
    +            ],
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 144,
    +            "description": "Wrapper around the Markdown parser so it can be normalized or even side stepped",
    +            "itemtype": "method",
    +            "name": "markdown",
    +            "access": "private",
    +            "tagname": "",
    +            "params": [
    +                {
    +                    "name": "data",
    +                    "description": "The Markdown string to parse",
    +                    "type": "String"
    +                }
    +            ],
    +            "return": {
    +                "description": "The rendered HTML",
    +                "type": "HTML"
    +            },
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 169,
    +            "description": "Parse the item to be cross linked and return an HREF linked to the item",
    +            "itemtype": "method",
    +            "name": "_parseCrossLink",
    +            "access": "private",
    +            "tagname": "",
    +            "params": [
    +                {
    +                    "name": "item",
    +                    "description": "The item to crossLink",
    +                    "type": "String"
    +                },
    +                {
    +                    "name": "raw",
    +                    "description": "Do not wrap it in HTML",
    +                    "type": "Boolean",
    +                    "optional": true,
    +                    "optdefault": "false"
    +                },
    +                {
    +                    "name": "content",
    +                    "description": "crossLink helper content",
    +                    "type": "String",
    +                    "optional": true
    +                }
    +            ],
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 297,
    +            "description": "Mixes the various external data soures together into the local data, augmenting\nit with flags.",
    +            "itemtype": "method",
    +            "name": "_mixExternal",
    +            "access": "private",
    +            "tagname": "",
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 345,
    +            "description": "Fetches the remote data and fires the callback when it's all complete",
    +            "itemtype": "method",
    +            "name": "mixExternal",
    +            "params": [
    +                {
    +                    "name": "cb",
    +                    "description": "The callback to execute when complete",
    +                    "type": "Callback"
    +                }
    +            ],
    +            "async": 1,
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 421,
    +            "description": "File counter",
    +            "itemtype": "property",
    +            "name": "files",
    +            "type": "Number",
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 427,
    +            "description": "Holder for project meta data",
    +            "itemtype": "property",
    +            "name": "_meta",
    +            "type": "Object",
    +            "access": "private",
    +            "tagname": "",
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 434,
    +            "description": "Prep the meta data to be fed to Selleck",
    +            "itemtype": "method",
    +            "name": "getProjectMeta",
    +            "return": {
    +                "description": "The project metadata",
    +                "type": "Object"
    +            },
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 477,
    +            "description": "Populate the meta data for classes",
    +            "itemtype": "method",
    +            "name": "populateClasses",
    +            "params": [
    +                {
    +                    "name": "opts",
    +                    "description": "The original options",
    +                    "type": "Object"
    +                }
    +            ],
    +            "return": {
    +                "description": "The modified options",
    +                "type": "Object"
    +            },
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 501,
    +            "description": "Populate the meta data for elements",
    +            "itemtype": "method",
    +            "name": "populateElements",
    +            "params": [
    +                {
    +                    "name": "opts",
    +                    "description": "The original options",
    +                    "type": "Object"
    +                }
    +            ],
    +            "return": {
    +                "description": "The modified options",
    +                "type": "Object"
    +            },
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 523,
    +            "description": "Populate the meta data for modules",
    +            "itemtype": "method",
    +            "name": "populateModules",
    +            "params": [
    +                {
    +                    "name": "opts",
    +                    "description": "The original options",
    +                    "type": "Object"
    +                }
    +            ],
    +            "return": {
    +                "description": "The modified options",
    +                "type": "Object"
    +            },
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 569,
    +            "description": "Populate the meta data for files",
    +            "itemtype": "method",
    +            "name": "populateFiles",
    +            "params": [
    +                {
    +                    "name": "opts",
    +                    "description": "The original options",
    +                    "type": "Object"
    +                }
    +            ],
    +            "return": {
    +                "description": "The modified options",
    +                "type": "Object"
    +            },
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 626,
    +            "description": "Parses file and line number from an item object and build's an HREF",
    +            "itemtype": "method",
    +            "name": "addFoundAt",
    +            "params": [
    +                {
    +                    "name": "a",
    +                    "description": "The item to parse",
    +                    "type": "Object"
    +                }
    +            ],
    +            "return": {
    +                "description": "The parsed HREF",
    +                "type": "String"
    +            },
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 642,
    +            "description": "Augments the **DocParser** meta data to provide default values for certain keys as well as parses all descriptions\nwith the `Markdown Parser`",
    +            "itemtype": "method",
    +            "name": "augmentData",
    +            "params": [
    +                {
    +                    "name": "o",
    +                    "description": "The object to recurse and augment",
    +                    "type": "Object"
    +                }
    +            ],
    +            "return": {
    +                "description": "The augmented object",
    +                "type": "Object"
    +            },
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 702,
    +            "description": "Makes the default directories needed",
    +            "itemtype": "method",
    +            "name": "makeDirs",
    +            "params": [
    +                {
    +                    "name": "cb",
    +                    "description": "The callback to execute after it's completed",
    +                    "type": "Callback"
    +                }
    +            ],
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 755,
    +            "description": "Parses `<pre><code>` tags and adds the __prettyprint__ `className` to them",
    +            "itemtype": "method",
    +            "name": "_parseCode",
    +            "access": "private",
    +            "tagname": "",
    +            "params": [
    +                {
    +                    "name": "html",
    +                    "description": "The HTML to parse",
    +                    "type": "HTML"
    +                }
    +            ],
    +            "return": {
    +                "description": "The parsed HTML",
    +                "type": "HTML"
    +            },
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 768,
    +            "description": "Ported from [Selleck](https://github.com/rgrove/selleck), this handles ```'s in fields\n       that are not parsed by the **Markdown** parser.",
    +            "itemtype": "method",
    +            "name": "_inlineCode",
    +            "access": "private",
    +            "tagname": "",
    +            "params": [
    +                {
    +                    "name": "html",
    +                    "description": "The HTML to parse",
    +                    "type": "HTML"
    +                }
    +            ],
    +            "return": {
    +                "description": "The parsed HTML",
    +                "type": "HTML"
    +            },
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 787,
    +            "description": "Ported from [Selleck](https://github.com/rgrove/selleck)\n       Renders the handlebars templates with the default View class.",
    +            "itemtype": "method",
    +            "name": "render",
    +            "params": [
    +                {
    +                    "name": "source",
    +                    "description": "The default template to parse",
    +                    "type": "HTML"
    +                },
    +                {
    +                    "name": "view",
    +                    "description": "The default view handler",
    +                    "type": "Class"
    +                },
    +                {
    +                    "name": "layout",
    +                    "description": "The HTML from the layout to use.",
    +                    "type": "HTML",
    +                    "optional": true,
    +                    "optdefault": "null"
    +                },
    +                {
    +                    "name": "partials",
    +                    "description": "List of partials to include in this template",
    +                    "type": "Object",
    +                    "optional": true,
    +                    "optdefault": "{}"
    +                },
    +                {
    +                    "name": "callback",
    +                    "description": "",
    +                    "type": "Callback",
    +                    "props": [
    +                        {
    +                            "name": "err",
    +                            "description": "",
    +                            "type": "Error"
    +                        },
    +                        {
    +                            "name": "html",
    +                            "description": "The assembled template markup",
    +                            "type": "HTML"
    +                        }
    +                    ]
    +                }
    +            ],
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 843,
    +            "description": "Render the index file",
    +            "itemtype": "method",
    +            "name": "renderIndex",
    +            "params": [
    +                {
    +                    "name": "cb",
    +                    "description": "The callback fired when complete",
    +                    "type": "Function",
    +                    "props": [
    +                        {
    +                            "name": "html",
    +                            "description": "The HTML to render this view",
    +                            "type": "String"
    +                        },
    +                        {
    +                            "name": "view",
    +                            "description": "The View Data",
    +                            "type": "Object"
    +                        }
    +                    ]
    +                }
    +            ],
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 879,
    +            "description": "Generates the index.html file",
    +            "itemtype": "method",
    +            "name": "writeIndex",
    +            "params": [
    +                {
    +                    "name": "cb",
    +                    "description": "The callback to execute after it's completed",
    +                    "type": "Callback",
    +                    "props": [
    +                        {
    +                            "name": "html",
    +                            "description": "The HTML to write index view",
    +                            "type": "String"
    +                        },
    +                        {
    +                            "name": "view",
    +                            "description": "The View Data",
    +                            "type": "Object"
    +                        }
    +                    ]
    +                }
    +            ],
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 905,
    +            "description": "Render a module",
    +            "itemtype": "method",
    +            "name": "renderModule",
    +            "params": [
    +                {
    +                    "name": "cb",
    +                    "description": "The callback fired when complete",
    +                    "type": "Function",
    +                    "props": [
    +                        {
    +                            "name": "html",
    +                            "description": "The HTML to render this view",
    +                            "type": "String"
    +                        },
    +                        {
    +                            "name": "view",
    +                            "description": "The View Data",
    +                            "type": "Object"
    +                        }
    +                    ]
    +                }
    +            ],
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 1013,
    +            "description": "Generates the module files under \"out\"/modules/",
    +            "itemtype": "method",
    +            "name": "writeModules",
    +            "params": [
    +                {
    +                    "name": "cb",
    +                    "description": "The callback to execute after it's completed",
    +                    "type": "Callback",
    +                    "props": [
    +                        {
    +                            "name": "html",
    +                            "description": "The HTML to write module view",
    +                            "type": "String"
    +                        },
    +                        {
    +                            "name": "view",
    +                            "description": "The View Data",
    +                            "type": "Object"
    +                        }
    +                    ]
    +                }
    +            ],
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 1056,
    +            "description": "Checks an array of items (class items) to see if an item is in that list",
    +            "itemtype": "method",
    +            "name": "hasProperty",
    +            "params": [
    +                {
    +                    "name": "a",
    +                    "description": "The Array of items to check",
    +                    "type": "Array"
    +                },
    +                {
    +                    "name": "b",
    +                    "description": "The object to find",
    +                    "type": "Object"
    +                }
    +            ],
    +            "return": {
    +                "description": "Boolean"
    +            },
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 1073,
    +            "description": "Counter for stepping into merges",
    +            "access": "private",
    +            "tagname": "",
    +            "itemtype": "property",
    +            "name": "_mergeCounter",
    +            "type": "Number",
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 1080,
    +            "description": "Merge superclass data into a child class",
    +            "itemtype": "method",
    +            "name": "mergeExtends",
    +            "params": [
    +                {
    +                    "name": "info",
    +                    "description": "The item to extend",
    +                    "type": "Object"
    +                },
    +                {
    +                    "name": "classItems",
    +                    "description": "The list of items to merge in",
    +                    "type": "Array"
    +                },
    +                {
    +                    "name": "first",
    +                    "description": "Set for the first call",
    +                    "type": "Boolean"
    +                }
    +            ],
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 1132,
    +            "description": "Render the class file",
    +            "itemtype": "method",
    +            "name": "renderClass",
    +            "params": [
    +                {
    +                    "name": "cb",
    +                    "description": "The callback fired when complete",
    +                    "type": "Function",
    +                    "props": [
    +                        {
    +                            "name": "html",
    +                            "description": "The HTML to render this view",
    +                            "type": "String"
    +                        },
    +                        {
    +                            "name": "view",
    +                            "description": "The View Data",
    +                            "type": "Object"
    +                        }
    +                    ]
    +                }
    +            ],
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 1425,
    +            "description": "Render the element file",
    +            "itemtype": "method",
    +            "name": "renderElement",
    +            "params": [
    +                {
    +                    "name": "cb",
    +                    "description": "The callback fired when complete",
    +                    "type": "Function",
    +                    "props": [
    +                        {
    +                            "name": "html",
    +                            "description": "The HTML to render this view",
    +                            "type": "String"
    +                        },
    +                        {
    +                            "name": "view",
    +                            "description": "The View Data",
    +                            "type": "Object"
    +                        }
    +                    ]
    +                }
    +            ],
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 1502,
    +            "description": "Generates the class or element files under \"out\"/classes/ or \"out\"/elements/",
    +            "itemtype": "method",
    +            "name": "writeComponents",
    +            "params": [
    +                {
    +                    "name": "type",
    +                    "description": "The component type, \"classes\" or \"elements\"",
    +                    "type": "String"
    +                },
    +                {
    +                    "name": "cb",
    +                    "description": "The callback to execute after it's completed",
    +                    "type": "Callback",
    +                    "props": [
    +                        {
    +                            "name": "html",
    +                            "description": "The HTML to write class view",
    +                            "type": "String"
    +                        },
    +                        {
    +                            "name": "view",
    +                            "description": "The View Data",
    +                            "type": "Object"
    +                        }
    +                    ]
    +                }
    +            ],
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 1546,
    +            "description": "Sort method of array of objects with a property called __name__",
    +            "itemtype": "method",
    +            "name": "nameSort",
    +            "params": [
    +                {
    +                    "name": "a",
    +                    "description": "First object to compare",
    +                    "type": "Object"
    +                },
    +                {
    +                    "name": "b",
    +                    "description": "Second object to compare",
    +                    "type": "Object"
    +                }
    +            ],
    +            "return": {
    +                "description": "1, -1 or 0 for sorting.",
    +                "type": "Number"
    +            },
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 1569,
    +            "description": "Generates the syntax files under `\"out\"/files/`",
    +            "itemtype": "method",
    +            "name": "writeFiles",
    +            "params": [
    +                {
    +                    "name": "cb",
    +                    "description": "The callback to execute after it's completed",
    +                    "type": "Callback",
    +                    "props": [
    +                        {
    +                            "name": "html",
    +                            "description": "The HTML to write file view",
    +                            "type": "String"
    +                        },
    +                        {
    +                            "name": "view",
    +                            "description": "The View Data",
    +                            "type": "Object"
    +                        }
    +                    ]
    +                }
    +            ],
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 1619,
    +            "description": "Render the source file",
    +            "itemtype": "method",
    +            "name": "renderFile",
    +            "params": [
    +                {
    +                    "name": "cb",
    +                    "description": "The callback fired when complete",
    +                    "type": "Function",
    +                    "props": [
    +                        {
    +                            "name": "html",
    +                            "description": "The HTML to render this view",
    +                            "type": "String"
    +                        },
    +                        {
    +                            "name": "view",
    +                            "description": "The View Data",
    +                            "type": "Object"
    +                        }
    +                    ]
    +                }
    +            ],
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 1678,
    +            "description": "Write the API meta data used for the AutoComplete widget",
    +            "itemtype": "method",
    +            "name": "writeAPIMeta",
    +            "params": [
    +                {
    +                    "name": "cb",
    +                    "description": "The callback to execute when complete",
    +                    "type": "Callback"
    +                }
    +            ],
    +            "async": 1,
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 1691,
    +            "description": "Render the API meta and return the JavaScript",
    +            "itemtype": "method",
    +            "name": "renderAPIMeta",
    +            "params": [
    +                {
    +                    "name": "cb",
    +                    "description": "The callback",
    +                    "type": "Callback",
    +                    "props": [
    +                        {
    +                            "name": "apijs",
    +                            "description": "The JavaScript code to write API meta data",
    +                            "type": "String"
    +                        }
    +                    ]
    +                }
    +            ],
    +            "async": 1,
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 1725,
    +            "description": "Normalizes a file path to a writable filename:\n\n   var path = 'lib/file.js';\n   returns 'lib_file.js';",
    +            "itemtype": "method",
    +            "name": "filterFileName",
    +            "params": [
    +                {
    +                    "name": "f",
    +                    "description": "The filename to normalize",
    +                    "type": "String"
    +                }
    +            ],
    +            "return": {
    +                "description": "The filtered file path",
    +                "type": "String"
    +            },
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/builder.js",
    +            "line": 1738,
    +            "description": "Compiles the templates from the meta-data provided by DocParser",
    +            "itemtype": "method",
    +            "name": "compile",
    +            "params": [
    +                {
    +                    "name": "cb",
    +                    "description": "The callback to execute after it's completed",
    +                    "type": "Callback"
    +                }
    +            ],
    +            "class": "DocBuilder",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/cli.js",
    +            "line": 4,
    +            "description": "Copyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "class": "CLI",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 1,
    +            "description": "Copyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 13,
    +            "description": "Parses the JSON data and formats it into a nice log string for\nfilename and line number: `/file/name.js:123`",
    +            "itemtype": "method",
    +            "name": "stringlog",
    +            "access": "private",
    +            "tagname": "",
    +            "params": [
    +                {
    +                    "name": "data",
    +                    "description": "The data block from the parser",
    +                    "type": "Object"
    +                }
    +            ],
    +            "return": {
    +                "description": "The formatted string.",
    +                "type": "String"
    +            },
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 40,
    +            "description": "Flatten a string, remove all line breaks and replace them with a token",
    +            "itemtype": "method",
    +            "name": "implodeString",
    +            "access": "private",
    +            "tagname": "",
    +            "params": [
    +                {
    +                    "name": "str",
    +                    "description": "The string to operate on",
    +                    "type": "String"
    +                }
    +            ],
    +            "return": {
    +                "description": "The modified string",
    +                "type": "String"
    +            },
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 50,
    +            "description": "Un-flatten a string, replace tokens injected with `implodeString`",
    +            "itemtype": "method",
    +            "name": "implodeString",
    +            "access": "private",
    +            "tagname": "",
    +            "params": [
    +                {
    +                    "name": "str",
    +                    "description": "The string to operate on",
    +                    "type": "String"
    +                }
    +            ],
    +            "return": {
    +                "description": "The modified string",
    +                "type": "String"
    +            },
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 97,
    +            "description": "A list of known tags.  This populates a member variable\nduring initialization, and will be updated if additional\ndigesters are added.",
    +            "itemtype": "property",
    +            "name": "TAGLIST",
    +            "type": "Array",
    +            "final": 1,
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 182,
    +            "description": "A list of ignored tags. These tags should be ignored because there is\nlikely to be used for purposes other than JSDoc tags in JavaScript comments.",
    +            "itemtype": "property",
    +            "name": "IGNORE_TAGLIST",
    +            "type": "Array",
    +            "final": 1,
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 194,
    +            "description": "Common errors will get scrubbed instead of being ignored.",
    +            "itemtype": "property",
    +            "name": "CORRECTIONS",
    +            "type": "Object",
    +            "final": 1,
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 217,
    +            "description": "A map of the default tag processors, keyed by the\ntag name.  Multiple tags can use the same digester\nby supplying the string name that points to the\nimplementation rather than a function.",
    +            "itemtype": "property",
    +            "name": "DIGESTERS",
    +            "type": "Object",
    +            "final": 1,
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 822,
    +            "description": "Digesters process the tag/text pairs found in a\ncomment block.  They are looked up by tag name.\nThe digester gets the tagname, the value, the\ntarget object to apply values to, and the full\nblock that is being processed.  Digesters can\nbe declared as strings instead of a function --\nin that case, the program will try to look up\nthe key listed and use the function there instead\n(it is an alias).  Digesters can return a host\nobject in the case the tag defines a new key\nblock type (modules/classes/methods/events/properties)",
    +            "itemtype": "attribute",
    +            "name": "digesters",
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 844,
    +            "description": "Emitters will be schemas for the types of payloads\nthe parser will emit.  Not implemented.",
    +            "itemtype": "attribute",
    +            "name": "emitters",
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 855,
    +            "description": "Comment syntax type.",
    +            "itemtype": "attribute",
    +            "name": "syntaxtype",
    +            "type": "String",
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 864,
    +            "description": "The map of file names to file content.",
    +            "itemtype": "attribute",
    +            "name": "filemap",
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 872,
    +            "description": "A map of file names to directory name.  Provided in\ncase this needs to be used to reset the module name\nappropriately -- currently not used",
    +            "itemtype": "attribute",
    +            "name": "dirmap",
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 882,
    +            "description": "The file currently being parsed",
    +            "itemtype": "attribute",
    +            "name": "currentfile",
    +            "type": "String",
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 903,
    +            "description": "The main documentation block for the module itself.",
    +            "itemtype": "attribute",
    +            "name": "mainmodule",
    +            "type": "String",
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 939,
    +            "description": "The module currently being parsed",
    +            "itemtype": "attribute",
    +            "name": "currentmodule",
    +            "type": "String",
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 999,
    +            "description": "The submodule currently being parsed",
    +            "itemtype": "attribute",
    +            "name": "currentsubmodule",
    +            "type": "String",
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 1040,
    +            "description": "The class currently being parsed",
    +            "itemtype": "attribute",
    +            "name": "currentclass",
    +            "type": "String",
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 1080,
    +            "description": "The element currently being parsed",
    +            "itemtype": "attribute",
    +            "name": "currentelement",
    +            "type": "String",
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 1110,
    +            "description": "Takes a non-namespaced classname and resolves it to a namespace (to support `@for`)",
    +            "access": "private",
    +            "tagname": "",
    +            "itemtype": "method",
    +            "name": "_resolveFor",
    +            "params": [
    +                {
    +                    "name": "value",
    +                    "description": "The classname to resolve",
    +                    "type": "String"
    +                }
    +            ],
    +            "return": {
    +                "description": "The resolved namespace + classname",
    +                "type": "String"
    +            },
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 1188,
    +            "description": "Normalizes the initial indentation of the given _content_ so that the first line\nis unindented, and all other lines are unindented to the same degree as the\nfirst line. So if the first line has four spaces at the beginning, then all\nlines will be unindented four spaces. Ported from [Selleck](https://github.com/rgrove/selleck)",
    +            "itemtype": "method",
    +            "name": "unindent",
    +            "params": [
    +                {
    +                    "name": "content",
    +                    "description": "Text to unindent.",
    +                    "type": "String"
    +                }
    +            ],
    +            "return": {
    +                "description": "Unindented text.",
    +                "type": "String"
    +            },
    +            "access": "private",
    +            "tagname": "",
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 1209,
    +            "description": "Transforms a JavaDoc style comment block (less the start and end of it)\ninto a list of tag/text pairs. The leading space and '*' are removed,\nbut the remaining whitespace is preserved so that the output should be\nfriendly for both markdown and html parsers.",
    +            "itemtype": "method",
    +            "name": "handlecomment",
    +            "params": [
    +                {
    +                    "name": "comment",
    +                    "description": "The comment to parse",
    +                    "type": "String"
    +                },
    +                {
    +                    "name": "file",
    +                    "description": "The file it was parsed from",
    +                    "type": "String"
    +                },
    +                {
    +                    "name": "line",
    +                    "description": "The line number it was found on",
    +                    "type": "String"
    +                }
    +            ],
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 1287,
    +            "description": "Accepts a map of filenames to file content.  Returns\na map of filenames to an array of API comment block\ntext.  This expects the comment to start with / **\non its own line, and end with * / on its own\nline.  Override this function to provide an\nalternative comment parser.",
    +            "itemtype": "method",
    +            "name": "extract",
    +            "params": [
    +                {
    +                    "name": "filemap",
    +                    "description": "A map of filenames to file content",
    +                    "type": "Object"
    +                },
    +                {
    +                    "name": "dirmap",
    +                    "description": "A map of file names to directory name",
    +                    "type": "Array"
    +                }
    +            ],
    +            "return": {
    +                "description": "A map of filenames to an array of extracted\ncomment text.",
    +                "type": "Object"
    +            },
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 1342,
    +            "description": "Processes all the tags in a single comment block",
    +            "itemtype": "method",
    +            "name": "processblock",
    +            "params": [
    +                {
    +                    "name": "an",
    +                    "description": "array of the tag/text pairs",
    +                    "type": "Array"
    +                }
    +            ],
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 1433,
    +            "description": "Transforms a map of filenames to arrays of comment blocks into a\nJSON structure that represents the entire processed API doc info\nand relationships between elements for the entire project.",
    +            "itemtype": "method",
    +            "name": "transform",
    +            "params": [
    +                {
    +                    "name": "commentmap",
    +                    "description": "The hash of files and parsed comment blocks",
    +                    "type": "Object"
    +                }
    +            ],
    +            "return": {
    +                "description": "The transformed data for the project",
    +                "type": "Object"
    +            },
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docparser.js",
    +            "line": 1562,
    +            "description": "Extracts and transforms the filemap provided to constructor",
    +            "itemtype": "method",
    +            "name": "parse",
    +            "params": [
    +                {
    +                    "name": "filemap",
    +                    "description": "A map of filenames to file content",
    +                    "type": "Array"
    +                },
    +                {
    +                    "name": "dirmap",
    +                    "description": "A map of file names to directory name",
    +                    "type": "Array"
    +                }
    +            ],
    +            "return": {
    +                "description": "this parser instance.  The total results\nare available in parser.data.",
    +                "type": "DocParser"
    +            },
    +            "class": "DocParser",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docview.js",
    +            "line": 1,
    +            "description": "Copyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "class": "DocView",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docview.js",
    +            "line": 30,
    +            "description": "**Mustache** `lambda` method for setting the HTML title",
    +            "itemtype": "method",
    +            "name": "htmlTitle",
    +            "class": "DocView",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/docview.js",
    +            "line": 49,
    +            "description": "**Mustache** `lambda` method for setting the title",
    +            "itemtype": "method",
    +            "name": "title",
    +            "class": "DocView",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/files.js",
    +            "line": 1,
    +            "description": "Copyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "class": "Files",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/files.js",
    +            "line": 39,
    +            "description": "Copy a directory from one location to another",
    +            "itemtype": "method",
    +            "name": "copyDirectory",
    +            "params": [
    +                {
    +                    "name": "source",
    +                    "description": "The source directory",
    +                    "type": "Path"
    +                },
    +                {
    +                    "name": "dest",
    +                    "description": "The destination directory",
    +                    "type": "Path"
    +                },
    +                {
    +                    "name": "overwrite",
    +                    "description": "Whether or not to overwrite destination files\n    if they already exist.",
    +                    "type": "Boolean",
    +                    "optional": true,
    +                    "optdefault": "false"
    +                },
    +                {
    +                    "name": "callback",
    +                    "description": "The callback to be executed when complete.",
    +                    "type": "Function"
    +                }
    +            ],
    +            "class": "Files",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/files.js",
    +            "line": 128,
    +            "description": "Copy a file from one location to another",
    +            "itemtype": "method",
    +            "name": "copyFile",
    +            "params": [
    +                {
    +                    "name": "source",
    +                    "description": "The source file",
    +                    "type": "Path"
    +                },
    +                {
    +                    "name": "dest",
    +                    "description": "The destination file",
    +                    "type": "Path"
    +                },
    +                {
    +                    "name": "overwrite",
    +                    "description": "Whether or not to overwrite destination files\n    if they already exist.",
    +                    "type": "Boolean",
    +                    "optional": true,
    +                    "optdefault": "false"
    +                },
    +                {
    +                    "name": "callback",
    +                    "description": "The callback to be executed when complete.",
    +                    "type": "Callback",
    +                    "props": [
    +                        {
    +                            "name": "err",
    +                            "description": "The Error returned from Node",
    +                            "type": "Error"
    +                        }
    +                    ]
    +                }
    +            ],
    +            "class": "Files",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/files.js",
    +            "line": 181,
    +            "description": "If _source_ is a file, copies it to _dest_. If it's a directory, recursively\ncopies it and all files and directories it contains to _dest_.\n\nNote that when attempting to copy a file into a directory, you should specify\nthe full path to the new file (including the new filename). Otherwise, it will\nbe interpreted as an attempt to copy the _source_ file *over* the _dest_\ndirectory instead of *into* it.\n\nKnown issues:\n- Doesn't preserve ownership or permissions on copied files/directories.",
    +            "itemtype": "method",
    +            "name": "copyPath",
    +            "params": [
    +                {
    +                    "name": "source",
    +                    "description": "Source path.",
    +                    "type": "String"
    +                },
    +                {
    +                    "name": "dest",
    +                    "description": "Destination path.",
    +                    "type": "String"
    +                },
    +                {
    +                    "name": "overwrite",
    +                    "description": "Whether or not to overwrite destination files\nif they already exist.",
    +                    "type": "Boolean",
    +                    "optional": true,
    +                    "optdefault": "false"
    +                },
    +                {
    +                    "name": "callback",
    +                    "description": "The callback to execute when completed.",
    +                    "type": "Callback",
    +                    "props": [
    +                        {
    +                            "name": "err",
    +                            "description": "",
    +                            "type": "Error"
    +                        }
    +                    ]
    +                }
    +            ],
    +            "class": "Files",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/files.js",
    +            "line": 227,
    +            "description": "If _path_ is a file, deletes it. If _path_ is a directory, recursively deletes\nit and all files and directories it contains.\n\nThis method is synchronous.",
    +            "itemtype": "method",
    +            "name": "deletePath",
    +            "params": [
    +                {
    +                    "name": "path",
    +                    "description": "File or directory to delete.",
    +                    "type": "String"
    +                }
    +            ],
    +            "class": "Files",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/files.js",
    +            "line": 252,
    +            "description": "Check to see if this is a directory",
    +            "itemtype": "method",
    +            "name": "isDirectory",
    +            "params": [
    +                {
    +                    "name": "path",
    +                    "description": "The path to check",
    +                    "type": "Path"
    +                },
    +                {
    +                    "name": "link",
    +                    "description": "Also validate a symlink",
    +                    "type": "Boolean",
    +                    "optional": true,
    +                    "optdefault": "false"
    +                }
    +            ],
    +            "return": {
    +                "description": "True if it is a directory",
    +                "type": "Boolean"
    +            },
    +            "class": "Files",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/files.js",
    +            "line": 283,
    +            "description": "Check to see if this is a File",
    +            "itemtype": "method",
    +            "name": "isFile",
    +            "params": [
    +                {
    +                    "name": "path",
    +                    "description": "The path to check",
    +                    "type": "Path"
    +                },
    +                {
    +                    "name": "link",
    +                    "description": "Also validate a symlink",
    +                    "type": "Boolean",
    +                    "optional": true,
    +                    "optdefault": "false"
    +                }
    +            ],
    +            "return": {
    +                "description": "True if it is a file",
    +                "type": "Boolean"
    +            },
    +            "class": "Files",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/files.js",
    +            "line": 312,
    +            "description": "Check to see if this is a SymLink",
    +            "itemtype": "method",
    +            "name": "isSymbolicLink",
    +            "params": [
    +                {
    +                    "name": "path",
    +                    "description": "The path to check",
    +                    "type": "Path"
    +                }
    +            ],
    +            "return": {
    +                "description": "True if it is a link",
    +                "type": "Boolean"
    +            },
    +            "class": "Files",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/files.js",
    +            "line": 326,
    +            "description": "Like `fs.lstatSync()`, but returns `null` instead of throwing when _path_\ndoesn't exist. Will still throw on other types of errors.",
    +            "itemtype": "method",
    +            "name": "lstatSync",
    +            "params": [
    +                {
    +                    "name": "path",
    +                    "description": "Path to stat.",
    +                    "type": "String"
    +                }
    +            ],
    +            "return": {
    +                "description": "`fs.Stats` object, or `null` if _path_ doesn't exist.",
    +                "type": "fs.Stats|null"
    +            },
    +            "class": "Files",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/files.js",
    +            "line": 348,
    +            "description": "Like `fs.statSync()`, but returns `null` instead of throwing when _path_\ndoesn't exist. Will still throw on other types of errors.",
    +            "itemtype": "method",
    +            "name": "statSync",
    +            "params": [
    +                {
    +                    "name": "path",
    +                    "description": "Path to stat.",
    +                    "type": "String"
    +                }
    +            ],
    +            "return": {
    +                "description": "`fs.Stats` object, or `null` if _path_ doesn't exist.",
    +                "type": "fs.Stats|null"
    +            },
    +            "class": "Files",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/files.js",
    +            "line": 369,
    +            "description": "Copy the theme assets directory",
    +            "itemtype": "method",
    +            "name": "copyAssets",
    +            "params": [
    +                {
    +                    "name": "from",
    +                    "description": "The source directory",
    +                    "type": "Path"
    +                },
    +                {
    +                    "name": "dest",
    +                    "description": "The destination directory",
    +                    "type": "Path"
    +                },
    +                {
    +                    "name": "deleteFirst",
    +                    "description": "Should the directory be deleted if it exists",
    +                    "type": "Boolean"
    +                },
    +                {
    +                    "name": "callback",
    +                    "description": "The callback to be executed",
    +                    "type": "Function"
    +                }
    +            ],
    +            "class": "Files",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/files.js",
    +            "line": 417,
    +            "description": "Helper method for getting JSON data from a local file",
    +            "itemtype": "method",
    +            "name": "getJSON",
    +            "params": [
    +                {
    +                    "name": "filename",
    +                    "description": "The filename to parse JSON from",
    +                    "type": "Path"
    +                }
    +            ],
    +            "return": {
    +                "description": "The JSON data",
    +                "type": "Object"
    +            },
    +            "class": "Files",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/files.js",
    +            "line": 432,
    +            "description": "Helper method for writing files to disk. It wraps the NodeJS file API",
    +            "itemtype": "method",
    +            "name": "writeFile",
    +            "params": [
    +                {
    +                    "name": "file",
    +                    "description": "The filename to write to",
    +                    "type": "Path"
    +                },
    +                {
    +                    "name": "data",
    +                    "description": "The data to write",
    +                    "type": "String"
    +                },
    +                {
    +                    "name": "callback",
    +                    "description": "",
    +                    "type": "Callback",
    +                    "multiple": true
    +                }
    +            ],
    +            "class": "Files",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/help.js",
    +            "line": 1,
    +            "description": "Copyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "class": "Help",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/help.js",
    +            "line": 16,
    +            "description": "The help text to display",
    +            "access": "private",
    +            "tagname": "",
    +            "itemtype": "property",
    +            "name": "help",
    +            "type": "Array",
    +            "class": "Help",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/help.js",
    +            "line": 63,
    +            "description": "Render the help message as a string",
    +            "itemtype": "method",
    +            "name": "renderHelp",
    +            "return": {
    +                "description": "The help screen to display",
    +                "type": "String"
    +            },
    +            "class": "Help",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/help.js",
    +            "line": 73,
    +            "description": "Display the help message, write it to the screen and exit",
    +            "itemtype": "method",
    +            "name": "showHelp",
    +            "class": "Help",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/index.js",
    +            "line": 1,
    +            "description": "Copyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "class": "Main",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/options.js",
    +            "line": 1,
    +            "description": "Copyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "class": "Options",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/options.js",
    +            "line": 18,
    +            "description": "Parses arguments and returns an Object of config options",
    +            "itemtype": "method",
    +            "name": "Options",
    +            "params": [
    +                {
    +                    "name": "args",
    +                    "description": "Arguments to parse",
    +                    "type": "Array"
    +                }
    +            ],
    +            "return": {
    +                "description": "The config object",
    +                "type": "Object"
    +            },
    +            "class": "Options",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/project.js",
    +            "line": 1,
    +            "description": "Copyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "class": "Server",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/server.js",
    +            "line": 1,
    +            "description": "Copyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "class": "Server",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/server.js",
    +            "line": 19,
    +            "description": "Cache for external mixed in data.",
    +            "itemtype": "property",
    +            "name": "_externalData",
    +            "access": "private",
    +            "tagname": "",
    +            "type": "Object",
    +            "class": "Server",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/server.js",
    +            "line": 26,
    +            "description": "Middleware to parse the API docs per request",
    +            "itemtype": "method",
    +            "name": "parse",
    +            "params": [
    +                {
    +                    "name": "req",
    +                    "description": "Express request object",
    +                    "type": "Request"
    +                },
    +                {
    +                    "name": "res",
    +                    "description": "Express response object",
    +                    "type": "Response"
    +                },
    +                {
    +                    "name": "next",
    +                    "description": "Express next callback",
    +                    "type": "Function"
    +                }
    +            ],
    +            "class": "Server",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/server.js",
    +            "line": 44,
    +            "description": "Create the routes used to serve YUIDoc files dynamically",
    +            "itemtype": "method",
    +            "name": "routes",
    +            "class": "Server",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/server.js",
    +            "line": 114,
    +            "description": "`/files` endpoint",
    +            "itemtype": "method",
    +            "name": "files",
    +            "params": [
    +                {
    +                    "name": "req",
    +                    "description": "Express request object",
    +                    "type": "Request"
    +                },
    +                {
    +                    "name": "res",
    +                    "description": "Express response object",
    +                    "type": "Response"
    +                }
    +            ],
    +            "class": "Server",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/server.js",
    +            "line": 140,
    +            "description": "`/classes` endpoint",
    +            "itemtype": "method",
    +            "name": "clazz",
    +            "params": [
    +                {
    +                    "name": "req",
    +                    "description": "Express request object",
    +                    "type": "Request"
    +                },
    +                {
    +                    "name": "res",
    +                    "description": "Express response object",
    +                    "type": "Response"
    +                }
    +            ],
    +            "class": "Server",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/server.js",
    +            "line": 156,
    +            "description": "`/modules` endpoint",
    +            "itemtype": "method",
    +            "name": "modules",
    +            "params": [
    +                {
    +                    "name": "req",
    +                    "description": "Express request object",
    +                    "type": "Request"
    +                },
    +                {
    +                    "name": "res",
    +                    "description": "Express response object",
    +                    "type": "Response"
    +                }
    +            ],
    +            "class": "Server",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/server.js",
    +            "line": 172,
    +            "description": "`/` endpoint",
    +            "itemtype": "method",
    +            "name": "home",
    +            "params": [
    +                {
    +                    "name": "req",
    +                    "description": "Express request object",
    +                    "type": "Request"
    +                },
    +                {
    +                    "name": "res",
    +                    "description": "Express response object",
    +                    "type": "Response"
    +                }
    +            ],
    +            "class": "Server",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/server.js",
    +            "line": 184,
    +            "description": "Creates the Express server and prep's YUI for serving",
    +            "itemtype": "method",
    +            "name": "init",
    +            "class": "Server",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/server.js",
    +            "line": 200,
    +            "description": "Start the server with the supplied options.",
    +            "itemtype": "method",
    +            "name": "start",
    +            "params": [
    +                {
    +                    "name": "options",
    +                    "description": "Server options",
    +                    "type": "Object"
    +                }
    +            ],
    +            "class": "Server",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/utils.js",
    +            "line": 1,
    +            "description": "Copyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "class": "Utils",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/utils.js",
    +            "line": 32,
    +            "description": "Escapes HTML characters in _html_.",
    +            "itemtype": "method",
    +            "name": "escapeHTML",
    +            "params": [
    +                {
    +                    "name": "html",
    +                    "description": "String to escape.",
    +                    "type": "String"
    +                }
    +            ],
    +            "return": {
    +                "description": "Escaped string.",
    +                "type": "String"
    +            },
    +            "class": "Utils",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/utils.js",
    +            "line": 45,
    +            "description": "Normalizes the initial indentation of the given _content_ so that the first line\nis unindented, and all other lines are unindented to the same degree as the\nfirst line. So if the first line has four spaces at the beginning, then all\nlines will be unindented four spaces.",
    +            "itemtype": "method",
    +            "name": "unindent",
    +            "params": [
    +                {
    +                    "name": "content",
    +                    "description": "Text to unindent.",
    +                    "type": "String"
    +                }
    +            ],
    +            "return": {
    +                "description": "Unindented text.",
    +                "type": "String"
    +            },
    +            "access": "private",
    +            "tagname": "",
    +            "class": "Utils",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/utils.js",
    +            "line": 66,
    +            "description": "Like `getPages()`, but returns only the files under the `layout/` subdirectory\nof the specified _dir_.",
    +            "itemtype": "method",
    +            "name": "getLayouts",
    +            "params": [
    +                {
    +                    "name": "dir",
    +                    "description": "Directory path.",
    +                    "type": "String"
    +                }
    +            ],
    +            "return": {
    +                "description": "Mapping of layout names to layout content.",
    +                "type": "Object"
    +            },
    +            "class": "Utils",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/utils.js",
    +            "line": 79,
    +            "description": "Loads and returns the content of the specified page file.",
    +            "itemtype": "method",
    +            "name": "getPage",
    +            "params": [
    +                {
    +                    "name": "pagePath",
    +                    "description": "Path to a single `.handlebars` page.",
    +                    "type": "String"
    +                }
    +            ],
    +            "return": {
    +                "description": "Page content, or `null` if not found.",
    +                "type": "String|null"
    +            },
    +            "class": "Utils",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/utils.js",
    +            "line": 94,
    +            "description": "Loads pages (files with a `.handlebars` extension) in the specified directory and\nreturns an object containing a mapping of page names (the part of the filename)\npreceding the `.handlebars` extension) to page content.",
    +            "itemtype": "method",
    +            "name": "getPages",
    +            "params": [
    +                {
    +                    "name": "dir",
    +                    "description": "Directory path.",
    +                    "type": "String"
    +                }
    +            ],
    +            "return": {
    +                "description": "Mapping of page names to page content.",
    +                "type": "Object"
    +            },
    +            "class": "Utils",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/utils.js",
    +            "line": 127,
    +            "description": "Like `getPages()`, but returns only the files under the `partial/` subdirectory\nof the specified _dir_.",
    +            "itemtype": "method",
    +            "name": "getPartials",
    +            "params": [
    +                {
    +                    "name": "dir",
    +                    "description": "Directory path.",
    +                    "type": "String"
    +                }
    +            ],
    +            "return": {
    +                "description": "Mapping of partial names to partial content.",
    +                "type": "Object"
    +            },
    +            "class": "Utils",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/utils.js",
    +            "line": 141,
    +            "description": "Mix/merge/munge data into the template.",
    +            "itemtype": "method",
    +            "name": "prepare",
    +            "params": [
    +                {
    +                    "name": "inDir",
    +                    "description": "The starting directory",
    +                    "type": "String"
    +                },
    +                {
    +                    "name": "options",
    +                    "description": "The `options` for the meta data.",
    +                    "type": "Object"
    +                },
    +                {
    +                    "name": "callback",
    +                    "description": "The callback to excecute when complete",
    +                    "type": "Callback",
    +                    "props": [
    +                        {
    +                            "name": "err",
    +                            "description": "",
    +                            "type": "Error"
    +                        },
    +                        {
    +                            "name": "options",
    +                            "description": "Merged options.",
    +                            "type": "Object"
    +                        }
    +                    ]
    +                }
    +            ],
    +            "class": "Utils",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/utils.js",
    +            "line": 227,
    +            "description": "Walk the directory tree to locate the yuidoc.json file.",
    +            "itemtype": "method",
    +            "name": "getProjectData",
    +            "params": [
    +                {
    +                    "name": "directory",
    +                    "description": "The directory to start from",
    +                    "type": "Path",
    +                    "optional": true,
    +                    "optdefault": "process.cwd()"
    +                }
    +            ],
    +            "class": "Utils",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/utils.js",
    +            "line": 339,
    +            "description": "Walks the tree from this dir and returns all the subdirs",
    +            "itemtype": "method",
    +            "name": "getDirs",
    +            "params": [
    +                {
    +                    "name": "baseDir",
    +                    "description": "The dir to begin at",
    +                    "type": "String"
    +                },
    +                {
    +                    "name": "ignore",
    +                    "description": "An array of paths to ignore",
    +                    "type": "Array"
    +                }
    +            ],
    +            "return": {
    +                "description": "The array of directories..",
    +                "type": "Array"
    +            },
    +            "class": "Utils",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/utils.js",
    +            "line": 384,
    +            "description": "Make sure all the paths passed are directories and that they are not in the ignore list.",
    +            "itemtype": "method",
    +            "name": "validatePaths",
    +            "params": [
    +                {
    +                    "name": "paths",
    +                    "description": "The array of paths to validate",
    +                    "type": "Array"
    +                },
    +                {
    +                    "name": "ignore",
    +                    "description": "A string to call `.indexOf` on a path to determine if it should be ignored",
    +                    "type": "String",
    +                    "optional": true,
    +                    "optdefault": "false"
    +                }
    +            ],
    +            "class": "Utils",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/utils.js",
    +            "line": 459,
    +            "description": "Takes a type string and converts it to a \"First letter upper cased\" type. e.g. `(string -> String, object -> Object)`",
    +            "itemtype": "method",
    +            "name": "fixType",
    +            "params": [
    +                {
    +                    "name": "t",
    +                    "description": "The type string to convert",
    +                    "type": "String"
    +                }
    +            ],
    +            "return": {
    +                "description": "The fixed string",
    +                "type": "String"
    +            },
    +            "class": "Utils",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/utils.js",
    +            "line": 481,
    +            "description": "Produces a normalized web path by joining all the parts and normalizing the\nfilesystem-like path into web compatible url.\nSupports relative and absolute paths.\nCourtesy of [Mojito's utils](https://github.com/yahoo/mojito/)",
    +            "itemtype": "method",
    +            "name": "webpath",
    +            "params": [
    +                {
    +                    "name": "url",
    +                    "description": "the list of parts to be joined and normalized",
    +                    "type": "Array|String*"
    +                }
    +            ],
    +            "return": {
    +                "description": "The joined and normalized url",
    +                "type": "String"
    +            },
    +            "class": "Utils",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/yuidoc.js",
    +            "line": 1,
    +            "description": "Copyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "class": "YUIDoc",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/yuidoc.js",
    +            "line": 31,
    +            "description": "The default list of configuration options",
    +            "itemtype": "property",
    +            "name": "OPTIONS",
    +            "type": "Object",
    +            "final": 1,
    +            "class": "YUIDoc",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/yuidoc.js",
    +            "line": 68,
    +            "description": "Holds the number of files that we are processing.",
    +            "itemtype": "property",
    +            "name": "filecount",
    +            "type": "Boolean",
    +            "access": "private",
    +            "tagname": "",
    +            "class": "YUIDoc",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/yuidoc.js",
    +            "line": 75,
    +            "description": "Hash map of dirnames to selleck config options.",
    +            "itemtype": "property",
    +            "name": "selleck",
    +            "type": "Object",
    +            "access": "private",
    +            "tagname": "",
    +            "class": "YUIDoc",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/yuidoc.js",
    +            "line": 82,
    +            "description": "Holder for the list of files we are processing.",
    +            "itemtype": "property",
    +            "name": "filemap",
    +            "type": "Object",
    +            "access": "private",
    +            "tagname": "",
    +            "class": "YUIDoc",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/yuidoc.js",
    +            "line": 89,
    +            "description": "Holder for the list of directories we are processing.",
    +            "itemtype": "property",
    +            "name": "dirmap",
    +            "type": "Object",
    +            "access": "private",
    +            "tagname": "",
    +            "class": "YUIDoc",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/yuidoc.js",
    +            "line": 97,
    +            "description": "Internal holder for configuration options.",
    +            "itemtype": "property",
    +            "name": "options",
    +            "type": "Object",
    +            "access": "private",
    +            "tagname": "",
    +            "class": "YUIDoc",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/yuidoc.js",
    +            "line": 114,
    +            "description": "Always exclude these directories",
    +            "itemtype": "method",
    +            "name": "_setDefaultExcludes",
    +            "access": "private",
    +            "tagname": "",
    +            "class": "YUIDoc",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/yuidoc.js",
    +            "line": 129,
    +            "description": "Does post process on self.options.",
    +            "itemtype": "method",
    +            "name": "_processConfig",
    +            "access": "private",
    +            "tagname": "",
    +            "class": "YUIDoc",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/yuidoc.js",
    +            "line": 140,
    +            "description": "Walks the paths and parses the directory contents",
    +            "itemtype": "method",
    +            "name": "walk",
    +            "access": "private",
    +            "tagname": "",
    +            "class": "YUIDoc",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/yuidoc.js",
    +            "line": 151,
    +            "description": "Walks the passed directory and grabs all the files recursively.",
    +            "itemtype": "method",
    +            "name": "parsedir",
    +            "params": [
    +                {
    +                    "name": "dir",
    +                    "description": "The directory to parse the contents of.",
    +                    "type": "String"
    +                }
    +            ],
    +            "access": "private",
    +            "tagname": "",
    +            "class": "YUIDoc",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/yuidoc.js",
    +            "line": 192,
    +            "description": "Gathers all the file data and populates the filemap and dirmap hashes.",
    +            "itemtype": "method",
    +            "name": "parsefiles",
    +            "params": [
    +                {
    +                    "name": "dir",
    +                    "description": "The directory to start from.",
    +                    "type": "String"
    +                },
    +                {
    +                    "name": "files",
    +                    "description": "List of files to parse.",
    +                    "type": "Array"
    +                }
    +            ],
    +            "access": "private",
    +            "tagname": "",
    +            "class": "YUIDoc",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/yuidoc.js",
    +            "line": 250,
    +            "description": "Applies preprocessors to the data tree.\nThis function first clones the data and operates on the clone.",
    +            "itemtype": "method",
    +            "name": "runPreprocessors",
    +            "access": "private",
    +            "tagname": "",
    +            "return": {
    +                "description": "The mutated data",
    +                "type": "Object"
    +            },
    +            "class": "YUIDoc",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/yuidoc.js",
    +            "line": 289,
    +            "description": "Writes the parser JSON data to disk.\nApplies preprocessors, if any.",
    +            "itemtype": "method",
    +            "name": "writeJSON",
    +            "params": [
    +                {
    +                    "name": "parser",
    +                    "description": "The DocParser instance to use",
    +                    "type": "Object"
    +                }
    +            ],
    +            "access": "private",
    +            "tagname": "",
    +            "return": {
    +                "description": "The JSON data returned from the DocParser",
    +                "type": "Object"
    +            },
    +            "class": "YUIDoc",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/yuidoc.js",
    +            "line": 378,
    +            "description": "Process the config, walk the file tree and write out the JSON data.",
    +            "itemtype": "method",
    +            "name": "run",
    +            "return": {
    +                "description": "The JSON data returned from the DocParser",
    +                "type": "Object"
    +            },
    +            "class": "YUIDoc",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/yuidoc.js",
    +            "line": 384,
    +            "description": "Timestamp holder so we know when YUIDoc started the parse process.",
    +            "itemtype": "property",
    +            "name": "starttime",
    +            "type": "Timestamp",
    +            "class": "YUIDoc",
    +            "module": "yuidoc"
    +        },
    +        {
    +            "file": "lib/yuidoc.js",
    +            "line": 406,
    +            "description": "Timestamp holder so we know when YUIDoc has finished the parse process.",
    +            "itemtype": "property",
    +            "name": "endtime",
    +            "type": "Timestamp",
    +            "class": "YUIDoc",
    +            "module": "yuidoc"
    +        }
    +    ],
    +    "warnings": [
    +        {
    +            "message": "unknown tag: exports",
    +            "line": " lib/index.js:8"
    +        },
    +        {
    +            "message": "Missing item type\nCopyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "line": " lib/builder.js:1"
    +        },
    +        {
    +            "message": "Missing item type\nCopyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "line": " lib/cli.js:4"
    +        },
    +        {
    +            "message": "Missing item type\nCopyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "line": " lib/docparser.js:1"
    +        },
    +        {
    +            "message": "Missing item type\nCopyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "line": " lib/docview.js:1"
    +        },
    +        {
    +            "message": "Missing item type\nCopyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "line": " lib/files.js:1"
    +        },
    +        {
    +            "message": "Missing item type\nCopyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "line": " lib/help.js:1"
    +        },
    +        {
    +            "message": "Missing item type\nCopyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "line": " lib/index.js:1"
    +        },
    +        {
    +            "message": "Missing item type\nCopyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "line": " lib/options.js:1"
    +        },
    +        {
    +            "message": "Missing item type\nCopyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "line": " lib/project.js:1"
    +        },
    +        {
    +            "message": "Missing item type\nCopyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "line": " lib/server.js:1"
    +        },
    +        {
    +            "message": "Missing item type\nCopyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "line": " lib/utils.js:1"
    +        },
    +        {
    +            "message": "Missing item type\nCopyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttps://github.com/yui/yuidoc/blob/master/LICENSE",
    +            "line": " lib/yuidoc.js:1"
    +        }
    +    ]
    +}
    \ No newline at end of file
    diff --git a/output/api/elements/index.html b/output/api/elements/index.html
    new file mode 100644
    index 00000000..487fe15b
    --- /dev/null
    +++ b/output/api/elements/index.html
    @@ -0,0 +1,10 @@
    +<!doctype html>
    +<html>
    +    <head>
    +        <title>Redirector</title>
    +        <meta http-equiv="refresh" content="0;url=../">
    +    </head>
    +    <body>
    +        <a href="../">Click here to redirect</a>
    +    </body>
    +</html>
    diff --git a/output/api/files/index.html b/output/api/files/index.html
    new file mode 100644
    index 00000000..487fe15b
    --- /dev/null
    +++ b/output/api/files/index.html
    @@ -0,0 +1,10 @@
    +<!doctype html>
    +<html>
    +    <head>
    +        <title>Redirector</title>
    +        <meta http-equiv="refresh" content="0;url=../">
    +    </head>
    +    <body>
    +        <a href="../">Click here to redirect</a>
    +    </body>
    +</html>
    diff --git a/output/api/files/lib_builder.js.html b/output/api/files/lib_builder.js.html
    new file mode 100644
    index 00000000..8ca48e04
    --- /dev/null
    +++ b/output/api/files/lib_builder.js.html
    @@ -0,0 +1,1910 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>lib/builder.js - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1 class="file-heading">File: lib/builder.js</h1>
    +
    +<div class="file">
    +    <pre class="code prettyprint linenums">
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +&#x27;use strict&#x27;;
    +
    +var MarkdownIt = require(&#x27;markdown-it&#x27;);
    +var fs = require(&#x27;graceful-fs&#x27;);
    +var mdn = require(&#x27;mdn-links&#x27;);
    +var noop = function () {};
    +var path = require(&#x27;path&#x27;);
    +var TEMPLATE;
    +
    +/**
    +* Takes the &#x60;JSON&#x60; data from the &#x60;DocParser&#x60; class, creates and parses markdown and handlebars
    +based templates to generate static HTML content
    +* @class DocBuilder
    +* @module yuidoc
    +*/
    +
    +YUI.add(&#x27;doc-builder&#x27;, function (Y) {
    +    var defaultMarkdownOption = {
    +        html: true,
    +        linkify: true
    +    };
    +
    +    var fixType = Y.Lang.fixType,
    +        print = function (items) {
    +            var out = &#x27;&lt;ul&gt;&#x27;;
    +
    +            Y.each(items, function (i, k) {
    +                out += &#x27;&lt;li&gt;&#x27;;
    +                if (Y.Lang.isObject(i)) {
    +                    if (!i.path) {
    +                        out += k + &#x27;/&#x27; + print(i);
    +                    } else {
    +                        out += &#x27;&lt;a href=&quot;../files/&#x27; + i.name + &#x27;.html&quot;&gt;&#x27; + k + &#x27;&lt;/a&gt;&#x27;;
    +                    }
    +                }
    +                out += &#x27;&lt;/li&gt;&#x27;;
    +            });
    +
    +            out += &#x27;&lt;/ul&gt;&#x27;;
    +            return out;
    +        };
    +
    +    Y.Handlebars.registerHelper(&#x27;buildFileTree&#x27;, function (items) {
    +        return print(items);
    +    });
    +
    +    var DEFAULT_THEME = path.join(__dirname, &#x27;../&#x27;, &#x27;themes&#x27;, &#x27;default&#x27;),
    +        themeDir = DEFAULT_THEME;
    +
    +    Y.DocBuilder = function (options, data) {
    +        this.options = options;
    +        if (options.helpers) {
    +            this._addHelpers(options.helpers);
    +        }
    +        if (options.themedir) {
    +            themeDir = options.themedir;
    +        }
    +        this.md = new MarkdownIt(Y.merge(defaultMarkdownOption, options.markdown));
    +        this.data = data;
    +        Y.log(&#x27;Building..&#x27;, &#x27;info&#x27;, &#x27;builder&#x27;);
    +        this.files = 0;
    +        var self = this;
    +
    +        Y.Handlebars.registerHelper(&#x27;crossLink&#x27;, function (item, helperOptions) {
    +            var str = &#x27;&#x27;;
    +            if (!item) {
    +                item = &#x27;&#x27;;
    +            }
    +            //console.log(&#x27;CrossLink:&#x27;, item);
    +            if (item.indexOf(&#x27;|&#x27;) &gt; 0) {
    +                var parts = item.split(&#x27;|&#x27;),
    +                    p = [];
    +                Y.each(parts, function (i) {
    +                    p.push(self._parseCrossLink.call(self, i));
    +                });
    +                str = p.join(&#x27; | &#x27;);
    +            } else {
    +                str = self._parseCrossLink.call(self, item, false, helperOptions.fn(this));
    +            }
    +            return str;
    +        });
    +
    +        Y.Handlebars.registerHelper(&#x27;crossLinkModule&#x27;, function (item, helperOptions) {
    +            var str = item;
    +            if (self.data.modules[item]) {
    +                var content = helperOptions.fn(this);
    +                if (content === &#x27;&#x27;) {
    +                    content = item;
    +                }
    +                str = &#x27;&lt;a href=&quot;../modules/&#x27; + item.replace(/\//g, &#x27;_&#x27;) +
    +                    &#x27;.html&quot;&gt;&#x27; + content + &#x27;&lt;/a&gt;&#x27;;
    +            }
    +            return str;
    +        });
    +
    +        Y.Handlebars.registerHelper(&#x27;crossLinkRaw&#x27;, function (item) {
    +            var str = &#x27;&#x27;;
    +            if (!item) {
    +                item = &#x27;&#x27;;
    +            }
    +            if (item.indexOf(&#x27;|&#x27;) &gt; 0) {
    +                var parts = item.split(&#x27;|&#x27;),
    +                    p = [];
    +                Y.each(parts, function (i) {
    +                    p.push(self._parseCrossLink.call(self, i, true));
    +                });
    +                str = p.join(&#x27; | &#x27;);
    +            } else {
    +                str = self._parseCrossLink.call(self, item, true);
    +            }
    +            return str;
    +        });
    +
    +        this.cacheTemplates = true;
    +        if (options.cacheTemplates === false) {
    +            this.cacheTemplates = false;
    +        }
    +    };
    +
    +    Y.DocBuilder.prototype = {
    +        /**
    +         * Register a &#x60;Y.Handlebars&#x60; helper method
    +         * @method _addHelpers
    +         * @param {Object} helpers Object containing a hash of names and functions
    +         */
    +        _addHelpers: function (helpers) {
    +            Y.log(&#x27;Importing helpers: &#x27; + helpers, &#x27;info&#x27;, &#x27;builder&#x27;);
    +            helpers.forEach(function (imp) {
    +                if (!Y.Files.exists(imp) || Y.Files.exists(path.join(process.cwd(), imp))) {
    +                    imp = path.join(process.cwd(), imp);
    +                }
    +                var h = require(imp);
    +                Object.keys(h).forEach(function (name) {
    +                    Y.Handlebars.registerHelper(name, h[name]);
    +                });
    +            });
    +        },
    +
    +        /**
    +         * Wrapper around the Markdown parser so it can be normalized or even side stepped
    +         * @method markdown
    +         * @private
    +         * @param {String} data The Markdown string to parse
    +         * @return {HTML} The rendered HTML
    +         */
    +        markdown: function (data) {
    +            var html = this.md.render(data);
    +            //Only reprocess if helpers were asked for
    +            if (this.options.helpers || (html.indexOf(&#x27;{{#crossLink&#x27;) &gt; -1)) {
    +                try {
    +                    // markdown-it auto-escapes quotation marks (and unfortunately
    +                    // does not expose the escaping function)
    +                    html = html.replace(/&amp;quot;/g, &#x27;&quot;&#x27;);
    +                    html = (Y.Handlebars.compile(html))({});
    +                } catch (hError) {
    +                    //Remove all the extra escapes
    +                    html = html.replace(/\\{/g, &#x27;{&#x27;).replace(/\\}/g, &#x27;}&#x27;);
    +                    Y.log(&#x27;Failed to parse Handlebars, probably an unknown helper, skipping..&#x27;, &#x27;warn&#x27;, &#x27;builder&#x27;);
    +                }
    +            }
    +            return html;
    +        },
    +
    +        /**
    +         * Parse the item to be cross linked and return an HREF linked to the item
    +         * @method _parseCrossLink
    +         * @private
    +         * @param {String} item The item to crossLink
    +         * @param {Boolean} [raw=false] Do not wrap it in HTML
    +         * @param {String} [content] crossLink helper content
    +         */
    +        _parseCrossLink: function (item, raw, content) {
    +            var self = this;
    +            var parts,
    +                base = &#x27;../&#x27;,
    +                baseItem,
    +                newWin = false,
    +                group = /&amp;lt;.*(?=&amp;gt;$)/.test(item) ? &#x27;elements&#x27; : &#x27;classes&#x27;,
    +                className = &#x27;crosslink&#x27;;
    +
    +            if (group === &#x27;classes&#x27;) {
    +                item = fixType(item);
    +            }
    +
    +            item = baseItem = Y.Lang.trim(item.replace(&#x27;{&#x27;, &#x27;&#x27;).replace(&#x27;}&#x27;, &#x27;&#x27;));
    +            //Remove Cruft
    +            item = item.replace(&#x27;*&#x27;, &#x27;&#x27;).replace(&#x27;[&#x27;, &#x27;&#x27;).replace(&#x27;]&#x27;, &#x27;&#x27;).replace(&#x27;&amp;lt;&#x27;, &#x27;&#x27;).replace(&#x27;&amp;gt;&#x27;, &#x27;&#x27;);
    +
    +            var link = false,
    +                href;
    +
    +            if (self.data[group][item]) {
    +                link = true;
    +            } else {
    +                if (self.data[group][item.replace(&#x27;.&#x27;, &#x27;&#x27;)]) {
    +                    link = true;
    +                    item = item.replace(&#x27;.&#x27;, &#x27;&#x27;);
    +                }
    +            }
    +            if (self.options.externalData) {
    +                if (self.data[group][item]) {
    +                    if (self.data[group][item].external) {
    +                        href = self.data[group][item].path;
    +                        base = self.options.externalData.base;
    +                        className += &#x27; external&#x27;;
    +                        newWin = true;
    +                        link = true;
    +                    }
    +                }
    +            }
    +
    +            if (group === &#x27;elements&#x27; &amp;&amp; item.indexOf(&#x27; &#x27;) &gt; -1) {
    +                // Fragment link for an attribute is required
    +                parts = item.split(&#x27; &#x27;);
    +                var el = parts[0],
    +                    attr = parts[1];
    +
    +                if (el &amp;&amp; attr) {
    +                    if (self.data.elements[el]) {
    +                        self.data.elements[el].attributes.some(function (i) {
    +                            if (i.name === attr) {
    +                                link = true;
    +                                baseItem = attr;
    +                                href = Y.webpath(base, &#x27;elements&#x27;, el + &#x27;.html#&#x27; + attr);
    +                            }
    +                        });
    +                    }
    +                }
    +            } else if (item.indexOf(&#x27;/&#x27;) &gt; -1) {
    +                //We have a class + method to parse
    +                parts = item.split(&#x27;/&#x27;);
    +                var cls = parts[0],
    +                    method = parts[1],
    +                    type = &#x27;method&#x27;;
    +
    +                if (method.indexOf(&#x27;:&#x27;) &gt; -1) {
    +                    parts = method.split(&#x27;:&#x27;);
    +                    method = parts[0];
    +                    type = parts[1];
    +                    if (type.indexOf(&#x27;attr&#x27;) === 0) {
    +                        type = &#x27;attribute&#x27;;
    +                    }
    +                }
    +
    +                if (cls &amp;&amp; method) {
    +                    if (self.data.classes[cls]) {
    +                        self.data.classitems.forEach(function (i) {
    +                            if (i.itemtype === type &amp;&amp; i.name === method &amp;&amp; i.class === cls) {
    +                                link = true;
    +                                baseItem = method;
    +                                var t = type;
    +                                if (t === &#x27;attribute&#x27;) {
    +                                    t = &#x27;attr&#x27;;
    +                                }
    +                                href = Y.webpath(base, &#x27;classes&#x27;, cls + &#x27;.html#&#x27; + t + &#x27;_&#x27; + method);
    +                            }
    +                        });
    +                    }
    +                }
    +
    +            }
    +
    +            if (item === &#x27;Object&#x27; || item === &#x27;Array&#x27;) {
    +                link = false;
    +            }
    +            if (!href) {
    +                href = Y.webpath(base, group, item + &#x27;.html&#x27;);
    +                if (base.match(/^https?:\/\//)) {
    +                    href = base + Y.webpath(group, item + &#x27;.html&#x27;);
    +                }
    +            }
    +            if (!link &amp;&amp; self.options.linkNatives) {
    +                href = mdn.getLink.apply(mdn, item.split(&#x27;/&#x27;));
    +                if (href) {
    +                    className += &#x27; external&#x27;;
    +                    newWin = true;
    +                    link = true;
    +                }
    +            }
    +            if (link) {
    +                if (content !== undefined) {
    +                    content = content.trim();
    +                }
    +                if (!content) {
    +                    content = baseItem;
    +                }
    +                item = &#x27;&lt;a href=&quot;&#x27; + href + &#x27;&quot; class=&quot;&#x27; + className + &#x27;&quot;&#x27; + ((newWin) ? &#x27; target=&quot;_blank&quot;&#x27; : &#x27;&#x27;) + &#x27;&gt;&#x27; + content + &#x27;&lt;/a&gt;&#x27;;
    +            }
    +            return (raw) ? href : item;
    +        },
    +
    +        /**
    +         * Mixes the various external data soures together into the local data, augmenting
    +         * it with flags.
    +         * @method _mixExternal
    +         * @private
    +         */
    +        _mixExternal: function () {
    +            var self = this;
    +            Y.log(&#x27;External data received, mixing&#x27;, &#x27;info&#x27;, &#x27;builder&#x27;);
    +            self.options.externalData.forEach(function (exData) {
    +
    +                [&#x27;files&#x27;, &#x27;elements&#x27;, &#x27;classes&#x27;, &#x27;modules&#x27;].forEach(function (k) {
    +                    Y.each(exData[k], function (item, key) {
    +                        item.external = true;
    +                        var file = item.name;
    +                        if (!item.file) {
    +                            file = self.filterFileName(item.name);
    +                        }
    +
    +                        if (item.type) {
    +                            item.type = fixType(item.type);
    +                        }
    +
    +                        item.path = exData.base + path.join(k, file + &#x27;.html&#x27;);
    +
    +                        self.data[k][key] = item;
    +                    });
    +                });
    +                Y.each(exData.classitems, function (item) {
    +                    item.external = true;
    +                    item.path = exData.base + path.join(&#x27;files&#x27;, self.filterFileName(item.file) + &#x27;.html&#x27;);
    +                    if (item.type) {
    +                        item.type = fixType(item.type);
    +                    }
    +                    if (item.params) {
    +                        item.params.forEach(function (p) {
    +                            if (p.type) {
    +                                p.type = fixType(p.type);
    +                            }
    +                        });
    +                    }
    +                    if (item.return) {
    +                        item.return.type = fixType(item.return.type);
    +                    }
    +                    self.data.classitems.push(item);
    +                });
    +            });
    +        },
    +        /**
    +         * Fetches the remote data and fires the callback when it&#x27;s all complete
    +         * @method mixExternal
    +         * @param {Callback} cb The callback to execute when complete
    +         * @async
    +         */
    +        mixExternal: function (cb) {
    +            var self = this,
    +                info = self.options.external;
    +
    +            if (!info) {
    +                cb();
    +                return;
    +            }
    +            if (!info.merge) {
    +                info.merge = &#x27;mix&#x27;;
    +            }
    +            if (!info.data) {
    +                Y.log(&#x27;External config found but no data path defined, skipping import.&#x27;, &#x27;warn&#x27;, &#x27;builder&#x27;);
    +                cb();
    +                return;
    +            }
    +            if (!Y.Lang.isArray(info.data)) {
    +                info.data = [info.data];
    +            }
    +            Y.log(&#x27;Importing external documentation data.&#x27;, &#x27;info&#x27;, &#x27;builder&#x27;);
    +
    +            var stack = new Y.Parallel();
    +            info.data.forEach(function (i) {
    +                var base;
    +                if (typeof i === &#x27;object&#x27;) {
    +                    base = i.base;
    +                    i = i.json;
    +                }
    +                if (i.match(/^https?:\/\//)) {
    +                    if (!base) {
    +                        base = i.replace(&#x27;data.json&#x27;, &#x27;&#x27;);
    +                    }
    +                    Y.use(&#x27;io-base&#x27;, stack.add(function () {
    +                        Y.log(&#x27;Fetching: &#x27; + i, &#x27;info&#x27;, &#x27;builder&#x27;);
    +                        Y.io(i, {
    +                            timeout: 10000000,
    +                            on: {
    +                                complete: stack.add(function (id, e) {
    +                                    Y.log(&#x27;Received: &#x27; + i, &#x27;info&#x27;, &#x27;builder&#x27;);
    +                                    var parsedData = JSON.parse(e.responseText);
    +                                    parsedData.base = base;
    +                                    //self.options.externalData = Y.mix(self.options.externalData || {}, data);
    +                                    if (!self.options.externalData) {
    +                                        self.options.externalData = [];
    +                                    }
    +                                    self.options.externalData.push(parsedData);
    +                                })
    +                            }
    +                        });
    +                    }));
    +                } else {
    +                    if (!base) {
    +                        base = path.dirname(path.resolve(i));
    +                    }
    +                    var data = Y.Files.getJSON(i);
    +                    data.base = base;
    +                    //self.options.externalData = Y.mix(self.options.externalData || {}, data);
    +                    if (!self.options.externalData) {
    +                        self.options.externalData = [];
    +                    }
    +                    self.options.externalData.push(data);
    +                }
    +            });
    +
    +            stack.done(function () {
    +                Y.log(&#x27;Finished fetching remote data&#x27;, &#x27;info&#x27;, &#x27;builder&#x27;);
    +                self._mixExternal();
    +                cb();
    +            });
    +        },
    +        /**
    +         * File counter
    +         * @property files
    +         * @type Number
    +         */
    +        files: null,
    +        /**
    +         * Holder for project meta data
    +         * @property _meta
    +         * @type Object
    +         * @private
    +         */
    +        _meta: null,
    +        /**
    +         * Prep the meta data to be fed to Selleck
    +         * @method getProjectMeta
    +         * @return {Object} The project metadata
    +         */
    +        getProjectMeta: function () {
    +            var obj = {
    +                meta: {
    +                    yuiSeedUrl: &#x27;http://yui.yahooapis.com/3.5.0/build/yui/yui-min.js&#x27;,
    +                    yuiGridsUrl: &#x27;http://yui.yahooapis.com/3.5.0/build/cssgrids/cssgrids-min.css&#x27;
    +                }
    +            };
    +            if (!this._meta) {
    +                try {
    +                    var meta,
    +                        theme = path.join(themeDir, &#x27;theme.json&#x27;);
    +                    if (Y.Files.exists(theme)) {
    +                        Y.log(&#x27;Loading theme from &#x27; + theme, &#x27;info&#x27;, &#x27;builder&#x27;);
    +                        meta = Y.Files.getJSON(theme);
    +                    } else if (DEFAULT_THEME !== themeDir) {
    +                        theme = path.join(DEFAULT_THEME, &#x27;theme.json&#x27;);
    +                        if (Y.Files.exists(theme)) {
    +                            Y.log(&#x27;Loading theme from &#x27; + theme, &#x27;info&#x27;, &#x27;builder&#x27;);
    +                            meta = Y.Files.getJSON(theme);
    +                        }
    +                    }
    +
    +                    if (meta) {
    +                        obj.meta = meta;
    +                        this._meta = meta;
    +                    }
    +                } catch (e) {
    +                    console.error(&#x27;Error&#x27;, e);
    +                }
    +            } else {
    +                obj.meta = this._meta;
    +            }
    +            Y.each(this.data.project, function (v, k) {
    +                var key = k.substring(0, 1).toUpperCase() + k.substring(1, k.length);
    +                obj.meta[&#x27;project&#x27; + key] = v;
    +            });
    +            return obj;
    +        },
    +        /**
    +         * Populate the meta data for classes
    +         * @method populateClasses
    +         * @param {Object} opts The original options
    +         * @return {Object} The modified options
    +         */
    +        populateClasses: function (opts) {
    +            opts.meta.classes = [];
    +            Y.each(this.data.classes, function (v) {
    +                if (v.external) {
    +                    return;
    +                }
    +                opts.meta.classes.push({
    +                    displayName: v.name,
    +                    name: v.name,
    +                    namespace: v.namespace,
    +                    module: v.module,
    +                    description: v.description,
    +                    access: v.access || &#x27;public&#x27;
    +                });
    +            });
    +            opts.meta.classes.sort(this.nameSort);
    +            return opts;
    +        },
    +        /**
    +         * Populate the meta data for elements
    +         * @method populateElements
    +         * @param {Object} opts The original options
    +         * @return {Object} The modified options
    +         */
    +        populateElements: function (opts) {
    +            opts.meta.elements = [];
    +            Y.each(this.data.elements, function (v) {
    +                if (v.external) {
    +                    return;
    +                }
    +                opts.meta.elements.push({
    +                    displayName: &#x27;&lt;&#x27; + v.name + &#x27;&gt;&#x27;,
    +                    name: v.name,
    +                    module: v.module,
    +                    description: v.description
    +                });
    +            });
    +            opts.meta.elements.sort(this.nameSort);
    +            return opts;
    +        },
    +        /**
    +         * Populate the meta data for modules
    +         * @method populateModules
    +         * @param {Object} opts The original options
    +         * @return {Object} The modified options
    +         */
    +        populateModules: function (opts) {
    +            var self = this;
    +            opts.meta.modules = [];
    +            opts.meta.allModules = [];
    +            Y.each(this.data.modules, function (v) {
    +                if (v.external) {
    +                    return;
    +                }
    +                opts.meta.allModules.push({
    +                    displayName: v.displayName || v.name,
    +                    name: self.filterFileName(v.name),
    +                    description: v.description
    +                });
    +                if (!v.is_submodule) {
    +                    var o = {
    +                        displayName: v.displayName || v.name,
    +                        name: self.filterFileName(v.name)
    +                    };
    +                    if (v.submodules) {
    +                        o.submodules = [];
    +                        Y.each(v.submodules, function (i, k) {
    +                            var moddef = self.data.modules[k];
    +                            if (moddef) {
    +                                o.submodules.push({
    +                                    displayName: k,
    +                                    description: moddef.description
    +                                });
    +                                // } else {
    +                                //     Y.log(&#x27;Submodule data missing: &#x27; + k + &#x27; for &#x27; + v.name, &#x27;warn&#x27;, &#x27;builder&#x27;);
    +                            }
    +                        });
    +                        o.submodules.sort(self.nameSort);
    +                    }
    +                    opts.meta.modules.push(o);
    +                }
    +            });
    +            opts.meta.modules.sort(this.nameSort);
    +            opts.meta.allModules.sort(this.nameSort);
    +            return opts;
    +        },
    +        /**
    +         * Populate the meta data for files
    +         * @method populateFiles
    +         * @param {Object} opts The original options
    +         * @return {Object} The modified options
    +         */
    +        populateFiles: function (opts) {
    +            var self = this;
    +            opts.meta.files = [];
    +            Y.each(this.data.files, function (v) {
    +                if (v.external) {
    +                    return;
    +                }
    +                opts.meta.files.push({
    +                    displayName: v.name,
    +                    name: self.filterFileName(v.name),
    +                    path: v.path || v.name
    +                });
    +            });
    +
    +            var tree = {};
    +            var files = [];
    +            Y.each(this.data.files, function (v) {
    +                if (v.external) {
    +                    return;
    +                }
    +                files.push(v.name);
    +            });
    +            files.sort();
    +            Y.each(files, function (v) {
    +                var p = v.split(&#x27;/&#x27;),
    +                    par;
    +                p.forEach(function (i, k) {
    +                    if (!par) {
    +                        if (!tree[i]) {
    +                            tree[i] = {};
    +                        }
    +                        par = tree[i];
    +                    } else {
    +                        if (!par[i]) {
    +                            par[i] = {};
    +                        }
    +                        if (k + 1 === p.length) {
    +                            par[i] = {
    +                                path: v,
    +                                name: self.filterFileName(v)
    +                            };
    +                        }
    +                        par = par[i];
    +                    }
    +                });
    +            });
    +
    +            opts.meta.fileTree = tree;
    +
    +            return opts;
    +        },
    +        /**
    +         * Parses file and line number from an item object and build&#x27;s an HREF
    +         * @method addFoundAt
    +         * @param {Object} a The item to parse
    +         * @return {String} The parsed HREF
    +         */
    +        addFoundAt: function (a) {
    +            var self = this;
    +            if (a.file &amp;&amp; a.line &amp;&amp; !self.options.nocode) {
    +                a.foundAt = &#x27;../files/&#x27; + self.filterFileName(a.file) + &#x27;.html#l&#x27; + a.line;
    +                if (a.path) {
    +                    a.foundAt = a.path + &#x27;#l&#x27; + a.line;
    +                }
    +            }
    +            return a;
    +        },
    +        /**
    +         * Augments the **DocParser** meta data to provide default values for certain keys as well as parses all descriptions
    +         * with the &#x60;Markdown Parser&#x60;
    +         * @method augmentData
    +         * @param {Object} o The object to recurse and augment
    +         * @return {Object} The augmented object
    +         */
    +        augmentData: function (o) {
    +            var self = this;
    +            o = self.addFoundAt(o);
    +            Y.each(o, function (i, k1) {
    +                if (i &amp;&amp; i.forEach) {
    +                    Y.each(i, function (a, k) {
    +                        if (!(a instanceof Object)) {
    +                            return;
    +                        }
    +                        if (!a.type) {
    +                            a.type = &#x27;Object&#x27;; //Default type is Object
    +                        }
    +                        if (a.final === &#x27;&#x27;) {
    +                            a.final = true;
    +                        }
    +                        if (!a.description) {
    +                            a.description = &#x27; &#x27;;
    +                        } else if (!o.extended_from) {
    +                            a.description = self.markdown(a.description);
    +                        }
    +                        if (a.example &amp;&amp; !o.extended_from) {
    +                            a.example = self.markdown(a.example);
    +                        }
    +                        a = self.addFoundAt(a);
    +
    +                        Y.each(a, function (c, d) {
    +                            if (c.forEach || (c instanceof Object)) {
    +                                c = self.augmentData(c);
    +                                a[d] = c;
    +                            }
    +                        });
    +
    +                        o[k1][k] = a;
    +                    });
    +                } else if (i instanceof Object) {
    +                    i = self.addFoundAt(i);
    +                    Y.each(i, function (v, k) {
    +                        if (k === &#x27;final&#x27;) {
    +                            o[k1][k] = true;
    +                        } else if (k === &#x27;description&#x27; || k === &#x27;example&#x27;) {
    +                            if (v.forEach || (v instanceof Object)) {
    +                                o[k1][k] = self.augmentData(v);
    +                            } else {
    +                                o[k1][k] = o.extended_from ? v : self.markdown(v);
    +                            }
    +                        }
    +                    });
    +                } else if (k1 === &#x27;description&#x27; || k1 === &#x27;example&#x27;) {
    +                    o[k1] = o.extended_from ? i : self.markdown(i);
    +                }
    +            });
    +            return o;
    +        },
    +        /**
    +         * Makes the default directories needed
    +         * @method makeDirs
    +         * @param {Callback} cb The callback to execute after it&#x27;s completed
    +         */
    +        makeDirs: function (cb) {
    +            var self = this;
    +            var dirs = [&#x27;classes&#x27;, &#x27;elements&#x27;, &#x27;modules&#x27;, &#x27;files&#x27;];
    +            if (self.options.dumpview) {
    +                dirs.push(&#x27;json&#x27;);
    +            }
    +            var writeRedirect = function (dir, file, cbWriteRedirect) {
    +                Y.Files.exists(file, function (x) {
    +                    if (x) {
    +                        var out = path.join(dir, &#x27;index.html&#x27;);
    +                        fs.createReadStream(file).pipe(fs.createWriteStream(out));
    +                    }
    +                    cbWriteRedirect();
    +                });
    +            };
    +            var defaultIndex = path.join(themeDir, &#x27;assets&#x27;, &#x27;index.html&#x27;);
    +            var stack = new Y.Parallel();
    +            Y.log(&#x27;Making default directories: &#x27; + dirs.join(&#x27;,&#x27;), &#x27;info&#x27;, &#x27;builder&#x27;);
    +            dirs.forEach(function (d) {
    +                var dir = path.join(self.options.outdir, d);
    +                Y.Files.exists(dir, stack.add(function (x) {
    +                    if (!x) {
    +                        fs.mkdir(dir, &#x27;0777&#x27;, stack.add(function () {
    +                            writeRedirect(dir, defaultIndex, stack.add(noop));
    +                        }));
    +                    } else {
    +                        writeRedirect(dir, defaultIndex, stack.add(noop));
    +                    }
    +                }));
    +            });
    +            stack.done(function () {
    +                if (cb) {
    +                    cb();
    +                }
    +            });
    +        },
    +
    +
    +        _resolveUrl: function (url, opts) {
    +            if (!url) {
    +                return null;
    +            }
    +            if (url.indexOf(&#x27;://&#x27;) &gt;= 0) {
    +                return url;
    +            }
    +            return path.join(opts.meta.projectRoot, url);
    +        },
    +
    +        /**
    +         * Parses &#x60;&lt;pre&gt;&lt;code&gt;&#x60; tags and adds the __prettyprint__ &#x60;className&#x60; to them
    +         * @method _parseCode
    +         * @private
    +         * @param {HTML} html The HTML to parse
    +         * @return {HTML} The parsed HTML
    +         */
    +        _parseCode: function (html) {
    +            html = html || &#x27;&#x27;;
    +            //html = html.replace(/&lt;pre&gt;&lt;code&gt;/g, &#x27;&lt;pre class=&quot;code&quot;&gt;&lt;code class=&quot;prettyprint&quot;&gt;&#x27;);
    +            html = html.replace(/&lt;pre&gt;&lt;code/g, &#x27;&lt;pre class=&quot;code prettyprint&quot;&gt;&lt;code&#x27;);
    +            return html;
    +        },
    +        /**
    +        * Ported from [Selleck](https://github.com/rgrove/selleck), this handles &#x60;&#x60;&#x60;&#x27;s in fields
    +        that are not parsed by the **Markdown** parser.
    +        * @method _inlineCode
    +        * @private
    +        * @param {HTML} html The HTML to parse
    +        * @return {HTML} The parsed HTML
    +        */
    +        _inlineCode: function (html) {
    +            html = html.replace(/\\&#x60;/g, &#x27;`&#x27;);
    +
    +            html = html.replace(/&#x60;(.+?)&#x60;/g, function (match, code) {
    +                return &#x27;&lt;code&gt;&#x27; + Y.escapeHTML(code) + &#x27;&lt;/code&gt;&#x27;;
    +            });
    +
    +            html = html.replace(/__\{\{SELLECK_BACKTICK\}\}__/g, &#x27;&#x60;&#x27;);
    +
    +            return html;
    +        },
    +        /**
    +        * Ported from [Selleck](https://github.com/rgrove/selleck)
    +        Renders the handlebars templates with the default View class.
    +        * @method render
    +        * @param {HTML} source The default template to parse
    +        * @param {Class} view The default view handler
    +        * @param {HTML} [layout=null] The HTML from the layout to use.
    +        * @param {Object} [partials=object] List of partials to include in this template
    +        * @param {Callback} callback
    +        * @param {Error} callback.err
    +        * @param {HTML} callback.html The assembled template markup
    +        */
    +        render: function (source, view, layout, partials, callback) {
    +            var html = [];
    +
    +            // function buffer(line) {
    +            //     html.push(line);
    +            // }
    +
    +            // Allow callback as third or fourth param.
    +            if (typeof partials === &#x27;function&#x27;) {
    +                callback = partials;
    +                partials = {};
    +            } else if (typeof layout === &#x27;function&#x27;) {
    +                callback = layout;
    +                layout = null;
    +            }
    +            var parts = Y.merge(partials || {}, {
    +                layout_content: source
    +            });
    +            Y.each(parts, function (partialsSource, name) {
    +                Y.Handlebars.registerPartial(name, partialsSource);
    +            });
    +
    +            if (!TEMPLATE || !this.cacheTemplates) {
    +                TEMPLATE = Y.Handlebars.compile(layout);
    +            }
    +
    +
    +            var _v = {};
    +            for (var k in view) {
    +                if (Y.Lang.isFunction(view[k])) {
    +                    _v[k] = view[k]();
    +                } else {
    +                    _v[k] = view[k];
    +                }
    +            }
    +            html = TEMPLATE(_v);
    +            //html = html.replace(/{{&amp;#x2F;/g, &#x27;{{/&#x27;);
    +
    +
    +            //html = (Y.Handlebars.compile(html))({});
    +
    +            html = this._inlineCode(html);
    +            callback(null, html);
    +        },
    +        /**
    +         * Render the index file
    +         * @method renderIndex
    +         * @param {Function} cb The callback fired when complete
    +         * @param {String} cb.html The HTML to render this view
    +         * @param {Object} cb.view The View Data
    +         */
    +        renderIndex: function (cb) {
    +            var self = this;
    +
    +            Y.prepare([DEFAULT_THEME, themeDir], self.getProjectMeta(), function (err, opts) {
    +                if (err) {
    +                    Y.log(err, &#x27;error&#x27;, &#x27;builder&#x27;);
    +                    cb(err);
    +                    return;
    +                }
    +                opts.meta.title = self.data.project.name;
    +                opts.meta.projectRoot = &#x27;./&#x27;;
    +                opts.meta.projectAssets = &#x27;./assets&#x27;;
    +                opts.meta.projectLogo = self._resolveUrl(self.data.project.logo, opts);
    +                opts = self.populateClasses(opts);
    +                opts = self.populateElements(opts);
    +                opts = self.populateModules(opts);
    +
    +                var view = new Y.DocView(opts.meta);
    +                self.render(&#x27;{{&gt;index}}&#x27;, view, opts.layouts.main, opts.partials, function (renderErr, html) {
    +                    if (renderErr) {
    +                        Y.log(renderErr, &#x27;error&#x27;, &#x27;builder&#x27;);
    +                        cb(renderErr);
    +                        return;
    +                    }
    +                    self.files++;
    +                    cb(html, view);
    +                });
    +            });
    +        },
    +        /**
    +         * Generates the index.html file
    +         * @method writeIndex
    +         * @param {Callback} cb The callback to execute after it&#x27;s completed
    +         * @param {String} cb.html The HTML to write index view
    +         * @param {Object} cb.view The View Data
    +         */
    +        writeIndex: function (cb) {
    +            var self = this,
    +                stack = new Y.Parallel();
    +
    +            Y.log(&#x27;Preparing index.html&#x27;, &#x27;info&#x27;, &#x27;builder&#x27;);
    +            self.renderIndex(stack.add(function (html, view) {
    +                stack.html = html;
    +                stack.view = view;
    +                if (self.options.dumpview) {
    +                    Y.Files.writeFile(path.join(self.options.outdir, &#x27;json&#x27;, &#x27;index.json&#x27;), JSON.stringify(view), stack.add(noop));
    +                }
    +                Y.Files.writeFile(path.join(self.options.outdir, &#x27;index.html&#x27;), html, stack.add(noop));
    +            }));
    +
    +            stack.done(function ( /* html, view */ ) {
    +                Y.log(&#x27;Writing index.html&#x27;, &#x27;info&#x27;, &#x27;builder&#x27;);
    +                cb(stack.html, stack.view);
    +            });
    +        },
    +        /**
    +         * Render a module
    +         * @method renderModule
    +         * @param {Function} cb The callback fired when complete
    +         * @param {String} cb.html The HTML to render this view
    +         * @param {Object} cb.view The View Data
    +         */
    +        renderModule: function (cb, data, layout) {
    +            var self = this;
    +            var stack = new Y.Parallel();
    +
    +            data.displayName = data.name;
    +            data.name = self.filterFileName(data.name);
    +            Y.prepare([DEFAULT_THEME, themeDir], self.getProjectMeta(), function (err, opts) {
    +                if (err) {
    +                    Y.log(err, &#x27;error&#x27;, &#x27;builder&#x27;);
    +                    cb(err);
    +                    return;
    +                }
    +                opts.meta = Y.merge(opts.meta, data);
    +
    +                //opts.meta.htmlTitle = v.name + &#x27;: &#x27; + self.data.project.name;
    +                opts.meta.title = self.data.project.name;
    +
    +                opts.meta.moduleName = data.displayName || data.name;
    +                opts.meta.moduleDescription = self._parseCode(self.markdown(data.description || &#x27; &#x27;));
    +                opts.meta.file = data.file;
    +                opts.meta.line = data.line;
    +                opts.meta = self.addFoundAt(opts.meta);
    +                opts.meta.projectRoot = &#x27;../&#x27;;
    +                opts.meta.projectAssets = &#x27;../assets&#x27;;
    +                opts.meta.projectLogo = self._resolveUrl(self.data.project.logo, opts);
    +                opts = self.populateClasses(opts);
    +                opts = self.populateElements(opts);
    +                opts = self.populateModules(opts);
    +                opts = self.populateFiles(opts);
    +
    +                if (data.classes &amp;&amp; Object.keys(data.classes).length) {
    +                    opts.meta.moduleClasses = [];
    +                    Y.each(Object.keys(data.classes), function (name) {
    +                        var i = self.data.classes[name];
    +                        if (i) {
    +                            opts.meta.moduleClasses.push({
    +                                name: i.name,
    +                                displayName: i.name
    +                            });
    +                        }
    +                    });
    +                    opts.meta.moduleClasses.sort(self.nameSort);
    +                }
    +                if (data.elements &amp;&amp; Object.keys(data.elements).length) {
    +                    opts.meta.moduleElements = [];
    +                    Y.each(Object.keys(data.elements), function (name) {
    +                        var i = self.data.elements[name];
    +                        if (i) {
    +                            opts.meta.moduleElements.push({
    +                                name: i.name,
    +                                displayName: i.name
    +                            });
    +                        }
    +                    });
    +                    opts.meta.moduleElements.sort(self.nameSort);
    +                }
    +                if (data.example &amp;&amp; data.example.length) {
    +                    if (data.example.forEach) {
    +                        var e = &#x27;&#x27;;
    +                        data.example.forEach(function (v) {
    +                            e += self._parseCode(self.markdown(v));
    +                        });
    +                        data.example = e;
    +                    } else {
    +                        data.example = self._parseCode(self.markdown(data.example));
    +                    }
    +                    opts.meta.example = data.example;
    +                }
    +                if (data.submodules &amp;&amp; Object.keys(data.submodules).length) {
    +                    opts.meta.subModules = [];
    +                    Y.each(Object.keys(data.submodules), function (name) {
    +                        var i = self.data.modules[name];
    +                        if (i) {
    +                            opts.meta.subModules.push({
    +                                name: i.name,
    +                                displayName: i.name,
    +                                description: i.description
    +                            });
    +                        }
    +                    });
    +                    opts.meta.subModules.sort(self.nameSort);
    +                }
    +
    +                var view = new Y.DocView(opts.meta);
    +                var mainLayout = opts.layouts[layout];
    +                self.render(&#x27;{{&gt;module}}&#x27;, view, mainLayout, opts.partials, stack.add(function (renderErr, html) {
    +                    if (renderErr) {
    +                        Y.log(renderErr, &#x27;error&#x27;, &#x27;builder&#x27;);
    +                        cb(renderErr);
    +                        return;
    +                    }
    +                    self.files++;
    +                    stack.html = html;
    +                    stack.view = view;
    +                }));
    +            });
    +
    +            stack.done(function () {
    +                cb(stack.html, stack.view);
    +            });
    +        },
    +        /**
    +         * Generates the module files under &quot;out&quot;/modules/
    +         * @method writeModules
    +         * @param {Callback} cb The callback to execute after it&#x27;s completed
    +         * @param {String} cb.html The HTML to write module view
    +         * @param {Object} cb.view The View Data
    +         */
    +        writeModules: function (cb, layout) {
    +            layout = layout || &#x27;main&#x27;;
    +            var self = this,
    +                stack = new Y.Parallel();
    +            stack.html = [];
    +            stack.view = [];
    +
    +            var counter = 0;
    +            Object.keys(self.data.modules).forEach(function (k) {
    +                if (!self.data.modules[k].external) {
    +                    counter++;
    +                }
    +            });
    +            Y.log(&#x27;Rendering and writing &#x27; + counter + &#x27; modules pages.&#x27;, &#x27;info&#x27;, &#x27;builder&#x27;);
    +            Y.each(self.data.modules, function (v) {
    +                if (v.external) {
    +                    return;
    +                }
    +                self.renderModule(function (html, view) {
    +                    stack.html.push(html);
    +                    stack.view.push(view);
    +                    if (self.options.dumpview) {
    +                        Y.Files.writeFile(
    +                            path.join(self.options.outdir, &#x27;json&#x27;, &#x27;module_&#x27; + v.name + &#x27;.json&#x27;),
    +                            JSON.stringify(view),
    +                            stack.add(noop)
    +                        );
    +                    }
    +                    Y.Files.writeFile(path.join(self.options.outdir, &#x27;modules&#x27;, v.name + &#x27;.html&#x27;), html, stack.add(noop));
    +                }, v, layout);
    +            });
    +            stack.done(function () {
    +                Y.log(&#x27;Finished writing module files&#x27;, &#x27;info&#x27;, &#x27;builder&#x27;);
    +                cb(stack.html, stack.view);
    +            });
    +        },
    +        /**
    +         * Checks an array of items (class items) to see if an item is in that list
    +         * @method hasProperty
    +         * @param {Array} a The Array of items to check
    +         * @param {Object} b The object to find
    +         * @return Boolean
    +         */
    +        hasProperty: function (a, b) {
    +            var other = false;
    +            Y.some(a, function (i, k) {
    +                if ((i.itemtype === b.itemtype) &amp;&amp; (i.name === b.name)) {
    +                    other = k;
    +                    return true;
    +                }
    +            });
    +            return other;
    +        },
    +        /**
    +         * Counter for stepping into merges
    +         * @private
    +         * @property _mergeCounter
    +         * @type Number
    +         */
    +        _mergeCounter: null,
    +        /**
    +         * Merge superclass data into a child class
    +         * @method mergeExtends
    +         * @param {Object} info The item to extend
    +         * @param {Array} classItems The list of items to merge in
    +         * @param {Boolean} first Set for the first call
    +         */
    +        mergeExtends: function (info, classItems, first) {
    +            var self = this;
    +            self._mergeCounter = (first) ? 0 : (self._mergeCounter + 1);
    +
    +            if (self._mergeCounter === 100) {
    +                throw (&#x27;YUIDoc detected a loop extending class &#x27; + info.name);
    +            }
    +            if (info.extends || info.uses) {
    +                var hasItems = {};
    +                hasItems[info.extends] = 1;
    +                if (info.uses) {
    +                    info.uses.forEach(function (v) {
    +                        hasItems[v] = 1;
    +                    });
    +                }
    +                self.data.classitems.forEach(function (v) {
    +                    //console.error(v.class, &#x27;==&#x27;, info.extends);
    +                    if (hasItems[v.class]) {
    +                        if (!v.static) {
    +                            var q,
    +                                override = self.hasProperty(classItems, v);
    +                            if (override === false) {
    +                                //This method was extended from the parent class but not over written
    +                                //console.error(&#x27;Merging extends from&#x27;, v.class, &#x27;onto&#x27;, info.name);
    +                                q = Y.merge({}, v);
    +                                q.extended_from = v.class;
    +                                classItems.push(q);
    +                            } else {
    +                                //This method was extended from the parent and overwritten in this class
    +                                q = Y.merge({}, v);
    +                                q = self.augmentData(q);
    +                                classItems[override].overwritten_from = q;
    +                            }
    +                        }
    +                    }
    +                });
    +                if (self.data.classes[info.extends]) {
    +                    if (self.data.classes[info.extends].extends || self.data.classes[info.extends].uses) {
    +                        //console.error(&#x27;Stepping down to:&#x27;, self.data.classes[info.extends]);
    +                        classItems = self.mergeExtends(self.data.classes[info.extends], classItems);
    +                    }
    +                }
    +            }
    +            return classItems;
    +        },
    +        /**
    +         * Render the class file
    +         * @method renderClass
    +         * @param {Function} cb The callback fired when complete
    +         * @param {String} cb.html The HTML to render this view
    +         * @param {Object} cb.view The View Data
    +         */
    +        renderClass: function (cb, data, layout) {
    +            var self = this;
    +            var stack = new Y.Parallel();
    +
    +            Y.prepare([DEFAULT_THEME, themeDir], self.getProjectMeta(), function (err, opts) {
    +                //console.log(opts);
    +                if (err) {
    +                    console.log(err);
    +                }
    +                opts.meta = Y.merge(opts.meta, data);
    +
    +                opts.meta.title = self.data.project.name;
    +                opts.meta.moduleName = data.name;
    +                opts.meta.file = data.file;
    +                opts.meta.line = data.line;
    +                opts.meta = self.addFoundAt(opts.meta);
    +                opts.meta.projectRoot = &#x27;../&#x27;;
    +                opts.meta.projectAssets = &#x27;../assets&#x27;;
    +                opts.meta.projectLogo = self._resolveUrl(self.data.project.logo, opts);
    +
    +                opts = self.populateClasses(opts);
    +                opts = self.populateElements(opts);
    +                opts = self.populateModules(opts);
    +                opts = self.populateFiles(opts);
    +
    +                opts.meta.classDescription = self._parseCode(self.markdown(data.description || &#x27; &#x27;));
    +
    +                opts.meta.methods = [];
    +                opts.meta.properties = [];
    +                opts.meta.attrs = [];
    +                opts.meta.events = [];
    +                opts.meta.extension_for = null;
    +                if (data.uses) {
    +                    opts.meta.uses = data.uses;
    +                }
    +                if (data.entension_for &amp;&amp; data.extension_for.length) {
    +                    opts.meta.extension_for = data.extension_for;
    +                }
    +
    +                if (data.extends) {
    +                    opts.meta.extends = data.extends;
    +                }
    +
    +                var classItems = [];
    +                self.data.classitems.forEach(function (classItem) {
    +                    if (classItem.class === data.name) {
    +                        classItems.push(classItem);
    +                    }
    +                });
    +
    +                classItems = self.mergeExtends(data, classItems, true);
    +
    +                if (data.is_constructor) {
    +                    var constructor = Y.mix({}, data);
    +                    constructor = self.augmentData(constructor);
    +                    constructor.paramsList = [];
    +                    if (constructor.params) {
    +                        constructor.params.forEach(function (p) {
    +                            var name = p.name;
    +                            if (p.optional) {
    +                                name = &#x27;[&#x27; + name + ((p.optdefault) ? &#x27;=&#x27; + p.optdefault : &#x27;&#x27;) + &#x27;]&#x27;;
    +                            }
    +                            constructor.paramsList.push(name);
    +                        });
    +                    }
    +                    //i.methodDescription = self._parseCode(markdown(i.description));
    +                    constructor.hasAccessType = constructor.access;
    +                    constructor.hasParams = constructor.paramsList.length;
    +                    if (constructor.paramsList.length) {
    +                        constructor.paramsList = constructor.paramsList.join(&#x27;, &#x27;);
    +                    } else {
    +                        constructor.paramsList = &#x27; &#x27;;
    +                    }
    +                    constructor.returnType = &#x27; &#x27;;
    +                    if (constructor.return) {
    +                        constructor.hasReturn = true;
    +                        constructor.returnType = constructor.return.type;
    +                    }
    +                    //console.error(i);
    +                    opts.meta.is_constructor = [constructor];
    +                    if (constructor.example &amp;&amp; constructor.example.length) {
    +                        if (constructor.example.forEach) {
    +                            var example = &#x27;&#x27;;
    +                            constructor.example.forEach(function (v) {
    +                                example += self._parseCode(self.markdown(v));
    +                            });
    +                            constructor.example = example;
    +                        } else {
    +                            constructor.example = self._parseCode(self.markdown(constructor.example));
    +                        }
    +                    }
    +                }
    +
    +                classItems.forEach(function (i) {
    +                    var e;
    +                    switch (i.itemtype) {
    +                    case &#x27;method&#x27;:
    +                        i = self.augmentData(i);
    +                        i.paramsList = [];
    +                        if (i.params &amp;&amp; i.params.forEach) {
    +                            i.params.forEach(function (p) {
    +                                var name = p.name;
    +                                if (p.optional) {
    +                                    name = &#x27;[&#x27; + name + ((p.optdefault) ? &#x27;=&#x27; + p.optdefault : &#x27;&#x27;) + &#x27;]&#x27;;
    +                                }
    +                                i.paramsList.push(name);
    +                            });
    +                        }
    +                        i.methodDescription = self._parseCode(i.description);
    +                        if (i.example &amp;&amp; i.example.length) {
    +                            if (i.example.forEach) {
    +                                e = &#x27;&#x27;;
    +                                i.example.forEach(function (v) {
    +                                    e += self._parseCode(self.markdown(v));
    +                                });
    +                                i.example = e;
    +                            } else if (!i.extended_from) {
    +                                i.example = self._parseCode(self.markdown(i.example));
    +                            }
    +                        }
    +                        i.hasAccessType = i.access;
    +                        i.hasParams = i.paramsList.length;
    +                        if (i.paramsList.length) {
    +                            i.paramsList = i.paramsList.join(&#x27;, &#x27;);
    +                        } else {
    +                            i.paramsList = &#x27; &#x27;;
    +                        }
    +                        i.returnType = &#x27; &#x27;;
    +                        if (i.return) {
    +                            i.hasReturn = true;
    +                            i.returnType = i.return.type;
    +                        }
    +
    +                        // If this item is provided by a module other
    +                        // than the module that provided the original
    +                        // class, add the original module name to the
    +                        // item&#x27;s &#x60;providedBy&#x60; property so we can
    +                        // indicate the relationship.
    +                        if ((i.submodule || i.module) !== (data.submodule || data.module)) {
    +                            i.providedBy = (i.submodule || i.module);
    +                        }
    +
    +                        opts.meta.methods.push(i);
    +                        break;
    +                    case &#x27;property&#x27;:
    +                        i = self.augmentData(i);
    +                        //i.propertyDescription = self._parseCode(markdown(i.description || &#x27;&#x27;));
    +                        i.propertyDescription = self._parseCode(i.description);
    +                        if (!i.type) {
    +                            i.type = &#x27;unknown&#x27;;
    +                        }
    +                        if (i.final === &#x27;&#x27;) {
    +                            i.final = true;
    +                        }
    +                        if (i.example &amp;&amp; i.example.length) {
    +                            if (i.example.forEach) {
    +                                e = &#x27;&#x27;;
    +                                i.example.forEach(function (v) {
    +                                    e += self._parseCode(self.markdown(v));
    +                                });
    +                                i.example = e;
    +                            } else {
    +                                i.example = self._parseCode(self.markdown(i.example));
    +                            }
    +                        }
    +
    +                        // If this item is provided by a module other
    +                        // than the module that provided the original
    +                        // class, add the original module name to the
    +                        // item&#x27;s &#x60;providedBy&#x60; property so we can
    +                        // indicate the relationship.
    +                        if ((i.submodule || i.module) !== (data.submodule || data.module)) {
    +                            i.providedBy = (i.submodule || i.module);
    +                        }
    +
    +                        opts.meta.properties.push(i);
    +                        break;
    +
    +                    case &#x27;attribute&#x27;: // fallthru
    +                    case &#x27;config&#x27;:
    +                        i = self.augmentData(i);
    +                        //i.attrDescription = self._parseCode(markdown(i.description || &#x27;&#x27;));
    +                        i.attrDescription = self._parseCode(i.description);
    +
    +                        if (i.itemtype === &#x27;config&#x27;) {
    +                            i.config = true;
    +                        } else {
    +                            i.emit = self.options.attributesEmit;
    +                        }
    +                        if (i.readonly === &#x27;&#x27;) {
    +                            i.readonly = true;
    +                        }
    +
    +                        if (i.example &amp;&amp; i.example.length) {
    +                            if (i.example.forEach) {
    +                                e = &#x27;&#x27;;
    +                                i.example.forEach(function (v) {
    +                                    e += self._parseCode(self.markdown(v));
    +                                });
    +                                i.example = e;
    +                            } else {
    +                                i.example = self._parseCode(self.markdown(i.example));
    +                            }
    +                        }
    +
    +                        // If this item is provided by a module other
    +                        // than the module that provided the original
    +                        // class, add the original module name to the
    +                        // item&#x27;s &#x60;providedBy&#x60; property so we can
    +                        // indicate the relationship.
    +                        if ((i.submodule || i.module) !== (data.submodule || data.module)) {
    +                            i.providedBy = (i.submodule || i.module);
    +                        }
    +
    +                        opts.meta.attrs.push(i);
    +                        break;
    +                    case &#x27;event&#x27;:
    +                        i = self.augmentData(i);
    +                        //i.eventDescription = self._parseCode(markdown(i.description || &#x27;&#x27;));
    +                        i.eventDescription = self._parseCode(i.description);
    +
    +                        if (i.example &amp;&amp; i.example.length) {
    +                            if (i.example.forEach) {
    +                                e = &#x27;&#x27;;
    +                                i.example.forEach(function (v) {
    +                                    e += self._parseCode(self.markdown(v));
    +                                });
    +                                i.example = e;
    +                            } else {
    +                                i.example = self._parseCode(self.markdown(i.example));
    +                            }
    +                        }
    +
    +                        // If this item is provided by a module other
    +                        // than the module that provided the original
    +                        // class, add the original module name to the
    +                        // item&#x27;s &#x60;providedBy&#x60; property so we can
    +                        // indicate the relationship.
    +                        if ((i.submodule || i.module) !== (data.submodule || data.module)) {
    +                            i.providedBy = (i.submodule || i.module);
    +                        }
    +
    +                        opts.meta.events.push(i);
    +                        break;
    +                    }
    +                });
    +
    +                if (!self.options.dontsortfields) {
    +                    opts.meta.attrs.sort(self.nameSort);
    +                    opts.meta.events.sort(self.nameSort);
    +                    opts.meta.methods.sort(self.nameSort);
    +                    opts.meta.properties.sort(self.nameSort);
    +                }
    +
    +                if (!opts.meta.methods.length) {
    +                    delete opts.meta.methods;
    +                }
    +                if (!opts.meta.properties.length) {
    +                    delete opts.meta.properties;
    +                }
    +                if (!opts.meta.attrs.length) {
    +                    delete opts.meta.attrs;
    +                }
    +                if (!opts.meta.events.length) {
    +                    delete opts.meta.events;
    +                }
    +
    +                var view = new Y.DocView(opts.meta);
    +                var mainLayout = opts.layouts[layout];
    +                self.render(&#x27;{{&gt;classes}}&#x27;, view, mainLayout, opts.partials, stack.add(function (renderErr, html) {
    +                    if (renderErr) {
    +                        Y.log(renderErr, &#x27;error&#x27;, &#x27;builder&#x27;);
    +                        cb(renderErr);
    +                        return;
    +                    }
    +                    self.files++;
    +                    stack.html = html;
    +                    stack.view = view;
    +                    stack.opts = opts;
    +                }));
    +            });
    +
    +            stack.done(function () {
    +                cb(stack.html, stack.view, stack.opts);
    +            });
    +        },
    +        /**
    +         * Render the element file
    +         * @method renderElement
    +         * @param {Function} cb The callback fired when complete
    +         * @param {String} cb.html The HTML to render this view
    +         * @param {Object} cb.view The View Data
    +         */
    +        renderElement: function (cb, data, layout) {
    +            var self = this;
    +            var stack = new Y.Parallel();
    +
    +            Y.prepare([DEFAULT_THEME, themeDir], self.getProjectMeta(), function (err, opts) {
    +                if (err) {
    +                    console.log(err);
    +                }
    +                opts.meta = Y.merge(opts.meta, data);
    +
    +                opts.meta.title = self.data.project.name;
    +                opts.meta.moduleName = data.name;
    +                opts.meta.file = data.file;
    +                opts.meta.line = data.line;
    +                opts.meta = self.addFoundAt(opts.meta);
    +                opts.meta.projectRoot = &#x27;../&#x27;;
    +                opts.meta.projectAssets = &#x27;../assets&#x27;;
    +                opts.meta.projectLogo = self._resolveUrl(self.data.project.logo, opts);
    +
    +                opts = self.populateClasses(opts);
    +                opts = self.populateElements(opts);
    +                opts = self.populateModules(opts);
    +                opts = self.populateFiles(opts);
    +
    +                opts.meta.elementDescription = self._parseCode(self.markdown(data.description || &#x27; &#x27;));
    +
    +                if (data.example &amp;&amp; data.example.length) {
    +                    if (data.example.forEach) {
    +                        var e = &#x27;&#x27;;
    +                        data.example.forEach(function (v) {
    +                            e += self._parseCode(self.markdown(v));
    +                        });
    +                        data.example = e;
    +                    } else {
    +                        data.example = self._parseCode(self.markdown(data.example));
    +                    }
    +                    opts.meta.example = data.example;
    +                }
    +
    +                if (!self.options.dontsortfields) {
    +                    opts.meta.attributes.sort(self.nameSort);
    +                }
    +
    +                opts.meta.attributes.forEach(function (a) {
    +                    a.description = self._parseCode(a.description);
    +                });
    +
    +                if (!opts.meta.attributes.length) {
    +                    delete opts.meta.attributes;
    +                }
    +
    +                var view = new Y.DocView(opts.meta);
    +                var mainLayout = opts.layouts[layout];
    +                self.render(&#x27;{{&gt;elements}}&#x27;, view, mainLayout, opts.partials, stack.add(function (renderErr, html) {
    +                    if (renderErr) {
    +                        Y.log(renderErr, &#x27;error&#x27;, &#x27;builder&#x27;);
    +                        cb(renderErr);
    +                        return;
    +                    }
    +                    self.files++;
    +                    stack.html = html;
    +                    stack.view = view;
    +                    stack.opts = opts;
    +                }));
    +            });
    +
    +            stack.done(function () {
    +                cb(stack.html, stack.view, stack.opts);
    +            });
    +        },
    +        /**
    +         * Generates the class or element files under &quot;out&quot;/classes/ or &quot;out&quot;/elements/
    +         * @method writeComponents
    +         * @param {String} type The component type, &quot;classes&quot; or &quot;elements&quot;
    +         * @param {Callback} cb The callback to execute after it&#x27;s completed
    +         * @param {String} cb.html The HTML to write class view
    +         * @param {Object} cb.view The View Data
    +         */
    +        writeComponents: function (type, cb, layout) {
    +            layout = layout || &#x27;main&#x27;;
    +            var self = this,
    +                stack = new Y.Parallel();
    +            stack.html = [];
    +            stack.view = [];
    +
    +            var counter = 0;
    +            Object.keys(self.data[type]).forEach(function (k) {
    +                if (!self.data[type][k].external) {
    +                    counter++;
    +                }
    +            });
    +            Y.log(&#x27;Rendering and writing &#x27; + counter + &#x27; class pages.&#x27;, &#x27;info&#x27;, &#x27;builder&#x27;);
    +            Y.each(self.data[type], function (v) {
    +                if (v.external) {
    +                    return;
    +                }
    +                self[type === &#x27;classes&#x27; ? &#x27;renderClass&#x27; : &#x27;renderElement&#x27;](stack.add(function (html, view) {
    +                    stack.html.push(html);
    +                    stack.view.push(view);
    +                    if (self.options.dumpview) {
    +                        Y.Files.writeFile(
    +                            path.join(self.options.outdir, &#x27;json&#x27;, type + &#x27;_&#x27; + v.name + &#x27;.json&#x27;),
    +                            JSON.stringify(view),
    +                            stack.add(noop)
    +                        );
    +                    }
    +                    Y.Files.writeFile(path.join(self.options.outdir, type, v.name + &#x27;.html&#x27;), html, stack.add(noop));
    +                }), v, layout);
    +            });
    +            stack.done(function () {
    +                Y.log(&#x27;Finished writing &#x27; + type.replace(/e?s$/, &#x27;&#x27;) + &#x27; files&#x27;, &#x27;info&#x27;, &#x27;builder&#x27;);
    +                cb(stack.html, stack.view);
    +            });
    +        },
    +        /**
    +         * Sort method of array of objects with a property called __name__
    +         * @method nameSort
    +         * @param {Object} a First object to compare
    +         * @param {Object} b Second object to compare
    +         * @return {Number} 1, -1 or 0 for sorting.
    +         */
    +        nameSort: function (a, b) {
    +            if (!a.name || !b.name) {
    +                return 0;
    +            }
    +            var an = a.name.toLowerCase(),
    +                bn = b.name.toLowerCase(),
    +                ret = 0;
    +
    +            if (an &lt; bn) {
    +                ret = -1;
    +            }
    +            if (an &gt; bn) {
    +                ret = 1;
    +            }
    +            return ret;
    +        },
    +        /**
    +         * Generates the syntax files under &#x60;&quot;out&quot;/files/&#x60;
    +         * @method writeFiles
    +         * @param {Callback} cb The callback to execute after it&#x27;s completed
    +         * @param {String} cb.html The HTML to write file view
    +         * @param {Object} cb.view The View Data
    +         */
    +        writeFiles: function (cb, layout) {
    +            layout = layout || &#x27;main&#x27;;
    +            var self = this,
    +                stack = new Y.Parallel();
    +            stack.html = [];
    +            stack.view = [];
    +
    +            var counter = 0;
    +            Object.keys(self.data.files).forEach(function (k) {
    +                if (!self.data.files[k].external) {
    +                    counter++;
    +                }
    +            });
    +            Y.log(&#x27;Rendering and writing &#x27; + counter + &#x27; source files.&#x27;, &#x27;info&#x27;, &#x27;builder&#x27;);
    +            Y.each(self.data.files, function (v) {
    +                if (v.external) {
    +                    return;
    +                }
    +                self.renderFile(stack.add(function (html, view, data) {
    +                    if (!view || !data) {
    +                        return;
    +                    }
    +                    stack.html.push(html);
    +                    stack.view.push(view);
    +                    if (self.options.dumpview) {
    +                        Y.Files.writeFile(
    +                            path.join(self.options.outdir, &#x27;json&#x27;, &#x27;files_&#x27; + self.filterFileName(data.name) + &#x27;.json&#x27;),
    +                            JSON.stringify(view),
    +                            stack.add(noop)
    +                        );
    +                    }
    +                    Y.Files.writeFile(
    +                        path.join(self.options.outdir, &#x27;files&#x27;, self.filterFileName(data.name) + &#x27;.html&#x27;),
    +                        html,
    +                        stack.add(noop)
    +                    );
    +                }), v, layout);
    +            });
    +            stack.done(function () {
    +                Y.log(&#x27;Finished writing source files&#x27;, &#x27;info&#x27;, &#x27;builder&#x27;);
    +                cb(stack.html, stack.view);
    +            });
    +        },
    +        /**
    +         * Render the source file
    +         * @method renderFile
    +         * @param {Function} cb The callback fired when complete
    +         * @param {String} cb.html The HTML to render this view
    +         * @param {Object} cb.view The View Data
    +         */
    +        renderFile: function (cb, data, layout) {
    +            var self = this;
    +
    +            Y.prepare([DEFAULT_THEME, themeDir], self.getProjectMeta(), function (err, opts) {
    +                if (err) {
    +                    console.log(err);
    +                }
    +                if (!data.name) {
    +                    return;
    +                }
    +
    +                opts.meta = Y.merge(opts.meta, data);
    +
    +                opts.meta.title = self.data.project.name;
    +                opts.meta.moduleName = data.name;
    +                opts.meta.projectRoot = &#x27;../&#x27;;
    +                opts.meta.projectAssets = &#x27;../assets&#x27;;
    +                opts.meta.projectLogo = self._resolveUrl(self.data.project.logo, opts);
    +
    +                opts = self.populateClasses(opts);
    +                opts = self.populateModules(opts);
    +                opts = self.populateFiles(opts);
    +
    +                opts.meta.fileName = data.name;
    +                fs.readFile(opts.meta.fileName, Y.charset, Y.rbind(function (readErr, str, readOpts, readData) {
    +                    if (readErr) {
    +                        Y.log(readErr, &#x27;error&#x27;, &#x27;builder&#x27;);
    +                        cb(readErr);
    +                        return;
    +                    }
    +
    +                    if (typeof self.options.tabspace === &#x27;string&#x27;) {
    +                        str = str.replace(/\t/g, self.options.tabspace);
    +                    }
    +
    +                    readOpts.meta.fileData = str;
    +                    var view = new Y.DocView(readOpts.meta, &#x27;index&#x27;);
    +                    var mainLayout = readOpts.layouts[layout];
    +                    self.render(&#x27;{{&gt;files}}&#x27;, view, mainLayout, readOpts.partials, function (renderErr, html) {
    +                        if (renderErr) {
    +                            Y.log(renderErr, &#x27;error&#x27;, &#x27;builder&#x27;);
    +                            cb(renderErr);
    +                            return;
    +                        }
    +                        self.files++;
    +                        cb(html, view, readData);
    +                    });
    +
    +                }, this, opts, data));
    +            });
    +
    +        },
    +        /**
    +         * Write the API meta data used for the AutoComplete widget
    +         * @method writeAPIMeta
    +         * @param {Callback} cb The callback to execute when complete
    +         * @async
    +         */
    +        writeAPIMeta: function (cb) {
    +            Y.log(&#x27;Writing API Meta Data&#x27;, &#x27;info&#x27;, &#x27;builder&#x27;);
    +            var self = this;
    +            this.renderAPIMeta(function (js) {
    +                fs.writeFile(path.join(self.options.outdir, &#x27;api.js&#x27;), js, Y.charset, cb);
    +            });
    +        },
    +        /**
    +         * Render the API meta and return the JavaScript
    +         * @method renderAPIMeta
    +         * @param {Callback} cb The callback
    +         * @param {String} cb.apijs The JavaScript code to write API meta data
    +         * @async
    +         */
    +        renderAPIMeta: function (cb) {
    +
    +            var opts = {
    +                meta: {}
    +            };
    +            opts = this.populateClasses(opts);
    +            opts = this.populateModules(opts);
    +            opts = this.populateElements(opts);
    +
    +            [&#x27;classes&#x27;, &#x27;modules&#x27;, &#x27;elements&#x27;].forEach(function (id) {
    +                opts.meta[id].forEach(function (v, k) {
    +                    opts.meta[id][k] = v.name;
    +                    if (v.submodules) {
    +                        v.submodules.forEach(function (s) {
    +                            opts.meta[id].push(s.displayName);
    +                        });
    +                    }
    +                });
    +                opts.meta[id].sort();
    +            });
    +
    +            var apijs = &#x27;YUI.add(&quot;yuidoc-meta&quot;, function(Y) {\n&#x27; +
    +                &#x27;   Y.YUIDoc = { meta: &#x27; + JSON.stringify(opts.meta, null, 4) + &#x27; };\n&#x27; +
    +                &#x27;});&#x27;;
    +
    +            cb(apijs);
    +        },
    +        /**
    +         * Normalizes a file path to a writable filename:
    +         *
    +         *    var path = &#x27;lib/file.js&#x27;;
    +         *    returns &#x27;lib_file.js&#x27;;
    +         *
    +         * @method filterFileName
    +         * @param {String} f The filename to normalize
    +         * @return {String} The filtered file path
    +         */
    +        filterFileName: function (f) {
    +            return f.replace(/[\/\\]/g, &#x27;_&#x27;);
    +        },
    +        /**
    +         * Compiles the templates from the meta-data provided by DocParser
    +         * @method compile
    +         * @param {Callback} cb The callback to execute after it&#x27;s completed
    +         */
    +        compile: function (cb) {
    +            var self = this;
    +            var starttime = (new Date()).getTime();
    +            Y.log(&#x27;Compiling Templates&#x27;, &#x27;info&#x27;, &#x27;builder&#x27;);
    +
    +            this.mixExternal(function () {
    +                self.makeDirs(function () {
    +                    Y.log(&#x27;Copying Assets&#x27;, &#x27;info&#x27;, &#x27;builder&#x27;);
    +                    if (!Y.Files.isDirectory(path.join(self.options.outdir, &#x27;assets&#x27;))) {
    +                        fs.mkdirSync(path.join(self.options.outdir, &#x27;assets&#x27;), &#x27;0777&#x27;);
    +                    }
    +                    Y.Files.copyAssets([
    +                            path.join(DEFAULT_THEME, &#x27;assets&#x27;),
    +                            path.join(themeDir, &#x27;assets&#x27;)
    +                        ],
    +                        path.join(self.options.outdir, &#x27;assets&#x27;),
    +                        false,
    +                        function () {
    +                            var cstack = new Y.Parallel();
    +
    +                            self.writeModules(cstack.add(function () {
    +                                self.writeComponents(&#x27;classes&#x27;, cstack.add(function () {
    +                                    if (!self.options.nocode) {
    +                                        self.writeFiles(cstack.add(noop));
    +                                    }
    +                                }));
    +                                self.writeComponents(&#x27;elements&#x27;, cstack.add(function () {
    +                                    if (!self.options.nocode) {
    +                                        self.writeFiles(cstack.add(noop));
    +                                    }
    +                                }));
    +                            }));
    +                            /*
    +                        self.writeModules(cstack.add(noop));
    +                        self.writeClasses(cstack.add(noop));
    +                        if (!self.options.nocode) {
    +                            self.writeFiles(cstack.add(noop));
    +                        }
    +                        */
    +                            self.writeIndex(cstack.add(noop));
    +                            self.writeAPIMeta(cstack.add(noop));
    +
    +                            cstack.done(function () {
    +                                var endtime = (new Date()).getTime();
    +                                var timer = ((endtime - starttime) / 1000) + &#x27; seconds&#x27;;
    +                                Y.log(&#x27;Finished writing &#x27; + self.files + &#x27; files in &#x27; + timer, &#x27;info&#x27;, &#x27;builder&#x27;);
    +                                if (cb) {
    +                                    cb();
    +                                }
    +                            });
    +                        });
    +                });
    +            });
    +        }
    +    };
    +});
    +
    +    </pre>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/files/lib_cli.js.html b/output/api/files/lib_cli.js.html
    new file mode 100644
    index 00000000..bc68dec7
    --- /dev/null
    +++ b/output/api/files/lib_cli.js.html
    @@ -0,0 +1,161 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>lib/cli.js - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1 class="file-heading">File: lib/cli.js</h1>
    +
    +<div class="file">
    +    <pre class="code prettyprint linenums">
    +#!/usr/bin/env node
    +&#x27;use strict&#x27;;
    +
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +
    +/**
    + * Parses the arguments, creates the options and passes them to &#x60;Y.YUIDoc&#x60; and then &#x60;Y.DocBuilder&#x60;.
    + * @class CLI
    + * @module yuidoc
    + */
    +
    +var Y = require(&#x27;./index&#x27;);
    +
    +var options = Y.Options(Y.Array(process.argv, 2));
    +
    +Y.log(&#x27;Starting YUIDoc@&#x27; + Y.packageInfo.version + &#x27; using YUI@&#x27; + Y.version + &#x27; with NodeJS@&#x27; + process.versions.node, &#x27;info&#x27;, &#x27;yuidoc&#x27;);
    +
    +var starttime = (new Date()).getTime();
    +
    +options = Y.Project.init(options);
    +
    +Y.log(&#x27;Starting YUIDoc with the following options:&#x27;, &#x27;info&#x27;, &#x27;yuidoc&#x27;);
    +var opts = Y.clone(options);
    +if (opts.paths &amp;&amp; opts.paths.length &amp;&amp; (opts.paths.length &gt; 10)) {
    +    opts.paths = [].concat(opts.paths.slice(0, 5), [&#x27;&lt;paths truncated&gt;&#x27;], options.paths.slice(-5));
    +}
    +Y.log(opts, &#x27;info&#x27;, &#x27;yuidoc&#x27;);
    +
    +if (options.server) {
    +    Y.Server.start(options);
    +} else {
    +    var json = (new Y.YUIDoc(options)).run();
    +    if (json === null) {
    +        throw new Error(&#x27;Running YUIDoc returns null.&#x27;);
    +    }
    +    options = Y.Project.mix(json, options);
    +
    +    if (!options.parseOnly) {
    +        var builder = new Y.DocBuilder(options, json);
    +        builder.compile(function () {
    +            var endtime = (new Date()).getTime();
    +            Y.log(&#x27;Completed in &#x27; + ((endtime - starttime) / 1000) + &#x27; seconds&#x27;, &#x27;info&#x27;, &#x27;yuidoc&#x27;);
    +        });
    +    }
    +}
    +
    +    </pre>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/files/lib_docparser.js.html b/output/api/files/lib_docparser.js.html
    new file mode 100644
    index 00000000..87ef5180
    --- /dev/null
    +++ b/output/api/files/lib_docparser.js.html
    @@ -0,0 +1,1693 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>lib/docparser.js - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1 class="file-heading">File: lib/docparser.js</h1>
    +
    +<div class="file">
    +    <pre class="code prettyprint linenums">
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +&#x27;use strict&#x27;;
    +
    +YUI.add(&#x27;docparser&#x27;, function (Y) {
    +
    +    var Lang = Y.Lang,
    +        trim = Lang.trim,
    +        fixType = Y.Lang.fixType,
    +        /**
    +         * Parses the JSON data and formats it into a nice log string for
    +         * filename and line number: &#x60;/file/name.js:123&#x60;
    +         * @method stringlog
    +         * @private
    +         * @param {Object} data The data block from the parser
    +         * @return {String} The formatted string.
    +         * @for DocParser
    +         */
    +        stringlog = function (data) {
    +            var line, file;
    +
    +            if (data.file &amp;&amp; data.line) {
    +                file = data.file;
    +                line = data.line;
    +            } else {
    +                data.forEach(function (d) {
    +                    if (d.tag === &#x27;file&#x27;) {
    +                        file = d.value;
    +                    }
    +                    if (d.tag === &#x27;line&#x27;) {
    +                        line = d.value;
    +                    }
    +                });
    +            }
    +            return &#x27; &#x27; + file + &#x27;:&#x27; + line;
    +        },
    +        /**
    +         * Flatten a string, remove all line breaks and replace them with a token
    +         * @method implodeString
    +         * @private
    +         * @param {String} str The string to operate on
    +         * @return {String} The modified string
    +         */
    +        implodeString = function (str) {
    +            return str.replace(REGEX_GLOBAL_LINES, &#x27;!~YUIDOC_LINE~!&#x27;);
    +        },
    +        /**
    +         * Un-flatten a string, replace tokens injected with &#x60;implodeString&#x60;
    +         * @method implodeString
    +         * @private
    +         * @param {String} str The string to operate on
    +         * @return {String} The modified string
    +         */
    +        explodeString = function (str) {
    +            return str.replace(/!~YUIDOC_LINE~!/g, &#x27;\n&#x27;);
    +        },
    +        CURRENT_NAMESPACE = &#x27;currentnamespace&#x27;,
    +        CURRENT_MODULE = &#x27;currentmodule&#x27;,
    +        MAIN_MODULE = &#x27;mainmodule&#x27;,
    +        CURRENT_SUBMODULE = &#x27;currentsubmodule&#x27;,
    +        CURRENT_FILE = &#x27;currentfile&#x27;,
    +        CURRENT_CLASS = &#x27;currentclass&#x27;,
    +        CURRENT_ELEMENT = &#x27;currentelement&#x27;,
    +
    +        REGEX_TYPE = /(.*?)\{(.*?)\}(.*)/,
    +        REGEX_FIRSTWORD = /^\s*?(\[.+\]\*?|[^\s]+)(.*)/,
    +        REGEX_OPTIONAL = /^\[(.*)\]$/,
    +        REGEX_START_COMMENT = {
    +            js: /^\s*\/\*\*/,
    +            coffee: /^\s*###\*/
    +        },
    +        REGEX_END_COMMENT = {
    +            js: /\*\/\s*$/,
    +            coffee: /###\s*$/
    +        },
    +        REGEX_LINE_HEAD_CHAR = {
    +            js: /^\s*\*/,
    +            coffee: /^\s*[#\*]/
    +        },
    +        REGEX_LINES = /\r\n|\n/,
    +        REGEX_GLOBAL_LINES = /\r\n|\n/g,
    +
    +        SHORT_TAGS = {
    +            &#x27;async&#x27;: 1,
    +            &#x27;beta&#x27;: 1,
    +            &#x27;chainable&#x27;: 1,
    +            &#x27;extends&#x27;: 1,
    +            &#x27;final&#x27;: 1,
    +            &#x27;static&#x27;: 1,
    +            &#x27;optional&#x27;: 1,
    +            &#x27;required&#x27;: 1
    +        },
    +
    +        /**
    +         * A list of known tags.  This populates a member variable
    +         * during initialization, and will be updated if additional
    +         * digesters are added.
    +         * @property TAGLIST
    +         * @type Array
    +         * @final
    +         * @for DocParser
    +         */
    +        TAGLIST = [
    +            &#x27;async&#x27;,        // bool, custom events can fire the listeners in a setTimeout
    +            &#x27;author&#x27;,       // author best for projects and modules, but can be used anywhere // multi
    +            &#x27;attribute&#x27;,    // YUI attributes / custom element attributes
    +            &#x27;beta&#x27;,         // module maturity identifier
    +            &#x27;broadcast&#x27;,    // bool, events
    +            &#x27;bubbles&#x27;,      // custom events that bubble
    +            &#x27;category&#x27;,     // modules can be in multiple categories
    +            &#x27;chainable&#x27;,    // methods that return the host object
    +            &#x27;class&#x27;,        // pseudo class
    +            &#x27;conditional&#x27;,  // conditional module
    +            &#x27;config&#x27;,       // a config param (not an attribute, so no change events)
    +            &#x27;const&#x27;,        // not standardized yet, converts to final property
    +            &#x27;constructs&#x27;,   // factory methods (not yet used)
    +            &#x27;constructor&#x27;,  // this is a constructor
    +            &#x27;content&#x27;,      // permitted content for an @element
    +            &#x27;contributor&#x27;,  // like author
    +            &#x27;default&#x27;,      // property/attribute default value
    +            &#x27;deprecated&#x27;,   // please specify what to use instead
    +            &#x27;description&#x27;,  // can also be free text at the beginning of a comment is
    +            &#x27;emitfacade&#x27;,   // bool, YUI custom event can have a dom-like event facade
    +            &#x27;element&#x27;,      // Web Components custom element
    +            &#x27;event&#x27;,        // YUI custom event
    +            &#x27;evil&#x27;,         // uses eval
    +            &#x27;extension&#x27;,    // this is an extension for [entity]
    +            &#x27;extensionfor&#x27;, // this is an extension for [entity]
    +            &#x27;extension_for&#x27;,// this is an extension for [entity]
    +            &#x27;example&#x27;,      // 0..n code snippets.  snippets can also be embedded in the desc
    +            &#x27;experimental&#x27;, // module maturity identifier
    +            &#x27;extends&#x27;,      // pseudo inheritance
    +            &#x27;file&#x27;,         // file name (used by the parser)
    +            &#x27;final&#x27;,        // not meant to be changed
    +            &#x27;fireonce&#x27;,     // bool, YUI custom event config allows
    +            &#x27;for&#x27;,          // used to change class context
    +            &#x27;global&#x27;,       // declare your globals
    +            &#x27;icon&#x27;,         // project icon(s)
    +            &#x27;implements&#x27;,   // Implements Interface
    +            &#x27;in&#x27;,           // indicates module this lives in (obsolete now)
    +            &#x27;initonly&#x27;,     // attribute writeonce value
    +            &#x27;injects&#x27;,      // injects {HTML|script|CSS}
    +            &#x27;interface&#x27;,    // Is Interface / Interface for an @element
    +            &#x27;knownissue&#x27;,   // 0..n known issues for your consumption
    +            &#x27;line&#x27;,         // line number for the comment block (used by the parser)
    +            &#x27;method&#x27;,       // a method
    +            &#x27;module&#x27;,       // YUI module name
    +            &#x27;main&#x27;,         // Description for the module
    +            &#x27;namespace&#x27;,    // Y.namespace, used to fully qualify class names
    +            &#x27;optional&#x27;,     // For optional attributes
    +            &#x27;required&#x27;,     // For required attributes
    +            &#x27;param&#x27;,        // member param
    +            &#x27;parents&#x27;,      // permitted parents for an @element
    +            &#x27;plugin&#x27;,       // this is a plugin for [entityl]
    +            &#x27;preventable&#x27;,  // YUI custom events can be preventable ala DOM events
    +            &#x27;private&#x27;,      // &gt; access
    +            &#x27;project&#x27;,      // project definition, one per source tree allowed
    +            &#x27;property&#x27;,     // a regular-ole property
    +            &#x27;protected&#x27;,    // &gt; access
    +            &#x27;public&#x27;,       // &gt; access
    +            &#x27;queuable&#x27;,     // bool, events
    +            &#x27;readonly&#x27;,     // YUI attribute config
    +            &#x27;requires&#x27;,     // YUI module requirements
    +            &#x27;return&#x27;,       // {type} return desc -- returns is converted to this
    +            &#x27;see&#x27;,          // 0..n things to look at
    +            &#x27;since&#x27;,        // when it was introduced
    +            &#x27;static&#x27;,       // static
    +            &#x27;submodule&#x27;,    // YUI submodule
    +            &#x27;throws&#x27;,       // {execption type} description
    +            &#x27;title&#x27;,        // this should be something for the project description
    +            &#x27;todo&#x27;,         // 0..n things to revisit eventually (hopefully)
    +            &#x27;type&#x27;,         // the var type
    +            &#x27;url&#x27;,          // project url(s)
    +            &#x27;uses&#x27;,         // 0..n compents mixed (usually, via augment) into the prototype
    +            &#x27;value&#x27;,        // the value of a constant
    +            &#x27;writeonce&#x27;     // YUI attribute config
    +        ],
    +
    +        /**
    +         * A list of ignored tags. These tags should be ignored because there is
    +         * likely to be used for purposes other than JSDoc tags in JavaScript comments.
    +         * @property IGNORE_TAGLIST
    +         * @type Array
    +         * @final
    +         * @for DocParser
    +         */
    +        IGNORE_TAGLIST = [
    +            &#x27;media&#x27;
    +        ],
    +
    +        /**
    +         * Common errors will get scrubbed instead of being ignored.
    +         * @property CORRECTIONS
    +         * @type Object
    +         * @final
    +         * @for DocParser
    +         */
    +        CORRECTIONS = {
    +            &#x27;augments&#x27;: &#x27;uses&#x27;, // YUI convention for prototype mixins
    +            &#x27;depreciated&#x27;: &#x27;deprecated&#x27;, // subtle difference
    +            &#x27;desciption&#x27;: &#x27;description&#x27;, // shouldn&#x27;t need the @description tag at all
    +            &#x27;extend&#x27;: &#x27;extends&#x27;, // typo
    +            &#x27;function&#x27;: &#x27;method&#x27;, // we may want standalone inner functions at some point
    +            &#x27;member&#x27;: &#x27;method&#x27;, // probably meant method
    +            &#x27;parm&#x27;: &#x27;param&#x27;, // typo
    +            &#x27;params&#x27;: &#x27;param&#x27;, // typo
    +            &#x27;pamra&#x27;: &#x27;param&#x27;, // typo
    +            &#x27;parma&#x27;: &#x27;param&#x27;, // typo
    +            &#x27;propery&#x27;: &#x27;property&#x27;, // typo
    +            &#x27;prop&#x27;: &#x27;property&#x27;, // probably meant property
    +            &#x27;returns&#x27;: &#x27;return&#x27; // need to standardize on one or the other
    +        },
    +
    +        /**
    +         * A map of the default tag processors, keyed by the
    +         * tag name.  Multiple tags can use the same digester
    +         * by supplying the string name that points to the
    +         * implementation rather than a function.
    +         * @property DIGESTERS
    +         * @type Object
    +         * @final
    +         * @for DocParser
    +         */
    +        DIGESTERS = {
    +            // &quot;params&quot;: [
    +            // {
    +            //   &quot;name&quot;: &quot;optionalandmultiple&quot;,
    +            //   &quot;description&quot;: &quot;my desc&quot;,
    +            //   &quot;type&quot;: &quot;string&quot;,
    +            //   &quot;optional&quot;: true, // [surroundedbybrackets]
    +            //   &quot;optdefault&quot;: &quot;if specified, this is always string to avoid syntax errors @TODO&quot;,
    +            //   &quot;multiple&quot;: true // endswith* or ...startswith
    +            // }
    +            // ],
    +            // @param {type} name description    -or-
    +            // @param name {type} description
    +            // #2173362 optional w/ or w/o default
    +            // @param {type} [optvar=default] description
    +            // #12 document config objects
    +            // @param {object|config} config description
    +            // @param {type} config.prop1 description
    +            // @param {type} config.prop2 description
    +            // #11 document callback argument signature
    +            // @param {callback|function} callback description
    +            // @param {type} callback.arg1 description
    +            // @param {type} callback.arg2 description
    +            // #2173362 document event facade decorations for custom events
    +            // @param {event} event description
    +            // @param {type}  event.child description
    +            // @param {type}  event.index description
    +            // @param name* {type} 1..n description
    +            // @param [name]* {type} 0..n description
    +            &#x27;param&#x27;: function (tagname, value, target, block) {
    +                // Y.log(&#x27;param digester&#x27; + value);
    +                target.params = target.params || [];
    +
    +                if (!value) {
    +                    this.warnings.push({
    +                        message: &#x27;param name/type/descript missing&#x27;,
    +                        line: stringlog(block)
    +                    });
    +                    Y.log(&#x27;param name/type/descript missing: &#x27; + stringlog(block), &#x27;warn&#x27;, &#x27;docparser&#x27;);
    +                    return;
    +                }
    +
    +                var type, name, parts, optional, optdefault, parent, multiple, len, result,
    +                    desc = implodeString(trim(value)),
    +                    match = REGEX_TYPE.exec(desc),
    +                    host = target.params;
    +
    +                // Extract {type}
    +                if (match) {
    +                    type = fixType(trim(match[2]));
    +                    desc = trim(match[1] + match[3]);
    +                }
    +
    +                // extract the first word, this is the param name
    +                match = REGEX_FIRSTWORD.exec(desc);
    +                if (match) {
    +                    name = trim(explodeString(match[1]));
    +                    desc = trim(match[2]);
    +                }
    +
    +                if (!name) {
    +                    if (value &amp;&amp; value.match(/callback/i)) {
    +                        this.warnings.push({
    +                            message: &#x27;Fixing missing name for callback&#x27;,
    +                            line: stringlog(block)
    +                        });
    +                        Y.log(&#x27;Fixing missing name for callback:&#x27; + stringlog(block), &#x27;warn&#x27;, &#x27;docparser&#x27;);
    +                        name = &#x27;callback&#x27;;
    +                        type = &#x27;Callback&#x27;;
    +                    } else {
    +                        this.warnings.push({
    +                            message: &#x27;param name missing: &#x27; + value,
    +                            line: stringlog(block)
    +                        });
    +                        Y.log(&#x27;param name missing: &#x27; + value + &#x27;:&#x27; + stringlog(block), &#x27;warn&#x27;, &#x27;docparser&#x27;);
    +                        name = &#x27;UNKNOWN&#x27;;
    +                    }
    +                }
    +
    +                len = name.length - 1;
    +
    +                if (name.charAt(len) === &#x27;*&#x27;) {
    +                    multiple = true;
    +                    name = name.substr(0, len);
    +                }
    +
    +                // extract [name], optional param
    +                if (name.indexOf(&#x27;[&#x27;) &gt; -1) {
    +                    match = REGEX_OPTIONAL.exec(name);
    +                    if (match) {
    +                        optional = true;
    +                        name = trim(match[1]);
    +                        // extract optional=defaultvalue
    +                        parts = name.split(&#x27;=&#x27;);
    +                        if (parts.length &gt; 1) {
    +                            name = parts[0];
    +                            optdefault = parts[1];
    +                            //Add some shortcuts for object/array defaults
    +                            if (optdefault.toLowerCase() === &#x27;object&#x27;) {
    +                                optdefault = &#x27;{}&#x27;;
    +                            }
    +                            if (optdefault.toLowerCase() === &#x27;array&#x27;) {
    +                                optdefault = &#x27;[]&#x27;;
    +                            }
    +                        }
    +                    }
    +                }
    +
    +                // This should run after the check for optional parameters
    +                // and before the check for child parameters
    +                // because the signature for 0..n params is [...args]
    +                if (name.substr(0, 3) === &#x27;...&#x27;) {
    +                    multiple = true;
    +                    name = name.substr(3);
    +                }
    +
    +                // parse object.prop, indicating a child property for object
    +                if (name.indexOf(&#x27;.&#x27;) &gt; -1) {
    +                    match = name.split(&#x27;.&#x27;);
    +                    parent = trim(match[0]);
    +                    Y.each(target.params, function (param) {
    +                        if (param.name === parent) {
    +                            param.props = param.props || [];
    +                            host = param.props;
    +                            match.shift();
    +                            name = trim(match.join(&#x27;.&#x27;));
    +                            if (match.length &gt; 1) {
    +                                var pname = name.split(&#x27;.&#x27;)[0],
    +                                    par;
    +                                Y.each(param.props, function (o) {
    +                                    if (o.name === pname) {
    +                                        par = o;
    +                                    }
    +                                });
    +                                if (par) {
    +                                    match = name.split(&#x27;.&#x27;);
    +                                    match.shift();
    +                                    name = match.join(&#x27;.&#x27;);
    +                                    par.props = par.props || [];
    +                                    host = par.props;
    +                                }
    +                            }
    +                        }
    +                    });
    +
    +                }
    +
    +                result = {
    +                    name: name,
    +                    description: explodeString(desc)
    +                };
    +
    +                if (type) {
    +                    result.type = type;
    +                }
    +
    +                if (optional) {
    +                    result.optional = true;
    +                    if (optdefault) {
    +                        result.optdefault = optdefault;
    +                    }
    +                }
    +
    +                if (multiple) {
    +                    result.multiple = true;
    +                }
    +
    +                host.push(result);
    +            },
    +
    +            // @return {type} description // methods
    +            // @returns {type} description // methods
    +            // @injects {HTML|CSS|script} description
    +            // can be used by anthing that has an optional {type} and a description
    +            &#x27;return&#x27;: function (tagname, value, target) {
    +
    +                var desc = implodeString(trim(value)),
    +                    type,
    +                    match = REGEX_TYPE.exec(desc),
    +                    result = {};
    +                if (match) {
    +                    type = fixType(trim(match[2]));
    +                    desc = trim(match[1] + match[3]);
    +                }
    +
    +                result = {
    +                    description: Y.unindent(explodeString(desc))
    +                };
    +
    +                if (type) {
    +                    result.type = type;
    +                }
    +
    +                target[tagname] = result;
    +
    +            },
    +
    +            // @throws {type} description
    +            &#x27;throws&#x27;: &#x27;return&#x27;,
    +
    +            &#x27;injects&#x27;: &#x27;return&#x27;,
    +
    +            // trying to overwrite the constructor value is a bad idea
    +            &#x27;constructor&#x27;: function (tagname, value, target) {
    +                target.is_constructor = 1;
    +            },
    +
    +            // @author {twitter: @arthurdent | github: ArthurDent}
    +            //    Arthur Dent adent@h2g2.earth #23, multiple // modules/class/method
    +            // &#x27;author&#x27;: function(tagname, value, target, block) {
    +            //     // Y.log(&#x27;author digester&#x27;);
    +            // },
    +
    +            // A key bock type for declaring modules and submodules
    +            // subsequent class and member blocks will be assigned
    +            // to this module.
    +            &#x27;module&#x27;: function (tagname, value, target, block) {
    +                this.set(CURRENT_MODULE, value);
    +                var go = true;
    +                Y.some(block, function (o) {
    +                    if (trim(o.tag) === &#x27;submodule&#x27;) {
    +                        go = false;
    +                        return true;
    +                    }
    +                });
    +                if (go) {
    +                    if (!this.get(MAIN_MODULE)) {
    +                        this.set(MAIN_MODULE, {
    +                            tag: tagname,
    +                            name: value,
    +                            file: target.file,
    +                            line: target.line,
    +                            description: target.description
    +                        });
    +                    }
    +                    return this.modules[value];
    +                }
    +                return null;
    +            },
    +
    +            //Setting the description for the module..
    +            &#x27;main&#x27;: function (tagname, value, target) {
    +                var o = target;
    +                o.mainName = value;
    +                o.tag = tagname;
    +                o.itemtype = &#x27;main&#x27;;
    +                o._main = true;
    +                this.set(MAIN_MODULE, o);
    +            },
    +
    +            // accepts a single project definition for the source tree
    +            &#x27;project&#x27;: function () {
    +                return this.project;
    +            },
    +
    +            // A key bock type for declaring submodules.  subsequent class and
    +            // member blocks will be assigned to this submodule.
    +            &#x27;submodule&#x27;: function (tagname, value) {
    +                //console.log(&#x27;Setting current submodule: &#x27;, value, &#x27;on class&#x27;);
    +                this.set(CURRENT_SUBMODULE, value);
    +                var host = this.modules[value],
    +                    clazz = this.get(CURRENT_CLASS),
    +                    parent = this.get(CURRENT_MODULE);
    +                if (parent) {
    +                    host.module = parent;
    +                }
    +                if (clazz &amp;&amp; this.classes[clazz]) {
    +                    //console.log(&#x27;Adding submodule&#x27;, value , &#x27;to class&#x27;, clazz, &#x27; it has submodule&#x27;, this.classes[clazz].submodule);
    +                    //if (!this.classes[clazz].submodule) {
    +                    //console.log(&#x27;REALLY Adding submodule&#x27;, value , &#x27;to class&#x27;, clazz);
    +                    this.classes[clazz].submodule = value;
    +                    //}
    +                }
    +                return host;
    +            },
    +
    +            // A key bock type for declaring classes, subsequent
    +            // member blocks will be assigned to this class
    +            &#x27;class&#x27;: function (tagname, value, target, block) {
    +                var namespace, fullname, host, parent;
    +
    +                block.forEach(function (def) {
    +                    if (def.tag === &#x27;namespace&#x27;) {
    +                        //We have a namespace, augment the name
    +                        var name = trim(def.value) + &#x27;.&#x27; + value;
    +                        if (value.indexOf(trim(def.value) + &#x27;.&#x27;) === -1) {
    +                            value = name;
    +                            namespace = trim(def.value);
    +                        }
    +                    }
    +                });
    +
    +                if (namespace) {
    +                    this.set(CURRENT_NAMESPACE, namespace);
    +                }
    +                this.set(CURRENT_CLASS, value);
    +
    +                fullname = this.get(CURRENT_CLASS);
    +                host = this.classes[fullname];
    +                parent = this.get(CURRENT_MODULE);
    +
    +                if (namespace) {
    +                    host.namespace = namespace;
    +                }
    +                if (parent) {
    +                    host.module = parent;
    +                }
    +
    +                //Merge host and target in case the class was defined in a &quot;for&quot; tag
    +                //before it was defined in a &quot;class&quot; tag
    +                host = Y.merge(host, target);
    +                this.classes[fullname] = host;
    +                parent = this.get(CURRENT_SUBMODULE);
    +                if (parent) {
    +                    //this.set(CURRENT_SUBMODULE, parent);
    +                    host.submodule = parent;
    +                }
    +                return host;
    +            },
    +
    +            // A key bock type for declaring custom elements
    +            &#x27;element&#x27;: function (tagname, value) {
    +                var name, parent, host;
    +
    +                name = value.split(/\s+/)[0];
    +                this.set(CURRENT_ELEMENT, name);
    +                host = this.elements[name];
    +
    +                parent = this.get(CURRENT_MODULE);
    +                if (parent) {
    +                    host.module = parent;
    +                }
    +
    +                parent = this.get(CURRENT_SUBMODULE);
    +                if (parent) {
    +                    host.submodule = parent;
    +                }
    +
    +                return host;
    +            },
    +
    +            // change &#x27;const&#x27; to final property
    +            &#x27;const&#x27;: function (tagname, value, target) {
    +                target.itemtype = &#x27;property&#x27;;
    +                target.name = value;
    +                target.final = &#x27;&#x27;;
    +            },
    +
    +            // supported classitems
    +            &#x27;property&#x27;: function (tagname, value, target, block) {
    +                var match, name, desc, type;
    +
    +                target.itemtype = tagname;
    +                target.name = value;
    +                if (!target.type) {
    +                    desc = implodeString(trim(value));
    +                    match = REGEX_TYPE.exec(desc);
    +
    +                    // Extract {type}
    +                    if (match) {
    +                        type = fixType(trim(match[2]));
    +                        name = trim(match[1] + match[3]);
    +                        target.type = type;
    +                        target.name = name;
    +                    }
    +
    +                }
    +                if (target.type &amp;&amp; target.type.toLowerCase() === &#x27;object&#x27;) {
    +                    block.forEach(function (i, k) {
    +                        if (i.tag === &#x27;property&#x27;) {
    +                            i.value = trim(i.value);
    +                            i.tag = &#x27;param&#x27;;
    +                            block[k] = i;
    +                        }
    +                    });
    +                }
    +            },
    +            &#x27;method&#x27;: &#x27;property&#x27;,
    +            &#x27;config&#x27;: &#x27;property&#x27;,
    +            &#x27;event&#x27;: &#x27;property&#x27;,
    +
    +            &#x27;attribute&#x27;: function (tagname, value, target) {
    +                // Use &#x27;property&#x27; if not currently parsing an element
    +                if (!this.get(CURRENT_ELEMENT)) {
    +                    return DIGESTERS.property.apply(this, arguments);
    +                }
    +
    +                var nameVal = value.split(/\s+([\s\S]*$)/),
    +                    desc = nameVal[1] || target.description || &#x27;&#x27;;
    +
    +                if (!target.attributes) {
    +                    target.attributes = [];
    +                }
    +                target.attributes.push({
    +                    name: nameVal[0],
    +                    description: desc
    +                });
    +            },
    +
    +            // access fields
    +            &#x27;public&#x27;: function (tagname, value, target) {
    +                target.access = tagname;
    +                target.tagname = value;
    +            },
    +            &#x27;private&#x27;: &#x27;public&#x27;,
    +            &#x27;protected&#x27;: &#x27;public&#x27;,
    +            &#x27;inner&#x27;: &#x27;public&#x27;,
    +
    +            // tags that can have multiple occurances in a single block
    +            &#x27;todo&#x27;: function (tagname, value, target) {
    +                if (!Lang.isArray(target[tagname])) {
    +                    target[tagname] = [];
    +                }
    +                //If the item is @tag one,two
    +                if (value.indexOf(&#x27;,&#x27;) &gt; -1) {
    +                    value = value.split(&#x27;,&#x27;);
    +                } else {
    +                    value = [value];
    +                }
    +
    +                value.forEach(function (v) {
    +                    v = trim(v);
    +                    target[tagname].push(v);
    +                });
    +            },
    +            &#x27;extension_for&#x27;: &#x27;extensionfor&#x27;,
    +            &#x27;extensionfor&#x27;: function (tagname, value) {
    +                if (this.classes[this.get(CURRENT_CLASS)]) {
    +                    this.classes[this.get(CURRENT_CLASS)].extension_for.push(value);
    +                }
    +            },
    +            &#x27;example&#x27;: function (tagname, value, target, block) {
    +                if (!Lang.isArray(target[tagname])) {
    +                    target[tagname] = [];
    +                }
    +
    +                var e = value;
    +                block.forEach(function (v) {
    +                    if (v.tag === &#x27;example&#x27;) {
    +                        if (v.value.indexOf(value) &gt; -1) {
    +                            e = v.value;
    +                        }
    +                    }
    +                });
    +
    +                target[tagname].push(e);
    +            },
    +            &#x27;url&#x27;: &#x27;todo&#x27;,
    +            &#x27;icon&#x27;: &#x27;todo&#x27;,
    +            &#x27;see&#x27;: &#x27;todo&#x27;,
    +            &#x27;requires&#x27;: &#x27;todo&#x27;,
    +            &#x27;knownissue&#x27;: &#x27;todo&#x27;,
    +            &#x27;uses&#x27;: &#x27;todo&#x27;,
    +            &#x27;category&#x27;: &#x27;todo&#x27;,
    +            &#x27;unimplemented&#x27;: &#x27;todo&#x27;,
    +
    +            genericValueTag: function (tagname, value, target) {
    +                target[tagname] = value;
    +            },
    +
    +            &#x27;author&#x27;: &#x27;genericValueTag&#x27;,
    +            &#x27;contributor&#x27;: &#x27;genericValueTag&#x27;,
    +            &#x27;since&#x27;: &#x27;genericValueTag&#x27;,
    +
    +            &#x27;deprecated&#x27;: function (tagname, value, target) {
    +                target.deprecated = true;
    +
    +                if (typeof value === &#x27;string&#x27; &amp;&amp; value.length) {
    +                    target.deprecationMessage = value;
    +                }
    +            },
    +
    +            // updates the current namespace
    +            &#x27;namespace&#x27;: function (tagname, value) {
    +                this.set(CURRENT_NAMESPACE, value);
    +                if (value === &#x27;&#x27;) {
    +                    //Shortcut this if namespace is an empty string.
    +                    return;
    +                }
    +                var m,
    +                    mod,
    +                    name,
    +                    lastNS,
    +                    file = this.get(CURRENT_FILE);
    +                if (file) {
    +                    this.files[file].namespaces[value] = 1;
    +                }
    +                mod = this.get(CURRENT_MODULE);
    +                if (mod) {
    +                    this.modules[mod].namespaces[value] = 1;
    +                }
    +
    +                mod = this.get(CURRENT_SUBMODULE);
    +                if (mod) {
    +                    this.modules[mod].namespaces[value] = 1;
    +                }
    +
    +                mod = this.get(CURRENT_CLASS);
    +                if (mod) {
    +                    lastNS = this.get(&#x27;lastnamespace&#x27;);
    +                    if (lastNS &amp;&amp; lastNS !== value &amp;&amp; (value.indexOf(lastNS + &#x27;.&#x27;) !== 0)) {
    +                        if (this.classes[mod]) {
    +                            m = this.classes[mod];
    +                            delete this.classes[mod];
    +                            mod = value + &#x27;.&#x27; + mod.replace(lastNS + &#x27;.&#x27;, &#x27;&#x27;);
    +                            m.name = mod;
    +                            m.namespace = value;
    +                            this.classes[mod] = m;
    +                            this.set(CURRENT_CLASS, m.name);
    +                        }
    +                    }
    +                    if (this.classes[mod]) {
    +                        this.classes[mod].namespace = value;
    +                        if (mod === value) {
    +                            return;
    +                        }
    +                        if (mod.indexOf(value + &#x27;.&#x27;) === -1) {
    +                            if (mod.indexOf(&#x27;.&#x27;) === -1) {
    +                                m = this.classes[mod];
    +                                delete this.classes[mod];
    +                                name = m.namespace + &#x27;.&#x27; + m.name;
    +                                m.name = name;
    +                                this.classes[name] = m;
    +                                this.set(CURRENT_CLASS, name);
    +                            } else {
    +                                if (mod.indexOf(this.classes[mod].namespace + &#x27;.&#x27;) === -1) {
    +                                    m = this.classes[mod];
    +                                    delete this.classes[mod];
    +                                    name = m.namespace + &#x27;.&#x27; + m.shortname;
    +                                    m.name = name;
    +                                    this.classes[name] = m;
    +                                    this.set(CURRENT_CLASS, name);
    +                                }
    +                            }
    +                        }
    +                    }
    +                }
    +            },
    +
    +            // updates the current class only (doesn&#x27;t create
    +            // a new class definition)
    +            &#x27;for&#x27;: function (tagname, value) {
    +                var ns, file, mod;
    +
    +                value = this._resolveFor(value);
    +                this.set(CURRENT_CLASS, value);
    +
    +                ns = ((this.classes[value]) ? this.classes[value].namespace : &#x27;&#x27;);
    +                this.set(CURRENT_NAMESPACE, ns);
    +
    +                file = this.get(CURRENT_FILE);
    +                if (file) {
    +                    this.files[file].fors[value] = 1;
    +                }
    +
    +                mod = this.get(CURRENT_MODULE);
    +                if (mod) {
    +                    this.modules[mod].fors[value] = 1;
    +                }
    +
    +                mod = this.get(CURRENT_SUBMODULE);
    +                if (mod) {
    +                    this.modules[mod].fors[value] = 1;
    +                }
    +            }
    +        },
    +
    +        /**
    +         * The doc parser accepts a **map** of files to file content.
    +         * Once &#x60;parse()&#x60; is called, various properties will be populated
    +         * with the parsers data (aggregated in the &#x60;&#x27;data&#x27;&#x60; property).
    +         * @class DocParser
    +         * @extends Base
    +         * @constructor
    +         * @param {Object} o the config object
    +         * @module yuidoc
    +         */
    +        DocParser = function () {
    +            this.digesters = Y.merge(DocParser.DIGESTERS);
    +            this.knowntags = Y.Array.hash(DocParser.TAGLIST);
    +            DocParser.superclass.constructor.apply(this, arguments);
    +        };
    +
    +    DocParser.NAME = &#x27;DocParser&#x27;;
    +
    +    DocParser.DIGESTERS = DIGESTERS;
    +    DocParser.TAGLIST = TAGLIST;
    +    DocParser.CORRECTIONS = CORRECTIONS;
    +
    +    DocParser.ATTRS = {
    +
    +        lint: {
    +            value: false
    +        },
    +
    +        /**
    +         * Digesters process the tag/text pairs found in a
    +         * comment block.  They are looked up by tag name.
    +         * The digester gets the tagname, the value, the
    +         * target object to apply values to, and the full
    +         * block that is being processed.  Digesters can
    +         * be declared as strings instead of a function --
    +         * in that case, the program will try to look up
    +         * the key listed and use the function there instead
    +         * (it is an alias).  Digesters can return a host
    +         * object in the case the tag defines a new key
    +         * block type (modules/classes/methods/events/properties)
    +         * @attribute digesters
    +         */
    +        digesters: {
    +            setter: function (val) {
    +                Y.mix(this.digesters, val, true);
    +                Y.mix(this.knowntags, val, true);
    +                return val;
    +            }
    +        },
    +
    +        /**
    +         * Emitters will be schemas for the types of payloads
    +         * the parser will emit.  Not implemented.
    +         * @attribute emitters
    +         */
    +        emitters: {
    +            setter: function (val) {
    +                Y.mix(this.emitters, val, true);
    +            }
    +        },
    +
    +        /**
    +         * Comment syntax type.
    +         * @attribute syntaxtype
    +         * @type String
    +         */
    +        syntaxtype: {
    +            writeOnce: true
    +        },
    +
    +        /**
    +         * The map of file names to file content.
    +         * @attribute filemap
    +         */
    +        filemap: {
    +            writeOnce: true
    +        },
    +
    +        /**
    +         * A map of file names to directory name.  Provided in
    +         * case this needs to be used to reset the module name
    +         * appropriately -- currently not used
    +         * @attribute dirmap
    +         */
    +        dirmap: {
    +            writeOnce: true
    +        },
    +
    +        /**
    +         * The file currently being parsed
    +         * @attribute currentfile
    +         * @type String
    +         */
    +        currentfile: {
    +            setter: function (val) {
    +                val = trim(val);
    +                // this.set(CURRENT_NAMESPACE, &#x27;&#x27;);
    +                if (!(val in this.files)) {
    +                    this.files[val] = {
    +                        name: val,
    +                        modules: {},
    +                        classes: {},
    +                        fors: {},
    +                        namespaces: {}
    +                    };
    +                }
    +                return val;
    +            }
    +        },
    +        /**
    +         * The main documentation block for the module itself.
    +         * @attribute mainmodule
    +         * @type String
    +         */
    +        mainmodule: {
    +            setter: function (o) {
    +                if (!o) {
    +                    return;
    +                }
    +                //console.log(&#x27;Main Module Setter: &#x27;, o);
    +                var write = true,
    +                    name = o.mainName || o.name;
    +                if (this.get(CURRENT_MODULE) === name) {
    +
    +                    if (name in this.modules) {
    +                        //console.log(&#x27;In Global Modules&#x27;, this.modules[name]);
    +                        if (this.modules[name].tag) {
    +                            //The main module has already been added, don&#x27;t over write it.
    +                            if (this.modules[name].tag === &#x27;main&#x27;) {
    +                                write = false;
    +                            }
    +                        }
    +                        if (write) {
    +                            //console.log(&#x27;Writing&#x27;);
    +                            this.modules[name] = Y.merge(this.modules[name], o);
    +                        }
    +                    } else {
    +                        if (o._main) {
    +                            //console.log(&#x27;Writing&#x27;);
    +                            this.modules[name] = o;
    +                        }
    +                    }
    +                }
    +            }
    +        },
    +        /**
    +         * The module currently being parsed
    +         * @attribute currentmodule
    +         * @type String
    +         */
    +        currentmodule: {
    +            setter: function (val) {
    +                if (!val) {
    +                    return val;
    +                }
    +                val = trim(val);
    +
    +                var modMain, clazz;
    +
    +                this.set(CURRENT_SUBMODULE, &#x27;&#x27;);
    +                this.set(CURRENT_NAMESPACE, &#x27;&#x27;);
    +
    +                modMain = this.get(MAIN_MODULE);
    +                if (modMain &amp;&amp; modMain.name !== val) {
    +                    this.set(MAIN_MODULE, &#x27;&#x27;);
    +                }
    +
    +                clazz = this.classes[this.get(CURRENT_CLASS)];
    +                if (clazz) {
    +                    //Handles case where @module comes after @class in a new directory of files
    +                    if (clazz.module !== val) {
    +                        if (this.modules[clazz.module]) {
    +                            delete this.modules[clazz.module].submodules[clazz.submodule];
    +                            delete this.modules[clazz.module].classes[clazz.name];
    +                        }
    +                        if (clazz.submodule &amp;&amp; this.modules[clazz.submodule]) {
    +                            delete this.modules[clazz.submodule].submodules[clazz.submodule];
    +                            delete this.modules[clazz.submodule].classes[clazz.name];
    +                        }
    +                        clazz.module = val;
    +                        if (this.modules[val]) {
    +                            this.modules[val].submodules[clazz.submodule] = 1;
    +                            this.modules[val].classes[clazz.name] = 1;
    +                        }
    +                        if (clazz.submodule &amp;&amp; this.modules[clazz.submodule]) {
    +                            this.modules[clazz.submodule].module = val;
    +                        }
    +                    }
    +                }
    +
    +                if (!(val in this.modules)) {
    +                    this.modules[val] = {
    +                        name: val,
    +                        submodules: {},
    +                        elements: {},
    +                        classes: {},
    +                        fors: {},
    +                        namespaces: {}
    +                    };
    +                }
    +
    +                return val;
    +            }
    +        },
    +
    +        /**
    +         * The submodule currently being parsed
    +         * @attribute currentsubmodule
    +         * @type String
    +         */
    +        currentsubmodule: {
    +            setter: function (val) {
    +                if (!val) {
    +                    return val;
    +                }
    +                val = trim(val);
    +                if (!(val in this.modules)) {
    +                    var mod = this.modules[val] = {
    +                        name: val,
    +                        submodules: {},
    +                        elements: {},
    +                        classes: {},
    +                        fors: {},
    +                        is_submodule: 1,
    +                        namespaces: {}
    +                    };
    +
    +                    mod.module = this.get(CURRENT_MODULE);
    +                    mod.namespace = this.get(CURRENT_NAMESPACE);
    +                }
    +                //console.log(&#x27;SETTING CURRENT SUBMODULE: &#x27;, val, &#x27;ON CLASS&#x27;, this.get(CURRENT_CLASS));
    +                return val;
    +            }
    +        },
    +        currentnamespace: {
    +            setter: function (val) {
    +                this.set(&#x27;lastnamespace&#x27;, this.get(CURRENT_NAMESPACE));
    +                return val;
    +            }
    +        },
    +        lastnamespace: {
    +
    +        },
    +        lastclass: {
    +
    +        },
    +        /**
    +         * The class currently being parsed
    +         * @attribute currentclass
    +         * @type String
    +         */
    +        currentclass: {
    +            setter: function (val) {
    +                if (!val) {
    +                    return val;
    +                }
    +                this.set(&#x27;lastclass&#x27;, this.get(CURRENT_CLASS));
    +                val = trim(val);
    +                var name = val,
    +                    ns, clazz;
    +                if (!(val in this.classes)) {
    +                    ns = this.get(CURRENT_NAMESPACE);
    +                    if (ns &amp;&amp; ns !== &#x27;&#x27; &amp;&amp; (val.indexOf(ns + &#x27;.&#x27;) !== 0)) {
    +                        name = ns + &#x27;.&#x27; + val;
    +                    }
    +                    clazz = this.classes[name] = {
    +                        name: name,
    +                        shortname: val,
    +                        classitems: [],
    +                        plugins: [],
    +                        extensions: [],
    +                        plugin_for: [],
    +                        extension_for: []
    +                    };
    +                    clazz.module = this.get(CURRENT_MODULE);
    +                    if (this.get(CURRENT_SUBMODULE)) {
    +                        clazz.submodule = this.get(CURRENT_SUBMODULE);
    +                    }
    +                    clazz.namespace = ns;
    +                }
    +                return name;
    +            }
    +        },
    +        lastelement: {
    +
    +        },
    +        /**
    +         * The element currently being parsed
    +         * @attribute currentelement
    +         * @type String
    +         */
    +        currentelement: {
    +            setter: function (val) {
    +                if (!val) {
    +                    return val;
    +                }
    +                this.set(&#x27;lastelement&#x27;, this.get(CURRENT_ELEMENT));
    +                val = trim(val);
    +                var name = val,
    +                    el;
    +                if (!(val in this.elements)) {
    +                    el = this.elements[name] = {
    +                        name: name,
    +                        attributes: []
    +                    };
    +                    el.module = this.get(CURRENT_MODULE);
    +                    if (this.get(CURRENT_SUBMODULE)) {
    +                        el.submodule = this.get(CURRENT_SUBMODULE);
    +                    }
    +                }
    +                return name;
    +            }
    +        }
    +    };
    +
    +    Y.extend(DocParser, Y.Base, {
    +        /**
    +         * Takes a non-namespaced classname and resolves it to a namespace (to support &#x60;@for&#x60;)
    +         * @private
    +         * @method _resolveFor
    +         * @param {String} value The classname to resolve
    +         * @return {String} The resolved namespace + classname
    +         */
    +        _resolveFor: function (value) {
    +            if (value.indexOf(&#x27;.&#x27;) === -1) {
    +                Y.each(this.classes, function (i) {
    +                    if (i.shortname === value) {
    +                        if (i.namespace) {
    +                            value = i.namespace + &#x27;.&#x27; + i.shortname;
    +                        }
    +                    }
    +                });
    +            }
    +            return value;
    +        },
    +
    +        initializer: function () {
    +            this.warnings = [];
    +
    +            var self = this;
    +            self.after(&#x27;currentfileChange&#x27;, function () {
    +                /*
    +                 * File changed, so we reset class and submodule.
    +                 * You should use @for if you want to reference another class
    +                 * in different file.
    +                 */
    +                self.set(CURRENT_SUBMODULE, &#x27;&#x27;);
    +                self.set(CURRENT_CLASS, &#x27;&#x27;);
    +                self.set(CURRENT_ELEMENT, &#x27;&#x27;);
    +            });
    +
    +            self.after(&#x27;currentmoduleChange&#x27;, function (e) {
    +                var mod = e.newVal,
    +                    elements = self.elements,
    +                    classes = self.classes,
    +                    addModule = function (c) {
    +                        if (!(c.module)) {
    +                            c.module = mod;
    +                        }
    +                    };
    +
    +                Y.each(classes, addModule);
    +                Y.each(elements, addModule);
    +            });
    +
    +            self.after(&#x27;currentsubmoduleChange&#x27;, function (e) {
    +                var mod = e.newVal,
    +                    classes = self.classes,
    +                    elements = self.elements,
    +                    addModule = function (c) {
    +                        if (!(c.submodule)) {
    +                            if (!c.module) {
    +                                c.submodule = mod;
    +                            }
    +                        }
    +                    };
    +
    +                if (mod) {
    +                    Y.each(classes, addModule);
    +                    Y.each(elements, addModule);
    +                }
    +            });
    +
    +            self.after(&#x27;currentclassChange&#x27;, function (e) {
    +                var clazz = e.newVal;
    +                Y.each(self.classitems, function (item) {
    +                    if (!(item.class)) {
    +                        item.class = clazz;
    +                    }
    +                });
    +                // Y.log(self.classitems);
    +            });
    +        },
    +
    +        /**
    +        Normalizes the initial indentation of the given _content_ so that the first line
    +        is unindented, and all other lines are unindented to the same degree as the
    +        first line. So if the first line has four spaces at the beginning, then all
    +        lines will be unindented four spaces. Ported from [Selleck](https://github.com/rgrove/selleck)
    +
    +        @method unindent
    +        @param {String} content Text to unindent.
    +        @return {String} Unindented text.
    +        @private
    +        **/
    +        unindent: function (content) {
    +            var indent = content.match(/^(\s+)/);
    +
    +            if (indent) {
    +                content = content.replace(new RegExp(&#x27;^&#x27; + indent[1], &#x27;gm&#x27;), &#x27;&#x27;);
    +            }
    +
    +            return content;
    +        },
    +
    +        /**
    +        Transforms a JavaDoc style comment block (less the start and end of it)
    +        into a list of tag/text pairs. The leading space and &#x27;*&#x27; are removed,
    +        but the remaining whitespace is preserved so that the output should be
    +        friendly for both markdown and html parsers.
    +
    +        @method handlecomment
    +        @param {String} comment The comment to parse
    +        @param {String} file The file it was parsed from
    +        @param {String} line The line number it was found on
    +        **/
    +        handlecomment: function (comment, file, line) {
    +            var lines = comment.split(REGEX_LINES),
    +                len = lines.length,
    +                i,
    +                regex,
    +                parts, part, peek, skip,
    +                tag, value,
    +                results = [{
    +                    tag: &#x27;file&#x27;,
    +                    value: file
    +                }, {
    +                    tag: &#x27;line&#x27;,
    +                    value: line
    +                }],
    +                syntaxtype = this.get(&#x27;syntaxtype&#x27;),
    +                lineHeadCharRegex = REGEX_LINE_HEAD_CHAR[syntaxtype],
    +                hasLineHeadChar = lines[0] &amp;&amp; lineHeadCharRegex.test(lines[0]);
    +
    +            // trim leading line head char(star or harp) if there are any
    +            if (hasLineHeadChar) {
    +                for (i = 0; i &lt; len; i++) {
    +                    lines[i] = lines[i].replace(lineHeadCharRegex, &#x27;&#x27;);
    +                }
    +            }
    +
    +            // reconsitute and tokenize the comment block
    +            comment = this.unindent(lines.join(&#x27;\n&#x27;));
    +            regex = new RegExp(&#x27;(?:^|\\n)\\s*((?!@&#x27; + IGNORE_TAGLIST.join(&#x27;)(?!@&#x27;) + &#x27;)@\\w*)&#x27;);
    +            parts = comment.split(regex);
    +            len = parts.length;
    +            for (i = 0; i &lt; len; i++) {
    +                value = &#x27;&#x27;;
    +                part = parts[i];
    +                if (part === &#x27;&#x27;) {
    +                    continue;
    +                }
    +                skip = false;
    +
    +                // the first token may be the description, otherwise it should be a tag
    +                if (i === 0 &amp;&amp; part.substr(0, 1) !== &#x27;@&#x27;) {
    +                    if (part) {
    +                        tag = &#x27;@description&#x27;;
    +                        value = part;
    +                    } else {
    +                        skip = true;
    +                    }
    +                } else {
    +                    tag = part;
    +                    // lookahead for the tag value
    +                    peek = parts[i + 1];
    +                    if (peek) {
    +                        value = peek;
    +                        i++;
    +                    }
    +                }
    +
    +                if (!skip &amp;&amp; tag) {
    +                    results.push({
    +                        tag: tag.substr(1).toLowerCase(),
    +                        value: value
    +                    });
    +                }
    +            }
    +
    +            return results;
    +        },
    +
    +        /**
    +         * Accepts a map of filenames to file content.  Returns
    +         * a map of filenames to an array of API comment block
    +         * text.  This expects the comment to start with / **
    +         * on its own line, and end with * / on its own
    +         * line.  Override this function to provide an
    +         * alternative comment parser.
    +         * @method extract
    +         * @param {Object} filemap A map of filenames to file content
    +         * @param {Array} dirmap A map of file names to directory name
    +         * @return {Object} A map of filenames to an array of extracted
    +         * comment text.
    +         */
    +        extract: function (filemap, dirmap) {
    +            filemap = filemap || this.get(&#x27;filemap&#x27;);
    +            dirmap = dirmap || this.get(&#x27;dirmap&#x27;);
    +            var syntaxtype = this.get(&#x27;syntaxtype&#x27;),
    +                commentmap = {};
    +            Y.each(filemap, function (code, filename) {
    +
    +                var commentlines, comment, line,
    +                    lines = code.split(REGEX_LINES),
    +                    len = lines.length,
    +                    i, linenum;
    +
    +                for (i = 0; i &lt; len; i++) {
    +                    line = lines[i];
    +                    if (REGEX_START_COMMENT[syntaxtype].test(line)) {
    +                        commentlines = [];
    +
    +                        linenum = i + 1;
    +
    +                        while (i &lt; len &amp;&amp; (!REGEX_END_COMMENT[syntaxtype].test(line))) {
    +                            commentlines.push(line);
    +                            i++;
    +                            line = lines[i];
    +                        }
    +
    +                        // we can look ahead here if we need to guess the
    +                        // name/type like we do in the python version.
    +
    +                        // remove /**
    +                        commentlines.shift();
    +                        comment = commentlines.join(&#x27;\n&#x27;);
    +                        commentmap[filename] = commentmap[filename] || [];
    +                        commentmap[filename]
    +                            .push(this.handlecomment(comment, filename, linenum));
    +                    }
    +                }
    +            }, this);
    +
    +            this.commentmap = commentmap;
    +            return commentmap;
    +        },
    +
    +        /**
    +         * Processes all the tags in a single comment block
    +         * @method processblock
    +         * @param {Array} an array of the tag/text pairs
    +         */
    +        processblock: function (block) {
    +            var target = {},
    +                digestname,
    +                digester,
    +                host;
    +
    +            // Y.log(block);
    +            Y.each(block, function (tag) {
    +                var name = trim(tag.tag),
    +                    value = trim(tag.value),
    +                    ret;
    +
    +                //Convert empty values to a 1 for JSON data parsing later
    +                if (SHORT_TAGS[name] &amp;&amp; value === &#x27;&#x27;) {
    +                    value = 1;
    +                }
    +
    +                if (tag &amp;&amp; tag.tag) {
    +                    if (!(name in this.knowntags)) {
    +                        if (name in CORRECTIONS) {
    +                            this.warnings.push({
    +                                message: &#x27;replacing incorrect tag: &#x27; + name + &#x27; with &#x27; + CORRECTIONS[name],
    +                                line: stringlog(block)
    +                            });
    +                            Y.log(&#x27;replacing incorrect tag: &#x27; + name + &#x27; with &#x27; + CORRECTIONS[name] + &#x27;: &#x27; + stringlog(block), &#x27;warn&#x27;, &#x27;docparser&#x27;);
    +                            name = CORRECTIONS[name];
    +                        } else {
    +                            this.warnings.push({
    +                                message: &#x27;unknown tag: &#x27; + name,
    +                                line: stringlog(block)
    +                            });
    +                            Y.log(&#x27;unknown tag: &#x27; + name + &#x27;,&#x27; + stringlog(block), &#x27;warn&#x27;, &#x27;docparser&#x27;);
    +                        }
    +                    }
    +
    +                    digestname = name;
    +                    if (digestname in this.digesters) {
    +                        digester = this.digesters[digestname];
    +                        if (Lang.isString(digester)) {
    +                            digester = this.digesters[digester];
    +                        }
    +                        ret = digester.call(this, name, value, target, block);
    +                        host = host || ret;
    +                    } else {
    +                        target[name] = value;
    +                    }
    +                }
    +            }, this);
    +
    +            if (host) {
    +                Y.mix(host, target);
    +
    +                if (host.attributes &amp;&amp; target.attributes) {
    +                    host.attributes.push.apply(host.attributes, target.attributes);
    +                }
    +            } else if (target.attributes) {
    +                host = this.elements[this.get(CURRENT_ELEMENT)];
    +                if (host) {
    +                    if (target.deprecated) {
    +                        target.attributes.forEach(function (a) {
    +                            a.deprecated = target.deprecated;
    +
    +                            if (target.deprecationMessage) {
    +                                a.deprecationMessage = target.deprecationMessage;
    +                            }
    +                        });
    +                    }
    +                    host.attributes.push.apply(host.attributes, target.attributes);
    +                }
    +            } else {
    +                this.classitems.push(target);
    +                target.class = this.get(CURRENT_CLASS);
    +                target.module = this.get(CURRENT_MODULE);
    +
    +                host = this.get(CURRENT_SUBMODULE);
    +                if (host) {
    +                    target.submodule = host;
    +                }
    +
    +                host = this.get(CURRENT_NAMESPACE);
    +                if (host) {
    +                    target.namespace = host;
    +                }
    +            }
    +        },
    +
    +        /**
    +         * Transforms a map of filenames to arrays of comment blocks into a
    +         * JSON structure that represents the entire processed API doc info
    +         * and relationships between elements for the entire project.
    +         * @method transform
    +         * @param {object} commentmap The hash of files and parsed comment blocks
    +         * @return {object} The transformed data for the project
    +         */
    +        transform: function (commentmap) {
    +            var self = this,
    +                project = self.project = {},
    +                files = self.files = {},
    +                modules = self.modules = {},
    +                classes = self.classes = {},
    +                elements = self.elements = {},
    +                classitems = self.classitems = [];
    +
    +            self.data = {
    +                project: project,
    +                files: files,
    +                modules: modules,
    +                classes: classes,
    +                elements: elements,
    +                classitems: classitems
    +            };
    +
    +            commentmap = commentmap || self.commentmap;
    +
    +            // process
    +            Y.each(commentmap, function (blocks, file) {
    +                //Y.log(&#x27;transform: &#x27; + file, &#x27;info&#x27;, &#x27;docparser&#x27;);
    +                self.set(CURRENT_FILE, file);
    +                Y.each(blocks, function (block) {
    +                    self.processblock(block);
    +                });
    +            });
    +
    +            // cross reference
    +            Y.each(modules, function (module, name) {
    +                if (module.file) {
    +                    files[module.file].modules[name] = 1;
    +                }
    +                if (module.is_submodule) {
    +                    modules[module.module].submodules[name] = 1;
    +                }
    +                //Clean up processors
    +                delete module.mainName;
    +                delete module._main;
    +            });
    +
    +            Y.each(classes, function (clazz, name) {
    +                if (clazz.module) {
    +                    modules[clazz.module].classes[name] = 1;
    +                }
    +                //console.error(&#x27;------------------------------&#x27;);
    +                //console.error(clazz);
    +                //console.error(modules[clazz.submodule]);
    +                //console.error(&#x27;------------------------------&#x27;);
    +                if (clazz.submodule) {
    +                    modules[clazz.submodule].classes[name] = 1;
    +                    if (!modules[clazz.submodule].description) {
    +                        modules[clazz.submodule].description = clazz.description;
    +                    }
    +                }
    +
    +                if (clazz.file) {
    +                    files[clazz.file].classes[name] = 1;
    +                    if (modules[clazz.module]) {
    +                        modules[clazz.module].file = clazz.file;
    +                        modules[clazz.module].line = clazz.line;
    +                    }
    +                    if (modules[clazz.submodule]) {
    +                        modules[clazz.submodule].file = clazz.file;
    +                        modules[clazz.submodule].line = clazz.line;
    +                    }
    +                }
    +                if (clazz.uses &amp;&amp; clazz.uses.length) {
    +                    clazz.uses.forEach(function (u) {
    +                        var c = classes[u];
    +                        if (c) {
    +                            c.extension_for.push(clazz.name);
    +                        }
    +                    });
    +                }
    +            });
    +
    +            Y.each(elements, function (el, name) {
    +                if (el.module) {
    +                    modules[el.module].elements[name] = 1;
    +                }
    +
    +                if (el.submodule) {
    +                    modules[el.submodule].elements[name] = 1;
    +                    if (!modules[el.submodule].description) {
    +                        modules[el.submodule].description = el.description;
    +                    }
    +                }
    +            });
    +
    +            Y.each(classitems, function (v) {
    +                if (!v.itemtype) {
    +                    self.warnings.push({
    +                        message: &#x27;Missing item type&#x27; + (v.description ? &#x27;\n&#x27; + v.description : &#x27;&#x27;),
    +                        line: stringlog(v)
    +                    });
    +                    Y.log(&#x27;Missing item type: &#x27; + stringlog(v), &#x27;warn&#x27;, &#x27;DocParser&#x27;);
    +                    if (v.description) {
    +                        Y.log(&#x27;\t\t&#x27; + v.description, &#x27;warn&#x27;, &#x27;DocParser&#x27;);
    +                    }
    +                }
    +                if (v.itemtype === &#x27;property&#x27; &amp;&amp; v.params) {
    +                    v.subprops = v.params;
    +                    v.subprops.forEach(function (i) {
    +                        //Remove top level prop name from sub props (should have been done in the @param parser
    +                        i.name = i.name.replace(v.name + &#x27;.&#x27;, &#x27;&#x27;);
    +                    });
    +                    delete v.params;
    +                }
    +            });
    +
    +            Y.each(modules, function (mod) {
    +                if (!mod.file || !mod.line || !mod.name) {
    +                    console.log(&#x27;Failed to find lines for&#x27;, mod);
    +                }
    +            });
    +
    +            return self;
    +        },
    +
    +        /**
    +         * Extracts and transforms the filemap provided to constructor
    +         * @method parse
    +         * @param {Array} filemap A map of filenames to file content
    +         * @param {Array} dirmap A map of file names to directory name
    +         * @return {DocParser} this parser instance.  The total results
    +         * are available in parser.data.
    +         */
    +        parse: function (filemap, dirmap) {
    +            filemap = filemap || this.get(&#x27;filemap&#x27;);
    +            dirmap = dirmap || this.get(&#x27;dirmap&#x27;);
    +            return this.transform(this.extract(filemap, dirmap));
    +        }
    +    });
    +
    +    Y.DocParser = DocParser;
    +
    +}, &#x27;0.1.0&#x27;, {
    +    requires: [&#x27;base-base&#x27;]
    +});
    +
    +    </pre>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/files/lib_docview.js.html b/output/api/files/lib_docview.js.html
    new file mode 100644
    index 00000000..8eba0517
    --- /dev/null
    +++ b/output/api/files/lib_docview.js.html
    @@ -0,0 +1,178 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>lib/docview.js - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1 class="file-heading">File: lib/docview.js</h1>
    +
    +<div class="file">
    +    <pre class="code prettyprint linenums">
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +&#x27;use strict&#x27;;
    +
    +YUI.add(&#x27;docview&#x27;, function (Y) {
    +
    +    /*
    +    Selleck
    +    Copyright (c) 2011 Yahoo! Inc.
    +    Licensed under the BSD License.
    +    */
    +
    +    /**
    +    View class borrowed from [Selleck](https://github.com/rgrove/selleck)
    +    The view class is a **&#x60;handlebars&#x60;** template helper.
    +    @class DocView
    +    @constructor
    +    @param {Object} data Meta data to use in this template
    +    @param {String} templateName The name of the template file to render.
    +    **/
    +    function DocView(data, templateName) {
    +        this.templateName = templateName;
    +        Y.mix(this, data);
    +    }
    +
    +    DocView.prototype = {
    +        /**
    +         * **Mustache** &#x60;lambda&#x60; method for setting the HTML title
    +         * @method htmlTitle
    +         */
    +        htmlTitle: function () {
    +            var name = this.displayName || this.name,
    +                title = name;
    +
    +            if (title) {
    +                if (this.projectName) {
    +                    title += &#x27; - &#x27; + this.projectName;
    +                }
    +            } else {
    +                title = this.projectName;
    +            }
    +
    +            return title;
    +        },
    +
    +        /**
    +         * **Mustache** &#x60;lambda&#x60; method for setting the title
    +         * @method title
    +         */
    +        title: function () {
    +            var name = this.displayName || this.name,
    +                title = this.projectName;
    +
    +            if (name) {
    +                title += &#x27;: &#x27; + name;
    +            }
    +
    +            return title;
    +        }
    +    };
    +
    +    Y.DocView = DocView;
    +});
    +
    +    </pre>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/files/lib_files.js.html b/output/api/files/lib_files.js.html
    new file mode 100644
    index 00000000..8a3537de
    --- /dev/null
    +++ b/output/api/files/lib_files.js.html
    @@ -0,0 +1,598 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>lib/files.js - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1 class="file-heading">File: lib/files.js</h1>
    +
    +<div class="file">
    +    <pre class="code prettyprint linenums">
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +&#x27;use strict&#x27;;
    +
    +YUI.add(&#x27;files&#x27;, function (Y) {
    +
    +    /**
    +     * Ported fileutils methods from [Selleck](http://github.com/rgrove/selleck)
    +     * @class Files
    +     * @module yuidoc
    +     */
    +
    +    Y.Files = {};
    +
    +    /*
    +    Selleck
    +    Copyright (c) 2011 Yahoo! Inc.
    +    Licensed under the BSD License.
    +    */
    +
    +    var fs = require(&#x27;graceful-fs&#x27;);
    +    var fsPath = require(&#x27;path&#x27;);
    +    var useFS = (fs.exists) ? fs : fsPath;
    +
    +
    +    function exists(file, cb) {
    +        if (cb) {
    +            useFS.exists(file, cb);
    +        } else {
    +            return useFS.existsSync(file);
    +        }
    +    }
    +    Y.Files.exists = exists;
    +
    +
    +    /**
    +    Copy a directory from one location to another
    +    @method copyDirectory
    +    @param {Path} source The source directory
    +    @param {Path} dest The destination directory
    +    @param {Boolean} [overwrite=false] Whether or not to overwrite destination files
    +        if they already exist.
    +    @param {Function} callback The callback to be executed when complete.
    +    **/
    +    function copyDirectory(source, dest, overwrite, callback) {
    +        // Allow callback as third arg.
    +        if (typeof overwrite === &#x27;function&#x27;) {
    +            callback = overwrite;
    +            overwrite = null;
    +        }
    +
    +        fs.stat(source, afterSourceStat);
    +
    +        function afterSourceStat(err, stats) {
    +            if (err) {
    +                return callback(err);
    +            }
    +
    +            if (!stats.isDirectory()) {
    +                return callback(new Error(&#x27;Source is not a directory: &#x27; + source));
    +            }
    +
    +            fs.lstat(dest, afterDestStat);
    +        }
    +
    +        function afterDestStat(err, stats) {
    +            if (err &amp;&amp; err.code !== &#x27;ENOENT&#x27;) {
    +                return callback(err);
    +            }
    +
    +            if (stats) {
    +                // If the destination is a file or a link, either delete it or
    +                // bubble an error if overwrite isn&#x27;t true.
    +                if (stats.isFile() || stats.isSymbolicLink()) {
    +                    if (overwrite) {
    +                        deletePath(dest); // TODO: make this async
    +                    } else {
    +                        callback(new Error(&#x27;Destination already exists: &#x27; + dest));
    +                        return undefined;
    +                    }
    +                }
    +
    +                afterMkDir();
    +            } else {
    +                fs.mkdir(dest, &#x27;0755&#x27;, afterMkDir);
    +            }
    +        }
    +
    +        function afterMkDir(err) {
    +            if (err &amp;&amp; err.code !== &#x27;EEXIST&#x27;) {
    +                return callback(err);
    +            }
    +            fs.readdir(source, afterReadDir);
    +        }
    +
    +        function afterReadDir(err, files) {
    +            if (err) {
    +                return callback(err);
    +            }
    +
    +            var pending = files.length,
    +                filename;
    +
    +            if (!pending) {
    +                return callback();
    +            }
    +
    +            while ((filename = files.shift())) {
    +                copyPath(fsPath.join(source, filename), fsPath.join(dest, filename), overwrite, function (copyPathErr) {
    +                    if (copyPathErr) {
    +                        return callback(copyPathErr);
    +                    }
    +
    +                    pending -= 1;
    +
    +                    if (!pending) {
    +                        callback();
    +                    }
    +                });
    +            }
    +        }
    +    }
    +    Y.Files.copyDirectory = copyDirectory;
    +
    +    /**
    +    Copy a file from one location to another
    +    @method copyFile
    +    @param {Path} source The source file
    +    @param {Path} dest The destination file
    +    @param {Boolean} [overwrite=false] Whether or not to overwrite destination files
    +        if they already exist.
    +    @param {Callback} callback The callback to be executed when complete.
    +    @param {Error} callback.err The Error returned from Node
    +    **/
    +    function copyFile(source, dest, overwrite, callback) {
    +        // Allow callback as third arg.
    +        if (typeof overwrite === &#x27;function&#x27;) {
    +            callback = overwrite;
    +            overwrite = null;
    +        }
    +
    +        fs.lstat(source, function (err, sourceStats) {
    +            if (err) {
    +                return callback(err);
    +            }
    +
    +            if (!sourceStats.isFile()) {
    +                return callback(new Error(&#x27;Source is not a file: &#x27; + source));
    +            }
    +
    +            fs.lstat(dest, function (destStatsErr, destStats) {
    +                var rs;
    +
    +                if (destStatsErr &amp;&amp; destStatsErr.code !== &#x27;ENOENT&#x27;) {
    +                    return callback(destStatsErr);
    +                }
    +
    +                if (destStats) {
    +                    if (overwrite) {
    +                        deletePath(dest); // TODO: make this async
    +                    } else {
    +                        callback(new Error(&#x27;Destination already exists: &#x27; + dest));
    +                        return undefined;
    +                    }
    +                }
    +
    +                rs = fs.createReadStream(source);
    +                rs.pipe(fs.createWriteStream(dest, {
    +                    mode: &#x27;0655&#x27;
    +                }));
    +                rs.on(&#x27;end&#x27;, callback);
    +            });
    +        });
    +    }
    +    Y.Files.copyFile = copyFile;
    +
    +
    +    /**
    +    If _source_ is a file, copies it to _dest_. If it&#x27;s a directory, recursively
    +    copies it and all files and directories it contains to _dest_.
    +
    +    Note that when attempting to copy a file into a directory, you should specify
    +    the full path to the new file (including the new filename). Otherwise, it will
    +    be interpreted as an attempt to copy the _source_ file *over* the _dest_
    +    directory instead of *into* it.
    +
    +    Known issues:
    +    - Doesn&#x27;t preserve ownership or permissions on copied files/directories.
    +
    +    @method copyPath
    +    @param {String} source Source path.
    +    @param {String} dest Destination path.
    +    @param {Boolean} [overwrite=false] Whether or not to overwrite destination files
    +    if they already exist.
    +    @param {Callback} callback The callback to execute when completed.
    +    @param {Error} callback.err
    +    **/
    +    function copyPath(source, dest, overwrite, callback) {
    +        var sourceStats = statSync(source);
    +
    +        // Allow callback as third arg.
    +        if (typeof overwrite === &#x27;function&#x27;) {
    +            callback = overwrite;
    +            overwrite = null;
    +        }
    +
    +        if (!sourceStats) {
    +            callback(new Error(&#x27;Source not found: &#x27; + source));
    +            return;
    +        }
    +
    +        if (sourceStats.isFile()) {
    +            copyFile(source, dest, overwrite, callback);
    +        } else if (sourceStats.isDirectory()) {
    +            copyDirectory(source, dest, overwrite, callback);
    +        } else {
    +            callback(new Error(&#x27;Source is neither a file nor a directory: &#x27; + source));
    +        }
    +    }
    +    Y.Files.copyPath = copyPath;
    +
    +    // TODO: copySymbolicLink()?
    +
    +    /**
    +    If _path_ is a file, deletes it. If _path_ is a directory, recursively deletes
    +    it and all files and directories it contains.
    +
    +    This method is synchronous.
    +
    +    @method deletePath
    +    @param {String} path File or directory to delete.
    +    **/
    +    function deletePath(path) {
    +        var stats = fs.lstatSync(path);
    +
    +        if (stats.isFile() || stats.isSymbolicLink()) {
    +            fs.unlinkSync(path);
    +        } else if (stats.isDirectory()) {
    +            fs.readdirSync(path).forEach(function (filename) {
    +                deletePath(fsPath.join(path, filename));
    +            });
    +
    +            fs.rmdirSync(path);
    +        }
    +    }
    +    Y.Files.deletePath = deletePath;
    +
    +
    +    /**
    +    Check to see if this is a directory
    +
    +    @method isDirectory
    +    @param {Path} path The path to check
    +    @param {Boolean} [link=false] Also validate a symlink
    +    @return {Boolean} True if it is a directory
    +    **/
    +    function isDirectory(path, link) {
    +        var stat,
    +            result = false;
    +
    +        link = (link === false) ? false : true;
    +
    +        try {
    +            stat = fs.lstatSync(path);
    +            if (stat) {
    +                if (stat.isSymbolicLink() &amp;&amp; link) {
    +                    stat = fs.statSync(path);
    +                }
    +                result = stat.isDirectory();
    +            }
    +        } catch (e) {
    +            result = false;
    +        }
    +
    +        return result;
    +    }
    +    Y.Files.isDirectory = isDirectory;
    +
    +
    +    /**
    +    Check to see if this is a File
    +
    +    @method isFile
    +    @param {Path} path The path to check
    +    @param {Boolean} [link=false] Also validate a symlink
    +    @return {Boolean} True if it is a file
    +    **/
    +    function isFile(path, link) {
    +        var stat,
    +            result = false;
    +
    +        try {
    +            stat = fs.lstatSync(path);
    +            if (stat) {
    +                if (stat.isSymbolicLink() &amp;&amp; link) {
    +                    stat = fs.statSync(path);
    +                }
    +                result = stat.isFile();
    +            }
    +        } catch (e) {
    +            result = false;
    +        }
    +
    +        return result;
    +    }
    +    Y.Files.isFile = isFile;
    +
    +
    +    /**
    +    Check to see if this is a SymLink
    +
    +    @method isSymbolicLink
    +    @param {Path} path The path to check
    +    @return {Boolean} True if it is a link
    +    **/
    +    function isSymbolicLink(path) {
    +        var stats = lstatSync(path);
    +        return stats ? stats.isSymbolicLink() : false;
    +    }
    +    Y.Files.isSymbolicLink = isSymbolicLink;
    +
    +
    +    /**
    +    Like &#x60;fs.lstatSync()&#x60;, but returns &#x60;null&#x60; instead of throwing when _path_
    +    doesn&#x27;t exist. Will still throw on other types of errors.
    +
    +    @method lstatSync
    +    @param {String} path Path to stat.
    +    @return {fs.Stats|null} &#x60;fs.Stats&#x60; object, or &#x60;null&#x60; if _path_ doesn&#x27;t exist.
    +    **/
    +    function lstatSync(path) {
    +        try {
    +            return fs.lstatSync(path);
    +        } catch (ex) {
    +            if (ex.code === &#x27;ENOENT&#x27;) {
    +                return null;
    +            }
    +
    +            throw ex;
    +        }
    +    }
    +    Y.Files.lstatSync = lstatSync;
    +
    +
    +    /**
    +    Like &#x60;fs.statSync()&#x60;, but returns &#x60;null&#x60; instead of throwing when _path_
    +    doesn&#x27;t exist. Will still throw on other types of errors.
    +
    +    @method statSync
    +    @param {String} path Path to stat.
    +    @return {fs.Stats|null} &#x60;fs.Stats&#x60; object, or &#x60;null&#x60; if _path_ doesn&#x27;t exist.
    +    **/
    +    function statSync(path) {
    +        try {
    +            return fs.statSync(path);
    +        } catch (ex) {
    +            if (ex.code === &#x27;ENOENT&#x27;) {
    +                return null;
    +            }
    +
    +            throw ex;
    +        }
    +    }
    +    Y.Files.statSync = statSync;
    +
    +    /**
    +    Copy the theme assets directory
    +
    +    @method copyAssets
    +    @param {Path} from The source directory
    +    @param {Path} dest The destination directory
    +    @param {Boolean} deleteFirst Should the directory be deleted if it exists
    +    @param {Function} callback The callback to be executed
    +    */
    +    function copyAssets() {
    +        var args = Array.prototype.slice.call(arguments),
    +            callback = args.pop(),
    +            from = args.shift(),
    +            to = args.shift(),
    +            deleteFirst = args.shift();
    +
    +        if (from[0] === from[1]) {
    +            if (isDirectory(from[0])) {
    +                if (deleteFirst &amp;&amp; isDirectory(to)) {
    +                    deletePath(to);
    +                }
    +
    +                copyPath(from[0], to, true, callback);
    +            } else {
    +                callback();
    +            }
    +        } else {
    +            if (isDirectory(from[0])) {
    +                if (deleteFirst &amp;&amp; isDirectory(to)) {
    +                    deletePath(to);
    +                }
    +
    +                copyPath(from[0], to, true, function () {
    +                    if (isDirectory(from[1])) {
    +                        copyPath(from[1], to, true, callback);
    +                    } else {
    +                        callback();
    +                    }
    +                });
    +            } else {
    +                callback();
    +            }
    +
    +        }
    +    }
    +    Y.Files.copyAssets = copyAssets;
    +
    +
    +    /**
    +    Helper method for getting JSON data from a local file
    +
    +    @method getJSON
    +    @param {Path} filename The filename to parse JSON from
    +    @return {Object} The JSON data
    +    **/
    +    Y.Files.getJSON = function (filename) {
    +        var data = {};
    +        if (exists(filename)) {
    +            data = JSON.parse(fs.readFileSync(filename, &#x27;utf8&#x27;));
    +        }
    +        return data;
    +    };
    +
    +    /**
    +    Helper method for writing files to disk. It wraps the NodeJS file API
    +
    +    @method writeFile
    +    @param {Path} file The filename to write to
    +    @param {String} data The data to write
    +    @param {Callback} callback*
    +    **/
    +    function writeFile(file, data, cb) {
    +        var out,
    +            args = arguments,
    +            flags = {
    +                flags: &#x27;w&#x27;,
    +                encoding: Y.charset,
    +                mode: &#x27;0644&#x27;
    +            };
    +
    +        if (cb) {
    +            fs.writeFile(file, data, flags, function (err) {
    +                if (err &amp;&amp; err.message.match(/^EMFILE, Too many open files/)) {
    +                    Y.log(&#x27;Writefile failed, too many open files (&#x27; + args[0] + &#x27;). Trying again.&#x27;, &#x27;warn&#x27;, &#x27;files&#x27;);
    +                    writeFile.timer++;
    +                    Y.later(writeFile.timer, Y, writeFile, args);
    +                    return;
    +                }
    +                cb();
    +            });
    +        } else {
    +            out = fs.createWriteStream(file, flags);
    +            out.write(data);
    +            out.end();
    +        }
    +    }
    +    writeFile.timer = 100;
    +
    +    Y.Files.writeFile = writeFile;
    +
    +
    +    function readFile(file, enc, cb) {
    +        var args = arguments;
    +        fs.readFile(file, enc, function (err, data) {
    +            if (err &amp;&amp; err.message.match(/^EMFILE, Too many open files/)) {
    +                Y.log(&#x27;Readfile failed, too many open files (&#x27; + args[0] + &#x27;). Trying again.&#x27;, &#x27;warn&#x27;, &#x27;files&#x27;);
    +                readFile.timer++;
    +                Y.later(readFile.timer, Y, readFile, args);
    +                return;
    +            }
    +            cb(err, data);
    +        });
    +    }
    +    readFile.timer = 100;
    +
    +    Y.Files.readFile = readFile;
    +
    +});
    +
    +    </pre>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/files/lib_help.js.html b/output/api/files/lib_help.js.html
    new file mode 100644
    index 00000000..9ece603f
    --- /dev/null
    +++ b/output/api/files/lib_help.js.html
    @@ -0,0 +1,193 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>lib/help.js - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1 class="file-heading">File: lib/help.js</h1>
    +
    +<div class="file">
    +    <pre class="code prettyprint linenums">
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +&#x27;use strict&#x27;;
    +
    +YUI.add(&#x27;help&#x27;, function (Y) {
    +
    +    /**
    +     * Shows the help text
    +     * @module yuidoc
    +     * @class Help
    +     */
    +
    +    /**
    +     * The help text to display
    +     * @private
    +     * @property help
    +     * @type Array
    +     */
    +    var help = [
    +        &#x27;&#x27;,
    +        &#x27;YUI Doc generates API documentation from a modified JavaDoc syntax.&#x27;,
    +        &#x27;&#x27;,
    +        &#x27;Current version ({VERSION})&#x27;,
    +        &#x27;&#x27;,
    +        &#x27;Usage: yuidoc &lt;options&gt; &lt;input path&gt;&#x27;,
    +        &#x27;&#x27;,
    +        &#x27;Common Options:&#x27;,
    +        &#x27;  -c, --config, --configfile &lt;filename&gt;  A JSON config file to provide configuration data.&#x27;,
    +        &#x27;           You can also create a yuidoc.json file and place it&#x27;,
    +        &#x27;           anywhere under your source tree and YUI Doc will find it&#x27;,
    +        &#x27;           and use it.&#x27;,
    +        &#x27;  -e, --extension &lt;comma sep list of file extensions&gt; The list of file extensions to parse &#x27;,
    +        &#x27;           for api documentation. (defaults to .js)&#x27;,
    +        &#x27;  -x, --exclude &lt;comma sep list of directories&gt; Directories to exclude from parsing &#x27;,
    +        &#x27;           (defaults to \&#x27;.DS_Store,.svn,CVS,.git,build_rollup_tmp,build_tmp\&#x27;)&#x27;,
    +        &#x27;  -v, --version Show the current YUIDoc version&#x27;,
    +        &#x27;  --project-version Set the doc version for the template&#x27;,
    +        &#x27;  -N, --no-color Turn off terminal colors (for automation)&#x27;,
    +        &#x27;  -C, --no-code Turn off code generation (don\&#x27;t include source files in output)&#x27;,
    +        &#x27;  -n, --norecurse Do not recurse directories (default is to recurse)&#x27;,
    +        &#x27;  --no-sort Do not alphabetical sorting of attributes, events, methods, and properties&#x27;,
    +        &#x27;  -S, --selleck Look for Selleck component data and attach to API meta data&#x27;,
    +        &#x27;  -V, --view Dump the Handlebars.js view data instead of writing template files&#x27;,
    +        &#x27;  -p, --parse-only Only parse the API docs and create the JSON data, do not render templates&#x27;,
    +        &#x27;  -o, --outdir &lt;directory path&gt; Path to put the generated files (defaults to ./out)&#x27;,
    +        &#x27;  -t, --themedir &lt;directory path&gt; Path to a custom theme directory containing Handlebars templates&#x27;,
    +        &#x27;  -H, --helpers &lt;comma separated list of paths to files&gt; Require these file and add Handlebars helpers. See docs for more information&#x27;,
    +        &#x27;  --charset CHARSET Use this as the default charset for all file operations. Defaults to \&#x27;utf8\&#x27;&#x27;,
    +        &#x27;  -h, --help Show this help&#x27;,
    +        &#x27;  -q, --quiet Supress logging output&#x27;,
    +        &#x27;  -T, --theme &lt;simple|default&gt; Choose one of the built in themes (default is default)&#x27;,
    +        &#x27;  --syntaxtype &lt;js|coffee&gt; Choose comment syntax type (default is js)&#x27;,
    +        &#x27;  --server &lt;port&gt; Fire up the YUIDoc server for faster API doc developement. Pass optional port to listen on. (default is 3000)&#x27;,
    +        &#x27;  --lint Lint your docs, will print parser warnings and exit code 1 if there are any&#x27;,
    +        &#x27;&#x27;,
    +        &#x27;  &lt;input path&gt; Supply a list of paths (shell globbing is handy here)&#x27;,
    +        &#x27;&#x27;
    +    ].join(&#x27;\n&#x27;);
    +
    +    /**
    +     * Render the help message as a string
    +     * @method renderHelp
    +     * @return {String} The help screen to display
    +     */
    +    Y.renderHelp = function () {
    +        return Y.Lang.sub(help, {
    +            VERSION: Y.packageInfo.version
    +        });
    +    };
    +    /**
    +     * Display the help message, write it to the screen and exit
    +     * @method showHelp
    +     */
    +    Y.showHelp = function () {
    +        console.error(Y.renderHelp());
    +        process.exit(0); //Shouldn&#x27;t exit one on help
    +    };
    +});
    +
    +    </pre>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/files/lib_index.js.html b/output/api/files/lib_index.js.html
    new file mode 100644
    index 00000000..793184c7
    --- /dev/null
    +++ b/output/api/files/lib_index.js.html
    @@ -0,0 +1,234 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>lib/index.js - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1 class="file-heading">File: lib/index.js</h1>
    +
    +<div class="file">
    +    <pre class="code prettyprint linenums">
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +&#x27;use strict&#x27;;
    +
    +/**
    +Module creates the YUI instance with the required modules, uses them and exports the **Y** to be used
    +by the _CLI class_ or by extenders: &#x60;require(&#x27;yuidocjs&#x27;);&#x60;
    +You can use it like this:
    +
    +    var options = {
    +        paths: [ &#x27;./lib&#x27; ],
    +        outdir: &#x27;./out&#x27;
    +    };
    +
    +    var Y = require(&#x27;yuidocjs&#x27;);
    +    var json = (new Y.YUIDoc(options)).run();
    +
    +@class Main
    +@exports {YUI} Y A YUI instance
    +@module yuidoc
    +*/
    +//Hacking in debug support
    +var args = process.argv.slice(2);
    +var debug = false;
    +
    +args.forEach(function (item) {
    +    if (item.toLowerCase() === &#x27;--debug&#x27;) {
    +        debug = true;
    +    }
    +});
    +
    +var YUI = require(&#x27;yui&#x27; + (debug ? &#x27;/debug&#x27; : &#x27;&#x27;)).YUI;
    +var path = require(&#x27;path&#x27;);
    +var fs = require(&#x27;graceful-fs&#x27;);
    +var metaPath = path.join(__dirname, &#x27;../&#x27;, &#x27;package.json&#x27;);
    +
    +function log (message, level) {
    +    if (!message || !level || typeof console[level] !== &#x27;function&#x27;) {
    +        return;
    +    }
    +
    +    if (typeof message === &#x27;object&#x27;) {
    +        message = JSON.stringify(message);
    +    }
    +
    +    console[level](&#x27;%s: %s&#x27;, level, message);
    +}
    +
    +process.on(&#x27;uncaughtException&#x27;, function (msg) {
    +    var meta = JSON.parse(fs.readFileSync(metaPath)),
    +        inst = YUI(),
    +        useColor = (Y ? Y.config.useColor : false);
    +
    +    inst.applyConfig({
    +        debug: true,
    +        logFn: log,
    +        useColor: useColor
    +    });
    +
    +    inst.log(&#x27;--------------------------------------------------------------------------&#x27;, &#x27;error&#x27;);
    +    inst.log(&#x27;An uncaught YUIDoc error has occurred, stack trace given below&#x27;, &#x27;error&#x27;);
    +    inst.log(&#x27;--------------------------------------------------------------------------&#x27;, &#x27;error&#x27;);
    +    inst.log(msg.stack || msg.message || msg, &#x27;error&#x27;);
    +    inst.log(&#x27;--------------------------------------------------------------------------&#x27;, &#x27;error&#x27;);
    +    inst.log(&#x27;Node.js version: &#x27; + process.version, &#x27;error&#x27;);
    +    inst.log(&#x27;YUI version: &#x27; + YUI.version, &#x27;error&#x27;);
    +    inst.log(&#x27;YUIDoc version: &#x27; + meta.version, &#x27;error&#x27;);
    +    inst.log(&#x27;Please file all tickets here: &#x27; + meta.bugs.url, &#x27;error&#x27;);
    +    inst.log(&#x27;--------------------------------------------------------------------------&#x27;, &#x27;error&#x27;);
    +
    +    process.exit(1);
    +});
    +
    +var Y = YUI({
    +    modules: {
    +        help: {
    +            fullpath: path.join(__dirname, &#x27;help.js&#x27;)
    +        },
    +        options: {
    +            fullpath: path.join(__dirname, &#x27;options.js&#x27;)
    +        },
    +        docparser: {
    +            fullpath: path.join(__dirname, &#x27;docparser.js&#x27;),
    +            requires: [&#x27;base-base&#x27;, &#x27;json-stringify&#x27;]
    +        },
    +        yuidoc: {
    +            fullpath: path.join(__dirname, &#x27;yuidoc.js&#x27;)
    +        },
    +        &#x27;doc-builder&#x27;: {
    +            fullpath: path.join(__dirname, &#x27;builder.js&#x27;),
    +            requires: [&#x27;parallel&#x27;, &#x27;handlebars&#x27;]
    +        },
    +        utils: {
    +            fullpath: path.join(__dirname, &#x27;utils.js&#x27;)
    +        },
    +        files: {
    +            fullpath: path.join(__dirname, &#x27;files.js&#x27;)
    +        },
    +        docview: {
    +            fullpath: path.join(__dirname, &#x27;docview.js&#x27;)
    +        },
    +        server: {
    +            fullpath: path.join(__dirname, &#x27;server.js&#x27;)
    +        },
    +        project: {
    +            fullpath: path.join(__dirname, &#x27;project.js&#x27;)
    +        }
    +    },
    +    logExclude: {
    +        attribute: true,
    +        handlebars: true
    +    },
    +    logFn: log,
    +    useSync: true
    +}).use(&#x27;utils&#x27;, &#x27;docparser&#x27;, &#x27;yuidoc&#x27;, &#x27;doc-builder&#x27;, &#x27;docview&#x27;, &#x27;files&#x27;, &#x27;help&#x27;, &#x27;options&#x27;, &#x27;server&#x27;, &#x27;project&#x27;);
    +
    +Y.packageInfo = Y.Files.getJSON(metaPath);
    +
    +module.exports = Y;
    +
    +    </pre>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/files/lib_options.js.html b/output/api/files/lib_options.js.html
    new file mode 100644
    index 00000000..ee88b586
    --- /dev/null
    +++ b/output/api/files/lib_options.js.html
    @@ -0,0 +1,290 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>lib/options.js - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1 class="file-heading">File: lib/options.js</h1>
    +
    +<div class="file">
    +    <pre class="code prettyprint linenums">
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +&#x27;use strict&#x27;;
    +
    +YUI.add(&#x27;options&#x27;, function (Y) {
    +
    +    var path = require(&#x27;path&#x27;);
    +
    +    /**
    +     * Handles argument parsing
    +     * @module yuidoc
    +     * @class Options
    +     */
    +
    +    /**
    +     * Parses arguments and returns an Object of config options
    +     * @method Options
    +     * @param {Array} args Arguments to parse
    +     * @return {Object} The config object
    +     */
    +    Y.Options = function (args) {
    +        var options = {
    +            port: 3000,
    +            nocode: false
    +        };
    +
    +        while (args.length &gt; 0) {
    +            var v = args.shift();
    +            // options.* defined in ./builder.js
    +            switch (v) {
    +            case &#x27;--lint&#x27;:
    +                options.lint = true;
    +                options.parseOnly = true;
    +                options.writeJSON = false;
    +                options.quiet = true;
    +                break;
    +            case &#x27;--debug&#x27;:
    +                Y.applyConfig({
    +                    debug: true,
    +                    filter: &#x27;debug&#x27;
    +                });
    +                break;
    +            case &#x27;--charset&#x27;:
    +                Y.charset = args.shift() || &#x27;utf8&#x27;;
    +                Y.log(&#x27;Setting default charset to &#x27; + Y.charset, &#x27;yuidoc&#x27;, &#x27;warn&#x27;);
    +                break;
    +            case &#x27;-c&#x27;:
    +            case &#x27;--config&#x27;:
    +            case &#x27;--configfile&#x27;:
    +                options.configfile = args.shift();
    +                break;
    +            case &#x27;-e&#x27;:
    +            case &#x27;--extension&#x27;:
    +                options.extension = args.shift();
    +                break;
    +            case &#x27;-x&#x27;:
    +            case &#x27;--exclude&#x27;:
    +                options.exclude = args.shift();
    +                break;
    +            case &#x27;-v&#x27;:
    +            case &#x27;--version&#x27;:
    +                console.error(Y.packageInfo.version);
    +                process.exit(1);
    +                break;
    +            case &#x27;--project-version&#x27;:
    +                options.version = args.shift();
    +                break;
    +            case &#x27;-N&#x27;:
    +            case &#x27;--no-color&#x27;:
    +                Y.config.useColor = false;
    +                options.nocolor = true;
    +                break;
    +            case &#x27;-D&#x27;:
    +            case &#x27;--no-delete-out&#x27;:
    +                options.nodeleteout = true;
    +                break;
    +            case &#x27;-C&#x27;:
    +            case &#x27;--no-code&#x27;:
    +                options.nocode = true;
    +                break;
    +            case &#x27;-n&#x27;:
    +            case &#x27;--norecurse&#x27;:
    +                options.norecurse = true;
    +                break;
    +            case &#x27;-S&#x27;:
    +            case &#x27;--selleck&#x27;:
    +                options.selleck = true;
    +                break;
    +            case &#x27;-V&#x27;:
    +            case &#x27;--view&#x27;:
    +                options.dumpview = true;
    +                break;
    +            case &#x27;-p&#x27;:
    +            case &#x27;--parse-only&#x27;:
    +                options.parseOnly = true;
    +                break;
    +            case &#x27;-o&#x27;:
    +            case &#x27;--outdir&#x27;:
    +                options.outdir = args.shift();
    +                break;
    +            case &#x27;-t&#x27;:
    +            case &#x27;--themedir&#x27;:
    +                options.themedir = args.shift();
    +                break;
    +            case &#x27;--server&#x27;:
    +                options.server = true;
    +                var a = args.shift();
    +                var p = parseInt(a, 10);
    +                if (isNaN(p) || !p) {
    +                    if (a) {
    +                        args.unshift(a);
    +                    }
    +                    Y.log(&#x27;Failed to extract port, setting to the default :3000&#x27;, &#x27;warn&#x27;, &#x27;yuidoc&#x27;);
    +                } else {
    +                    options.port = p;
    +                }
    +                break;
    +            case &#x27;-h&#x27;:
    +            case &#x27;--help&#x27;:
    +                Y.showHelp();
    +                break;
    +            case &#x27;-H&#x27;:
    +            case &#x27;--helpers&#x27;:
    +                var list = args.shift();
    +                if (list) {
    +                    options.helpers = list.split(&#x27;,&#x27;);
    +                } else {
    +                    throw (&#x27;Failed to pass a helper file.&#x27;);
    +                }
    +                break;
    +            case &#x27;-T&#x27;:
    +            case &#x27;--theme&#x27;:
    +                var theme = args.shift();
    +                options.themedir = path.join(__dirname, &#x27;../&#x27;, &#x27;themes&#x27;, theme);
    +                break;
    +            case &#x27;-q&#x27;:
    +            case &#x27;--quiet&#x27;:
    +                options.quiet = true;
    +                break;
    +            case &#x27;--syntaxtype&#x27;:
    +                options.syntaxtype = args.shift();
    +                break;
    +            case &#x27;--tab-to-space&#x27;:
    +                options.tabtospace = parseInt(args.shift(), 10);
    +                if (typeof options.tabtospace === &#x27;number&#x27;) {
    +                    options.tabspace = &#x27;&#x27;;
    +                    for (var s = 0; s &lt; options.tabtospace; s++) {
    +                        options.tabspace += &#x27; &#x27;;
    +                    }
    +                }
    +                break;
    +            case &#x27;--no-sort&#x27;:
    +                options.dontsortfields = true;
    +                break;
    +            default:
    +                if (!options.paths) {
    +                    options.paths = [];
    +                }
    +                if (v &amp;&amp; v.indexOf(&#x27;-&#x27;) === 0) {
    +                    throw (&#x27;Unknown option: &#x27; + v);
    +                }
    +                options.paths.push(v);
    +            }
    +        }
    +
    +        if (options.quiet) {
    +            Y.applyConfig({
    +                debug: false
    +            });
    +        }
    +
    +        return options;
    +    };
    +
    +});
    +
    +    </pre>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/files/lib_project.js.html b/output/api/files/lib_project.js.html
    new file mode 100644
    index 00000000..c500ce25
    --- /dev/null
    +++ b/output/api/files/lib_project.js.html
    @@ -0,0 +1,180 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>lib/project.js - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1 class="file-heading">File: lib/project.js</h1>
    +
    +<div class="file">
    +    <pre class="code prettyprint linenums">
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +&#x27;use strict&#x27;;
    +
    +YUI.add(&#x27;project&#x27;, function (Y) {
    +
    +    Y.Project = {
    +        mix: function (json, options) {
    +            if (json.project) {
    +                options = Y.merge(options, json.project);
    +            }
    +
    +            if (options.title &amp;&amp; !options.name) {
    +                options.name = options.title;
    +            }
    +
    +            return options;
    +        },
    +        init: function (options) {
    +            var project = {};
    +            if (options.configfile) {
    +                project = Y.Files.getJSON(options.configfile);
    +            } else {
    +                Y.log(&#x27;Scanning for yuidoc.json file.&#x27;, &#x27;info&#x27;, &#x27;yuidoc&#x27;);
    +                project = Y.getProjectData();
    +                if (!project) {
    +                    project = {};
    +                }
    +            }
    +
    +            if (project.options &amp;&amp; Object.keys(project.options).length) {
    +                options = Y.merge(project.options, options);
    +                delete project.options;
    +                options.project = project;
    +            }
    +
    +            if (options.version &amp;&amp; options.project) {
    +                options.project.version = options.version;
    +                delete options.version;
    +            }
    +
    +            if (!options.outdir) {
    +                options.outdir = &#x27;./out&#x27;;
    +            }
    +
    +            options.paths = Y.validatePaths(options.paths, options.ignorePaths);
    +
    +            if (!options.paths.length) {
    +                Y.log(&#x27;Paths argument was empty&#x27;, &#x27;warn&#x27;, &#x27;yuidoc&#x27;);
    +                Y.showHelp();
    +                process.exit(1);
    +            }
    +
    +            if (typeof options.tabtospace === &#x27;number&#x27;) {
    +                options.tabspace = &#x27;&#x27;;
    +                for (var s = 0; s &lt; options.tabtospace; s++) {
    +                    options.tabspace += &#x27; &#x27;;
    +                }
    +            }
    +
    +            return options;
    +        }
    +    };
    +
    +});
    +
    +    </pre>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/files/lib_server.js.html b/output/api/files/lib_server.js.html
    new file mode 100644
    index 00000000..068b4cb1
    --- /dev/null
    +++ b/output/api/files/lib_server.js.html
    @@ -0,0 +1,349 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>lib/server.js - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1 class="file-heading">File: lib/server.js</h1>
    +
    +<div class="file">
    +    <pre class="code prettyprint linenums">
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +&#x27;use strict&#x27;;
    +
    +var path = require(&#x27;path&#x27;);
    +var express = require(&#x27;express&#x27;);
    +
    +YUI.add(&#x27;server&#x27;, function (Y) {
    +
    +    /**
    +     * Provides the &#x60;--server&#x60; server option for YUIDoc
    +     * @class Server
    +     * @module yuidoc
    +     */
    +    var Server = {
    +        /**
    +         * Cache for external mixed in data.
    +         * @property _externalData
    +         * @private
    +         * @type Object
    +         */
    +        _externalData: null,
    +        /**
    +         * Middleware to parse the API docs per request
    +         * @method parse
    +         * @param {Request} req Express request object
    +         * @param {Response} res Express response object
    +         * @param {Function} next Express next callback
    +         */
    +        parse: function (req, res, next) {
    +            var json = (new Y.YUIDoc(Server.options)).run();
    +            Server.options = Y.Project.mix(json, Server.options);
    +            Server.builder = new Y.DocBuilder(Server.options, json);
    +            if (Server._externalData) {
    +                Server.options.externalData = Server._externalData;
    +                Server.builder._mixExternal();
    +            }
    +
    +            next();
    +        },
    +        /**
    +         * Create the routes used to serve YUIDoc files dynamically
    +         * @method routes
    +         */
    +        routes: function () {
    +            var app = Server.app;
    +
    +            app.get(&#x27;/&#x27;, Server.parse, function (req, res) {
    +                Server.home(req, res);
    +            });
    +            app.get(&#x27;/api.js&#x27;, function (req, res) {
    +                Server.builder.renderAPIMeta(function (js) {
    +                    res.contentType(&#x27;.js&#x27;);
    +                    res.send(js);
    +                });
    +            });
    +
    +
    +            app.get(&#x27;/classes/:class.html&#x27;, Server.parse, function (req, res, next) {
    +                Server.clazz(req, res, next);
    +            });
    +
    +            app.get(&#x27;/modules/:module.html&#x27;, Server.parse, function (req, res, next) {
    +                Server.module(req, res, next);
    +            });
    +
    +            app.get(&#x27;/files/:file.html&#x27;, Server.parse, function (req, res, next) {
    +                Server.files(req, res, next);
    +            });
    +
    +            //These routes are special catch routes..
    +
    +            app.get(&#x27;//api.js&#x27;, function (req, res) {
    +                res.redirect(&#x27;/api.js&#x27;);
    +            });
    +            app.get(&#x27;//classes/:class.html&#x27;, Server.parse, function (req, res, next) {
    +                Server.clazz(req, res, next);
    +            });
    +
    +            app.get(&#x27;//modules/:module.html&#x27;, Server.parse, function (req, res, next) {
    +                Server.module(req, res, next);
    +            });
    +
    +            app.get(&#x27;//files/:file.html&#x27;, Server.parse, function (req, res, next) {
    +                Server.files(req, res, next);
    +            });
    +
    +            app.get(&#x27;*&#x27;, function (req, res) {
    +                var type = req.url.split(&#x27;/&#x27;)[1],
    +                    html = [&#x27;&lt;h1&gt;Item Not Found in internal meta-data&lt;/h1&gt;&#x27;];
    +
    +                if (type === &#x27;class&#x27;) {
    +                    type = &#x27;classes&#x27;;
    +                }
    +                if (Server.builder &amp;&amp; Server.builder.data &amp;&amp; Server.builder.data[type]) {
    +                    if (Object.keys(Server.builder.data[type]).length) {
    +                        html.push(&#x27;&lt;p&gt;But I know about these? Misname your module?&lt;/p&gt;&#x27;);
    +                        html.push(&#x27;&lt;ul&gt;&#x27;);
    +                        Object.keys(Server.builder.data[type]).forEach(function (item) {
    +                            html.push(&#x27;&lt;li&gt;&lt;a href=&quot;../&#x27; + path.dirname(req.url) + &#x27;/&#x27; + item + &#x27;.html&quot;&gt;&#x27; + item + &#x27;&lt;/a&gt;&lt;/li&gt;&#x27;);
    +                        });
    +                        html.push(&#x27;&lt;/ul&gt;&#x27;);
    +                    }
    +                }
    +
    +
    +                res.status(404).send(html.join(&#x27;\n&#x27;));
    +            });
    +
    +        },
    +        /**
    +         * &#x60;/files&#x60; endpoint
    +         * @method files
    +         * @param {Request} req Express request object
    +         * @param {Response} res Express response object
    +         */
    +        files: function (req, res, next) {
    +            var fileName = req.params.file,
    +                data;
    +            Object.keys(Server.builder.data.files).forEach(function (file) {
    +                if (fileName === Server.builder.filterFileName(file)) {
    +                    data = Server.builder.data.files[file];
    +                }
    +            });
    +
    +            if (!data) {
    +                return next();
    +            }
    +
    +            Y.log(&#x27;Serving /files/&#x27; + data.name, &#x27;info&#x27;, &#x27;server&#x27;);
    +
    +
    +            Server.builder.renderFile(function (html) {
    +                res.send(html);
    +            }, data, (req.xhr ? &#x27;xhr&#x27; : &#x27;main&#x27;));
    +        },
    +        /**
    +         * &#x60;/classes&#x60; endpoint
    +         * @method clazz
    +         * @param {Request} req Express request object
    +         * @param {Response} res Express response object
    +         */
    +        clazz: function (req, res, next) {
    +            var className = req.params.class;
    +            Y.log(&#x27;Serving /classes/&#x27; + className + &#x27;.html&#x27;, &#x27;info&#x27;, &#x27;server&#x27;);
    +            if (!Server.builder.data.classes[className]) {
    +                return next();
    +            }
    +            Server.builder.renderClass(function (html) {
    +                res.send(html);
    +            }, Server.builder.data.classes[className], (req.xhr ? &#x27;xhr&#x27; : &#x27;main&#x27;));
    +        },
    +        /**
    +         * &#x60;/modules&#x60; endpoint
    +         * @method modules
    +         * @param {Request} req Express request object
    +         * @param {Response} res Express response object
    +         */
    +        module: function (req, res, next) {
    +            var modName = req.params.module;
    +            Y.log(&#x27;Serving /modules/&#x27; + modName + &#x27;.html&#x27;, &#x27;info&#x27;, &#x27;server&#x27;);
    +            if (!Server.builder.data.modules[modName]) {
    +                return next();
    +            }
    +            Server.builder.renderModule(function (html) {
    +                res.send(html);
    +            }, Server.builder.data.modules[modName], (req.xhr ? &#x27;xhr&#x27; : &#x27;main&#x27;));
    +        },
    +        /**
    +         * &#x60;/&#x60; endpoint
    +         * @method home
    +         * @param {Request} req Express request object
    +         * @param {Response} res Express response object
    +         */
    +        home: function (req, res) {
    +            Y.log(&#x27;Serving index.html&#x27;, &#x27;info&#x27;, &#x27;server&#x27;);
    +            Server.builder.renderIndex(function (html) {
    +                res.send(html);
    +            });
    +        },
    +        /**
    +         * Creates the Express server and prep&#x27;s YUI for serving
    +         * @method init
    +         */
    +        init: function () {
    +            var stat;
    +
    +            Server.app = express();
    +            //console.log(Server.options);
    +            stat = Server.options.themedir || path.join(__dirname, &#x27;../&#x27;, &#x27;themes&#x27;, &#x27;default&#x27;);
    +            Server.app.use(express.static(stat));
    +            Server.routes();
    +            Server.app.listen(Server.options.port);
    +
    +            Y.log(&#x27;Starting server: http:/&#x27; + &#x27;/127.0.0.1:&#x27; + Server.options.port, &#x27;info&#x27;, &#x27;server&#x27;);
    +        },
    +        /**
    +         * Start the server with the supplied options.
    +         * @method start
    +         * @param {Object} options Server options
    +         */
    +        start: function (options) {
    +            options = Y.Project.init(options);
    +            Server.options = options;
    +
    +            Server.options.cacheTemplates = false; //Don&#x27;t cache the Handlebars templates
    +            Server.options.writeJSON = false; //Don&#x27;t write the JSON file out
    +
    +            Y.config.logExclude.yuidoc = true;
    +            Y.config.logExclude.docparser = true;
    +            Y.config.logExclude.builder = true;
    +
    +            if (Server.options.external) {
    +                Y.log(&#x27;Fetching external data, this may take a minute&#x27;, &#x27;warn&#x27;, &#x27;server&#x27;);
    +                var json, builder;
    +
    +                json = (new Y.YUIDoc(Server.options)).run();
    +                Server.options = Y.Project.mix(json, Server.options);
    +
    +                builder = new Y.DocBuilder(Server.options, json);
    +                builder.mixExternal(function () {
    +                    Y.log(&#x27;External data fetched, launching server..&#x27;, &#x27;info&#x27;, &#x27;server&#x27;);
    +                    Server._externalData = builder.options.externalData;
    +                    Server.init();
    +                });
    +
    +            } else {
    +                Server.init();
    +            }
    +        }
    +    };
    +
    +    Y.Server = Server;
    +});
    +
    +    </pre>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/files/lib_utils.js.html b/output/api/files/lib_utils.js.html
    new file mode 100644
    index 00000000..cf41dbcf
    --- /dev/null
    +++ b/output/api/files/lib_utils.js.html
    @@ -0,0 +1,610 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>lib/utils.js - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1 class="file-heading">File: lib/utils.js</h1>
    +
    +<div class="file">
    +    <pre class="code prettyprint linenums">
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +&#x27;use strict&#x27;;
    +
    +var path = require(&#x27;path&#x27;),
    +    minimatch = require(&#x27;minimatch&#x27;),
    +    fs = require(&#x27;graceful-fs&#x27;);
    +
    +/**
    + * Utilities Class
    + * @class Utils
    + * @module yuidoc
    + */
    +
    +YUI.add(&#x27;utils&#x27;, function (Y) {
    +
    +    Y.charset = &#x27;utf8&#x27;;
    +
    +    var HTML_CHARS = {
    +        &#x27;&amp;&#x27;: &#x27;&amp;amp;&#x27;,
    +        &#x27;&lt;&#x27;: &#x27;&amp;lt;&#x27;,
    +        &#x27;&gt;&#x27;: &#x27;&amp;gt;&#x27;,
    +        &#x27;&quot;&#x27;: &#x27;&amp;quot;&#x27;,
    +        &#x27;\&#x27;&#x27;: &#x27;&amp;#x27;&#x27;,
    +        &#x27;/&#x27;: &#x27;&amp;#x2F;&#x27;,
    +        &#x27;&#x60;&#x27;: &#x27;&amp;#x60;&#x27;
    +    };
    +
    +    /**
    +    Escapes HTML characters in _html_.
    +
    +    @method escapeHTML
    +    @param {String} html String to escape.
    +    @return {String} Escaped string.
    +    **/
    +    Y.escapeHTML = function (html) {
    +        return html.replace(/[&amp;&lt;&gt;&quot;&#x27;\/&#x60;]/g, function (match) {
    +            return HTML_CHARS[match];
    +        });
    +    };
    +
    +    /**
    +    Normalizes the initial indentation of the given _content_ so that the first line
    +    is unindented, and all other lines are unindented to the same degree as the
    +    first line. So if the first line has four spaces at the beginning, then all
    +    lines will be unindented four spaces.
    +
    +    @method unindent
    +    @param {String} content Text to unindent.
    +    @return {String} Unindented text.
    +    @private
    +    **/
    +    Y.unindent = function (content) {
    +        var indent = content.match(/^(\s+)/);
    +
    +        if (indent) {
    +            content = content.replace(new RegExp(&#x27;^&#x27; + indent[1], &#x27;gm&#x27;), &#x27;&#x27;);
    +        }
    +
    +        return content;
    +    };
    +
    +    /**
    +    Like &#x60;getPages()&#x60;, but returns only the files under the &#x60;layout/&#x60; subdirectory
    +    of the specified _dir_.
    +
    +    @method getLayouts
    +    @param {String} dir Directory path.
    +    @return {Object} Mapping of layout names to layout content.
    +    **/
    +    function getLayouts(dir) {
    +        return getPages(path.join(dir, &#x27;layouts&#x27;));
    +    }
    +    Y.getLayouts = getLayouts;
    +
    +    /**
    +    Loads and returns the content of the specified page file.
    +
    +    @method getPage
    +    @param {String} pagePath Path to a single &#x60;.handlebars&#x60; page.
    +    @return {String|null} Page content, or &#x60;null&#x60; if not found.
    +    **/
    +    function getPage(pagePath) {
    +        if (!Y.Files.isFile(pagePath)) {
    +            return null;
    +        }
    +        return fs.readFileSync(pagePath, Y.charset);
    +    }
    +    Y.getPage = getPage;
    +
    +    /**
    +    Loads pages (files with a &#x60;.handlebars&#x60; extension) in the specified directory and
    +    returns an object containing a mapping of page names (the part of the filename)
    +    preceding the &#x60;.handlebars&#x60; extension) to page content.
    +
    +    @method getPages
    +    @param {String} dir Directory path.
    +    @return {Object} Mapping of page names to page content.
    +    **/
    +    var cache = {};
    +    function getPages(dir) {
    +        if (cache[dir]) {
    +            return cache[dir];
    +        }
    +        var pages = {};
    +
    +        if (!Y.Files.isDirectory(dir)) {
    +            return pages;
    +        }
    +
    +        fs.readdirSync(dir).forEach(function (filename) {
    +            var filePath = path.join(dir, filename);
    +
    +            if (path.extname(filename) === &#x27;.handlebars&#x27; &amp;&amp; Y.Files.isFile(filePath)) {
    +                pages[path.basename(filename, &#x27;.handlebars&#x27;)] = fs.readFileSync(filePath, Y.charset);
    +            }
    +        });
    +        cache[dir] = pages;
    +
    +        return pages;
    +    }
    +    Y.getPages = getPages;
    +
    +    /**
    +    Like &#x60;getPages()&#x60;, but returns only the files under the &#x60;partial/&#x60; subdirectory
    +    of the specified _dir_.
    +
    +    @method getPartials
    +    @param {String} dir Directory path.
    +    @return {Object} Mapping of partial names to partial content.
    +    **/
    +    function getPartials(dir) {
    +        return getPages(path.join(dir, &#x27;partials&#x27;));
    +    }
    +    Y.getPartials = getPartials;
    +
    +
    +    /**
    +    Mix/merge/munge data into the template.
    +
    +    @method prepare
    +    @param {String} inDir The starting directory
    +    @param {Object} options The &#x60;options&#x60; for the meta data.
    +    @param {callback} callback The callback to excecute when complete
    +    @param {Error} callback.err
    +    @param {Object} callback.options Merged options.
    +    **/
    +    function prepare(inDirs, options, callback) {
    +        var layouts,
    +            partials,
    +            type = &#x27;project&#x27;;
    +
    +        if (options &amp;&amp; options.skipLoad) {
    +            // Skip loading layouts, metadata, pages, and partials and assume that
    +            // the caller has provided them if they want them.
    +            options = Y.merge({
    +                layouts: {},
    +                meta: {},
    +                pages: {},
    +                partials: {},
    +                viewClass: Y.DocView
    +            }, options);
    +        } else {
    +            // Gather layouts, metadata, pages, and partials from the specified
    +            // input directory, then merge them into the provided options (if any).
    +            //
    +            // Gathered data will override provided data if there are conflicts, in
    +            // order to support a use case where global data are provided by the
    +            // caller and overridden by more specific component-level data gathered
    +            // from the input directory.
    +            //
    +            // The metadata inheritance chain looks like this:
    +            //
    +            //   - override metadata specified via CLI (highest precedence)
    +            //   - component metadata (if this is a component)
    +            //   - project-level component default metadata (if specified and this is a component)
    +            //   - theme-level component default metadata (if specified and this is a component)
    +            //   - project metadata
    +            //   - theme metadata (lowest precedence)
    +            try {
    +                if (inDirs[0] === inDirs[1]) {
    +                    layouts = getLayouts(inDirs[0]);
    +                    partials = getPartials(inDirs[0]);
    +                } else {
    +                    layouts = Y.merge(getLayouts(inDirs[0]), getLayouts(inDirs[1]));
    +                    partials = Y.merge(getPartials(inDirs[0]), getPartials(inDirs[1]));
    +                }
    +                options = Y.merge({
    +                        viewClass: Y.DocView
    +                    },
    +                    options || {}, {
    +                        layouts: layouts,
    +                        meta: options.meta,
    +                        partials: partials
    +                    }
    +                );
    +            } catch (ex) {
    +                return callback(ex);
    +            }
    +        }
    +
    +        // Mix in the override metadata, if any. It takes precedence over everything
    +        // else.
    +        Y.mix(options.meta, options.overrideMeta);
    +
    +        // Set a default asset path if one isn&#x27;t specified in the metadata.
    +        if (!options.meta.projectAssets) {
    +            options.meta.projectAssets = options.component ? &#x27;../assets&#x27; : &#x27;assets&#x27;;
    +        }
    +
    +        if (!options.meta.componentAssets &amp;&amp; options.component) {
    +            options.meta.componentAssets = &#x27;../assets/&#x27; + options.meta.name;
    +        }
    +
    +        if (typeof options.meta.layout === &#x27;undefined&#x27;) {
    +            options.meta.layout = options.layouts[type] ? type : &#x27;main&#x27;;
    +        }
    +
    +        callback(null, options);
    +    }
    +
    +    Y.prepare = prepare;
    +
    +    /**
    +     * Walk the directory tree to locate the yuidoc.json file.
    +     * @method getProjectData
    +     * @param {Path} [directory=process.cwd()] The directory to start from
    +     */
    +    var getProjectData = function (directory) {
    +        var dirs = [directory || process.cwd()];
    +        var projectData, packageData;
    +        var dirCount = 0;
    +        // keep looping until
    +        //  * data is found
    +        //  * there are no more dirs to process
    +        //  * we abort due to failsafe
    +        while (dirs.length &amp;&amp; !projectData) {
    +            if (dirCount++ &gt; 5000) {
    +                Y.log(&#x27;Scanned &#x27; + dirCount + &#x27; directories looking for a yuidoc.json file, something is probably wrong here..&#x27;, &#x27;error&#x27;, &#x27;yuidoc&#x27;);
    +                process.exit(1);
    +            }
    +            // accumulator for directories at this level
    +            var childDirs = [];
    +            // for each directory at the previous level
    +            dirs.forEach(function (dir) {
    +                // abort iterating if we have project data
    +                if (projectData) {
    +                    return;
    +                }
    +                // squelch (but log) any complaints about this particular directory
    +                try {
    +                    // for each item in this directory
    +                    var names = fs.readdirSync(dir);
    +                    names.forEach(function (name) {
    +                        // abort iterating a folder if we have found both data
    +                        if (projectData &amp;&amp; packageData) {
    +                            return;
    +                        }
    +                        // build a full path
    +                        var p = path.join(dir, name);
    +                        // acquire project data from this item if possible
    +                        if (Y.Files.isFile(p)) {
    +                            projectData = getFileData(p, name, &#x27;yuidoc.json&#x27;);
    +                            // &#x27;package.json&#x27; is used for auxilliary configuration
    +                            // if it&#x27;s found. Formerly, it was only found if it
    +                            // came _before_&#x27;yuidoc.json&#x27; in the folder tree
    +                            // (never in the same folder).
    +                            // This code will find &#x27;package.json&#x27; in the same
    +                            // folder as &#x27;yuidoc.json&#x27;.
    +                            // If there is no &#x27;yuidoc.json&#x27;, former algorithm would
    +                            // use the deepest &#x27;package.json&#x27; it can find, this one
    +                            // will use the first (most shallow) one.
    +                            packageData = packageData || getFileData(p, name, &#x27;package.json&#x27;);
    +                        }
    +                        // if we are a folder, but not ., .., or node_modules,
    +                        // then add to directory accumulator
    +                        if (Y.Files.isDirectory(p)) {
    +                            if (name.indexOf(&#x27;.&#x27;) === 0) {
    +                                return;
    +                            }
    +                            if (name === &#x27;node_modules&#x27;) {
    +                                Y.log(&#x27;Skipping node_modules directory while scanning for yuidoc.json&#x27;, &#x27;warn&#x27;, &#x27;yuidoc&#x27;);
    +                                return;
    +                            }
    +                            childDirs.push(p);
    +                        }
    +                    });
    +                } catch (dirPerm) {
    +                    Y.log(&#x27;Accessing dir (&#x27; + dir + &#x27;) threw an error&#x27;, &#x27;warn&#x27;, &#x27;yuidoc&#x27;);
    +                }
    +            });
    +            // iterate over new set of folders
    +            dirs = childDirs;
    +        }
    +        if ((packageData &amp;&amp; projectData) || (packageData &amp;&amp; packageData.yuidoc)) {
    +            projectData = mergeData(packageData, projectData);
    +        }
    +        return projectData;
    +    };
    +
    +    var getFileData = function (p, name, file) {
    +        if (name === file) {
    +            Y.log(&#x27;Loading &#x27; + name + &#x27; data from: &#x27; + p, &#x27;info&#x27;, &#x27;yuidoc&#x27;);
    +            try {
    +                return Y.Files.getJSON(p);
    +            } catch (e) {
    +                var err = &#x27;Failed to parse &#x27; + name + &#x27; file, please make sure it is valid JSON&#x27;;
    +                Y.log(err, &#x27;error&#x27;, &#x27;yuidoc&#x27;);
    +                throw (e + &#x27;&#x27;);
    +            }
    +        }
    +    };
    +
    +    var mergeData = function (pack, project) {
    +        project = project || {};
    +
    +        if (pack.yuidoc) {
    +            Object.keys(pack.yuidoc).forEach(function (key) {
    +                if (!project[key]) {
    +                    project[key] = pack.yuidoc[key];
    +                }
    +            });
    +        }
    +
    +        [&#x27;name&#x27;, &#x27;description&#x27;, &#x27;version&#x27;, &#x27;url&#x27;].forEach(function (key) {
    +            if (pack[key] &amp;&amp; !project[key]) {
    +                project[key] = pack[key];
    +            }
    +        });
    +
    +        return project;
    +    };
    +
    +    Y.getProjectData = getProjectData;
    +
    +    /**
    +     * Walks the tree from this dir and returns all the subdirs
    +     * @method getDirs
    +     * @param {String} baseDir The dir to begin at
    +     * @param {Array} ignore An array of paths to ignore
    +     * @return {Array} The array of directories..
    +     */
    +    var getDirs = function (baseDir, ignore) {
    +        var inputPaths = [],
    +            paths = [],
    +            i, d, isIgnored, subpath,
    +            stat, possibleDirs, fullPath;
    +
    +        var inputPath = &#x27;&#x27;;
    +        while (inputPath !== undefined) {
    +            fullPath = path.join(baseDir, inputPath);
    +            stat = fs.lstatSync(fullPath);
    +
    +            if (stat.isDirectory()) {
    +                if (fullPath !== baseDir) {
    +                    paths.push(fullPath);
    +                }
    +                possibleDirs = fs.readdirSync(fullPath);
    +                for (d=0;d&lt;possibleDirs.length;d++) {
    +                    subpath = path.join(inputPath, possibleDirs[d]);
    +                    isIgnored = false;
    +                    for (i=0;i&lt;ignore.length;i++) {
    +                        if (subpath.indexOf(ignore[i]) === 0) {
    +                          isIgnored = true;
    +                          break;
    +                        }
    +                    }
    +                    if (!isIgnored) {
    +                      inputPaths.push(subpath);
    +                    }
    +                }
    +            }
    +            inputPath = inputPaths.pop();
    +        }
    +
    +        return paths;
    +    };
    +
    +    Y.getDirs = getDirs;
    +
    +    /**
    +     * Make sure all the paths passed are directories and that they are not in the ignore list.
    +     * @method validatePaths
    +     * @param {Array} paths The array of paths to validate
    +     * @param {String} [ignore=false] A string to call &#x60;.indexOf&#x60; on a path to determine if it should be ignored
    +     */
    +    var validatePaths = function (paths, ignore) {
    +        if (!ignore) {
    +            ignore = [];
    +        } else if (!(ignore instanceof Array)) {
    +            ignore = [ignore];
    +        }
    +
    +        var newpaths = [];
    +        //Shortcut the *, . &amp; ./ shortcuts that shall globbing fixes for us
    +        if (paths === &#x27;*&#x27; || paths === &#x27;.&#x27; || paths === &#x27;./&#x27;) {
    +            paths = [process.cwd()];
    +        }
    +
    +        // Ensure that we always have an array of some kind.
    +        paths = paths || [];
    +        if (!Y.Lang.isArray(paths)) {
    +            paths = [paths];
    +        }
    +        paths.forEach(function (validatePath) {
    +            var glob = validatePath || &#x27;&#x27;;
    +
    +            if (process.platform === &#x27;win32&#x27;) {
    +                glob = validatePath.replace(/\//g, &#x27;\\\\&#x27;);
    +            }
    +
    +            var glob_paths = getDirs(&#x27;.&#x27;, ignore),
    +                is_globbed = false;
    +
    +            glob_paths.forEach(function (dir) {
    +                //Don&#x27;t scan things in node_modules
    +                if (dir.indexOf(&#x27;node_modules&#x27;) &gt; -1) {
    +                    return;
    +                }
    +                if (minimatch(dir, glob, {
    +                    period: true
    +                })) {
    +                    newpaths.push(dir);
    +                    is_globbed = true;
    +                }
    +            });
    +
    +            if (!is_globbed &amp;&amp; (Y.Files.isDirectory(glob))) {
    +                //If minimatch fails, check to see if it&#x27;s a relative directory
    +                // if it is, add it directly
    +                newpaths.push(glob);
    +            }
    +        });
    +
    +        paths = newpaths;
    +        paths.forEach(function (newPath) {
    +            try {
    +                if (!Y.Files.isDirectory(newPath)) {
    +                    throw (&#x27;Path not a directory: &#x27; + newPath);
    +                }
    +            } catch (e) {
    +                throw new Error(e.message);
    +            }
    +        });
    +
    +        if (!paths || !paths.forEach) {
    +            throw (&#x27;Paths should be an array of paths&#x27;);
    +        }
    +
    +        paths = paths.sort();
    +        return paths;
    +    };
    +
    +    Y.validatePaths = validatePaths;
    +
    +    /**
    +     * Takes a type string and converts it to a &quot;First letter upper cased&quot; type. e.g. &#x60;(string -&gt; String, object -&gt; Object)&#x60;
    +     * @method fixType
    +     * @param {String} t The type string to convert
    +     * @return {String} The fixed string
    +     */
    +    var fixType = function (t) {
    +        if (t &amp;&amp; t.indexOf(&#x27;.&#x27;) === -1) {
    +            t = t.replace(/{/g, &#x27;&#x27;).replace(/}/g, &#x27;&#x27;);
    +            var firstChar = t.charAt(0),
    +                upperFirstChar = firstChar.toUpperCase();
    +
    +            if (firstChar !== upperFirstChar) {
    +                return upperFirstChar + t.substring(1);
    +            }
    +        }
    +
    +        return t;
    +    };
    +
    +    Y.Lang.fixType = fixType;
    +
    +    /**
    +     * Produces a normalized web path by joining all the parts and normalizing the
    +     * filesystem-like path into web compatible url.
    +     * Supports relative and absolute paths.
    +     * Courtesy of [Mojito&#x27;s utils](https://github.com/yahoo/mojito/)
    +     *
    +     * @method webpath
    +     * @param {Array|String*} url the list of parts to be joined and normalized
    +     * @return {String} The joined and normalized url
    +     **/
    +    function webpath() {
    +        var args = [].concat.apply([], arguments),
    +            parts = path.join.apply(path, args).split(/[\\\/]/);
    +        return parts.join(&#x27;/&#x27;);
    +    }
    +
    +    Y.webpath = webpath;
    +});
    +
    +    </pre>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/files/lib_yuidoc.js.html b/output/api/files/lib_yuidoc.js.html
    new file mode 100644
    index 00000000..95d62318
    --- /dev/null
    +++ b/output/api/files/lib_yuidoc.js.html
    @@ -0,0 +1,530 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>lib/yuidoc.js - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1 class="file-heading">File: lib/yuidoc.js</h1>
    +
    +<div class="file">
    +    <pre class="code prettyprint linenums">
    +/**
    + * Copyright (c) 2011, Yahoo! Inc. All rights reserved.
    + * Code licensed under the BSD License:
    + * https://github.com/yui/yuidoc/blob/master/LICENSE
    + */
    +&#x27;use strict&#x27;;
    +
    +var fs = require(&#x27;graceful-fs&#x27;);
    +var rimraf = require(&#x27;rimraf&#x27;);
    +var path = require(&#x27;path&#x27;);
    +
    +/**
    +This is the __module__ description for the &#x60;YUIDoc&#x60; module.
    +
    +    var options = {
    +        paths: [ &#x27;./lib&#x27; ],
    +        outdir: &#x27;./out&#x27;
    +    };
    +
    +    var Y = require(&#x27;yuidocjs&#x27;);
    +    var json = (new Y.YUIDoc(options)).run();
    +
    +@class YUIDoc
    +@main yuidoc
    +*/
    +
    +
    +YUI.add(&#x27;yuidoc&#x27;, function (Y) {
    +
    +
    +    /**
    +     * The default list of configuration options
    +     * @property OPTIONS
    +     * @type Object
    +     * @final
    +     * @for YUIDoc
    +     */
    +    var OPTIONS = {
    +        quiet: false,
    +        writeJSON: true,
    +        outdir: path.join(process.cwd(), &#x27;out&#x27;),
    +        extension: &#x27;.js&#x27;,
    +        exclude: &#x27;.DS_Store,.svn,CVS,.git,build_rollup_tmp,build_tmp,node_modules&#x27;,
    +        norecurse: false,
    +        version: &#x27;0.1.0&#x27;,
    +        paths: [],
    +        themedir: path.join(__dirname, &#x27;themes&#x27;, &#x27;default&#x27;),
    +        syntaxtype: &#x27;js&#x27;
    +    };
    +
    +    /**
    +     * YUIDoc main class
    +
    +        var options = {
    +            paths: [ &#x27;./lib&#x27; ],
    +            outdir: &#x27;./out&#x27;
    +        };
    +
    +        var Y = require(&#x27;yuidoc&#x27;);
    +        var json = (new Y.YUIDoc(options)).run();
    +
    +     * @class YUIDoc
    +     * @module yuidoc
    +     * @constructor
    +     * @param config The config object
    +     */
    +    Y.YUIDoc = function (config) {
    +        /**
    +         * Holds the number of files that we are processing.
    +         * @property filecount
    +         * @type Boolean
    +         * @private
    +         */
    +        this.filecount = 0;
    +        /**
    +         * Hash map of dirnames to selleck config options.
    +         * @property selleck
    +         * @type Object
    +         * @private
    +         */
    +        this.selleck = {};
    +        /**
    +         * Holder for the list of files we are processing.
    +         * @property filemap
    +         * @type Object
    +         * @private
    +         */
    +        this.filemap = {};
    +        /**
    +         * Holder for the list of directories we are processing.
    +         * @property dirmap
    +         * @type Object
    +         * @private
    +         */
    +        this.dirmap = {};
    +
    +        /**
    +         * Internal holder for configuration options.
    +         * @property options
    +         * @type Object
    +         * @private
    +         */
    +        this.options = Y.merge(OPTIONS, config);
    +
    +        if (this.options.quiet) {
    +            Y.applyConfig({
    +                debug: false
    +            });
    +        }
    +
    +    };
    +
    +    Y.YUIDoc.prototype = {
    +        /**
    +         * Always exclude these directories
    +         * @method _setDefaultExcludes
    +         * @private
    +         */
    +        _setDefaultExcludes: function () {
    +            //These should always be excluded
    +            var excludes = &#x27;.DS_Store,.svn,CVS,.git,build_rollup_tmp,build_tmp,node_modules&#x27;.split(&#x27;,&#x27;),
    +                self = this;
    +
    +            excludes.forEach(function (item) {
    +                self.options.excludes[item] = true;
    +            });
    +        },
    +
    +        /**
    +         * Does post process on self.options.
    +         * @method _processConfig
    +         * @private
    +         */
    +        _processConfig: function () {
    +            this.options.extensions = Y.Array.hash(this.options.extension.split(&#x27;,&#x27;));
    +            this.options.excludes = Y.Array.hash(this.options.exclude.split(&#x27;,&#x27;));
    +            this._setDefaultExcludes();
    +        },
    +
    +        /**
    +         * Walks the paths and parses the directory contents
    +         * @method walk
    +         * @private
    +         */
    +        walk: function () {
    +            Y.each(this.options.paths, function (dir) {
    +                this.parsedir(dir);
    +            }, this);
    +        },
    +
    +        /**
    +         * Walks the passed directory and grabs all the files recursively.
    +         * @method parsedir
    +         * @param {String} dir The directory to parse the contents of.
    +         * @private
    +         */
    +        parsedir: function (dir) {
    +            if (!Y.Files.isDirectory(dir)) {
    +                throw (&#x27;Can not find directory: &#x27; + dir);
    +            }
    +
    +            var allfiles = fs.readdirSync(dir),
    +                stats,
    +                files = [],
    +                fullpath, self = this;
    +
    +            if (dir in self.options.excludes) {
    +                return;
    +            }
    +
    +            allfiles = allfiles.sort();
    +
    +            Y.each(allfiles, function (filename) {
    +                if (!(filename in self.options.excludes)) {
    +                    fullpath = path.join(dir, filename);
    +
    +                    stats = fs.statSync(fullpath);
    +
    +                    if (stats.isDirectory() &amp;&amp; !self.options.norecurse) {
    +                        self.parsedir(fullpath);
    +                    } else {
    +                        files.push(filename);
    +                    }
    +                }
    +            });
    +
    +            if (!(dir in self.options.excludes)) {
    +                this.parsefiles(dir, files);
    +            }
    +        },
    +
    +        /**
    +         * Gathers all the file data and populates the filemap and dirmap hashes.
    +         * @method parsefiles
    +         * @param {String} dir The directory to start from.
    +         * @param {Array} files List of files to parse.
    +         * @private
    +         */
    +        parsefiles: function (dir, files) {
    +            var self = this;
    +            files = files.sort();
    +
    +            Y.each(files, function (filename) {
    +                var ext = path.extname(filename),
    +                    text,
    +                    fullpath;
    +
    +                if (ext) {
    +                    if (ext in self.options.extensions) {
    +                        fullpath = path.join(dir, filename);
    +
    +                        if (Y.Files.exists(fullpath)) {
    +                            self.filecount++;
    +                            text = fs.readFileSync(fullpath, Y.charset);
    +
    +                            self.filemap[fullpath] = text.replace(/\r?\n|\r/g, &#x27;\n&#x27;);
    +                            self.dirmap[fullpath] = dir;
    +                            self.getSelleck(fullpath);
    +
    +                        } else {
    +                            Y.log(&#x27;File skipped: &#x27; + fullpath, &#x27;warn&#x27;, &#x27;yuidoc&#x27;);
    +                        }
    +                    }
    +                }
    +            });
    +        },
    +
    +        getSelleck: function (fullpath) {
    +            var self = this,
    +                base,
    +                comp,
    +                json;
    +
    +            if (self.options.selleck) {
    +                base = path.dirname(fullpath);
    +                comp = path.join(base, &#x27;../&#x27;, &#x27;docs&#x27;, &#x27;component.json&#x27;);
    +                //Y.log(&#x27;Checking for Selleck data: &#x27; + comp, &#x27;info&#x27;, &#x27;yuidoc&#x27;);
    +                if (Y.Files.exists(comp)) {
    +                    try {
    +                        json = JSON.parse(fs.readFileSync(comp, &#x27;utf8&#x27;));
    +                        delete json.examples; //Remove the selleck example data, we only want the comp info
    +                        self.selleck[fullpath] = json;
    +                    } catch (e) {
    +                        Y.log(&#x27;JSON parse failed on Selleck component.json file: &#x27; + comp, &#x27;error&#x27;, &#x27;yuidoc&#x27;);
    +                    }
    +                }
    +            }
    +        },
    +
    +        /**
    +         * Applies preprocessors to the data tree.
    +         * This function first clones the data and operates on the clone.
    +         * @method runPreprocessors
    +         * @private
    +         * @return {Object} The mutated data
    +         */
    +        runPreprocessors: function (data) {
    +            var self = this,
    +                preprocessors,
    +                preprocessorsRelativeTo;
    +
    +            // We will try to load the preprocessors as npm modules, but we will also
    +            // search for them relative to the process working directory.
    +            // The latter is consistent with how other paths are treated by yuidoc,
    +            // such as the config options &#x27;paths&#x27; and &#x27;outdir&#x27;.
    +            preprocessorsRelativeTo = process.cwd();
    +
    +            if (self.options.preprocessor) {
    +                data = JSON.parse(JSON.stringify(data));
    +
    +                preprocessors = [].concat(self.options.preprocessor);
    +
    +                preprocessors.forEach(function (preprocessor) {
    +                    var preprocessorModule;
    +
    +                    try {
    +                        preprocessorModule = require(preprocessor);
    +                    } catch (e) {
    +                        preprocessorModule = require(path.resolve(preprocessorsRelativeTo, preprocessor));
    +                    }
    +
    +                    preprocessorModule(data, self.options);
    +                });
    +            }
    +
    +            return data;
    +        },
    +
    +        /**
    +         * Writes the parser JSON data to disk.
    +         * Applies preprocessors, if any.
    +         * @method writeJSON
    +         * @param {Object} parser The DocParser instance to use
    +         * @private
    +         * @return {Object} The JSON data returned from the DocParser
    +         */
    +        writeJSON: function (parser) {
    +            var self = this,
    +                data,
    +                file,
    +                out;
    +
    +            data = parser.data;
    +
    +            data.warnings = parser.warnings;
    +
    +            data = this.runPreprocessors(data);
    +
    +            if (self.selleck &amp;&amp; self.options.selleck &amp;&amp; data.files &amp;&amp; data.modules) {
    +                Object.keys(self.selleck).forEach(function (selleckFile) {
    +                    Object.keys(data.files).forEach(function (f) {
    +                        if (selleckFile === f) {
    +                            var mods = data.files[f].modules;
    +                            if (mods) {
    +                                Object.keys(mods).forEach(function (mod) {
    +                                    if (data.modules[mod]) {
    +                                        if (!data.modules[mod].extra) {
    +                                            data.modules[mod].extra = {};
    +                                        }
    +                                        data.modules[mod].extra.selleck = self.selleck[selleckFile];
    +                                    }
    +                                });
    +                            }
    +                        }
    +                    });
    +                });
    +            }
    +
    +            if (self.options.project) {
    +                data.project = self.options.project;
    +            }
    +
    +            if (self.options.writeJSON) {
    +                // Y.log(Y.JSON.stringify(parser.data, null, 4));
    +                file = path.join(self.options.outdir, &#x27;data.json&#x27;);
    +
    +                if (Y.Files.exists(self.options.outdir) &amp;&amp; !self.options.nodeleteout) {
    +                    Y.log(&#x27;Found out dir, deleting: &#x27; + self.options.outdir, &#x27;warn&#x27;, &#x27;yuidoc&#x27;);
    +                    rimraf.sync(self.options.outdir);
    +                }
    +
    +                if (!Y.Files.exists(self.options.outdir)) {
    +                    Y.log(&#x27;Making out dir: &#x27; + self.options.outdir, &#x27;info&#x27;, &#x27;yuidoc&#x27;);
    +                    try {
    +                        fs.mkdirSync(self.options.outdir, &#x27;0777&#x27;);
    +                    } catch (e) {
    +                        Y.log(&#x27;Outdir creation failed&#x27;, &#x27;warn&#x27;, &#x27;yuidoc&#x27;);
    +                    }
    +                }
    +
    +                out = fs.createWriteStream(file, {
    +                    flags: &#x27;w&#x27;,
    +                    encoding: Y.charset,
    +                    mode: &#x27;0644&#x27;
    +                });
    +                out.write(JSON.stringify(data, null, 4));
    +                out.end();
    +            }
    +
    +            return data;
    +        },
    +
    +        lint: function (warnings) {
    +            var code = 0,
    +                count = 0;
    +
    +            if (warnings &amp;&amp; warnings.length) {
    +                code = 1;
    +                console.log(&#x27;YUIDoc found&#x27;, warnings.length, &#x27;lint errors in your docs&#x27;);
    +                warnings.forEach(function (item) {
    +                    count++;
    +                    console.log(&#x27;#&#x27; + count, item.message, item.line + &#x27;\n&#x27;);
    +                });
    +                process.exit(code);
    +            }
    +        },
    +
    +        /**
    +         * Process the config, walk the file tree and write out the JSON data.
    +         * @method run
    +         * @return {Object} The JSON data returned from the DocParser
    +         */
    +        run: function () {
    +            /**
    +             * Timestamp holder so we know when YUIDoc started the parse process.
    +             * @property starttime
    +             * @type Timestamp
    +             */
    +            Y.log(&#x27;YUIDoc Starting from: &#x27; + this.options.paths.join(&#x27;,&#x27;), &#x27;info&#x27;, &#x27;yuidoc&#x27;);
    +            this.starttime = new Date().getTime();
    +
    +            this._processConfig();
    +            this.walk();
    +
    +            var json = this.writeJSON(new Y.DocParser({
    +                syntaxtype: this.options.syntaxtype,
    +                filemap: this.filemap,
    +                dirmap: this.dirmap
    +            }).parse());
    +
    +            if (this.options.lint) {
    +                this.lint(json.warnings);
    +                return null;
    +            }
    +
    +            /**
    +             * Timestamp holder so we know when YUIDoc has finished the parse process.
    +             * @property endtime
    +             * @type Timestamp
    +             */
    +            this.endtime = new Date().getTime();
    +            Y.log(&#x27;Parsed &#x27; + this.filecount + &#x27; files in &#x27; + ((this.endtime - this.starttime) / 1000) + &#x27; seconds&#x27;, &#x27;info&#x27;, &#x27;yuidoc&#x27;);
    +
    +            return json;
    +        }
    +    };
    +
    +});
    +
    +    </pre>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/index.html b/output/api/index.html
    new file mode 100644
    index 00000000..2adf0d0d
    --- /dev/null
    +++ b/output/api/index.html
    @@ -0,0 +1,126 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="./assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="./assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="./assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="./assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="./classes/CLI.html">CLI</a></li>
    +                                <li><a href="./classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="./classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="./classes/DocView.html">DocView</a></li>
    +                                <li><a href="./classes/Files.html">Files</a></li>
    +                                <li><a href="./classes/Help.html">Help</a></li>
    +                                <li><a href="./classes/Main.html">Main</a></li>
    +                                <li><a href="./classes/Options.html">Options</a></li>
    +                                <li><a href="./classes/Server.html">Server</a></li>
    +                                <li><a href="./classes/Utils.html">Utils</a></li>
    +                                <li><a href="./classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="./modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +    <div class="apidocs">
    +        <div id="docs-main" class="content">
    +            <p>
    +            Browse to a module or class using the sidebar to view its API documentation.
    +            </p>
    +
    +            <h2>Keyboard Shortcuts</h2>
    +
    +            <ul>
    +                <li><p>Press <kbd>s</kbd> to focus the API search box.</p></li>
    +
    +                <li><p>Use <kbd>Up</kbd> and <kbd>Down</kbd> to select classes, modules, and search results.</p></li>
    +
    +                <li class="mac-only"><p>With the API search box or sidebar focused, use <kbd><span class="cmd">&#x2318;</span>-Left</kbd> or <kbd><span class="cmd">&#x2318;</span>-Right</kbd> to switch sidebar tabs.</p></li>
    +
    +                <li class="pc-only"><p>With the API search box or sidebar focused, use <kbd>Ctrl+Left</kbd> and <kbd>Ctrl+Right</kbd> to switch sidebar tabs.</p></li>
    +            </ul>
    +        </div>
    +    </div>
    +
    +
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="./assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="./assets/js/yui-prettify.js"></script>
    +<script src="./assets/../api.js"></script>
    +<script src="./assets/js/api-filter.js"></script>
    +<script src="./assets/js/api-list.js"></script>
    +<script src="./assets/js/api-search.js"></script>
    +<script src="./assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/api/modules/index.html b/output/api/modules/index.html
    new file mode 100644
    index 00000000..487fe15b
    --- /dev/null
    +++ b/output/api/modules/index.html
    @@ -0,0 +1,10 @@
    +<!doctype html>
    +<html>
    +    <head>
    +        <title>Redirector</title>
    +        <meta http-equiv="refresh" content="0;url=../">
    +    </head>
    +    <body>
    +        <a href="../">Click here to redirect</a>
    +    </body>
    +</html>
    diff --git a/output/api/modules/yuidoc.html b/output/api/modules/yuidoc.html
    new file mode 100644
    index 00000000..c16d2e58
    --- /dev/null
    +++ b/output/api/modules/yuidoc.html
    @@ -0,0 +1,196 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>yuidoc - YUIDoc</title>
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
    +</head>
    +<body class="yui3-skin-sam">
    +
    +<div id="doc">
    +    <div id="hd" class="yui3-g header">
    +        <div class="yui3-u-3-4">
    +                <h1><img src="../assets/css/logo.png" title="YUIDoc" width="117" height="52"></h1>
    +        </div>
    +        <div class="yui3-u-1-4 version">
    +            <em>API Docs for: 0.10.0</em>
    +        </div>
    +    </div>
    +    <div id="bd" class="yui3-g">
    +
    +        <div class="yui3-u-1-4">
    +            <div id="docs-sidebar" class="sidebar apidocs">
    +                <div id="api-list">
    +                    <h2 class="off-left">APIs</h2>
    +                    <div id="api-tabview" class="tabview">
    +                        <ul class="tabs">
    +                            <li><a href="#api-classes">Classes</a></li>
    +                            <li><a href="#api-modules">Modules</a></li>
    +                        </ul>
    +                
    +                        <div id="api-tabview-filter">
    +                            <input type="search" id="api-filter" placeholder="Type to filter APIs">
    +                        </div>
    +                
    +                        <div id="api-tabview-panel">
    +                            <ul id="api-classes" class="apis classes">
    +                                <li><a href="../classes/CLI.html">CLI</a></li>
    +                                <li><a href="../classes/DocBuilder.html">DocBuilder</a></li>
    +                                <li><a href="../classes/DocParser.html">DocParser</a></li>
    +                                <li><a href="../classes/DocView.html">DocView</a></li>
    +                                <li><a href="../classes/Files.html">Files</a></li>
    +                                <li><a href="../classes/Help.html">Help</a></li>
    +                                <li><a href="../classes/Main.html">Main</a></li>
    +                                <li><a href="../classes/Options.html">Options</a></li>
    +                                <li><a href="../classes/Server.html">Server</a></li>
    +                                <li><a href="../classes/Utils.html">Utils</a></li>
    +                                <li><a href="../classes/YUIDoc.html">YUIDoc</a></li>
    +                            </ul>
    +                
    +                
    +                            <ul id="api-modules" class="apis modules">
    +                                <li><a href="../modules/yuidoc.html">yuidoc</a></li>
    +                            </ul>
    +                        </div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +        <div class="yui3-u-3-4">
    +                <div id="api-options">
    +                    Show:
    +                    <label for="api-show-inherited">
    +                        <input type="checkbox" id="api-show-inherited" checked>
    +                        Inherited
    +                    </label>
    +            
    +                    <label for="api-show-protected">
    +                        <input type="checkbox" id="api-show-protected">
    +                        Protected
    +                    </label>
    +            
    +                    <label for="api-show-private">
    +                        <input type="checkbox" id="api-show-private">
    +                        Private
    +                    </label>
    +                    <label for="api-show-deprecated">
    +                        <input type="checkbox" id="api-show-deprecated">
    +                        Deprecated
    +                    </label>
    +            
    +                </div>
    +            
    +            <div class="apidocs">
    +                <div id="docs-main">
    +                    <div class="content">
    +<h1>yuidoc Module</h1>
    +<div class="box clearfix meta">
    +
    +
    +        <div class="foundat">
    +            Defined in: <a href="../files/lib_yuidoc.js.html#l51"><code>lib&#x2F;yuidoc.js:51</code></a>
    +        </div>
    +
    +</div>
    +
    +
    +<div class="box intro">
    +    <p>This is the <strong>module</strong> description for the <code>YUIDoc</code> module.</p>
    +<pre class="code prettyprint"><code>var options = {
    +    paths: [ './lib' ],
    +    outdir: './out'
    +};
    +
    +var Y = require('yuidocjs');
    +var json = (new Y.YUIDoc(options)).run();</code></pre>
    +
    +</div>
    +
    +
    +<div class="yui3-g">
    +    <div class="yui3-u-1-2">
    +            <p>This module provides the following classes:</p>
    +
    +            <ul class="module-classes">
    +                <li class="module-class">
    +                    <a href="../classes/CLI.html">
    +                        CLI
    +                    </a>
    +                </li>
    +                <li class="module-class">
    +                    <a href="../classes/DocBuilder.html">
    +                        DocBuilder
    +                    </a>
    +                </li>
    +                <li class="module-class">
    +                    <a href="../classes/DocParser.html">
    +                        DocParser
    +                    </a>
    +                </li>
    +                <li class="module-class">
    +                    <a href="../classes/DocView.html">
    +                        DocView
    +                    </a>
    +                </li>
    +                <li class="module-class">
    +                    <a href="../classes/Files.html">
    +                        Files
    +                    </a>
    +                </li>
    +                <li class="module-class">
    +                    <a href="../classes/Help.html">
    +                        Help
    +                    </a>
    +                </li>
    +                <li class="module-class">
    +                    <a href="../classes/Main.html">
    +                        Main
    +                    </a>
    +                </li>
    +                <li class="module-class">
    +                    <a href="../classes/Options.html">
    +                        Options
    +                    </a>
    +                </li>
    +                <li class="module-class">
    +                    <a href="../classes/Server.html">
    +                        Server
    +                    </a>
    +                </li>
    +                <li class="module-class">
    +                    <a href="../classes/Utils.html">
    +                        Utils
    +                    </a>
    +                </li>
    +                <li class="module-class">
    +                    <a href="../classes/YUIDoc.html">
    +                        YUIDoc
    +                    </a>
    +                </li>
    +            </ul>
    +    </div>
    +
    +
    +    <div class="yui3-u-1-2">
    +    </div>
    +</div>
    +                    </div>
    +                </div>
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +<script src="../assets/js/yui-prettify.js"></script>
    +<script src="../assets/../api.js"></script>
    +<script src="../assets/js/api-filter.js"></script>
    +<script src="../assets/js/api-list.js"></script>
    +<script src="../assets/js/api-search.js"></script>
    +<script src="../assets/js/apidocs.js"></script>
    +</body>
    +</html>
    diff --git a/output/args/index.html b/output/args/index.html
    new file mode 100644
    index 00000000..f5f02466
    --- /dev/null
    +++ b/output/args/index.html
    @@ -0,0 +1,482 @@
    +<!DOCTYPE html>
    +<html lang="en">
    +<head>
    +    <meta charset="utf-8">
    +    <title>Using YUIDoc</title>
    +    <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Maven+Pro:400,700">
    +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.4.1/build/cssgrids/grids-min.css">
    +    <link rel="stylesheet" href="../assets/css/main.css">
    +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    +    <link rel="icon" href="../assets/favicon.ico">
    +    <script src="http://yui.yahooapis.com/3.5.1/build/yui/yui.js"></script>
    +</head>
    +<body>
    +<a href="https://github.com/yui/yuidoc"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub"></a>
    +<div id="doc">
    +    <div id="hd">
    +        <h1><img src="http://yuilibrary.com/img/yui-logo-2x.png" width="117" height="52">Using YUIDoc</h1>
    +    </div>
    +    
    +    <div class="crumbs">
    +        <a href="../">Main Page</a> <a name="Arrow">&gt;</a> <a href="../args/index.html">Using YUIDoc</a>
    +    </div>
    +    
    +    
    +        <a href="#toc" class="jump">Jump to Table of Contents</a>
    +    
    +
    +    <div class="yui3-g">
    +        <div class="yui3-u-3-4">
    +            <div id="main">
    +                <div class="content"><p>Generating documentation with YUIDoc is as simple as 
    +going to the top of your source tree and running:</p>
    +<pre class="code terminal"><span class="noselect">$ </span>yuidoc .</pre>
    +
    +<p>However, you can configure YUIDoc's behavior further 
    +by providing <a href="#command-line">command line options</a>, 
    +a <a href="#json">JSON configuration file</a>, or even both.
    +This section discusses the <code>yuidoc</code> command line tool in more detail.</p>
    +
    +<h2 id="command-line">Running YUIDoc on the Command Line</h2>
    +
    +<p>Certain <code>yuidoc</code> command line options correspond to entries in the  
    +the <a href="#json"><code>yuidoc.json</code> configuration file</a>.
    +Command line options always take priority.</p>
    +
    +<pre class="code terminal">YUI Doc generates API documentation from a modified JavaDoc syntax.
    +
    +Current version (0.10.0)
    +
    +Usage: yuidoc &lt;options&gt; &lt;input path&gt;
    +
    +Common Options:
    +  -c, --config, --configfile &lt;filename&gt;  A JSON config file to provide configuration data.
    +           You can also create a yuidoc.json file and place it
    +           anywhere under your source tree and YUI Doc will find it
    +           and use it.
    +  -e, --extension &lt;comma sep list of file extensions&gt; The list of file extensions to parse 
    +           for api documentation. (defaults to .js)
    +  -x, --exclude &lt;comma sep list of directories&gt; Directories to exclude from parsing 
    +           (defaults to &#x27;.DS_Store,.svn,CVS,.git,build_rollup_tmp,build_tmp&#x27;)
    +  -v, --version Show the current YUIDoc version
    +  --project-version Set the doc version for the template
    +  -N, --no-color Turn off terminal colors (for automation)
    +  -C, --no-code Turn off code generation (don&#x27;t include source files in output)
    +  -n, --norecurse Do not recurse directories (default is to recurse)
    +  --no-sort Do not alphabetical sorting of attributes, events, methods, and properties
    +  -S, --selleck Look for Selleck component data and attach to API meta data
    +  -V, --view Dump the Handlebars.js view data instead of writing template files
    +  -p, --parse-only Only parse the API docs and create the JSON data, do not render templates
    +  -o, --outdir &lt;directory path&gt; Path to put the generated files (defaults to .&#x2F;out)
    +  -t, --themedir &lt;directory path&gt; Path to a custom theme directory containing Handlebars templates
    +  -H, --helpers &lt;comma separated list of paths to files&gt; Require these file and add Handlebars helpers. See docs for more information
    +  --charset CHARSET Use this as the default charset for all file operations. Defaults to &#x27;utf8&#x27;
    +  -h, --help Show this help
    +  -q, --quiet Supress logging output
    +  -T, --theme &lt;simple|default&gt; Choose one of the built in themes (default is default)
    +  --syntaxtype &lt;js|coffee&gt; Choose comment syntax type (default is js)
    +  --server &lt;port&gt; Fire up the YUIDoc server for faster API doc developement. Pass optional port to listen on. (default is 3000)
    +  --lint Lint your docs, will print parser warnings and exit code 1 if there are any
    +
    +  &lt;input path&gt; Supply a list of paths (shell globbing is handy here)</pre>
    +
    +
    +<h3 id="server">Running YUIDoc in Server Mode</h3>
    +
    +<p>
    +Most documentation tools (including YUIDoc) involve some sort of build process.
    +However, YUIDoc provides a unique feature that allows you to short-circuit this.
    +</p>
    +<p>
    +In <dfn>server mode</dfn>, 
    +YUIDoc fires up a small Node.js based server and 
    +begins parsing and displaying documentation in real time.
    +This greatly speeds up the documentation authoring process,
    +as you can edit your source code and 
    +preview changes with a simple browser reload,
    +rather than waiting for a build.
    +</p>
    +
    +<p>To activate server mode on <code>localhost:3000</code>, run <code>yuidoc --server</code>.
    +You can optionally specify an alternate port:</p> 
    +
    +<pre class="code terminal">yuidoc --server
    +    or
    +yuidoc --server 5000</pre>
    +
    +
    +Then visit:
    +
    +<pre class="code terminal">http:&#x2F;&#x2F;127.0.0.1:3000&#x2F;
    +    or
    +http:&#x2F;&#x2F;127.0.0.1:5000&#x2F;</pre>
    +
    +
    +<p>
    +Any changes you make to your YUIDoc comment blocks. 
    +will be reflected when you reload the browser. 
    +It's that simple!
    +</p>
    +
    +<p><strong>NOTE:</strong> Server mode is not
    +a replacement for building and hosting your documentation,
    +just a handy previewing tool. 
    +For production, you should generate static HTML pages and 
    +host them on a real web server.</p> 
    +
    +<h3 id="working-with-yuidoc-parsed-data">Working with YUIDoc Parsed Data</h3>
    +
    +<p>
    +YUIDoc generates a <code>data.json</code> file after it parses your API documentation. 
    +The <code>external.data</code> config option enables you to import a YUIDoc <code>data.json</code> file 
    +from another project and mix it into your own documentation. 
    +</p>
    +
    +<p>
    +This feature is handy when you are extending another project and would like to link back
    +to their API documentation. For example, importing YUI Library's <code>data.json</code>
    +file would enable YUIDoc to automatically link back to <code>Base</code>, <code>EventTarget</code>, and
    +other core YUI objects that your own API might be extending or mixing in. 
    +</p>
    +
    +<p>
    +Currently, importing external data enables YUIDoc to resolve HTML links <code>@extends</code> or <code>@use</code> keywords, 
    +but does <em>not</em> cause YUIDoc to generate complete documentation for the external API.
    +Future versions of YUIDoc may provide the option to mix in the data natively 
    +and reproduce the external API right along with your own.
    +</p>
    +
    +<h4 id="external-data">Adding External YUIDoc Data to Your Project</h4>
    +
    +<p>
    +    Create an <code>external</code> object under the <code>options</code> object in your <code>yuidoc.json</code> file and give it
    +    a property called <code>data</code> pointing to the URL of the external <code>data.json</code> file you wish to import. 
    +    <code>data</code> can be a string or an array of strings. 
    +</p>
    +
    +<pre class="code prettyprint">{
    +  &quot;options&quot;: {
    +    &quot;external&quot;: {
    +      &quot;data&quot;: &quot;http:&#x2F;&#x2F;yuilibrary.com&#x2F;yui&#x2F;docs&#x2F;api&#x2F;data.json&quot;
    +    }
    +  }
    +}</pre>
    +
    +
    +<p>
    +    Also, you are able to give <code>base</code> data within <code>external</code> for external base URLs.
    +</p>
    +
    +<pre class="code prettyprint">{
    +  &quot;options&quot;: {
    +    &quot;external&quot;: {
    +      &quot;data&quot;: [
    +        {
    +          &quot;base&quot;: &quot;http:&#x2F;&#x2F;emberjs.com&#x2F;api&#x2F;&quot;,
    +          &quot;json&quot;: &quot;http:&#x2F;&#x2F;builds.emberjs.com&#x2F;tags&#x2F;v1.5.1&#x2F;ember-docs.json&quot;
    +        },
    +        {
    +          &quot;base&quot;: &quot;http:&#x2F;&#x2F;emberjs.com&#x2F;api&#x2F;&quot;,
    +          &quot;json&quot;: &quot;http:&#x2F;&#x2F;builds.emberjs.com&#x2F;tags&#x2F;v1.0.0-beta.6&#x2F;ember-data-docs.json&quot;
    +        }
    +      ]
    +    }
    +  }
    +}</pre>
    +
    +
    +<p>
    +<strong>NOTE:</strong> YUIDoc currently fetches external data on each run with no caching. 
    +</p>
    +
    +
    +
    +<h2 id="json">Configuring YUIDoc with yuidoc.json</h2>
    +
    +<p>
    +You can also store most YUIDoc configurables in a <code>yuidoc.json</code> file.
    +As mentioned in the <a href="#command-line">command line arguments</a> section,
    +command line options always take priority over <code>yuidoc.json</code> configuration values.</p>
    +</p>
    +<p>
    +The <code>yuidoc.json</code> file must reside in a directory somewhere under where you execute <code>yuidoc</code>. 
    +YUIDoc will scan the tree for this file before doing anything else.
    +</p>
    +
    +<p>A short example <code>yuidoc.json</code> file would resemble:</p>
    +
    +<pre class="code prettyprint">{
    +    &quot;name&quot;: &quot;The Foo API&quot;,
    +    &quot;description&quot;: &quot;The Foo API: a library for doing X, Y, and Z&quot;,
    +    &quot;version&quot;: &quot;1.2.1&quot;,
    +    &quot;url&quot;: &quot;http:&#x2F;&#x2F;example.com&#x2F;&quot;,
    +    &quot;options&quot;: {
    +        &quot;outdir&quot;: &quot;..&#x2F;build&#x2F;apidocs&quot;
    +    }
    +}</pre>
    +
    +
    +See below for <a href="#ex-yui3">more</a> <a href="#ex-yuidoc">examples</a>.
    +
    +<h3 id="yuidocjson-fields">yuidoc.json Fields</h3>
    +
    +<h4 id="general-yuidoc-project-information">General YUIDoc Project Information</h4>
    +
    +<table>
    +<tr>
    +    <th>Name</th>
    +    <th>Description</th>
    +</tr>
    +<tr>
    +    <td><code>name</code></th>
    +    <td>A short name for the project.</td>
    +</tr>
    +<tr>
    +    <td><code>description</code></th>
    +    <td>A one or two sentence description of the project.</td>
    +</tr>
    +<tr>
    +    <td><code>version</code></th>
    +    <td>The project's current version, as some kind of meaningful string.</td>
    +</tr>
    +<tr>
    +    <td><code>url</code></th>
    +    <td>The project's primary URL. This does not necessarily have to be the URL of the generated API documentation.</td>
    +</tr>
    +<tr>
    +    <td><code>logo</code></th>
    +    <td>
    +        The logo to add to the header of all generated HTML documentation. 
    +        If you do not provide a header, YUIDoc will use the YUI logo by default.
    +    </td>
    +</tr>
    +</table>
    +
    +<h4 id="yuidoc-options">YUIDoc Options</h4>
    +
    +<p>Within the <code>options</code> object, you can provide any of the following fields:</p>
    +
    +<table>
    +<tr>
    +    <th>Name</th>
    +    <th>Description</th>
    +</tr>
    +<tr>
    +    <td><code>linkNatives</code></th>
    +    <td>Selects whether to autolink native types such as <code>String</code> and <code>Object</code> over to the Mozilla Developer Network. </td>
    +</tr>
    +<tr>
    +    <td><code>attributesEmit</code></th>
    +    <td>
    +        Selects whether YUIDoc should autogenerate documentation for change events 
    +        generated by the <a href="http://yuilibrary.com/yui/docs/api/classes/Attribute.html">YUI Attribute API</a>.
    +        When a YUI attribute <code>foo</code> changes its value, 
    +        YUI automatically fires a custom event named <code>fooChange</code>.
    +        Setting <code>attributesEmit</code> to <code>true</code> instructs YUIDoc to
    +        automatically generate documentation for each of these events.
    +        You can set this value to <code>false</code> if you think that your audience
    +        is well aware of change events and would not benefit from this extra verbiage.
    +    </td>
    +</tr>
    +<tr>
    +    <td><code>selleck</code></th>
    +    <td>
    +        Selects whether to add <a href="http://rgrove.github.com/selleck/">Selleck</a> metadata. 
    +        If <code>true</code>, YUIDoc searches for a <code>component.json</code> file above the source tree and 
    +        attaches that data to the module data as extra information.
    +    </td>
    +</tr>
    +<tr>
    +    <td><code>ignorePaths</code></th>
    +    <td>Specifies an array of string paths to ignore when using shell globbing. This only removes top level items from the list to initally scan. Use <code>exclude</code> to remove specific directories.</td>
    +</tr>
    +<tr>
    +    <td><code>exclude</code></th>
    +    <td>Specify a comma separated list of names you want to exclude from parses when YUIDoc recurses the source tree.</td>
    +</tr>
    +<tr>
    +    <td><code>paths</code></th>
    +    <td>
    +        Specifies a single string <code>glob</code> or array of globs 
    +        to use when searching the source tree for docs to parse.
    +    </td>
    +</tr>
    +<tr>
    +    <td><code>outdir</code></th>
    +    <td>Specifies the directory in which to place the rendered HTML files and assets.</td>
    +</tr>
    +<tr>
    +    <td><code>tabtospace</code></th>
    +    <td>Specifies the number of spaces each tab character in source code should be converted to when using YUIDoc's source code view. The default is 8.</td>
    +</tr>
    +<tr>
    +    <td><code>external.data</code></th>
    +    <td>
    +        Provides a link to an external <code>data.json</code> file to merge into the local api docs. 
    +        For more information, refer to the <a href="#external-data">external data example</a>.
    +    </td>
    +</tr>
    +<tr>
    +    <td><code>markdown</code></td>
    +    <td>
    +        Options to pass to markdown-it, the Markdown compiler used to compile API descriptions.
    +        See the <a href="https://markdown-it.github.io/markdown-it/#MarkdownIt.new">markdown-it API</a> for details.
    +    </td>
    +</tr>
    +<tr>
    +    <td><code>preprocessor</code></td>
    +    <td>
    +        Specifies the array of your preprocessor script or npm package like <code>yuidoc-preprocessor-foo</code>
    +        that implements a preprocessor. See the <a href="#ex-preprocessor">example used preprocessor</a>.
    +    </td>
    +</tr>
    +</table>
    +
    +<h3 id="ex-yui3">Example: YUI 3 Library API </h3>
    +
    +<p>
    +This sample <code>yuidoc.json</code> file is used in the <a href="http://yuilibrary.com/">YUI 3</a>
    +project:
    +</p>
    +
    +<pre class="code prettyprint">{
    +    &quot;name&quot;: &quot;YUI 3&quot;,
    +    &quot;description&quot;: &quot;YUI 3 JavaScript Framework&quot;,
    +    &quot;version&quot;: &quot;3.5.0&quot;,
    +    &quot;url&quot;: &quot;http:&#x2F;&#x2F;yuilibrary.com&#x2F;&quot;,
    +    &quot;options&quot;: {
    +        &quot;linkNatives&quot;: &quot;true&quot;,        
    +        &quot;attributesEmit&quot;: &quot;true&quot;,
    +        &quot;selleck&quot;: &quot;true&quot;,
    +        &quot;ignorePaths&quot;: [ &quot;simpleyui&quot; ],
    +        &quot;paths&quot;: &quot;*&#x2F;js&quot;,
    +        &quot;outdir&quot;: &quot;..&#x2F;api-js&quot;
    +    }
    +}</pre>
    +
    +
    +<h3 id="ex-yuidoc">Example: YUIDoc API</h3>
    +
    +<p>This sample <code>yuidoc.json</code> file is used in the YUIDoc project itself:</p>
    +
    +<pre class="code prettyprint">{
    +  &quot;name&quot;: &quot;YUIDoc&quot;,
    +  &quot;description&quot;: &quot;YUIDoc documentation tool written in JavaScript&quot;,
    +  &quot;version&quot;: &quot;0.2.38&quot;,
    +  &quot;url&quot;: &quot;http:&#x2F;&#x2F;yuilibrary.com&#x2F;projects&#x2F;yuidoc&quot;,
    +  &quot;logo&quot;: &quot;http:&#x2F;&#x2F;yuilibrary.com&#x2F;img&#x2F;yui-logo.png&quot;,
    +  &quot;options&quot;: {
    +    &quot;external&quot;: {
    +      &quot;data&quot;: &quot;http:&#x2F;&#x2F;yuilibrary.com&#x2F;yui&#x2F;docs&#x2F;api&#x2F;data.json&quot;
    +    },
    +    &quot;linkNatives&quot;: &quot;true&quot;,
    +    &quot;attributesEmit&quot;: &quot;true&quot;,
    +    &quot;paths&quot;: [
    +      &quot;.&#x2F;lib&quot;
    +    ],
    +    &quot;outdir&quot;: &quot;.&#x2F;output&#x2F;api&quot;
    +  }
    +}</pre>
    +
    +
    +<h3 id="ex-preprocessor">Example: Using preprocessor</h3>
    +
    +<p>This sample <code>yuidoc.json</code> file used preprocessor option:</p>
    +
    +<pre class="code prettyprint">{
    +  &quot;name&quot;: &quot;My Project&quot;,
    +  &quot;version&quot;: &quot;1.0.0&quot;,
    +  &quot;options&quot;: {
    +    &quot;paths&quot;: &quot;src&quot;,
    +    &quot;preprocessor&quot;: [&quot;.&#x2F;path&#x2F;to&#x2F;custom_doc_preprocessor.js&quot;, &quot;yuidoc-preprocessor-foo&quot;]
    +  }
    +}</pre>
    +
    +</div>
    +            </div>
    +        </div>
    +
    +        <div class="yui3-u-1-4">
    +            <div class="sidebar">
    +                <ul class="links">
    +                    <li><a href="https://github.com/yui/yuidoc/" class="button">Get the Source</a></li>
    +                    <li><a href="https://groups.google.com/forum/#!forum/yuidoc" class="button">Questions? Join the Mailing List</a></li>
    +                    <li><a href="https://github.com/yui/yuidoc/issues/" class="button">File an Issue</a></li>
    +                    <li><a href="../api/" class="button">View API Documentation</a></li>
    +                </ul>
    +                <div class="sidebox">
    +                    <div class="hd">
    +                        <h2 class="no-toc">Build Status</h2>
    +                    </div>
    +
    +                    <div class="bd">
    +                        <a href="http://travis-ci.org/yui/yuidoc"><img src="https://secure.travis-ci.org/yui/yuidoc.png?branch=master" border="0"></a>
    +                    </div>
    +                </div>
    +                
    +                    <div id="toc" class="sidebox">
    +                        <div class="hd">
    +                            <h2 class="no-toc">Table of Contents</h2>
    +                        </div>
    +
    +                        <div class="bd">
    +                            <ul class="toc">
    +<li>
    +<a href="#command-line">Running YUIDoc on the Command Line</a>
    +<ul class="toc">
    +<li>
    +<a href="#server">Running YUIDoc in Server Mode</a>
    +</li>
    +<li>
    +<a href="#working-with-yuidoc-parsed-data">Working with YUIDoc Parsed Data</a>
    +<ul class="toc">
    +<li>
    +<a href="#external-data">Adding External YUIDoc Data to Your Project</a>
    +</li>
    +</ul>
    +</li>
    +</ul>
    +</li>
    +<li>
    +<a href="#json">Configuring YUIDoc with yuidoc.json</a>
    +<ul class="toc">
    +<li>
    +<a href="#yuidocjson-fields">yuidoc.json Fields</a>
    +<ul class="toc">
    +<li>
    +<a href="#general-yuidoc-project-information">General YUIDoc Project Information</a>
    +</li>
    +<li>
    +<a href="#yuidoc-options">YUIDoc Options</a>
    +</li>
    +</ul>
    +</li>
    +<li>
    +<a href="#ex-yui3">Example: YUI 3 Library API </a>
    +</li>
    +<li>
    +<a href="#ex-yuidoc">Example: YUIDoc API</a>
    +</li>
    +<li>
    +<a href="#ex-preprocessor">Example: Using preprocessor</a>
    +</li>
    +</ul>
    +</li>
    +</ul>
    +                        </div>
    +                    </div>
    +                
    +
    +                
    +
    +                
    +            </div>
    +        </div>
    +    </div>
    +</div>
    +
    +<script src="../assets/vendor/prettify/prettify-min.js"></script>
    +<script>prettyPrint();</script>
    +
    +</body>
    +</html>
    diff --git a/output/assets/css/main.css b/output/assets/css/main.css
    new file mode 100644
    index 00000000..d1d1609c
    --- /dev/null
    +++ b/output/assets/css/main.css
    @@ -0,0 +1,399 @@
    +/*
    +Font sizes for all selectors other than the body are given in percentages,
    +with 100% equal to 13px. To calculate a font size percentage, multiply the
    +desired size in pixels by 7.6923076923.
    +
    +Here's a quick lookup table:
    +
    +10px - 76.923%
    +11px - 84.615%
    +12px - 92.308%
    +13px - 100%
    +14px - 107.692%
    +15px - 115.385%
    +16px - 123.077%
    +17px - 130.769%
    +18px - 138.462%
    +19px - 146.154%
    +20px - 153.846%
    +*/
    +
    +html {
    +    background: #fff;
    +    color: #333;
    +    overflow-y: scroll;
    +}
    +
    +body {
    +    font: 13px/1.4 Helvetica, 'DejaVu Sans', 'Bitstream Vera Sans', Arial, sans-serif;
    +    margin: 0;
    +    padding: 0;
    +}
    +
    +
    +ul.links {
    +    list-style-type: none;
    +    padding-left: 0;
    +}
    +
    +ul.links li {
    +    margin-bottom: 8px;
    +}
    +
    +ul.links .button {
    +    display: block;
    +    text-align: left;
    +}
    +
    +.crumbs {
    +    background: whiteSmoke;
    +    background: -moz-linear-gradient(top,#DCDBD9 0,#F6F5F3 100%);
    +    background: -webkit-gradient(linear,left top,left bottom,color-stop(0%,#DCDBD9),color-stop(100%,#F6F5F3));
    +    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dcdbd9',endColorstr='#F6F5F3',GradientType=0);
    +    border-top: 1px solid #DFDFDF;
    +    border-bottom: 1px solid #DFDFDF;
    +    padding: 0.25em 1.25em 0.25em;
    +    margin-bottom: 0.75em;
    +}
    +.crumbs a, .crumbs a:visited {
    +    color: #30418C;
    +}
    +
    +#hd {
    +    background: whiteSmoke;
    +    background: -moz-linear-gradient(top,#DCDBD9 0,#F6F5F3 100%);
    +    background: -webkit-gradient(linear,left top,left bottom,color-stop(0%,#DCDBD9),color-stop(100%,#F6F5F3));
    +    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dcdbd9',endColorstr='#F6F5F3',GradientType=0);
    +    border-bottom: 1px solid #DFDFDF;
    +    padding: 0.75em 0 0.5em;
    +    margin-bottom: 15px;
    +}
    +
    +#hd img {
    +    margin-right: 10px;
    +    vertical-align: middle;
    +}
    +
    +/* -- Links ----------------------------------------------------------------- */
    +a {
    +    color: #356de4;
    +    text-decoration: none;
    +}
    +
    +a:hover { text-decoration: underline; }
    +a:visited { color: #6d93e4; }
    +
    +hr {
    +    border: none;
    +    border-top: 1px solid #afafaf;
    +}
    +
    +/* "Jump to Table of Contents" link is shown to assistive tools, but hidden from
    +   sight until it's focused. */
    +.jump {
    +    position: absolute;
    +    padding: 3px 6px;
    +    left: -99999px;
    +    top: 0;
    +}
    +
    +.jump:focus { left: 40%; }
    +
    +/* -- Paragraphs and paragraph-like blocks ---------------------------------- */
    +p,
    +pre.code, pre.terminal, pre.cmd {
    +    margin: 1.2em 0;
    +}
    +
    +dd p, td p { margin-bottom: 0; }
    +dd p:first-child, td p:first-child { margin-top: 0; }
    +
    +/* -- Headings -------------------------------------------------------------- */
    +h1, h2, h3, h4, h5, h6 {
    +    color: #eb8c28;/*was #f80*/
    +    font-family: 'Maven Pro', Helvetica, sans-serif;
    +    font-weight: bold;
    +    line-height: 1.1;
    +    margin: 1.1em 0 0.5em;
    +}
    +
    +h1 {
    +    font-size: 184.6%;
    +    color: #30418C;
    +    margin: 0.75em 0 0.5em;
    +    padding: 0 16px 0 20px;
    +}
    +
    +h2 { font-size: 153.846%; }
    +
    +h3 { font-size: 138.462%; }
    +
    +h4 {
    +    border-bottom: 1px solid #DBDFEA;
    +    font-size: 115.385%;
    +    font-weight: normal;
    +    padding-bottom: 2px;
    +}
    +
    +h5, h6 { font-size: 107.692%; }
    +
    +/* -- Code and examples ----------------------------------------------------- */
    +code, kbd, pre, samp {
    +    font-family: Menlo, Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Consolas', 'Courier New', Courier, monospace;
    +    font-size: 92.308%;
    +    line-height: 1.35;
    +}
    +
    +p code, p kbd, p samp {
    +    background: #FCFBFA;
    +    border: 1px solid #EFEEED;
    +    padding: 0 3px;
    +}
    +
    +a code, a kbd, a samp,
    +pre code, pre kbd, pre samp,
    +table code, table kbd, table samp,
    +.intro code, .intro kbd, .intro samp,
    +.toc code, .toc kbd, .toc samp {
    +    background: none;
    +    border: none;
    +    padding: 0;
    +}
    +
    +pre.code, pre.terminal, pre.cmd, #doc pre.prettyprint {
    +    overflow-x: auto;
    +    padding: 0.3em 0.6em;
    +    _width: 99%;
    +}
    +
    +pre.code, #doc pre.prettyprint {
    +    background: #FCFBFA;
    +    border: 1px solid #EFEEED;
    +    border-left-width: 5px;
    +}
    +
    +pre.terminal, pre.cmd {
    +    background: #F0EFFC;
    +    border: 1px solid #D0CBFB;
    +    border-left: 5px solid #D0CBFB;
    +}
    +
    +/* Don't reduce the font size of <code>/<kbd>/<samp> elements inside <pre>
    +   blocks. */
    +pre code, pre kbd, pre samp { font-size: 100%; }
    +
    +/* Used to denote text that shouldn't be selectable, such as line numbers or
    +   shell prompts. Guess which browser this doesn't work in. */
    +.noselect {
    +    -moz-user-select: -moz-none;
    +    -khtml-user-select: none;
    +    -webkit-user-select: none;
    +    -o-user-select: none;
    +    user-select: none;
    +}
    +
    +/* -- Lists ----------------------------------------------------------------- */
    +dd { margin: 0.2em 0 0.7em 1em; }
    +dl { margin: 1em 0; }
    +dt { font-weight: bold; }
    +
    +/* -- Lists ----------------------------------------------------------------- */
    +dd { margin: 0.2em 0 0.7em 1em; }
    +dl { margin: 1em 0; }
    +dt { font-weight: bold; }
    +
    +/* -- Tables ---------------------------------------------------------------- */
    +caption, th { text-align: left; }
    +
    +table {
    +    border-collapse: collapse;
    +    width: 100%;
    +}
    +
    +td, th {
    +    border: 1px solid #fff;
    +    padding: 5px 12px;
    +    vertical-align: top;
    +}
    +
    +td { background: #E6E9F5; }
    +td dl { margin: 0; }
    +td dl dl { margin: 1em 0; }
    +td pre:first-child { margin-top: 0; }
    +
    +th {
    +    background: #D2D7E6;/*#97A0BF*/
    +    border-bottom: none;
    +    border-top: none;
    +    color: #000;/*#FFF1D5*/
    +    font-weight: bold;
    +    line-height: 1.3;
    +    white-space: nowrap;
    +}
    +
    +/* -- Layout and Content ---------------------------------------------------- */
    +#doc {
    +    margin: auto;
    +    min-width: 960px;
    +    padding-bottom: 50px;
    +}
    +
    +/*#main { width: 99%; }
    +#sidebar { width: 270px; }
    +*/
    +.content { padding: 0 16px 0 20px; }
    +
    +/* -- Sidebar --------------------------------------------------------------- */
    +.sidebar { padding: 0 15px 0 10px; }
    +
    +.sidebox {
    +    border: 1px solid #D4D8EB;
    +    -moz-border-radius: 3px;
    +    -webkit-border-radius: 3px;
    +    border-radius: 3px;
    +    -moz-box-shadow: 0 1px 4px rgba(0,0,0,0.1);
    +    -webkit-box-shadow: 0 1px 4px rgba(0,0,0,0.1);
    +    box-shadow: 0 1px 4px rgba(0,0,0,0.1);
    +    margin: 0 0 15px 0;
    +    padding-bottom: 1px;
    +}
    +
    +.sidebox .hd {
    +    background: #E5E6F1;
    +    -moz-border-radius: 3px 3px 0 0;
    +    -webkit-border-radius: 3px 3px 0 0;
    +    border-radius: 3px 3px 0 0;
    +    padding: 4px 7px 5px;
    +}
    +
    +.sidebox .bd {
    +    background: #F9F9FC;
    +    -moz-border-radius: 0 0 3px 3px;
    +    -webkit-border-radius: 0 0 3px 3px;
    +    border-radius: 0 0 3px 3px;
    +    font-size: 11px;
    +    padding: 10px 8px 10px;
    +}
    +
    +.sidebox .hd h2 {
    +    color: #30418c;
    +    font-weight: bold;
    +    font-size: 107.692%;
    +    margin: 0;
    +}
    +
    +.sidebox li {
    +    color: #D4D5E3;
    +    list-style-type: disc;
    +}
    +
    +.sidebox ol, .sidebox ul {
    +    margin: 0;
    +    padding-left: 14px;
    +}
    +
    +.sidebox ol ol, .sidebox ol ul,
    +.sidebox ul ol, .sidebox ul ul {
    +    margin: 0;
    +    padding-left: 14px;
    +}
    +
    +/* -- Table of Contents ----------------------------------------------------- */
    +
    +/* The #toc id refers to the single global table of contents, while the .toc
    +   class refers to generic TOC lists that could be used throughout the page. */
    +
    +.toc code, .toc kbd, .toc samp { font-size: 100%; }
    +.toc li { font-weight: bold; }
    +.toc li li { font-weight: normal; }
    +
    +/* -- Intro and Example Boxes ----------------------------------------------- */
    +.intro, .example { margin-bottom: 2em; }
    +
    +.example {
    +    -moz-border-radius: 4px;
    +    -webkit-border-radius: 4px;
    +    border-radius: 4px;
    +    -moz-box-shadow: 0 0 5px #bfbfbf;
    +    -webkit-box-shadow: 0 0 5px #bfbfbf;
    +    box-shadow: 0 0 5px #bfbfbf;
    +    padding: 1em;
    +    border: 1px solid #dfdfdf\9; /* IE6-8 only */
    +}
    +
    +.intro {
    +    background: #F0F1F8;/*E6E9F5*/
    +    border: 1px solid #D4D8EB;
    +    -moz-border-radius: 3px;
    +    -webkit-border-radius: 3px;
    +    border-radius: 3px;
    +    padding: 0 1em;
    +}
    +
    +/* -- Other Styles ---------------------------------------------------------- */
    +
    +/* These are probably YUI-specific, and should be moved out of Selleck's default
    +   theme. */
    +
    +/* Pretty buttons. */
    +.button,
    +.button:visited {
    +    color: #444;
    +}
    +
    +.button {
    +    border: 1px solid #e9e9e9;
    +    -moz-border-radius: 3px;
    +    -webkit-border-radius: 3px;
    +    border-radius: 3px;
    +    -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
    +    -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
    +    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
    +    display: inline-block;
    +    font-family: Helvetica, Arial, sans-serif;
    +    font-size: 13px;
    +    font-weight: bold;
    +    padding: 4px 13px 3px;
    +    text-align: center;
    +    -moz-text-shadow: 1px 1px 0 #fff;
    +    -webkit-text-shadow: 1px 1px 0 #fff;
    +    text-shadow: 1px 1px 0 #fff;
    +    white-space: nowrap;
    +
    +    background: #EFEFEF; /* old browsers */
    +    background: -moz-linear-gradient(top, #f5f5f5 0%, #efefef 50%, #e5e5e5 51%, #dfdfdf 100%); /* firefox */
    +    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(50%,#efefef), color-stop(51%,#e5e5e5), color-stop(100%,#dfdfdf)); /* webkit */
    +    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#dfdfdf',GradientType=0 ); /* ie */
    +    *border-color: #dadada;
    +    *padding-bottom: 5px;
    +}
    +
    +.button:hover {
    +    border-color: #466899;
    +    -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
    +    -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
    +    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
    +    color: #fff;
    +    text-decoration: none;
    +    -moz-text-shadow: 1px 1px 0 #222;
    +    -webkit-text-shadow: 1px 1px 0 #222;
    +    text-shadow: 1px 1px 0 #222;
    +
    +    background: #6396D8; /* old browsers */
    +    background: -moz-linear-gradient(top, #6396D8 0%, #5A83BC 50%, #547AB7 51%, #466899 100%); /* firefox */
    +    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#6396D8), color-stop(50%,#5A83BC), color-stop(51%,#547AB7), color-stop(100%,#466899)); /* webkit */
    +    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6396D8', endColorstr='#466899',GradientType=0 ); /* ie */
    +}
    +
    +/* Big download button, like on the Home page. */
    +.button.download {
    +    display: block;
    +    font-size: 18px;
    +    margin: 0 0 1em;
    +    padding: 9px 17px 8px;
    +}
    +
    +.newwindow { text-align: center; }
    +
    +/* List with extra vertical spacing between items. */
    +.spaced li { margin: 0.8em 0; }
    diff --git a/output/assets/favicon.ico b/output/assets/favicon.ico
    new file mode 100644
    index 0000000000000000000000000000000000000000..414ac4fb9e145171ae8f660e51879e18c401e653
    GIT binary patch
    literal 5430
    zcmdT|c~n&A6@SF^c=}JZwQU+rgHaP#WKr3f0cL=KVVglvkVQZiQDfDk(FA2t0)iWh
    zY=W#JA~S%vRZzjDF`C4MRAU4c7u+h2MgbA{^?q-_;)qB%w&!%tx#zw2&G&uxzWd$#
    zyTAK5PK$ew8$O()>u4_YeUAH#<G9hI)z8H=zKO;r&=}p)4D~o&IF80Oe*n1t<Z1K6
    zKRmqA_(^|rH2-`0;NGZn%A!TPmIm)%XRdcU$xV71U0qt5^ZI&jI#cUW7Akv~AvMGX
    z!4yR3kHKn#@hz%5O(Xl7uQ~Q@VS0>Wt}S-?OOYwFzy>RQteQ9yKUN)d(VW}sS?gZ?
    zPx|>Q!Vau3)9EakCq-qL90hZ1ks>ulgswI!)`q9{n*WN=S|2z6sbrBy(?+QgBE*JB
    zlnJnZksB2AoRK}#3JJogNS28kUOaCb+SeXkot@mC@Q@R^-quL*5MiyIF?RYpVBbPF
    z?DVronzI>VjK-tk)Cp_N^|bcAW9b_=#|x%(<@s2lFu)#3Gp(_~*#hPBT~HA!L*8sL
    z5-cX6B63B6=K7xxlrGM9x4<?xOKf#A!47{B3TTflZe)wQ6)G3Vu{+QS87^i>v^V+X
    z@!h76dhelXtk*db8Fs$J#|HUcwzQ80?IA{iKik6!8Kj%}a)*xu8-<f`EHf#(_j-2U
    z`sl%5j>j)QTIwf8F}-ijENc|feZIeh-y_r024x{G$d+3m-A#1A<x%qp%{@BW+lF2!
    zO5Ic*<bd6NcKq4pdyA1v_v~HLJZSH^4oDK~;&@i_Yc}-kcdzb@P0hN`zhyC0<RwC`
    zrwH4<Y<N31xeDq1gvgKy9;=#eecZD~^V<31#rusX4|yMpTXtL#=-8PfH={E&!3KLH
    zthF`7*MiB|8?}75=DNO~RgG7s{(MmJw_}M>#mc4rKV*4JZ^cW^A4gm2x16n1`1ZBt
    zO=A=*TCJ+)5vp5_WA9%1Y4U@{YvUl~xHfH$Q*}!uT_cBaTn!1wWT;vqhtL>_N{i-`
    zfQE5hjWeU^-jamj5&vVrqw#x_P5&?BEJq*RzBTINkt&-zmoH8FU)Zf`y7|$CeM+xA
    z(W}x^+#S9n9DFkWk3*qYvohtsrN85O+mNd#4m%%+URIj!DtH`gG9FO|pJ4UW(O5P4
    zV=U1gfmAQ~(RZ!C<9X}QhQpQqhr&a@FPv?KZLX$BC)`V-oY`Qlj~LU*h?w>%R!kU$
    zNMoJ*&mJ`of0s5qz27vdJlL^Q8R!6IkPDAj+X?^DoJ_IBb_Ui9bg|ZGBEogYVA<FY
    zP=D&A#k<tc_Bxrc;z-#%2UN^wnCnP*YJ+WZ0bheQiVP5Iu7ju<pJD0f5vWSp{N+2-
    z-v#c6!-wn(!aUDchB{#n;dNPvD_?tZW{HsQVvZz<ArdV0u+C%>R!$g+%(=6w-i7}9
    zGv5f)!~Cij>W#&6W2#YMu2gemybnsLeinM$A#0{3QXNgO*=9Q81XB??Z5*PFr>LIX
    zzxU_C+R*w~HLNN*HaX7TxO0uAF21swh9$;2*fv{4wOdX;U^d8j9+BrM=D9?2cPxHw
    zHko|zA<plwm^m2z&5c(klrEW5mnt(uvbzWyTm)DrF~KUK0V2gSNVf~sOc{R;%3xO%
    z`AV?egK8M%1B=CYp)SIw{1qiD7v~RF|Be8gmONh@WP3}9a}Ylu8`hEyD+LC~q%+^Y
    zkbFSzuZ~406!5iOsE$SPG{hKBK)l%KZj0*Cu))}HxmqzV-$#J_xsq-hM7#~r#C;;j
    z2c<zy*h_KH6N|-u4#*|DGF-c3(Mk_%rfQ?^V5R)m>hEZ8A5t0fRZ5n-33diaUb7+6
    z#t55SEV}ipZBPWMV=<e>B4GlH#pvl{v2#gq*{{)09Pl?4tC#GInl=Ur)_N!k6r*Tf
    z-!^1Z{_k6;)?X1SM@fJq)UimI;9yMos7v{v`|RP3>)Hdcp{uiltBw!PPb3bMOuRP1
    z+JLTx*cC!tXPzDJhb%rGM2IK;$YQcMK&tiwVG@rCzQoTc78y1t+8H96-lKL~@~XG$
    zC;oq7cg~l&Zsy1(PRRIXs*@Qu*~~zO+!Q6DcGwYUhdhdh9vkAE%(33l9Lf-9-Ub$n
    zrNl)UFV7+#wpD6E+*${zGi|T5x3=`jt$XYuo;t2P)VW1TamD<|aE0YmhN}e<B}T}e
    zW%0TVl$&v+f3r+Tama8<j&kDDj7PF}U~7}?4H0AbDe4YXc=YJ%>&iIc<$cAAl>WBF
    z$z7occH!}rohRdzDN<A9%od;|MC}Kb7t9X~A7aUd6zU@wCRBz|U(sEkvb*b30`*CG
    zL7pcWzw1kP?=iArp)!DMAfK{#DWN*k<BK%H`JCB8><YH!&qC9NH1Zeo0Xqlg!<Y4m
    zVlmEiBI^HfOw?P~o9?e3t@J4macn6MmUd$t`GS0!M?621e7${^5XC|2n9TDdKg_XH
    z`$1}sG{S(r>>NU5uhb{jD;6&f{QH}9YL4GIf68+I(%Fs506Vfl#`}WRT;>br*K7|<
    z6b0C*^P;y6j%G-u9*yA=j|nUm2@|$bKCvF`+L>?6HFdq|`IkF4v}<FRR4L|)DJEQA
    z@db;oY<Ei(_=^6Mo8*Ti77tRY8x#-h{B|=;pt+gUb8fWM!OqY9tGl|oUg=NYq@Rs<
    zv_Bv6<L<206~WTBvOq~MUpT4b!rdA<p45*~+_HWwYmVfl4Xht3p?qXL8_$)TO%YFh
    z=H=RIhyHZ-_1}X_=ZtFBEviva??^n1cz_&A%8{O2%l5EBuD9qVKJa-#@eoJ8$R)oN
    zF`htqv_-6k9Dld73}^e&)8AO<i}v^G4=I8UF86L=XHp*QL_IY5nBK7`N3tj`w$CA6
    zM*5fy3?Ep{+A6n1em75uH=l^p#d!<*)79U9ZK~$qUo6l2;^1<h28BQMzVtmp8SKpa
    zg5gCLVP_`ATn6Pr5}nU_!s-aBS#kEJ$Rr=6Iv63v$@~HJsH6JR^S1w<KT-Xzp}NAq
    zCT4Lh;l+zmKl-lXYllLLc^*3{=28hW5~)@)oMtwxww{5F4kp-SIR#Ybir=PVK>t%b
    zH#c0;xmcFBvNm?v(TW8#n|F9wBU@&QH2UU}BAJfOw$l+$H969H8dh59VYN`7xatI4
    z*sJgvkPga)fzEsO;O>V_XHSXilm*Lcw?yStd=Y%2FhF)K)6H77MPm3omN;rS^$N@M
    z#vn?d_vB{XIsJj|J=l5et<Qe@^k4TsXuffET+=_#PrrHYJChq{&zN5Q{<O)XJGTe)
    z?QF2R2e^)=Z3fziF4mB6RIZsss;?c~5U5D5^P)xfT6C|48v4w@ggz%kbc>Llh1W?`
    c9H-qz(m`J;Xu?oLlCTZhNI;9}q1!h68y;F)#sB~S
    
    literal 0
    HcmV?d00001
    
    diff --git a/output/assets/vendor/prettify/CHANGES.html b/output/assets/vendor/prettify/CHANGES.html
    new file mode 100644
    index 00000000..9da9fa63
    --- /dev/null
    +++ b/output/assets/vendor/prettify/CHANGES.html
    @@ -0,0 +1,155 @@
    +<html>
    +  <head>
    +    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    +    <title>Change Log</title>
    +  </head>
    +  <body bgcolor="white">
    +    <a style="float:right" href="README.html">README</a>
    +
    +    <h1>Known Issues</h1>
    +    <ul>
    +      <li>Perl formatting is really crappy.  Partly because the author is lazy and
    +      partly because Perl is
    +      <a href="http://www.perlmonks.org/?node_id=663393">hard</a> to parse.
    +      <li>On some browsers, <code>&lt;code&gt;</code> elements with newlines in the text
    +      which use CSS to specify <code>white-space:pre</code> will have the newlines
    +      improperly stripped if the element is not attached to the document at the time
    +      the stripping is done.  Also, on IE 6, all newlines will be stripped from
    +      <code>&lt;code&gt;</code> elements because of the way IE6 produces
    +      <code>innerHTML</code>.  Workaround: use <code>&lt;pre&gt;</code> for code with
    +      newlines.
    +    </ul>
    +
    +    <h1>Change Log</h1>
    +    <h2>29 March 2007</h2>
    +    <ul>
    +      <li>Added <a href="tests/prettify_test.html#PHP">tests</a> for PHP support
    +        to address
    +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=3"
    +       >issue 3</a>.
    +      <li>Fixed
    +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=6"
    +       >bug</a>: <code>prettyPrintOne</code> was not halting.  This was not
    +        reachable through the normal entry point.
    +      <li>Fixed
    +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=4"
    +       >bug</a>: recursing into a script block or PHP tag that was not properly
    +        closed would not silently drop the content.
    +        (<a href="tests/prettify_test.html#issue4">test</a>)
    +      <li>Fixed
    +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=8"
    +       >bug</a>: was eating tabs
    +        (<a href="tests/prettify_test.html#issue8">test</a>)
    +      <li>Fixed entity handling so that the caveat
    +        <blockquote>
    +          <p>Caveats: please properly escape less-thans.  <tt>x&amp;lt;y</tt>
    +          instead of <tt>x&lt;y</tt>, and use <tt>&quot;</tt> instead of
    +          <tt>&amp;quot;</tt> for string delimiters.</p>
    +        </blockquote>
    +        is no longer applicable.
    +      <li>Added noisefree's C#
    +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=4"
    +       >patch</a>
    +      <li>Added a <a href="http://google-code-prettify.googlecode.com/files/prettify-small.zip">distribution</a> that has comments and
    +        whitespace removed to reduce download size from 45.5kB to 12.8kB.
    +    </ul>
    +    <h2>4 Jul 2008</h2>
    +    <ul>
    +      <li>Added <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=17">language specific formatters</a> that are triggered by the presence
    +      of a <code>lang-&lt;language-file-extension&gt;</code></li>
    +      <li>Fixed <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=29">bug</a>: python handling of <code>'''string'''</code>
    +      <li>Fixed bug: <code>/</code> in regex <code>[charsets] should not end regex</code>
    +    </ul>
    +    <h2>5 Jul 2008</h2>
    +    <ul>
    +      <li>Defined language extensions for Lisp and Lua</code>
    +    </ul>
    +    <h2>14 Jul 2008</h2>
    +    <ul>
    +      <li>Language handlers for F#, OCAML, SQL</code>
    +      <li>Support for <code>nocode</code> spans to allow embedding of line
    +      numbers and code annotations which should not be styled or otherwise
    +      affect the tokenization of prettified code.
    +      See the issue 22
    +      <a href="tests/prettify_test.html#issue22">testcase</a>.</code>
    +    </ul>
    +    <h2>6 Jan 2009</h2>
    +    <ul>
    +      <li>Language handlers for Visual Basic, Haskell, CSS, and WikiText</li>
    +      <li>Added <tt>.mxml</tt> extension to the markup style handler for
    +        Flex <a href="http://en.wikipedia.org/wiki/MXML">MXML files</a>.  See
    +        <a
    +        href="http://code.google.com/p/google-code-prettify/issues/detail?id=37"
    +        >issue 37</a>.
    +      <li>Added <tt>.m</tt> extension to the C style handler so that Objective
    +        C source files properly highlight.  See
    +        <a
    +        href="http://code.google.com/p/google-code-prettify/issues/detail?id=58"
    +       >issue 58</a>.
    +      <li>Changed HTML lexer to use the same embedded source mechanism as the
    +        wiki language handler, and changed to use the registered
    +        CSS handler for STYLE element content.
    +    </ul>
    +    <h2>21 May 2009</h2>
    +    <ul>
    +      <li>Rewrote to improve performance on large files.
    +        See <a href="http://mikesamuel.blogspot.com/2009/05/efficient-parsing-in-javascript.html">benchmarks</a>.</li>
    +      <li>Fixed bugs with highlighting of Haskell line comments, Lisp
    +        number literals, Lua strings, C preprocessor directives,
    +        newlines in Wiki code on Windows, and newlines in IE6.</li>
    +    </ul>
    +    <h2>14 August 2009</h2>
    +    <ul>
    +      <li>Fixed prettifying of <code>&lt;code&gt;</code> blocks with embedded newlines.
    +    </ul>
    +    <h2>3 October 2009</h2>
    +    <ul>
    +      <li>Fixed prettifying of XML/HTML tags that contain uppercase letters.
    +    </ul>
    +    <h2>19 July 2010</h2>
    +    <ul>
    +      <li>Added support for line numbers.  Bug
    +        <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=22"
    +         >22</a></li>
    +      <li>Added YAML support.  Bug
    +        <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=123"
    +         >123</a></li>
    +      <li>Added VHDL support courtesy Le Poussin.</li>
    +      <li>IE performance improvements.  Bug
    +        <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=102"
    +         >102</a> courtesy jacobly.</li>
    +      <li>A variety of markup formatting fixes courtesy smain and thezbyg.</li>
    +      <li>Fixed copy and paste in IE[678].
    +      <li>Changed output to use <code>&amp;#160;</code> instead of
    +        <code>&amp;nbsp;</code> so that the output works when embedded in XML.
    +        Bug
    +        <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=108"
    +         >108</a>.</li>
    +    </ul>
    +    <h2>7 September 2010</h2>
    +    <ul>
    +      <li>Added support for coffeescript courtesy Cezary Bartoszuk.</li>
    +    </ul>
    +    <h2>4 March 2011</h2>
    +    <ul>
    +      <li>Added a <a href="http://google-code-prettify.googlecode.com/svn/trunk/styles/index.html">themes
    +      gallery</a> to showcase contributed styles.</li>
    +      <li>Added support for XQuery courtesy Patrick Wied, Nemerle
    +      courtesy Zimin A.V., and Latex support courtesy Martin S.</li>
    +    </ul>
    +    <h2>29 March 2011</h2>
    +    <ul>
    +      <li>Fixed IE newline issues, and copying/pasting of prettified
    +      source code from IE.  This required significant internal changes
    +      but involves no API changes.
    +      <b>Caveat:</b> <code>prettyPrintOne</code> injects the HTML
    +      passed to it into a <code>&lt;pre&gt;</code> element.
    +      If the HTML comes from a trusted source, this may allow XSS.
    +      Do not do this.  This should not be a problem for existing apps
    +      since the standard usage is to rewrite the HTML and then inject
    +      it, so anyone doing that with untrusted HTML already has an XSS
    +      vulnerability.  If you sanitize and prettify HTML from an
    +      untrusted source, sanitize first.
    +    </ul>
    +  </body>
    +</html>
    diff --git a/output/assets/vendor/prettify/COPYING b/output/assets/vendor/prettify/COPYING
    new file mode 100644
    index 00000000..d6456956
    --- /dev/null
    +++ b/output/assets/vendor/prettify/COPYING
    @@ -0,0 +1,202 @@
    +
    +                                 Apache License
    +                           Version 2.0, January 2004
    +                        http://www.apache.org/licenses/
    +
    +   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
    +
    +   1. Definitions.
    +
    +      "License" shall mean the terms and conditions for use, reproduction,
    +      and distribution as defined by Sections 1 through 9 of this document.
    +
    +      "Licensor" shall mean the copyright owner or entity authorized by
    +      the copyright owner that is granting the License.
    +
    +      "Legal Entity" shall mean the union of the acting entity and all
    +      other entities that control, are controlled by, or are under common
    +      control with that entity. For the purposes of this definition,
    +      "control" means (i) the power, direct or indirect, to cause the
    +      direction or management of such entity, whether by contract or
    +      otherwise, or (ii) ownership of fifty percent (50%) or more of the
    +      outstanding shares, or (iii) beneficial ownership of such entity.
    +
    +      "You" (or "Your") shall mean an individual or Legal Entity
    +      exercising permissions granted by this License.
    +
    +      "Source" form shall mean the preferred form for making modifications,
    +      including but not limited to software source code, documentation
    +      source, and configuration files.
    +
    +      "Object" form shall mean any form resulting from mechanical
    +      transformation or translation of a Source form, including but
    +      not limited to compiled object code, generated documentation,
    +      and conversions to other media types.
    +
    +      "Work" shall mean the work of authorship, whether in Source or
    +      Object form, made available under the License, as indicated by a
    +      copyright notice that is included in or attached to the work
    +      (an example is provided in the Appendix below).
    +
    +      "Derivative Works" shall mean any work, whether in Source or Object
    +      form, that is based on (or derived from) the Work and for which the
    +      editorial revisions, annotations, elaborations, or other modifications
    +      represent, as a whole, an original work of authorship. For the purposes
    +      of this License, Derivative Works shall not include works that remain
    +      separable from, or merely link (or bind by name) to the interfaces of,
    +      the Work and Derivative Works thereof.
    +
    +      "Contribution" shall mean any work of authorship, including
    +      the original version of the Work and any modifications or additions
    +      to that Work or Derivative Works thereof, that is intentionally
    +      submitted to Licensor for inclusion in the Work by the copyright owner
    +      or by an individual or Legal Entity authorized to submit on behalf of
    +      the copyright owner. For the purposes of this definition, "submitted"
    +      means any form of electronic, verbal, or written communication sent
    +      to the Licensor or its representatives, including but not limited to
    +      communication on electronic mailing lists, source code control systems,
    +      and issue tracking systems that are managed by, or on behalf of, the
    +      Licensor for the purpose of discussing and improving the Work, but
    +      excluding communication that is conspicuously marked or otherwise
    +      designated in writing by the copyright owner as "Not a Contribution."
    +
    +      "Contributor" shall mean Licensor and any individual or Legal Entity
    +      on behalf of whom a Contribution has been received by Licensor and
    +      subsequently incorporated within the Work.
    +
    +   2. Grant of Copyright License. Subject to the terms and conditions of
    +      this License, each Contributor hereby grants to You a perpetual,
    +      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
    +      copyright license to reproduce, prepare Derivative Works of,
    +      publicly display, publicly perform, sublicense, and distribute the
    +      Work and such Derivative Works in Source or Object form.
    +
    +   3. Grant of Patent License. Subject to the terms and conditions of
    +      this License, each Contributor hereby grants to You a perpetual,
    +      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
    +      (except as stated in this section) patent license to make, have made,
    +      use, offer to sell, sell, import, and otherwise transfer the Work,
    +      where such license applies only to those patent claims licensable
    +      by such Contributor that are necessarily infringed by their
    +      Contribution(s) alone or by combination of their Contribution(s)
    +      with the Work to which such Contribution(s) was submitted. If You
    +      institute patent litigation against any entity (including a
    +      cross-claim or counterclaim in a lawsuit) alleging that the Work
    +      or a Contribution incorporated within the Work constitutes direct
    +      or contributory patent infringement, then any patent licenses
    +      granted to You under this License for that Work shall terminate
    +      as of the date such litigation is filed.
    +
    +   4. Redistribution. You may reproduce and distribute copies of the
    +      Work or Derivative Works thereof in any medium, with or without
    +      modifications, and in Source or Object form, provided that You
    +      meet the following conditions:
    +
    +      (a) You must give any other recipients of the Work or
    +          Derivative Works a copy of this License; and
    +
    +      (b) You must cause any modified files to carry prominent notices
    +          stating that You changed the files; and
    +
    +      (c) You must retain, in the Source form of any Derivative Works
    +          that You distribute, all copyright, patent, trademark, and
    +          attribution notices from the Source form of the Work,
    +          excluding those notices that do not pertain to any part of
    +          the Derivative Works; and
    +
    +      (d) If the Work includes a "NOTICE" text file as part of its
    +          distribution, then any Derivative Works that You distribute must
    +          include a readable copy of the attribution notices contained
    +          within such NOTICE file, excluding those notices that do not
    +          pertain to any part of the Derivative Works, in at least one
    +          of the following places: within a NOTICE text file distributed
    +          as part of the Derivative Works; within the Source form or
    +          documentation, if provided along with the Derivative Works; or,
    +          within a display generated by the Derivative Works, if and
    +          wherever such third-party notices normally appear. The contents
    +          of the NOTICE file are for informational purposes only and
    +          do not modify the License. You may add Your own attribution
    +          notices within Derivative Works that You distribute, alongside
    +          or as an addendum to the NOTICE text from the Work, provided
    +          that such additional attribution notices cannot be construed
    +          as modifying the License.
    +
    +      You may add Your own copyright statement to Your modifications and
    +      may provide additional or different license terms and conditions
    +      for use, reproduction, or distribution of Your modifications, or
    +      for any such Derivative Works as a whole, provided Your use,
    +      reproduction, and distribution of the Work otherwise complies with
    +      the conditions stated in this License.
    +
    +   5. Submission of Contributions. Unless You explicitly state otherwise,
    +      any Contribution intentionally submitted for inclusion in the Work
    +      by You to the Licensor shall be under the terms and conditions of
    +      this License, without any additional terms or conditions.
    +      Notwithstanding the above, nothing herein shall supersede or modify
    +      the terms of any separate license agreement you may have executed
    +      with Licensor regarding such Contributions.
    +
    +   6. Trademarks. This License does not grant permission to use the trade
    +      names, trademarks, service marks, or product names of the Licensor,
    +      except as required for reasonable and customary use in describing the
    +      origin of the Work and reproducing the content of the NOTICE file.
    +
    +   7. Disclaimer of Warranty. Unless required by applicable law or
    +      agreed to in writing, Licensor provides the Work (and each
    +      Contributor provides its Contributions) on an "AS IS" BASIS,
    +      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
    +      implied, including, without limitation, any warranties or conditions
    +      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
    +      PARTICULAR PURPOSE. You are solely responsible for determining the
    +      appropriateness of using or redistributing the Work and assume any
    +      risks associated with Your exercise of permissions under this License.
    +
    +   8. Limitation of Liability. In no event and under no legal theory,
    +      whether in tort (including negligence), contract, or otherwise,
    +      unless required by applicable law (such as deliberate and grossly
    +      negligent acts) or agreed to in writing, shall any Contributor be
    +      liable to You for damages, including any direct, indirect, special,
    +      incidental, or consequential damages of any character arising as a
    +      result of this License or out of the use or inability to use the
    +      Work (including but not limited to damages for loss of goodwill,
    +      work stoppage, computer failure or malfunction, or any and all
    +      other commercial damages or losses), even if such Contributor
    +      has been advised of the possibility of such damages.
    +
    +   9. Accepting Warranty or Additional Liability. While redistributing
    +      the Work or Derivative Works thereof, You may choose to offer,
    +      and charge a fee for, acceptance of support, warranty, indemnity,
    +      or other liability obligations and/or rights consistent with this
    +      License. However, in accepting such obligations, You may act only
    +      on Your own behalf and on Your sole responsibility, not on behalf
    +      of any other Contributor, and only if You agree to indemnify,
    +      defend, and hold each Contributor harmless for any liability
    +      incurred by, or claims asserted against, such Contributor by reason
    +      of your accepting any such warranty or additional liability.
    +
    +   END OF TERMS AND CONDITIONS
    +
    +   APPENDIX: How to apply the Apache License to your work.
    +
    +      To apply the Apache License to your work, attach the following
    +      boilerplate notice, with the fields enclosed by brackets "[]"
    +      replaced with your own identifying information. (Don't include
    +      the brackets!)  The text should be enclosed in the appropriate
    +      comment syntax for the file format. We also recommend that a
    +      file or class name and description of purpose be included on the
    +      same "printed page" as the copyright notice for easier
    +      identification within third-party archives.
    +
    +   Copyright [yyyy] [name of copyright owner]
    +
    +   Licensed under the Apache License, Version 2.0 (the "License");
    +   you may not use this file except in compliance with the License.
    +   You may obtain a copy of the License at
    +
    +       http://www.apache.org/licenses/LICENSE-2.0
    +
    +   Unless required by applicable law or agreed to in writing, software
    +   distributed under the License is distributed on an "AS IS" BASIS,
    +   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +   See the License for the specific language governing permissions and
    +   limitations under the License.
    diff --git a/output/assets/vendor/prettify/README.html b/output/assets/vendor/prettify/README.html
    new file mode 100644
    index 00000000..967d6131
    --- /dev/null
    +++ b/output/assets/vendor/prettify/README.html
    @@ -0,0 +1,233 @@
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    +
    +<html>
    +  <head>
    +    <title>Javascript code prettifier</title>
    +
    +    <link href="src/prettify.css" type="text/css" rel="stylesheet" />
    +
    +    <script src="src/prettify.js" type="text/javascript"></script>
    +
    +    <style type="text/css">
    +      body { margin-left: .5in }
    +      h1, h2, h3, h4, .footer { margin-left: -.4in; }
    +    </style>
    +  </head>
    +
    +  <body onload="prettyPrint()" bgcolor="white">
    +    <small style="float: right">Languages : <a href="README-zh-Hans.html">CH</a></small>
    +    <h1>Javascript code prettifier</h1>
    +
    +    <h2>Setup</h2>
    +    <ol>
    +      <li><a href="http://code.google.com/p/google-code-prettify/downloads/list">Download</a> a distribution
    +      <li>Include the script and stylesheets in your document
    +        (you will need to make sure the css and js file are on your server, and
    +         adjust the paths in the <tt>script</tt> and <tt>link</tt> tag)
    +        <pre class="prettyprint">
    +&lt;link href="prettify.css" type="text/css" rel="stylesheet" /&gt;
    +&lt;script type="text/javascript" src="prettify.js"&gt;&lt;/script&gt;</pre>
    +      <li>Add <code class="prettyprint lang-in.tag">onload="prettyPrint()"</code> to your
    +      document's body tag.
    +      <li>Modify the stylesheet to get the coloring you prefer</li>
    +    </ol>
    +
    +    <h2>Usage</h2>
    +    <p>Put code snippets in
    +    <tt>&lt;pre class="prettyprint"&gt;...&lt;/pre&gt;</tt>
    +    or <tt>&lt;code class="prettyprint"&gt;...&lt;/code&gt;</tt>
    +    and it will automatically be pretty printed.
    +
    +    <table summary="code examples">
    +      <tr>
    +        <th>The original
    +        <th>Prettier
    +      <tr>
    +        <td><pre style="border: 1px solid #888;padding: 2px"
    +             ><a name="voila1"></a>class Voila {
    +public:
    +  // Voila
    +  static const string VOILA = "Voila";
    +
    +  // will not interfere with embedded <a href="#voila1">tags</a>.
    +}</pre>
    +
    +        <td><pre class="prettyprint"><a name="voila2"></a>class Voila {
    +public:
    +  // Voila
    +  static const string VOILA = "Voila";
    +
    +  // will not interfere with embedded <a href="#voila2">tags</a>.
    +}</pre>
    +    </table>
    +
    +    <h2>FAQ</h2>
    +    <h3 id="langs">For which languages does it work?</h3>
    +    <p>The comments in <tt>prettify.js</tt> are authoritative but the lexer
    +    should work on a number of languages including C and friends,
    +    Java, Python, Bash, SQL, HTML, XML, CSS, Javascript, and Makefiles.
    +    It works passably on Ruby, PHP, VB, and Awk and a decent subset of Perl
    +    and Ruby, but, because of commenting conventions, doesn't work on
    +    Smalltalk, or CAML-like languages.</p>
    +
    +    <p>LISPy languages are supported via an extension:
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-lisp.js"
    +     ><code>lang-lisp.js</code></a>.</p>
    +    <p>And similarly for
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-clj.js"
    +     ><code>Clojure</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-css.js"
    +     ><code>CSS</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-go.js"
    +     ><code>Go</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-hs.js"
    +     ><code>Haskell</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-lua.js"
    +     ><code>Lua</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-ml.js"
    +     ><code>OCAML, SML, F#</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-n.js"
    +     ><code>Nemerle</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-proto.js"
    +     ><code>Protocol Buffers</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-scala.js"
    +     ><code>Scala</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-sql.js"
    +     ><code>SQL</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-tex.js"
    +     ><code>TeX, LaTeX</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-vhdl.js"
    +     ><code>VHDL</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-vb.js"
    +     ><code>Visual Basic</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-wiki.js"
    +     ><code>WikiText</code></a>,
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-xq.js"
    +     ><code>XQuery</code></a>, and
    +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-yaml.js"
    +     ><code>YAML</code></a>.
    +
    +    <p>If you'd like to add an extension for your favorite language, please
    +    look at <tt>src/lang-lisp.js</tt> and file an
    +    <a href="http://code.google.com/p/google-code-prettify/issues/list"
    +     >issue</a> including your language extension, and a testcase.</p>
    +
    +    <h3>How do I specify the language of my code?</h3>
    +    <p>You don't need to specify the language since <code>prettyprint()</code>
    +    will guess.  You can specify a language by specifying the language extension
    +    along with the <code>prettyprint</code> class like so:</p>
    +    <pre class="prettyprint lang-html"
    +>&lt;pre class=&quot;prettyprint <b>lang-html</b>&quot;&gt;
    +  The lang-* class specifies the language file extensions.
    +  File extensions supported by default include
    +    "bsh", "c", "cc", "cpp", "cs", "csh", "cyc", "cv", "htm", "html",
    +    "java", "js", "m", "mxml", "perl", "pl", "pm", "py", "rb", "sh",
    +    "xhtml", "xml", "xsl".
    +&lt;/pre&gt;</pre>
    +
    +    <p>You may also use the
    +    <a href="http://dev.w3.org/html5/spec-author-view/the-code-element.html#the-code-element"
    +     >HTML 5</a> convention of embedding a <tt>code</tt> element inside the
    +    <code>PRE</code> and using <code>language-java</code> style classes.
    +    E.g. <xmp class="prettyprint"><pre class="prettyprint"><code class="language-java">...</code></pre>
    +
    +    

    It doesn't work on <obfuscated code sample>?

    +

    Yes. Prettifying obfuscated code is like putting lipstick on a pig + — i.e. outside the scope of this tool.

    + +

    Which browsers does it work with?

    +

    It's been tested with IE 6, Firefox 1.5 & 2, and Safari 2.0.4. + Look at the test page to see if it + works in your browser.

    + +

    What's changed?

    +

    See the change log

    + +

    Why doesn't Prettyprinting of strings work on WordPress?

    +

    Apparently wordpress does "smart quoting" which changes close quotes. + This causes end quotes to not match up with open quotes. +

    This breaks prettifying as well as copying and pasting of code samples. + See + WordPress's help center for info on how to stop smart quoting of code + snippets.

    + +

    How do I put line numbers in my code?

    +

    You can use the linenums class to turn on line + numbering. If your code doesn't start at line number 1, you can + add a colon and a line number to the end of that class as in + linenums:52. + +

    For example +

    <pre class="prettyprint linenums:4"
    +>// This is line 4.
    +foo();
    +bar();
    +baz();
    +boo();
    +far();
    +faz();
    +<pre>
    + produces +
    // This is line 4.
    +foo();
    +bar();
    +baz();
    +boo();
    +far();
    +faz();
    +
    + +

    How do I prevent a portion of markup from being marked as code?

    +

    You can use the nocode class to identify a span of markup + that is not code. +

    <pre class=prettyprint>
    +int x = foo();  /* This is a comment  <span class="nocode">This is not code</span>
    +  Continuation of comment */
    +int y = bar();
    +</pre>
    +produces +
    +int x = foo();  /* This is a comment  This is not code
    +  Continuation of comment */
    +int y = bar();
    +
    + +

    For a more complete example see the issue22 + testcase.

    + +

    I get an error message "a is not a function" or "opt_whenDone is not a function"

    +

    If you are calling prettyPrint via an event handler, wrap it in a function. + Instead of doing +

    + addEventListener('load', prettyPrint, false); +
    + wrap it in a closure like +
    + addEventListener('load', function (event) { prettyPrint() }, false); +
    + so that the browser does not pass an event object to prettyPrint which + will confuse it. + +

    How can I customize the colors and styles of my code?

    +

    + Prettify adds <span> with classes describing + the kind of code. You can create CSS styles to matches these + classes. + See the + + theme gallery for examples. +

    + +


    + + + + diff --git a/output/assets/vendor/prettify/prettify-min.css b/output/assets/vendor/prettify/prettify-min.css new file mode 100644 index 00000000..d44b3a22 --- /dev/null +++ b/output/assets/vendor/prettify/prettify-min.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} \ No newline at end of file diff --git a/output/assets/vendor/prettify/prettify-min.js b/output/assets/vendor/prettify/prettify-min.js new file mode 100644 index 00000000..4845d05d --- /dev/null +++ b/output/assets/vendor/prettify/prettify-min.js @@ -0,0 +1 @@ +window.PR_SHOULD_USE_CONTINUATION=true;var prettyPrintOne;var prettyPrint;(function(){var O=window;var j=["break,continue,do,else,for,if,return,while"];var v=[j,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var q=[v,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var m=[q,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var y=[q,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var T=[y,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"];var s="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes";var x=[q,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var t="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var J=[j,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var g=[j,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var I=[j,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var B=[m,T,x,t+J,g,I];var f=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/;var D="str";var A="kwd";var k="com";var Q="typ";var H="lit";var M="pun";var G="pln";var n="tag";var F="dec";var K="src";var R="atn";var o="atv";var P="nocode";var N="(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function l(ab){var af=0;var U=false;var ae=false;for(var X=0,W=ab.length;X122)){if(!(am<65||ai>90)){ah.push([Math.max(65,ai)|32,Math.min(am,90)|32])}if(!(am<97||ai>122)){ah.push([Math.max(97,ai)&~32,Math.min(am,122)&~32])}}}}ah.sort(function(aw,av){return(aw[0]-av[0])||(av[1]-aw[1])});var ak=[];var aq=[];for(var at=0;atau[0]){if(au[1]+1>au[0]){ao.push("-")}ao.push(V(au[1]))}}ao.push("]");return ao.join("")}function Y(an){var al=an.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var aj=al.length;var ap=[];for(var am=0,ao=0;am=2&&ak==="["){al[am]=Z(ai)}else{if(ak!=="\\"){al[am]=ai.replace(/[a-zA-Z]/g,function(aq){var ar=aq.charCodeAt(0);return"["+String.fromCharCode(ar&~32,ar|32)+"]"})}}}}return al.join("")}var ac=[];for(var X=0,W=ab.length;X=0;){U[ae.charAt(ag)]=aa}}var ah=aa[1];var ac=""+ah;if(!ai.hasOwnProperty(ac)){aj.push(ah);ai[ac]=null}}aj.push(/[\0-\uffff]/);X=l(aj)})();var Z=V.length;var Y=function(aj){var ab=aj.sourceCode,aa=aj.basePos;var af=[aa,G];var ah=0;var ap=ab.match(X)||[];var al={};for(var ag=0,at=ap.length;ag=5&&"lang-"===ar.substring(0,5);if(ao&&!(ak&&typeof ak[1]==="string")){ao=false;ar=K}if(!ao){al[ai]=ar}}var ad=ah;ah+=ai.length;if(!ao){af.push(aa+ad,ar)}else{var an=ak[1];var am=ai.indexOf(an);var ae=am+an.length;if(ak[2]){ae=ai.length-ak[2].length;am=ae-an.length}var au=ar.substring(5);C(aa+ad,ai.substring(0,am),Y,af);C(aa+ad+am,an,r(au,an),af);C(aa+ad+ae,ai.substring(ae),Y,af)}}aj.decorations=af};return Y}function i(V){var Y=[],U=[];if(V.tripleQuotedStrings){Y.push([D,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(V.multiLineStrings){Y.push([D,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{Y.push([D,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(V.verbatimStrings){U.push([D,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var ab=V.hashComments;if(ab){if(V.cStyleComments){if(ab>1){Y.push([k,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{Y.push([k,/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}U.push([D,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,null])}else{Y.push([k,/^#[^\r\n]*/,null,"#"])}}if(V.cStyleComments){U.push([k,/^\/\/[^\r\n]*/,null]);U.push([k,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(V.regexLiterals){var aa=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");U.push(["lang-regex",new RegExp("^"+N+"("+aa+")")])}var X=V.types;if(X){U.push([Q,X])}var W=(""+V.keywords).replace(/^ | $/g,"");if(W.length){U.push([A,new RegExp("^(?:"+W.replace(/[\s,]+/g,"|")+")\\b"),null])}Y.push([G,/^\s+/,null," \r\n\t\xA0"]);var Z=/^.[^\s\w\.$@\'\"\`\/\\]*/;U.push([H,/^@[a-z_$][a-z_$@0-9]*/i,null],[Q,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[G,/^[a-z_$][a-z_$@0-9]*/i,null],[H,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[G,/^\\[\s\S]?/,null],[M,Z,null]);return h(Y,U)}var L=i({keywords:B,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function S(W,ah,aa){var V=/(?:^|\s)nocode(?:\s|$)/;var ac=/\r\n?|\n/;var ad=W.ownerDocument;var ag=ad.createElement("li");while(W.firstChild){ag.appendChild(W.firstChild)}var X=[ag];function af(am){switch(am.nodeType){case 1:if(V.test(am.className)){break}if("br"===am.nodeName){ae(am);if(am.parentNode){am.parentNode.removeChild(am)}}else{for(var ao=am.firstChild;ao;ao=ao.nextSibling){af(ao)}}break;case 3:case 4:if(aa){var an=am.nodeValue;var ak=an.match(ac);if(ak){var aj=an.substring(0,ak.index);am.nodeValue=aj;var ai=an.substring(ak.index+ak[0].length);if(ai){var al=am.parentNode;al.insertBefore(ad.createTextNode(ai),am.nextSibling)}ae(am);if(!aj){am.parentNode.removeChild(am)}}}break}}function ae(al){while(!al.nextSibling){al=al.parentNode;if(!al){return}}function aj(am,at){var ar=at?am.cloneNode(false):am;var ap=am.parentNode;if(ap){var aq=aj(ap,1);var ao=am.nextSibling;aq.appendChild(ar);for(var an=ao;an;an=ao){ao=an.nextSibling;aq.appendChild(an)}}return ar}var ai=aj(al.nextSibling,0);for(var ak;(ak=ai.parentNode)&&ak.nodeType===1;){ai=ak}X.push(ai)}for(var Z=0;Z=U){aj+=2}if(Y>=ar){ac+=2}}}finally{if(au){au.style.display=ak}}}var u={};function d(W,X){for(var U=X.length;--U>=0;){var V=X[U];if(!u.hasOwnProperty(V)){u[V]=W}else{if(O.console){console.warn("cannot override language handler %s",V)}}}}function r(V,U){if(!(V&&u.hasOwnProperty(V))){V=/^\s*]*(?:>|$)/],[k,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[M,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);d(h([[G,/^[\s]+/,null," \t\r\n"],[o,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[n,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[R,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[M,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);d(h([],[[o,/^[\s\S]+/]]),["uq.val"]);d(i({keywords:m,hashComments:true,cStyleComments:true,types:f}),["c","cc","cpp","cxx","cyc","m"]);d(i({keywords:"null,true,false"}),["json"]);d(i({keywords:T,hashComments:true,cStyleComments:true,verbatimStrings:true,types:f}),["cs"]);d(i({keywords:y,cStyleComments:true}),["java"]);d(i({keywords:I,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);d(i({keywords:J,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);d(i({keywords:t,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);d(i({keywords:g,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);d(i({keywords:x,cStyleComments:true,regexLiterals:true}),["js"]);d(i({keywords:s,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);d(h([],[[D,/^[\s\S]+/]]),["regex"]);function e(X){var W=X.langExtension;try{var U=b(X.sourceNode,X.pre);var V=U.sourceCode;X.sourceCode=V;X.spans=U.spans;X.basePos=0;r(W,V)(X);E(X)}catch(Y){if(O.console){console.log(Y&&Y.stack?Y.stack:Y)}}}function z(Y,X,W){var U=document.createElement("pre");U.innerHTML=Y;if(W){S(U,W,true)}var V={langExtension:X,numberLines:W,sourceNode:U,pre:1};e(V);return U.innerHTML}function c(aj){function ab(al){return document.getElementsByTagName(al)}var ah=[ab("pre"),ab("code"),ab("xmp")];var V=[];for(var ae=0;ae]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); \ No newline at end of file diff --git a/output/assets/vendor/prettify/prettify.css b/output/assets/vendor/prettify/prettify.css new file mode 100644 index 00000000..400fd742 --- /dev/null +++ b/output/assets/vendor/prettify/prettify.css @@ -0,0 +1,52 @@ +/* Pretty printing styles. Used with prettify.js. */ + +/* SPAN elements with the classes below are added by prettyprint. */ +.pln { color: #000 } /* plain text */ + +@media screen { + .str { color: #080 } /* string content */ + .kwd { color: #008 } /* a keyword */ + .com { color: #800 } /* a comment */ + .typ { color: #606 } /* a type name */ + .lit { color: #066 } /* a literal value */ + /* punctuation, lisp open bracket, lisp close bracket */ + .pun, .opn, .clo { color: #660 } + .tag { color: #008 } /* a markup tag name */ + .atn { color: #606 } /* a markup attribute name */ + .atv { color: #080 } /* a markup attribute value */ + .dec, .var { color: #606 } /* a declaration; a variable name */ + .fun { color: red } /* a function name */ +} + +/* Use higher contrast and text-weight for printable form. */ +@media print, projection { + .str { color: #060 } + .kwd { color: #006; font-weight: bold } + .com { color: #600; font-style: italic } + .typ { color: #404; font-weight: bold } + .lit { color: #044 } + .pun, .opn, .clo { color: #440 } + .tag { color: #006; font-weight: bold } + .atn { color: #404 } + .atv { color: #060 } +} + +/* Put a border around prettyprinted code snippets. */ +pre.prettyprint { padding: 2px; border: 1px solid #888 } + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { margin-top: 0; margin-bottom: 0 } /* IE indents via margin-left */ +li.L0, +li.L1, +li.L2, +li.L3, +li.L5, +li.L6, +li.L7, +li.L8 { list-style-type: none } +/* Alternate shading for lines */ +li.L1, +li.L3, +li.L5, +li.L7, +li.L9 { background: #eee } diff --git a/output/assets/vendor/prettify/prettify.js b/output/assets/vendor/prettify/prettify.js new file mode 100644 index 00000000..63d73d0a --- /dev/null +++ b/output/assets/vendor/prettify/prettify.js @@ -0,0 +1,1710 @@ +// NOTE: This is a customized version of Prettify for Selleck, with Handlebars +// and CSS syntax highlighting added at the end. + +// Copyright (C) 2006 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +/** + * @fileoverview + * some functions for browser-side pretty printing of code contained in html. + * + *

    + * For a fairly comprehensive set of languages see the + * README + * file that came with this source. At a minimum, the lexer should work on a + * number of languages including C and friends, Java, Python, Bash, SQL, HTML, + * XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP and Awk + * and a subset of Perl, but, because of commenting conventions, doesn't work on + * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class. + *

    + * Usage:

      + *
    1. include this source file in an html page via + * {@code } + *
    2. define style rules. See the example page for examples. + *
    3. mark the {@code
      } and {@code } tags in your source with
      + *    {@code class=prettyprint.}
      + *    You can also use the (html deprecated) {@code } tag, but the pretty
      + *    printer needs to do more substantial DOM manipulations to support that, so
      + *    some css styles may not be preserved.
      + * </ol>
      + * That's it.  I wanted to keep the API as simple as possible, so there's no
      + * need to specify which language the code is in, but if you wish, you can add
      + * another class to the {@code <pre>} or {@code <code>} element to specify the
      + * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
      + * starts with "lang-" followed by a file extension, specifies the file type.
      + * See the "lang-*.js" files in this directory for code that implements
      + * per-language file handlers.
      + * <p>
      + * Change log:<br>
      + * cbeust, 2006/08/22
      + * <blockquote>
      + *   Java annotations (start with "@") are now captured as literals ("lit")
      + * </blockquote>
      + * @requires console
      + */
      +
      +// JSLint declarations
      +/*global console, document, navigator, setTimeout, window, define */
      +
      +/**
      + * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
      + * UI events.
      + * If set to {@code false}, {@code prettyPrint()} is synchronous.
      + */
      +window['PR_SHOULD_USE_CONTINUATION'] = true;
      +
      +/**
      + * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
      + * {@code class=prettyprint} and prettify them.
      + *
      + * @param {Function?} opt_whenDone if specified, called when the last entry
      + *     has been finished.
      + */
      +var prettyPrintOne;
      +/**
      + * Pretty print a chunk of code.
      + *
      + * @param {string} sourceCodeHtml code as html
      + * @return {string} code as html, but prettier
      + */
      +var prettyPrint;
      +
      +
      +(function () {
      +  var win = window;
      +  // Keyword lists for various languages.
      +  // We use things that coerce to strings to make them compact when minified
      +  // and to defeat aggressive optimizers that fold large string constants.
      +  var FLOW_CONTROL_KEYWORDS = ["break,continue,do,else,for,if,return,while"];
      +  var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,"auto,case,char,const,default," + 
      +      "double,enum,extern,float,goto,int,long,register,short,signed,sizeof," +
      +      "static,struct,switch,typedef,union,unsigned,void,volatile"];
      +  var COMMON_KEYWORDS = [C_KEYWORDS,"catch,class,delete,false,import," +
      +      "new,operator,private,protected,public,this,throw,true,try,typeof"];
      +  var CPP_KEYWORDS = [COMMON_KEYWORDS,"alignof,align_union,asm,axiom,bool," +
      +      "concept,concept_map,const_cast,constexpr,decltype," +
      +      "dynamic_cast,explicit,export,friend,inline,late_check," +
      +      "mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast," +
      +      "template,typeid,typename,using,virtual,where"];
      +  var JAVA_KEYWORDS = [COMMON_KEYWORDS,
      +      "abstract,boolean,byte,extends,final,finally,implements,import," +
      +      "instanceof,null,native,package,strictfp,super,synchronized,throws," +
      +      "transient"];
      +  var CSHARP_KEYWORDS = [JAVA_KEYWORDS,
      +      "as,base,by,checked,decimal,delegate,descending,dynamic,event," +
      +      "fixed,foreach,from,group,implicit,in,interface,internal,into,is,let," +
      +      "lock,object,out,override,orderby,params,partial,readonly,ref,sbyte," +
      +      "sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort," +
      +      "var,virtual,where"];
      +  var COFFEE_KEYWORDS = "all,and,by,catch,class,else,extends,false,finally," +
      +      "for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then," +
      +      "throw,true,try,unless,until,when,while,yes";
      +  var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,
      +      "debugger,eval,export,function,get,null,set,undefined,var,with," +
      +      "Infinity,NaN"];
      +  var PERL_KEYWORDS = "caller,delete,die,do,dump,elsif,eval,exit,foreach,for," +
      +      "goto,if,import,last,local,my,next,no,our,print,package,redo,require," +
      +      "sub,undef,unless,until,use,wantarray,while,BEGIN,END";
      +  var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "and,as,assert,class,def,del," +
      +      "elif,except,exec,finally,from,global,import,in,is,lambda," +
      +      "nonlocal,not,or,pass,print,raise,try,with,yield," +
      +      "False,True,None"];
      +  var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "alias,and,begin,case,class," +
      +      "def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo," +
      +      "rescue,retry,self,super,then,true,undef,unless,until,when,yield," +
      +      "BEGIN,END"];
      +  var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "case,done,elif,esac,eval,fi," +
      +      "function,in,local,set,then,until"];
      +  var ALL_KEYWORDS = [
      +      CPP_KEYWORDS, CSHARP_KEYWORDS, JSCRIPT_KEYWORDS, PERL_KEYWORDS +
      +      PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS];
      +  var C_TYPES = /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/;
      +
      +  // token style names.  correspond to css classes
      +  /**
      +   * token style for a string literal
      +   * @const
      +   */
      +  var PR_STRING = 'str';
      +  /**
      +   * token style for a keyword
      +   * @const
      +   */
      +  var PR_KEYWORD = 'kwd';
      +  /**
      +   * token style for a comment
      +   * @const
      +   */
      +  var PR_COMMENT = 'com';
      +  /**
      +   * token style for a type
      +   * @const
      +   */
      +  var PR_TYPE = 'typ';
      +  /**
      +   * token style for a literal value.  e.g. 1, null, true.
      +   * @const
      +   */
      +  var PR_LITERAL = 'lit';
      +  /**
      +   * token style for a punctuation string.
      +   * @const
      +   */
      +  var PR_PUNCTUATION = 'pun';
      +  /**
      +   * token style for plain text.
      +   * @const
      +   */
      +  var PR_PLAIN = 'pln';
      +
      +  /**
      +   * token style for an sgml tag.
      +   * @const
      +   */
      +  var PR_TAG = 'tag';
      +  /**
      +   * token style for a markup declaration such as a DOCTYPE.
      +   * @const
      +   */
      +  var PR_DECLARATION = 'dec';
      +  /**
      +   * token style for embedded source.
      +   * @const
      +   */
      +  var PR_SOURCE = 'src';
      +  /**
      +   * token style for an sgml attribute name.
      +   * @const
      +   */
      +  var PR_ATTRIB_NAME = 'atn';
      +  /**
      +   * token style for an sgml attribute value.
      +   * @const
      +   */
      +  var PR_ATTRIB_VALUE = 'atv';
      +
      +  /**
      +   * A class that indicates a section of markup that is not code, e.g. to allow
      +   * embedding of line numbers within code listings.
      +   * @const
      +   */
      +  var PR_NOCODE = 'nocode';
      +
      +
      +
      +/**
      + * A set of tokens that can precede a regular expression literal in
      + * javascript
      + * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html
      + * has the full list, but I've removed ones that might be problematic when
      + * seen in languages that don't support regular expression literals.
      + *
      + * <p>Specifically, I've removed any keywords that can't precede a regexp
      + * literal in a syntactically legal javascript program, and I've removed the
      + * "in" keyword since it's not a keyword in many languages, and might be used
      + * as a count of inches.
      + *
      + * <p>The link above does not accurately describe EcmaScript rules since
      + * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
      + * very well in practice.
      + *
      + * @private
      + * @const
      + */
      +var REGEXP_PRECEDER_PATTERN = '(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*';
      +
      +// CAVEAT: this does not properly handle the case where a regular
      +// expression immediately follows another since a regular expression may
      +// have flags for case-sensitivity and the like.  Having regexp tokens
      +// adjacent is not valid in any language I'm aware of, so I'm punting.
      +// TODO: maybe style special characters inside a regexp as punctuation.
      +
      +
      +  /**
      +   * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
      +   * matches the union of the sets of strings matched by the input RegExp.
      +   * Since it matches globally, if the input strings have a start-of-input
      +   * anchor (/^.../), it is ignored for the purposes of unioning.
      +   * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
      +   * @return {RegExp} a global regex.
      +   */
      +  function combinePrefixPatterns(regexs) {
      +    var capturedGroupIndex = 0;
      +  
      +    var needToFoldCase = false;
      +    var ignoreCase = false;
      +    for (var i = 0, n = regexs.length; i < n; ++i) {
      +      var regex = regexs[i];
      +      if (regex.ignoreCase) {
      +        ignoreCase = true;
      +      } else if (/[a-z]/i.test(regex.source.replace(
      +                     /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
      +        needToFoldCase = true;
      +        ignoreCase = false;
      +        break;
      +      }
      +    }
      +  
      +    var escapeCharToCodeUnit = {
      +      'b': 8,
      +      't': 9,
      +      'n': 0xa,
      +      'v': 0xb,
      +      'f': 0xc,
      +      'r': 0xd
      +    };
      +  
      +    function decodeEscape(charsetPart) {
      +      var cc0 = charsetPart.charCodeAt(0);
      +      if (cc0 !== 92 /* \\ */) {
      +        return cc0;
      +      }
      +      var c1 = charsetPart.charAt(1);
      +      cc0 = escapeCharToCodeUnit[c1];
      +      if (cc0) {
      +        return cc0;
      +      } else if ('0' <= c1 && c1 <= '7') {
      +        return parseInt(charsetPart.substring(1), 8);
      +      } else if (c1 === 'u' || c1 === 'x') {
      +        return parseInt(charsetPart.substring(2), 16);
      +      } else {
      +        return charsetPart.charCodeAt(1);
      +      }
      +    }
      +  
      +    function encodeEscape(charCode) {
      +      if (charCode < 0x20) {
      +        return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
      +      }
      +      var ch = String.fromCharCode(charCode);
      +      return (ch === '\\' || ch === '-' || ch === ']' || ch === '^')
      +          ? "\\" + ch : ch;
      +    }
      +  
      +    function caseFoldCharset(charSet) {
      +      var charsetParts = charSet.substring(1, charSet.length - 1).match(
      +          new RegExp(
      +              '\\\\u[0-9A-Fa-f]{4}'
      +              + '|\\\\x[0-9A-Fa-f]{2}'
      +              + '|\\\\[0-3][0-7]{0,2}'
      +              + '|\\\\[0-7]{1,2}'
      +              + '|\\\\[\\s\\S]'
      +              + '|-'
      +              + '|[^-\\\\]',
      +              'g'));
      +      var ranges = [];
      +      var inverse = charsetParts[0] === '^';
      +  
      +      var out = ['['];
      +      if (inverse) { out.push('^'); }
      +  
      +      for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
      +        var p = charsetParts[i];
      +        if (/\\[bdsw]/i.test(p)) {  // Don't muck with named groups.
      +          out.push(p);
      +        } else {
      +          var start = decodeEscape(p);
      +          var end;
      +          if (i + 2 < n && '-' === charsetParts[i + 1]) {
      +            end = decodeEscape(charsetParts[i + 2]);
      +            i += 2;
      +          } else {
      +            end = start;
      +          }
      +          ranges.push([start, end]);
      +          // If the range might intersect letters, then expand it.
      +          // This case handling is too simplistic.
      +          // It does not deal with non-latin case folding.
      +          // It works for latin source code identifiers though.
      +          if (!(end < 65 || start > 122)) {
      +            if (!(end < 65 || start > 90)) {
      +              ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
      +            }
      +            if (!(end < 97 || start > 122)) {
      +              ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
      +            }
      +          }
      +        }
      +      }
      +  
      +      // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
      +      // -> [[1, 12], [14, 14], [16, 17]]
      +      ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
      +      var consolidatedRanges = [];
      +      var lastRange = [];
      +      for (var i = 0; i < ranges.length; ++i) {
      +        var range = ranges[i];
      +        if (range[0] <= lastRange[1] + 1) {
      +          lastRange[1] = Math.max(lastRange[1], range[1]);
      +        } else {
      +          consolidatedRanges.push(lastRange = range);
      +        }
      +      }
      +  
      +      for (var i = 0; i < consolidatedRanges.length; ++i) {
      +        var range = consolidatedRanges[i];
      +        out.push(encodeEscape(range[0]));
      +        if (range[1] > range[0]) {
      +          if (range[1] + 1 > range[0]) { out.push('-'); }
      +          out.push(encodeEscape(range[1]));
      +        }
      +      }
      +      out.push(']');
      +      return out.join('');
      +    }
      +  
      +    function allowAnywhereFoldCaseAndRenumberGroups(regex) {
      +      // Split into character sets, escape sequences, punctuation strings
      +      // like ('(', '(?:', ')', '^'), and runs of characters that do not
      +      // include any of the above.
      +      var parts = regex.source.match(
      +          new RegExp(
      +              '(?:'
      +              + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
      +              + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
      +              + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
      +              + '|\\\\[0-9]+'  // a back-reference or octal escape
      +              + '|\\\\[^ux0-9]'  // other escape sequence
      +              + '|\\(\\?[:!=]'  // start of a non-capturing group
      +              + '|[\\(\\)\\^]'  // start/end of a group, or line start
      +              + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
      +              + ')',
      +              'g'));
      +      var n = parts.length;
      +  
      +      // Maps captured group numbers to the number they will occupy in
      +      // the output or to -1 if that has not been determined, or to
      +      // undefined if they need not be capturing in the output.
      +      var capturedGroups = [];
      +  
      +      // Walk over and identify back references to build the capturedGroups
      +      // mapping.
      +      for (var i = 0, groupIndex = 0; i < n; ++i) {
      +        var p = parts[i];
      +        if (p === '(') {
      +          // groups are 1-indexed, so max group index is count of '('
      +          ++groupIndex;
      +        } else if ('\\' === p.charAt(0)) {
      +          var decimalValue = +p.substring(1);
      +          if (decimalValue) {
      +            if (decimalValue <= groupIndex) {
      +              capturedGroups[decimalValue] = -1;
      +            } else {
      +              // Replace with an unambiguous escape sequence so that
      +              // an octal escape sequence does not turn into a backreference
      +              // to a capturing group from an earlier regex.
      +              parts[i] = encodeEscape(decimalValue);
      +            }
      +          }
      +        }
      +      }
      +  
      +      // Renumber groups and reduce capturing groups to non-capturing groups
      +      // where possible.
      +      for (var i = 1; i < capturedGroups.length; ++i) {
      +        if (-1 === capturedGroups[i]) {
      +          capturedGroups[i] = ++capturedGroupIndex;
      +        }
      +      }
      +      for (var i = 0, groupIndex = 0; i < n; ++i) {
      +        var p = parts[i];
      +        if (p === '(') {
      +          ++groupIndex;
      +          if (!capturedGroups[groupIndex]) {
      +            parts[i] = '(?:';
      +          }
      +        } else if ('\\' === p.charAt(0)) {
      +          var decimalValue = +p.substring(1);
      +          if (decimalValue && decimalValue <= groupIndex) {
      +            parts[i] = '\\' + capturedGroups[decimalValue];
      +          }
      +        }
      +      }
      +  
      +      // Remove any prefix anchors so that the output will match anywhere.
      +      // ^^ really does mean an anchored match though.
      +      for (var i = 0; i < n; ++i) {
      +        if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
      +      }
      +  
      +      // Expand letters to groups to handle mixing of case-sensitive and
      +      // case-insensitive patterns if necessary.
      +      if (regex.ignoreCase && needToFoldCase) {
      +        for (var i = 0; i < n; ++i) {
      +          var p = parts[i];
      +          var ch0 = p.charAt(0);
      +          if (p.length >= 2 && ch0 === '[') {
      +            parts[i] = caseFoldCharset(p);
      +          } else if (ch0 !== '\\') {
      +            // TODO: handle letters in numeric escapes.
      +            parts[i] = p.replace(
      +                /[a-zA-Z]/g,
      +                function (ch) {
      +                  var cc = ch.charCodeAt(0);
      +                  return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
      +                });
      +          }
      +        }
      +      }
      +  
      +      return parts.join('');
      +    }
      +  
      +    var rewritten = [];
      +    for (var i = 0, n = regexs.length; i < n; ++i) {
      +      var regex = regexs[i];
      +      if (regex.global || regex.multiline) { throw new Error('' + regex); }
      +      rewritten.push(
      +          '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
      +    }
      +  
      +    return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
      +  }
      +
      +
      +  /**
      +   * Split markup into a string of source code and an array mapping ranges in
      +   * that string to the text nodes in which they appear.
      +   *
      +   * <p>
      +   * The HTML DOM structure:</p>
      +   * <pre>
      +   * (Element   "p"
      +   *   (Element "b"
      +   *     (Text  "print "))       ; #1
      +   *   (Text    "'Hello '")      ; #2
      +   *   (Element "br")            ; #3
      +   *   (Text    "  + 'World';")) ; #4
      +   * </pre>
      +   * <p>
      +   * corresponds to the HTML
      +   * {@code <p><b>print </b>'Hello '<br>  + 'World';</p>}.</p>
      +   *
      +   * <p>
      +   * It will produce the output:</p>
      +   * <pre>
      +   * {
      +   *   sourceCode: "print 'Hello '\n  + 'World';",
      +   *   //                     1          2
      +   *   //           012345678901234 5678901234567
      +   *   spans: [0, #1, 6, #2, 14, #3, 15, #4]
      +   * }
      +   * </pre>
      +   * <p>
      +   * where #1 is a reference to the {@code "print "} text node above, and so
      +   * on for the other text nodes.
      +   * </p>
      +   *
      +   * <p>
      +   * The {@code} spans array is an array of pairs.  Even elements are the start
      +   * indices of substrings, and odd elements are the text nodes (or BR elements)
      +   * that contain the text for those substrings.
      +   * Substrings continue until the next index or the end of the source.
      +   * </p>
      +   *
      +   * @param {Node} node an HTML DOM subtree containing source-code.
      +   * @param {boolean} isPreformatted true if white-space in text nodes should
      +   *    be considered significant.
      +   * @return {Object} source code and the text nodes in which they occur.
      +   */
      +  function extractSourceSpans(node, isPreformatted) {
      +    var nocode = /(?:^|\s)nocode(?:\s|$)/;
      +  
      +    var chunks = [];
      +    var length = 0;
      +    var spans = [];
      +    var k = 0;
      +  
      +    function walk(node) {
      +      switch (node.nodeType) {
      +        case 1:  // Element
      +          if (nocode.test(node.className)) { return; }
      +          for (var child = node.firstChild; child; child = child.nextSibling) {
      +            walk(child);
      +          }
      +          var nodeName = node.nodeName.toLowerCase();
      +          if ('br' === nodeName || 'li' === nodeName) {
      +            chunks[k] = '\n';
      +            spans[k << 1] = length++;
      +            spans[(k++ << 1) | 1] = node;
      +          }
      +          break;
      +        case 3: case 4:  // Text
      +          var text = node.nodeValue;
      +          if (text.length) {
      +            if (!isPreformatted) {
      +              text = text.replace(/[ \t\r\n]+/g, ' ');
      +            } else {
      +              text = text.replace(/\r\n?/g, '\n');  // Normalize newlines.
      +            }
      +            // TODO: handle tabs here?
      +            chunks[k] = text;
      +            spans[k << 1] = length;
      +            length += text.length;
      +            spans[(k++ << 1) | 1] = node;
      +          }
      +          break;
      +      }
      +    }
      +  
      +    walk(node);
      +  
      +    return {
      +      sourceCode: chunks.join('').replace(/\n$/, ''),
      +      spans: spans
      +    };
      +  }
      +
      +
      +  /**
      +   * Apply the given language handler to sourceCode and add the resulting
      +   * decorations to out.
      +   * @param {number} basePos the index of sourceCode within the chunk of source
      +   *    whose decorations are already present on out.
      +   */
      +  function appendDecorations(basePos, sourceCode, langHandler, out) {
      +    if (!sourceCode) { return; }
      +    var job = {
      +      sourceCode: sourceCode,
      +      basePos: basePos
      +    };
      +    langHandler(job);
      +    out.push.apply(out, job.decorations);
      +  }
      +
      +  var notWs = /\S/;
      +
      +  /**
      +   * Given an element, if it contains only one child element and any text nodes
      +   * it contains contain only space characters, return the sole child element.
      +   * Otherwise returns undefined.
      +   * <p>
      +   * This is meant to return the CODE element in {@code <pre><code ...>} when
      +   * there is a single child element that contains all the non-space textual
      +   * content, but not to return anything where there are multiple child elements
      +   * as in {@code <pre><code>...</code><code>...</code></pre>} or when there
      +   * is textual content.
      +   */
      +  function childContentWrapper(element) {
      +    var wrapper = undefined;
      +    for (var c = element.firstChild; c; c = c.nextSibling) {
      +      var type = c.nodeType;
      +      wrapper = (type === 1)  // Element Node
      +          ? (wrapper ? element : c)
      +          : (type === 3)  // Text Node
      +          ? (notWs.test(c.nodeValue) ? element : wrapper)
      +          : wrapper;
      +    }
      +    return wrapper === element ? undefined : wrapper;
      +  }
      +
      +  /** Given triples of [style, pattern, context] returns a lexing function,
      +    * The lexing function interprets the patterns to find token boundaries and
      +    * returns a decoration list of the form
      +    * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
      +    * where index_n is an index into the sourceCode, and style_n is a style
      +    * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
      +    * all characters in sourceCode[index_n-1:index_n].
      +    *
      +    * The stylePatterns is a list whose elements have the form
      +    * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
      +    *
      +    * Style is a style constant like PR_PLAIN, or can be a string of the
      +    * form 'lang-FOO', where FOO is a language extension describing the
      +    * language of the portion of the token in $1 after pattern executes.
      +    * E.g., if style is 'lang-lisp', and group 1 contains the text
      +    * '(hello (world))', then that portion of the token will be passed to the
      +    * registered lisp handler for formatting.
      +    * The text before and after group 1 will be restyled using this decorator
      +    * so decorators should take care that this doesn't result in infinite
      +    * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
      +    * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
      +    * '<script>foo()<\/script>', which would cause the current decorator to
      +    * be called with '<script>' which would not match the same rule since
      +    * group 1 must not be empty, so it would be instead styled as PR_TAG by
      +    * the generic tag rule.  The handler registered for the 'js' extension would
      +    * then be called with 'foo()', and finally, the current decorator would
      +    * be called with '<\/script>' which would not match the original rule and
      +    * so the generic tag rule would identify it as a tag.
      +    *
      +    * Pattern must only match prefixes, and if it matches a prefix, then that
      +    * match is considered a token with the same style.
      +    *
      +    * Context is applied to the last non-whitespace, non-comment token
      +    * recognized.
      +    *
      +    * Shortcut is an optional string of characters, any of which, if the first
      +    * character, gurantee that this pattern and only this pattern matches.
      +    *
      +    * @param {Array} shortcutStylePatterns patterns that always start with
      +    *   a known character.  Must have a shortcut string.
      +    * @param {Array} fallthroughStylePatterns patterns that will be tried in
      +    *   order if the shortcut ones fail.  May have shortcuts.
      +    *
      +    * @return {function (Object)} a
      +    *   function that takes source code and returns a list of decorations.
      +    */
      +  function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
      +    var shortcuts = {};
      +    var tokenizer;
      +    (function () {
      +      var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
      +      var allRegexs = [];
      +      var regexKeys = {};
      +      for (var i = 0, n = allPatterns.length; i < n; ++i) {
      +        var patternParts = allPatterns[i];
      +        var shortcutChars = patternParts[3];
      +        if (shortcutChars) {
      +          for (var c = shortcutChars.length; --c >= 0;) {
      +            shortcuts[shortcutChars.charAt(c)] = patternParts;
      +          }
      +        }
      +        var regex = patternParts[1];
      +        var k = '' + regex;
      +        if (!regexKeys.hasOwnProperty(k)) {
      +          allRegexs.push(regex);
      +          regexKeys[k] = null;
      +        }
      +      }
      +      allRegexs.push(/[\0-\uffff]/);
      +      tokenizer = combinePrefixPatterns(allRegexs);
      +    })();
      +
      +    var nPatterns = fallthroughStylePatterns.length;
      +
      +    /**
      +     * Lexes job.sourceCode and produces an output array job.decorations of
      +     * style classes preceded by the position at which they start in
      +     * job.sourceCode in order.
      +     *
      +     * @param {Object} job an object like <pre>{
      +     *    sourceCode: {string} sourceText plain text,
      +     *    basePos: {int} position of job.sourceCode in the larger chunk of
      +     *        sourceCode.
      +     * }</pre>
      +     */
      +    var decorate = function (job) {
      +      var sourceCode = job.sourceCode, basePos = job.basePos;
      +      /** Even entries are positions in source in ascending order.  Odd enties
      +        * are style markers (e.g., PR_COMMENT) that run from that position until
      +        * the end.
      +        * @type {Array.<number|string>}
      +        */
      +      var decorations = [basePos, PR_PLAIN];
      +      var pos = 0;  // index into sourceCode
      +      var tokens = sourceCode.match(tokenizer) || [];
      +      var styleCache = {};
      +
      +      for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
      +        var token = tokens[ti];
      +        var style = styleCache[token];
      +        var match = void 0;
      +
      +        var isEmbedded;
      +        if (typeof style === 'string') {
      +          isEmbedded = false;
      +        } else {
      +          var patternParts = shortcuts[token.charAt(0)];
      +          if (patternParts) {
      +            match = token.match(patternParts[1]);
      +            style = patternParts[0];
      +          } else {
      +            for (var i = 0; i < nPatterns; ++i) {
      +              patternParts = fallthroughStylePatterns[i];
      +              match = token.match(patternParts[1]);
      +              if (match) {
      +                style = patternParts[0];
      +                break;
      +              }
      +            }
      +
      +            if (!match) {  // make sure that we make progress
      +              style = PR_PLAIN;
      +            }
      +          }
      +
      +          isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
      +          if (isEmbedded && !(match && typeof match[1] === 'string')) {
      +            isEmbedded = false;
      +            style = PR_SOURCE;
      +          }
      +
      +          if (!isEmbedded) { styleCache[token] = style; }
      +        }
      +
      +        var tokenStart = pos;
      +        pos += token.length;
      +
      +        if (!isEmbedded) {
      +          decorations.push(basePos + tokenStart, style);
      +        } else {  // Treat group 1 as an embedded block of source code.
      +          var embeddedSource = match[1];
      +          var embeddedSourceStart = token.indexOf(embeddedSource);
      +          var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
      +          if (match[2]) {
      +            // If embeddedSource can be blank, then it would match at the
      +            // beginning which would cause us to infinitely recurse on the
      +            // entire token, so we catch the right context in match[2].
      +            embeddedSourceEnd = token.length - match[2].length;
      +            embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
      +          }
      +          var lang = style.substring(5);
      +          // Decorate the left of the embedded source
      +          appendDecorations(
      +              basePos + tokenStart,
      +              token.substring(0, embeddedSourceStart),
      +              decorate, decorations);
      +          // Decorate the embedded source
      +          appendDecorations(
      +              basePos + tokenStart + embeddedSourceStart,
      +              embeddedSource,
      +              langHandlerForExtension(lang, embeddedSource),
      +              decorations);
      +          // Decorate the right of the embedded section
      +          appendDecorations(
      +              basePos + tokenStart + embeddedSourceEnd,
      +              token.substring(embeddedSourceEnd),
      +              decorate, decorations);
      +        }
      +      }
      +      job.decorations = decorations;
      +    };
      +    return decorate;
      +  }
      +
      +  /** returns a function that produces a list of decorations from source text.
      +    *
      +    * This code treats ", ', and ` as string delimiters, and \ as a string
      +    * escape.  It does not recognize perl's qq() style strings.
      +    * It has no special handling for double delimiter escapes as in basic, or
      +    * the tripled delimiters used in python, but should work on those regardless
      +    * although in those cases a single string literal may be broken up into
      +    * multiple adjacent string literals.
      +    *
      +    * It recognizes C, C++, and shell style comments.
      +    *
      +    * @param {Object} options a set of optional parameters.
      +    * @return {function (Object)} a function that examines the source code
      +    *     in the input job and builds the decoration list.
      +    */
      +  function sourceDecorator(options) {
      +    var shortcutStylePatterns = [], fallthroughStylePatterns = [];
      +    if (options['tripleQuotedStrings']) {
      +      // '''multi-line-string''', 'single-line-string', and double-quoted
      +      shortcutStylePatterns.push(
      +          [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
      +           null, '\'"']);
      +    } else if (options['multiLineStrings']) {
      +      // 'multi-line-string', "multi-line-string"
      +      shortcutStylePatterns.push(
      +          [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
      +           null, '\'"`']);
      +    } else {
      +      // 'single-line-string', "single-line-string"
      +      shortcutStylePatterns.push(
      +          [PR_STRING,
      +           /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
      +           null, '"\'']);
      +    }
      +    if (options['verbatimStrings']) {
      +      // verbatim-string-literal production from the C# grammar.  See issue 93.
      +      fallthroughStylePatterns.push(
      +          [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
      +    }
      +    var hc = options['hashComments'];
      +    if (hc) {
      +      if (options['cStyleComments']) {
      +        if (hc > 1) {  // multiline hash comments
      +          shortcutStylePatterns.push(
      +              [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);
      +        } else {
      +          // Stop C preprocessor declarations at an unclosed open comment
      +          shortcutStylePatterns.push(
      +              [PR_COMMENT, /^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,
      +               null, '#']);
      +        }
      +        // #include <stdio.h>
      +        fallthroughStylePatterns.push(
      +            [PR_STRING,
      +             /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,
      +             null]);
      +      } else {
      +        shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
      +      }
      +    }
      +    if (options['cStyleComments']) {
      +      fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
      +      fallthroughStylePatterns.push(
      +          [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
      +    }
      +    if (options['regexLiterals']) {
      +      /**
      +       * @const
      +       */
      +      var REGEX_LITERAL = (
      +          // A regular expression literal starts with a slash that is
      +          // not followed by * or / so that it is not confused with
      +          // comments.
      +          '/(?=[^/*])'
      +          // and then contains any number of raw characters,
      +          + '(?:[^/\\x5B\\x5C]'
      +          // escape sequences (\x5C),
      +          +    '|\\x5C[\\s\\S]'
      +          // or non-nesting character sets (\x5B\x5D);
      +          +    '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+'
      +          // finally closed by a /.
      +          + '/');
      +      fallthroughStylePatterns.push(
      +          ['lang-regex',
      +           new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
      +           ]);
      +    }
      +
      +    var types = options['types'];
      +    if (types) {
      +      fallthroughStylePatterns.push([PR_TYPE, types]);
      +    }
      +
      +    var keywords = ("" + options['keywords']).replace(/^ | $/g, '');
      +    if (keywords.length) {
      +      fallthroughStylePatterns.push(
      +          [PR_KEYWORD,
      +           new RegExp('^(?:' + keywords.replace(/[\s,]+/g, '|') + ')\\b'),
      +           null]);
      +    }
      +
      +    shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
      +
      +    var punctuation =
      +      // The Bash man page says
      +
      +      // A word is a sequence of characters considered as a single
      +      // unit by GRUB. Words are separated by metacharacters,
      +      // which are the following plus space, tab, and newline: { }
      +      // | & $ ; < >
      +      // ...
      +      
      +      // A word beginning with # causes that word and all remaining
      +      // characters on that line to be ignored.
      +
      +      // which means that only a '#' after /(?:^|[{}|&$;<>\s])/ starts a
      +      // comment but empirically
      +      // $ echo {#}
      +      // {#}
      +      // $ echo \$#
      +      // $#
      +      // $ echo }#
      +      // }#
      +
      +      // so /(?:^|[|&;<>\s])/ is more appropriate.
      +
      +      // http://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC3
      +      // suggests that this definition is compatible with a
      +      // default mode that tries to use a single token definition
      +      // to recognize both bash/python style comments and C
      +      // preprocessor directives.
      +
      +      // This definition of punctuation does not include # in the list of
      +      // follow-on exclusions, so # will not be broken before if preceeded
      +      // by a punctuation character.  We could try to exclude # after
      +      // [|&;<>] but that doesn't seem to cause many major problems.
      +      // If that does turn out to be a problem, we should change the below
      +      // when hc is truthy to include # in the run of punctuation characters
      +      // only when not followint [|&;<>].
      +      /^.[^\s\w\.$@\'\"\`\/\\]*/;
      +
      +    fallthroughStylePatterns.push(
      +        // TODO(mikesamuel): recognize non-latin letters and numerals in idents
      +        [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
      +        [PR_TYPE,        /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/, null],
      +        [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
      +        [PR_LITERAL,
      +         new RegExp(
      +             '^(?:'
      +             // A hex number
      +             + '0x[a-f0-9]+'
      +             // or an octal or decimal number,
      +             + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
      +             // possibly in scientific notation
      +             + '(?:e[+\\-]?\\d+)?'
      +             + ')'
      +             // with an optional modifier like UL for unsigned long
      +             + '[a-z]*', 'i'),
      +         null, '0123456789'],
      +        // Don't treat escaped quotes in bash as starting strings.  See issue 144.
      +        [PR_PLAIN,       /^\\[\s\S]?/, null],
      +        [PR_PUNCTUATION, punctuation, null]);
      +
      +    return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
      +  }
      +
      +  var decorateSource = sourceDecorator({
      +        'keywords': ALL_KEYWORDS,
      +        'hashComments': true,
      +        'cStyleComments': true,
      +        'multiLineStrings': true,
      +        'regexLiterals': true
      +      });
      +
      +  /**
      +   * Given a DOM subtree, wraps it in a list, and puts each line into its own
      +   * list item.
      +   *
      +   * @param {Node} node modified in place.  Its content is pulled into an
      +   *     HTMLOListElement, and each line is moved into a separate list item.
      +   *     This requires cloning elements, so the input might not have unique
      +   *     IDs after numbering.
      +   * @param {boolean} isPreformatted true iff white-space in text nodes should
      +   *     be treated as significant.
      +   */
      +  function numberLines(node, opt_startLineNum, isPreformatted) {
      +    var nocode = /(?:^|\s)nocode(?:\s|$)/;
      +    var lineBreak = /\r\n?|\n/;
      +  
      +    var document = node.ownerDocument;
      +  
      +    var li = document.createElement('li');
      +    while (node.firstChild) {
      +      li.appendChild(node.firstChild);
      +    }
      +    // An array of lines.  We split below, so this is initialized to one
      +    // un-split line.
      +    var listItems = [li];
      +  
      +    function walk(node) {
      +      switch (node.nodeType) {
      +        case 1:  // Element
      +          if (nocode.test(node.className)) { break; }
      +          if ('br' === node.nodeName) {
      +            breakAfter(node);
      +            // Discard the <BR> since it is now flush against a </LI>.
      +            if (node.parentNode) {
      +              node.parentNode.removeChild(node);
      +            }
      +          } else {
      +            for (var child = node.firstChild; child; child = child.nextSibling) {
      +              walk(child);
      +            }
      +          }
      +          break;
      +        case 3: case 4:  // Text
      +          if (isPreformatted) {
      +            var text = node.nodeValue;
      +            var match = text.match(lineBreak);
      +            if (match) {
      +              var firstLine = text.substring(0, match.index);
      +              node.nodeValue = firstLine;
      +              var tail = text.substring(match.index + match[0].length);
      +              if (tail) {
      +                var parent = node.parentNode;
      +                parent.insertBefore(
      +                    document.createTextNode(tail), node.nextSibling);
      +              }
      +              breakAfter(node);
      +              if (!firstLine) {
      +                // Don't leave blank text nodes in the DOM.
      +                node.parentNode.removeChild(node);
      +              }
      +            }
      +          }
      +          break;
      +      }
      +    }
      +  
      +    // Split a line after the given node.
      +    function breakAfter(lineEndNode) {
      +      // If there's nothing to the right, then we can skip ending the line
      +      // here, and move root-wards since splitting just before an end-tag
      +      // would require us to create a bunch of empty copies.
      +      while (!lineEndNode.nextSibling) {
      +        lineEndNode = lineEndNode.parentNode;
      +        if (!lineEndNode) { return; }
      +      }
      +  
      +      function breakLeftOf(limit, copy) {
      +        // Clone shallowly if this node needs to be on both sides of the break.
      +        var rightSide = copy ? limit.cloneNode(false) : limit;
      +        var parent = limit.parentNode;
      +        if (parent) {
      +          // We clone the parent chain.
      +          // This helps us resurrect important styling elements that cross lines.
      +          // E.g. in <i>Foo<br>Bar</i>
      +          // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.
      +          var parentClone = breakLeftOf(parent, 1);
      +          // Move the clone and everything to the right of the original
      +          // onto the cloned parent.
      +          var next = limit.nextSibling;
      +          parentClone.appendChild(rightSide);
      +          for (var sibling = next; sibling; sibling = next) {
      +            next = sibling.nextSibling;
      +            parentClone.appendChild(sibling);
      +          }
      +        }
      +        return rightSide;
      +      }
      +  
      +      var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);
      +  
      +      // Walk the parent chain until we reach an unattached LI.
      +      for (var parent;
      +           // Check nodeType since IE invents document fragments.
      +           (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {
      +        copiedListItem = parent;
      +      }
      +      // Put it on the list of lines for later processing.
      +      listItems.push(copiedListItem);
      +    }
      +  
      +    // Split lines while there are lines left to split.
      +    for (var i = 0;  // Number of lines that have been split so far.
      +         i < listItems.length;  // length updated by breakAfter calls.
      +         ++i) {
      +      walk(listItems[i]);
      +    }
      +  
      +    // Make sure numeric indices show correctly.
      +    if (opt_startLineNum === (opt_startLineNum|0)) {
      +      listItems[0].setAttribute('value', opt_startLineNum);
      +    }
      +  
      +    var ol = document.createElement('ol');
      +    ol.className = 'linenums';
      +    var offset = Math.max(0, ((opt_startLineNum - 1 /* zero index */)) | 0) || 0;
      +    for (var i = 0, n = listItems.length; i < n; ++i) {
      +      li = listItems[i];
      +      // Stick a class on the LIs so that stylesheets can
      +      // color odd/even rows, or any other row pattern that
      +      // is co-prime with 10.
      +      li.className = 'L' + ((i + offset) % 10);
      +      if (!li.firstChild) {
      +        li.appendChild(document.createTextNode('\xA0'));
      +      }
      +      ol.appendChild(li);
      +    }
      +  
      +    node.appendChild(ol);
      +  }
      +
      +  /**
      +   * Breaks {@code job.sourceCode} around style boundaries in
      +   * {@code job.decorations} and modifies {@code job.sourceNode} in place.
      +   * @param {Object} job like <pre>{
      +   *    sourceCode: {string} source as plain text,
      +   *    spans: {Array.<number|Node>} alternating span start indices into source
      +   *       and the text node or element (e.g. {@code <BR>}) corresponding to that
      +   *       span.
      +   *    decorations: {Array.<number|string} an array of style classes preceded
      +   *       by the position at which they start in job.sourceCode in order
      +   * }</pre>
      +   * @private
      +   */
      +  function recombineTagsAndDecorations(job) {
      +    var isIE8OrEarlier = /\bMSIE\s(\d+)/.exec(navigator.userAgent);
      +    isIE8OrEarlier = isIE8OrEarlier && +isIE8OrEarlier[1] <= 8;
      +    var newlineRe = /\n/g;
      +  
      +    var source = job.sourceCode;
      +    var sourceLength = source.length;
      +    // Index into source after the last code-unit recombined.
      +    var sourceIndex = 0;
      +  
      +    var spans = job.spans;
      +    var nSpans = spans.length;
      +    // Index into spans after the last span which ends at or before sourceIndex.
      +    var spanIndex = 0;
      +  
      +    var decorations = job.decorations;
      +    var nDecorations = decorations.length;
      +    // Index into decorations after the last decoration which ends at or before
      +    // sourceIndex.
      +    var decorationIndex = 0;
      +  
      +    // Remove all zero-length decorations.
      +    decorations[nDecorations] = sourceLength;
      +    var decPos, i;
      +    for (i = decPos = 0; i < nDecorations;) {
      +      if (decorations[i] !== decorations[i + 2]) {
      +        decorations[decPos++] = decorations[i++];
      +        decorations[decPos++] = decorations[i++];
      +      } else {
      +        i += 2;
      +      }
      +    }
      +    nDecorations = decPos;
      +  
      +    // Simplify decorations.
      +    for (i = decPos = 0; i < nDecorations;) {
      +      var startPos = decorations[i];
      +      // Conflate all adjacent decorations that use the same style.
      +      var startDec = decorations[i + 1];
      +      var end = i + 2;
      +      while (end + 2 <= nDecorations && decorations[end + 1] === startDec) {
      +        end += 2;
      +      }
      +      decorations[decPos++] = startPos;
      +      decorations[decPos++] = startDec;
      +      i = end;
      +    }
      +  
      +    nDecorations = decorations.length = decPos;
      +  
      +    var sourceNode = job.sourceNode;
      +    var oldDisplay;
      +    if (sourceNode) {
      +      oldDisplay = sourceNode.style.display;
      +      sourceNode.style.display = 'none';
      +    }
      +    try {
      +      var decoration = null;
      +      while (spanIndex < nSpans) {
      +        var spanStart = spans[spanIndex];
      +        var spanEnd = spans[spanIndex + 2] || sourceLength;
      +  
      +        var decEnd = decorations[decorationIndex + 2] || sourceLength;
      +  
      +        var end = Math.min(spanEnd, decEnd);
      +  
      +        var textNode = spans[spanIndex + 1];
      +        var styledText;
      +        if (textNode.nodeType !== 1  // Don't muck with <BR>s or <LI>s
      +            // Don't introduce spans around empty text nodes.
      +            && (styledText = source.substring(sourceIndex, end))) {
      +          // This may seem bizarre, and it is.  Emitting LF on IE causes the
      +          // code to display with spaces instead of line breaks.
      +          // Emitting Windows standard issue linebreaks (CRLF) causes a blank
      +          // space to appear at the beginning of every line but the first.
      +          // Emitting an old Mac OS 9 line separator makes everything spiffy.
      +          if (isIE8OrEarlier) {
      +            styledText = styledText.replace(newlineRe, '\r');
      +          }
      +          textNode.nodeValue = styledText;
      +          var document = textNode.ownerDocument;
      +          var span = document.createElement('span');
      +          span.className = decorations[decorationIndex + 1];
      +          var parentNode = textNode.parentNode;
      +          parentNode.replaceChild(span, textNode);
      +          span.appendChild(textNode);
      +          if (sourceIndex < spanEnd) {  // Split off a text node.
      +            spans[spanIndex + 1] = textNode
      +                // TODO: Possibly optimize by using '' if there's no flicker.
      +                = document.createTextNode(source.substring(end, spanEnd));
      +            parentNode.insertBefore(textNode, span.nextSibling);
      +          }
      +        }
      +  
      +        sourceIndex = end;
      +  
      +        if (sourceIndex >= spanEnd) {
      +          spanIndex += 2;
      +        }
      +        if (sourceIndex >= decEnd) {
      +          decorationIndex += 2;
      +        }
      +      }
      +    } finally {
      +      if (sourceNode) {
      +        sourceNode.style.display = oldDisplay;
      +      }
      +    }
      +  }
      +
      +
      +  /** Maps language-specific file extensions to handlers. */
      +  var langHandlerRegistry = {};
      +  /** Register a language handler for the given file extensions.
      +    * @param {function (Object)} handler a function from source code to a list
      +    *      of decorations.  Takes a single argument job which describes the
      +    *      state of the computation.   The single parameter has the form
      +    *      {@code {
      +    *        sourceCode: {string} as plain text.
      +    *        decorations: {Array.<number|string>} an array of style classes
      +    *                     preceded by the position at which they start in
      +    *                     job.sourceCode in order.
      +    *                     The language handler should assigned this field.
      +    *        basePos: {int} the position of source in the larger source chunk.
      +    *                 All positions in the output decorations array are relative
      +    *                 to the larger source chunk.
      +    *      } }
      +    * @param {Array.<string>} fileExtensions
      +    */
      +  function registerLangHandler(handler, fileExtensions) {
      +    for (var i = fileExtensions.length; --i >= 0;) {
      +      var ext = fileExtensions[i];
      +      if (!langHandlerRegistry.hasOwnProperty(ext)) {
      +        langHandlerRegistry[ext] = handler;
      +      } else if (win['console']) {
      +        console['warn']('cannot override language handler %s', ext);
      +      }
      +    }
      +  }
      +  function langHandlerForExtension(extension, source) {
      +    if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
      +      // Treat it as markup if the first non whitespace character is a < and
      +      // the last non-whitespace character is a >.
      +      extension = /^\s*</.test(source)
      +          ? 'default-markup'
      +          : 'default-code';
      +    }
      +    return langHandlerRegistry[extension];
      +  }
      +  registerLangHandler(decorateSource, ['default-code']);
      +  registerLangHandler(
      +      createSimpleLexer(
      +          [],
      +          [
      +           [PR_PLAIN,       /^[^<?]+/],
      +           [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
      +           [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
      +           // Unescaped content in an unknown language
      +           ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
      +           ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
      +           [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
      +           ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
      +           // Unescaped content in javascript.  (Or possibly vbscript).
      +           ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
      +           // Contains unescaped stylesheet content
      +           ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
      +           ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
      +          ]),
      +      ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
      +  registerLangHandler(
      +      createSimpleLexer(
      +          [
      +           [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
      +           [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
      +           ],
      +          [
      +           [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
      +           [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
      +           ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
      +           [PR_PUNCTUATION,  /^[=<>\/]+/],
      +           ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
      +           ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
      +           ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
      +           ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
      +           ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
      +           ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
      +           ]),
      +      ['in.tag']);
      +  registerLangHandler(
      +      createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
      +  registerLangHandler(sourceDecorator({
      +          'keywords': CPP_KEYWORDS,
      +          'hashComments': true,
      +          'cStyleComments': true,
      +          'types': C_TYPES
      +        }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
      +  registerLangHandler(sourceDecorator({
      +          'keywords': 'null,true,false'
      +        }), ['json']);
      +  registerLangHandler(sourceDecorator({
      +          'keywords': CSHARP_KEYWORDS,
      +          'hashComments': true,
      +          'cStyleComments': true,
      +          'verbatimStrings': true,
      +          'types': C_TYPES
      +        }), ['cs']);
      +  registerLangHandler(sourceDecorator({
      +          'keywords': JAVA_KEYWORDS,
      +          'cStyleComments': true
      +        }), ['java']);
      +  registerLangHandler(sourceDecorator({
      +          'keywords': SH_KEYWORDS,
      +          'hashComments': true,
      +          'multiLineStrings': true
      +        }), ['bsh', 'csh', 'sh']);
      +  registerLangHandler(sourceDecorator({
      +          'keywords': PYTHON_KEYWORDS,
      +          'hashComments': true,
      +          'multiLineStrings': true,
      +          'tripleQuotedStrings': true
      +        }), ['cv', 'py']);
      +  registerLangHandler(sourceDecorator({
      +          'keywords': PERL_KEYWORDS,
      +          'hashComments': true,
      +          'multiLineStrings': true,
      +          'regexLiterals': true
      +        }), ['perl', 'pl', 'pm']);
      +  registerLangHandler(sourceDecorator({
      +          'keywords': RUBY_KEYWORDS,
      +          'hashComments': true,
      +          'multiLineStrings': true,
      +          'regexLiterals': true
      +        }), ['rb']);
      +  registerLangHandler(sourceDecorator({
      +          'keywords': JSCRIPT_KEYWORDS,
      +          'cStyleComments': true,
      +          'regexLiterals': true
      +        }), ['js']);
      +  registerLangHandler(sourceDecorator({
      +          'keywords': COFFEE_KEYWORDS,
      +          'hashComments': 3,  // ### style block comments
      +          'cStyleComments': true,
      +          'multilineStrings': true,
      +          'tripleQuotedStrings': true,
      +          'regexLiterals': true
      +        }), ['coffee']);
      +  registerLangHandler(
      +      createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
      +
      +  function applyDecorator(job) {
      +    var opt_langExtension = job.langExtension;
      +
      +    try {
      +      // Extract tags, and convert the source code to plain text.
      +      var sourceAndSpans = extractSourceSpans(job.sourceNode, job.pre);
      +      /** Plain text. @type {string} */
      +      var source = sourceAndSpans.sourceCode;
      +      job.sourceCode = source;
      +      job.spans = sourceAndSpans.spans;
      +      job.basePos = 0;
      +
      +      // Apply the appropriate language handler
      +      langHandlerForExtension(opt_langExtension, source)(job);
      +
      +      // Integrate the decorations and tags back into the source code,
      +      // modifying the sourceNode in place.
      +      recombineTagsAndDecorations(job);
      +    } catch (e) {
      +      if (win['console']) {
      +        console['log'](e && e['stack'] ? e['stack'] : e);
      +      }
      +    }
      +  }
      +
      +  /**
      +   * @param sourceCodeHtml {string} The HTML to pretty print.
      +   * @param opt_langExtension {string} The language name to use.
      +   *     Typically, a filename extension like 'cpp' or 'java'.
      +   * @param opt_numberLines {number|boolean} True to number lines,
      +   *     or the 1-indexed number of the first line in sourceCodeHtml.
      +   */
      +  function prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {
      +    var container = document.createElement('pre');
      +    // This could cause images to load and onload listeners to fire.
      +    // E.g. <img onerror="alert(1337)" src="nosuchimage.png">.
      +    // We assume that the inner HTML is from a trusted source.
      +    container.innerHTML = sourceCodeHtml;
      +    if (opt_numberLines) {
      +      numberLines(container, opt_numberLines, true);
      +    }
      +
      +    var job = {
      +      langExtension: opt_langExtension,
      +      numberLines: opt_numberLines,
      +      sourceNode: container,
      +      pre: 1
      +    };
      +    applyDecorator(job);
      +    return container.innerHTML;
      +  }
      +
      +  function prettyPrint(opt_whenDone) {
      +    function byTagName(tn) { return document.getElementsByTagName(tn); }
      +    // fetch a list of nodes to rewrite
      +    var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
      +    var elements = [];
      +    for (var i = 0; i < codeSegments.length; ++i) {
      +      for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
      +        elements.push(codeSegments[i][j]);
      +      }
      +    }
      +    codeSegments = null;
      +
      +    var clock = Date;
      +    if (!clock['now']) {
      +      clock = { 'now': function () { return +(new Date); } };
      +    }
      +
      +    // The loop is broken into a series of continuations to make sure that we
      +    // don't make the browser unresponsive when rewriting a large page.
      +    var k = 0;
      +    var prettyPrintingJob;
      +
      +    var langExtensionRe = /\blang(?:uage)?-([\w.]+)(?!\S)/;
      +    var prettyPrintRe = /\bprettyprint\b/;
      +    var prettyPrintedRe = /\bprettyprinted\b/;
      +    var preformattedTagNameRe = /pre|xmp/i;
      +    var codeRe = /^code$/i;
      +    var preCodeXmpRe = /^(?:pre|code|xmp)$/i;
      +
      +    function doWork() {
      +      var endTime = (win['PR_SHOULD_USE_CONTINUATION'] ?
      +                     clock['now']() + 250 /* ms */ :
      +                     Infinity);
      +      for (; k < elements.length && clock['now']() < endTime; k++) {
      +        var cs = elements[k];
      +        var className = cs.className;
      +        if (prettyPrintRe.test(className)
      +            // Don't redo this if we've already done it.
      +            // This allows recalling pretty print to just prettyprint elements
      +            // that have been added to the page since last call.
      +            && !prettyPrintedRe.test(className)) {
      +
      +          // make sure this is not nested in an already prettified element
      +          var nested = false;
      +          for (var p = cs.parentNode; p; p = p.parentNode) {
      +            var tn = p.tagName;
      +            if (preCodeXmpRe.test(tn)
      +                && p.className && prettyPrintRe.test(p.className)) {
      +              nested = true;
      +              break;
      +            }
      +          }
      +          if (!nested) {
      +            // Mark done.  If we fail to prettyprint for whatever reason,
      +            // we shouldn't try again.
      +            cs.className += ' prettyprinted';
      +
      +            // If the classes includes a language extensions, use it.
      +            // Language extensions can be specified like
      +            //     <pre class="prettyprint lang-cpp">
      +            // the language extension "cpp" is used to find a language handler
      +            // as passed to PR.registerLangHandler.
      +            // HTML5 recommends that a language be specified using "language-"
      +            // as the prefix instead.  Google Code Prettify supports both.
      +            // http://dev.w3.org/html5/spec-author-view/the-code-element.html
      +            var langExtension = className.match(langExtensionRe);
      +            // Support <pre class="prettyprint"><code class="language-c">
      +            var wrapper;
      +            if (!langExtension && (wrapper = childContentWrapper(cs))
      +                && codeRe.test(wrapper.tagName)) {
      +              langExtension = wrapper.className.match(langExtensionRe);
      +            }
      +
      +            if (langExtension) { langExtension = langExtension[1]; }
      +
      +            var preformatted;
      +            if (preformattedTagNameRe.test(cs.tagName)) {
      +              preformatted = 1;
      +            } else {
      +              var currentStyle = cs['currentStyle'];
      +              var whitespace = (
      +                  currentStyle
      +                  ? currentStyle['whiteSpace']
      +                  : (document.defaultView
      +                     && document.defaultView.getComputedStyle)
      +                  ? document.defaultView.getComputedStyle(cs, null)
      +                  .getPropertyValue('white-space')
      +                  : 0);
      +              preformatted = whitespace
      +                  && 'pre' === whitespace.substring(0, 3);
      +            }
      +
      +            // Look for a class like linenums or linenums:<n> where <n> is the
      +            // 1-indexed number of the first line.
      +            var lineNums = cs.className.match(/\blinenums\b(?::(\d+))?/);
      +            lineNums = lineNums
      +                ? lineNums[1] && lineNums[1].length ? +lineNums[1] : true
      +                : false;
      +            if (lineNums) { numberLines(cs, lineNums, preformatted); }
      +
      +            // do the pretty printing
      +            prettyPrintingJob = {
      +              langExtension: langExtension,
      +              sourceNode: cs,
      +              numberLines: lineNums,
      +              pre: preformatted
      +            };
      +            applyDecorator(prettyPrintingJob);
      +          }
      +        }
      +      }
      +      if (k < elements.length) {
      +        // finish up in a continuation
      +        setTimeout(doWork, 250);
      +      } else if (opt_whenDone) {
      +        opt_whenDone();
      +      }
      +    }
      +
      +    doWork();
      +  }
      +
      +  /**
      +   * Contains functions for creating and registering new language handlers.
      +   * @type {Object}
      +   */
      +  var PR = win['PR'] = {
      +        'createSimpleLexer': createSimpleLexer,
      +        'registerLangHandler': registerLangHandler,
      +        'sourceDecorator': sourceDecorator,
      +        'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
      +        'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
      +        'PR_COMMENT': PR_COMMENT,
      +        'PR_DECLARATION': PR_DECLARATION,
      +        'PR_KEYWORD': PR_KEYWORD,
      +        'PR_LITERAL': PR_LITERAL,
      +        'PR_NOCODE': PR_NOCODE,
      +        'PR_PLAIN': PR_PLAIN,
      +        'PR_PUNCTUATION': PR_PUNCTUATION,
      +        'PR_SOURCE': PR_SOURCE,
      +        'PR_STRING': PR_STRING,
      +        'PR_TAG': PR_TAG,
      +        'PR_TYPE': PR_TYPE,
      +        'prettyPrintOne': win['prettyPrintOne'] = prettyPrintOne,
      +        'prettyPrint': win['prettyPrint'] = prettyPrint
      +      };
      +
      +  // Make PR available via the Asynchronous Module Definition (AMD) API.
      +  // Per https://github.com/amdjs/amdjs-api/wiki/AMD:
      +  // The Asynchronous Module Definition (AMD) API specifies a
      +  // mechanism for defining modules such that the module and its
      +  // dependencies can be asynchronously loaded.
      +  // ...
      +  // To allow a clear indicator that a global define function (as
      +  // needed for script src browser loading) conforms to the AMD API,
      +  // any global define function SHOULD have a property called "amd"
      +  // whose value is an object. This helps avoid conflict with any
      +  // other existing JavaScript code that could have defined a define()
      +  // function that does not conform to the AMD API.
      +  if (typeof define === "function" && define['amd']) {
      +    define("google-code-prettify", [], function () {
      +      return PR; 
      +    });
      +  }
      +})();
      +
      +
      +// ***** Customization begin
      +
      +// Contributed by Ryan Grove <ryan@wonko.com>
      +/**
      + * @fileoverview
      + * Registers a language handler for Handlebars.
      + *
      + * @author Ryan Grove <ryan@wonko.com>
      + */
      +
      +PR['registerLangHandler'](
      +  PR['createSimpleLexer'](
      +    [],
      +    [
      +      // -- HTML ---------------------------------------------------------------
      +      [PR['PR_DECLARATION'], /^<!\w[^>]*(?:>|$)/],
      +      [PR['PR_COMMENT'],     /^<\!--[\s\S]*?(?:-\->|$)/],
      +      [PR['PR_PUNCTUATION'], /^(?:<[%?]|[%?]>)/],
      +
      +      // Unescaped content in an unknown language
      +      ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
      +      ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
      +      ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
      +
      +      // Unescaped Handlebars template in JavaScript.
      +      ['lang-handlebars', /^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
      +
      +      // Unescaped content in javascript.  (Or possibly vbscript).
      +      ['lang-js',         /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
      +
      +      // Contains unescaped stylesheet content
      +      ['lang-css',        /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
      +      ['lang-in.tag',     /^(<\/?[a-z][^<>]*>)/i],
      +
      +      // -- Handlebars ---------------------------------------------------------
      +      // Tag (escaped).
      +      [PR['PR_DECLARATION'], /^{{[#^>/]?\s*[\w.][^}]*}}/],
      +
      +      // Tag (unescaped).
      +      [PR['PR_DECLARATION'], /^{{&?\s*[\w.][^}]*}}/],
      +
      +      // Tag (unescaped).
      +      [PR['PR_DECLARATION'], /^{{{>?\s*[\w.][^}]*}}}/],
      +
      +      // Comment.
      +      [PR['PR_COMMENT'], /^{{![^}]*}}/]
      +    ]),
      +['handlebars', 'hbs']);
      +
      +
      +
      +// Copyright (C) 2009 Google Inc.
      +//
      +// Licensed under the Apache License, Version 2.0 (the "License");
      +// you may not use this file except in compliance with the License.
      +// You may obtain a copy of the License at
      +//
      +//      http://www.apache.org/licenses/LICENSE-2.0
      +//
      +// Unless required by applicable law or agreed to in writing, software
      +// distributed under the License is distributed on an "AS IS" BASIS,
      +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      +// See the License for the specific language governing permissions and
      +// limitations under the License.
      +
      +/**
      + * @fileoverview
      + * Registers a language handler for CSS.
      + *
      + *
      + * To use, include prettify.js and this file in your HTML page.
      + * Then put your code in an HTML tag like
      + *      <pre class="prettyprint lang-css"></pre>
      + *
      + *
      + * http://www.w3.org/TR/CSS21/grammar.html Section G2 defines the lexical
      + * grammar.  This scheme does not recognize keywords containing escapes.
      + *
      + * @author mikesamuel@gmail.com
      + */
      +
      +PR['registerLangHandler'](
      +    PR['createSimpleLexer'](
      +        [
      +         // The space production <s>
      +         [PR['PR_PLAIN'],       /^[ \t\r\n\f]+/, null, ' \t\r\n\f']
      +        ],
      +        [
      +         // Quoted strings.  <string1> and <string2>
      +         [PR['PR_STRING'],
      +          /^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/, null],
      +         [PR['PR_STRING'],
      +          /^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/, null],
      +         ['lang-css-str', /^url\(([^\)\"\']*)\)/i],
      +         [PR['PR_KEYWORD'],
      +          /^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,
      +          null],
      +         // A property name -- an identifier followed by a colon.
      +         ['lang-css-kw', /^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],
      +         // A C style block comment.  The <comment> production.
      +         [PR['PR_COMMENT'], /^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],
      +         // Escaping text spans
      +         [PR['PR_COMMENT'], /^(?:<!--|-->)/],
      +         // A number possibly containing a suffix.
      +         [PR['PR_LITERAL'], /^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],
      +         // A hex color
      +         [PR['PR_LITERAL'], /^#(?:[0-9a-f]{3}){1,2}/i],
      +         // An identifier
      +         [PR['PR_PLAIN'],
      +          /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],
      +         // A run of punctuation
      +         [PR['PR_PUNCTUATION'], /^[^\s\w\'\"]+/]
      +        ]),
      +    ['css']);
      +PR['registerLangHandler'](
      +    PR['createSimpleLexer']([],
      +        [
      +         [PR['PR_KEYWORD'],
      +          /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]
      +        ]),
      +    ['css-kw']);
      +PR['registerLangHandler'](
      +    PR['createSimpleLexer']([],
      +        [
      +         [PR['PR_STRING'], /^[^\)\"\']+/]
      +        ]),
      +    ['css-str']);
      +
      +
      +// ****** Customization end
      \ No newline at end of file
      diff --git a/output/index.html b/output/index.html
      new file mode 100644
      index 00000000..d0e13389
      --- /dev/null
      +++ b/output/index.html
      @@ -0,0 +1,188 @@
      +<!DOCTYPE html>
      +<html lang="en">
      +<head>
      +    <meta charset="utf-8">
      +    <title>YUIDoc - JavaScript Documentation Tool</title>
      +    <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Maven+Pro:400,700">
      +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.4.1/build/cssgrids/grids-min.css">
      +    <link rel="stylesheet" href="assets/css/main.css">
      +    <link rel="stylesheet" href="assets/vendor/prettify/prettify-min.css">
      +    <link rel="icon" href="assets/favicon.ico">
      +    <script src="http://yui.yahooapis.com/3.5.1/build/yui/yui.js"></script>
      +</head>
      +<body>
      +<a href="https://github.com/yui/yuidoc"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub"></a>
      +<div id="doc">
      +    <div id="hd">
      +        <h1><img src="http://yuilibrary.com/img/yui-logo-2x.png" width="117" height="52">YUIDoc - JavaScript Documentation Tool</h1>
      +    </div>
      +    
      +    
      +        <a href="#toc" class="jump">Jump to Table of Contents</a>
      +    
      +
      +    <div class="yui3-g">
      +        <div class="yui3-u-3-4">
      +            <div id="main">
      +                <div class="content"><h2 id="welcome-to-yuidoc-0100">Welcome to YUIDoc 0.10.0!</h2>
      +
      +<div class="intro">
      +    <p>YUIDoc is a <a href="http://nodejs.org/">Node.js</a> application that
      +    generates API documentation from comments in source, using a syntax similar 
      +    to tools like Javadoc and Doxygen. YUIDoc provides:</p>
      +
      +    <ul>
      +        <li><b>Live previews.</b> YUIDoc includes a 
      +        <a href="args/index.html#server">standalone doc server</a>, 
      +        making it trivial to preview your docs as you write.</li>
      +        <li><b>Modern markup.</b> YUIDoc's generated documentation is an
      +        <a href="http://yuilibrary.com/yui/docs/api/classes/Model.html">attractive, 
      +        functional web application</a> with real URLs and graceful 
      +        fallbacks for spiders and other agents that can't run JavaScript.</li> 
      +        <li><b>Wide language support.</b> YUIDoc was originally designed for 
      +        the <a href="http://yuilibrary.com">YUI project</a>, but it is not
      +        tied to any particular library or programming language. 
      +        You can use it with any language that supports
      +        <code>&#x2F;* *&#x2F;</code> comment blocks.</li>
      +    </ul>
      +</p>
      +</div>
      +
      +<h2 id="#install">Installation and Usage</h2>
      +
      +<ol>
      +    <li>Download and install <a href="http://nodejs.org/#download">Node.js</a></li>
      +    <li>Run <code>npm -g install yuidocjs</code>.</li>
      +    <li>Run <code>yuidoc .</code> at the top of your JS source tree.</li>
      +</ol>
      +
      +<p>That's it! For more information about running the <code>yuidoc</code> commandline tool,
      +refer to "<a href="args/index.html">Using YUIDoc</a>".</p>
      +
      +<h2 id="user-guides">User Guides</h2>
      +
      +<ul>
      +  
      +    
      +    <li><a href="args/index.html">Using YUIDoc</a> &mdash; Understanding YUIDoc command line arguments and usage.</li>
      +    
      +  
      +    
      +    <li><a href="syntax/index.html">YUIDoc Syntax Reference</a> &mdash; Detailed instructions for writing YUIDoc comment blocks.</li>
      +    
      +  
      +    
      +    <li><a href="themes/index.html">YUIDoc Themes</a> &mdash; How to modify the default YUIDoc theme.</li>
      +    
      +  
      +</ul>
      +
      +<h2 id="example-yuidoc-comment-blocks">Example YUIDoc Comment Blocks</h2>
      +
      +<p>YUIDoc parses a modified form of JSDoc tags. 
      +This section provides a taste of some of the more common constructs in YUIDoc.
      +For more information, refer to the "<a href="./syntax/index.html">YUIDoc Syntax Reference</a>".</p>
      +
      +<h3 id="example-class-block">Example Class Block</h3>
      +<pre class="code prettyprint">&#x2F;**
      +* This is the description for my class.
      +*
      +* @class MyClass
      +* @constructor
      +*&#x2F;</pre>
      +
      +<h3 id="example-method-block">Example Method Block</h3>
      +<pre class="code prettyprint">&#x2F;**
      +* My method description.  Like other pieces of your comment blocks, 
      +* this can span multiple lines.
      +*
      +* @method methodName
      +* @param {String} foo Argument 1
      +* @param {Object} config A config object
      +* @param {String} config.name The name on the config object
      +* @param {Function} config.callback A callback function on the config object
      +* @param {Boolean} [extra=false] Do extra, optional work
      +* @return {Boolean} Returns true on success
      +*&#x2F;</pre>
      +
      +
      +<h3 id="example-property-block">Example Property Block</h3>
      +<pre class="code prettyprint">&#x2F;**
      +* My property description.  Like other pieces of your comment blocks, 
      +* this can span multiple lines.
      +* 
      +* @property propertyName
      +* @type {Object}
      +* @default &quot;foo&quot;
      +*&#x2F;</pre>
      +
      +</div>
      +            </div>
      +        </div>
      +
      +        <div class="yui3-u-1-4">
      +            <div class="sidebar">
      +                <ul class="links">
      +                    <li><a href="https://github.com/yui/yuidoc/" class="button">Get the Source</a></li>
      +                    <li><a href="https://groups.google.com/forum/#!forum/yuidoc" class="button">Questions? Join the Mailing List</a></li>
      +                    <li><a href="https://github.com/yui/yuidoc/issues/" class="button">File an Issue</a></li>
      +                    <li><a href="api/" class="button">View API Documentation</a></li>
      +                </ul>
      +                <div class="sidebox">
      +                    <div class="hd">
      +                        <h2 class="no-toc">Build Status</h2>
      +                    </div>
      +
      +                    <div class="bd">
      +                        <a href="http://travis-ci.org/yui/yuidoc"><img src="https://secure.travis-ci.org/yui/yuidoc.png?branch=master" border="0"></a>
      +                    </div>
      +                </div>
      +                
      +                    <div id="toc" class="sidebox">
      +                        <div class="hd">
      +                            <h2 class="no-toc">Table of Contents</h2>
      +                        </div>
      +
      +                        <div class="bd">
      +                            <ul class="toc">
      +<li>
      +<a href="#welcome-to-yuidoc-0100">Welcome to YUIDoc 0.10.0!</a>
      +</li>
      +<li>
      +<a href="##install">Installation and Usage</a>
      +</li>
      +<li>
      +<a href="#user-guides">User Guides</a>
      +</li>
      +<li>
      +<a href="#example-yuidoc-comment-blocks">Example YUIDoc Comment Blocks</a>
      +<ul class="toc">
      +<li>
      +<a href="#example-class-block">Example Class Block</a>
      +</li>
      +<li>
      +<a href="#example-method-block">Example Method Block</a>
      +</li>
      +<li>
      +<a href="#example-property-block">Example Property Block</a>
      +</li>
      +</ul>
      +</li>
      +</ul>
      +                        </div>
      +                    </div>
      +                
      +
      +                
      +
      +                
      +            </div>
      +        </div>
      +    </div>
      +</div>
      +
      +<script src="assets/vendor/prettify/prettify-min.js"></script>
      +<script>prettyPrint();</script>
      +
      +</body>
      +</html>
      diff --git a/output/syntax/index.html b/output/syntax/index.html
      new file mode 100644
      index 00000000..ee067203
      --- /dev/null
      +++ b/output/syntax/index.html
      @@ -0,0 +1,1492 @@
      +<!DOCTYPE html>
      +<html lang="en">
      +<head>
      +    <meta charset="utf-8">
      +    <title>YUIDoc Syntax Reference</title>
      +    <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Maven+Pro:400,700">
      +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.4.1/build/cssgrids/grids-min.css">
      +    <link rel="stylesheet" href="../assets/css/main.css">
      +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
      +    <link rel="icon" href="../assets/favicon.ico">
      +    <script src="http://yui.yahooapis.com/3.5.1/build/yui/yui.js"></script>
      +</head>
      +<body>
      +<a href="https://github.com/yui/yuidoc"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub"></a>
      +<div id="doc">
      +    <div id="hd">
      +        <h1><img src="http://yuilibrary.com/img/yui-logo-2x.png" width="117" height="52">YUIDoc Syntax Reference</h1>
      +    </div>
      +    
      +    <div class="crumbs">
      +        <a href="../">Main Page</a> <a name="Arrow">&gt;</a> <a href="../syntax/index.html">YUIDoc Syntax Reference</a>
      +    </div>
      +    
      +    
      +        <a href="#toc" class="jump">Jump to Table of Contents</a>
      +    
      +
      +    <div class="yui3-g">
      +        <div class="yui3-u-3-4">
      +            <div id="main">
      +                <div class="content"><div class="intro">
      +    <p>YUIDoc's syntax should be familiar if you've used 
      +    Javadoc, JSDoc, Doxygen, or other documentation generator tools. 
      +    YUIDoc relies on <dfn>tags</dfn> such as <code>@param</code> or <code>@return</code> embedded in comment blocks 
      +    that start with <code>&#x2F;**</code> and end with <code>*&#x2F;</code>. See <a
      +    href="#comment-styles">comment styles</a> for more information.
      +    It includes a small number of tags for documenting specific YUI features, 
      +    but most tags are generic enough to use with any object-oriented language.</p>
      +
      +    <p><b>IMPORTANT:</b> YUIDoc only parses YUIDoc comment blocks, not source code.
      +    This keeps YUIDoc relatively simple and language agnostic. 
      +    However, it also means you must declare everything to YUIDoc explicitly.
      +    A code snippet will not display as a "method" or "class" 
      +    until you describe it as such. 
      +    A corollary is that YUIDoc will never generate empty, "stub" doc entries
      +    for API members that lack comment blocks.</p>
      +</div>
      +
      +<h2 id="basic-requirements">Basic Requirements</h2>
      +
      +<p>A given comment block must contain one (and only one) 
      +<a href="#primary-tags">primary tag</a> such as <code>@class</code> or <code>@method</code>,
      +and zero or more <a href="#secondary-tags">secondary tags</a>
      +such as <code>@param</code>, <code>@type</code>, and <code>@extends</code>. 
      +Some secondary tags can be used in any comment block, 
      +while others only make sense alongside a particular primary tag.</p>
      +
      +<p>A source tree must contain at least one comment block with a <code>@module</code> tag.</p>
      +
      +<p>Each module must have at least one comment block with a <code>@class</code> tag.</p>
      +
      +<p>Each class may then have zero or more comment blocks with 
      +an <code>attribute</code>, <code>@class</code>, <code>@event</code>, <code>@method</code>, or <code>@property</code> tag.</p>
      +
      +<h2 id="primary-tags">Primary Tags</h2>
      +<p>Each comment block must have one (and only one) of the following tags:</p>
      +
      +<table>
      +<tr>
      +    <th>Name</th>
      +    <th>Example</th>
      +    <th>Description</th>
      +</tr>
      +<tr id="module">
      +    <td><code>module</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * Provides the base Widget class...
      + *
      + * @module widget
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Indicates that the block describes a group of related classes. 
      +        For example, YUI's <code>app</code> module includes classes such as <code>App.Base</code>, <code>Model</code>, and <code>Router</code>.
      +        You can optionally break modules up into submodules.
      +        
      +        <p>YUIDoc requires you to provide at least one module per source tree. 
      +        Since there isn't always an obvious place to insert module documentation in JavaScript source, 
      +        the convention is to declare your module at the top of the file that contains your module's "primary" or "base" class.</p>
      +
      +        <p>
      +            See also: 
      +            <a href="#class"><code>@class</code></a>,
      +            <a href="#for"><code>@for</code></a>,
      +            <a href="#maintag"><code>@main</code></a>,
      +            <a href="#submodule"><code>@submodule</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="maintag">
      +    <td><code>main</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * Provides more features for the widget module...
      + *
      + * @module widget
      + * @submodule widget-foo
      + * @main widget
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +    <p>
      +        When YUIDoc parses a module's directory, there may be several files in this directory that
      +        provides documentation for that module and it's submodules. YUIDoc will attempt to determine
      +        which module contains the main description for this module. If it has trouble doing that,
      +        you can add a <code>@main</code> tag to your module/submodule description and YUIDoc will use this block as
      +        the main module description on the modules API landing page.
      +    </p>
      +    </td>
      +</tr>
      +<tr id="class">
      +    <td><code>class</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * A utility that brokers HTTP requests...
      + *
      + * @class IO
      + * @constructor
      + *&#x2F;
      +function IO (config) {</pre>
      +
      +    </td>
      +    <td>
      +        <p>Indicates that the block describes a class.
      +        In JavaScript, this is generally an object with a constructor function. 
      +        The value of <code>@class</code> should be the string that identifies the functional class on its parent object. 
      +        For example, the <code>@class</code> for <code>Y.DD.Drag</code> would be <code>Drag</code> 
      +        (and its <a href="#namespace"><code>@namespace</code></a> would be <code>DD</code>).</p>
      +        
      +        <p>YUIDoc expects methods, properties, attributes, and events to belong to a class, 
      +        so in general you must provide at least one class for each module in your source tree. 
      +        A <code>@class</code> block should reside just above the class's constructor function,
      +        and above all methods, events, properties, and attributes that belong to the class.</p>
      +
      +        <p>A <a href="#class"><code>@class</code></a> tag should be paired with 
      +        either a <code>@constructor</code> tag or a <code>@static</code> tag.</p> 
      +
      +        <p>
      +            See also: 
      +            <a href="#constructor"><code>@constructor</code></a>,
      +            <a href="#extends"><code>@extends</code></a>,
      +            <a href="#extensionfor"><code>@extensionfor</code></a>,
      +            <a href="#for"><code>@for</code></a>,
      +            <a href="#module"><code>@module</code></a>,
      +            <a href="#namespace"><code>@namespace</code></a>,
      +            <a href="#static"><code>@static</code></a>,
      +            <a href="#uses"><code>@uses</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="element">
      +    <td><code>element</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * This is the foo element description...
      + *
      + * @element x-foo
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Indicates that the block describes a Custom Element.
      +        The <a href="#attribute"><code>@attribute</code></a> tag works as a attribute of the element
      +        when you specify a <code>@element</code> tag. You can also specify the
      +        <a href="#parents"><code>@parents</code></a>, <a href="#contents"><code>@contents</code></a>,
      +        and <a href="#interface"><code>@interface</code></a> tag for the element.</p>
      +
      +        <p>
      +            See also:
      +            <a href="#attribute"><code>@attribute</code></a>,
      +            <a href="#parents"><code>@parents</code></a>,
      +            <a href="#contents"><code>@contents</code></a>,
      +            <a href="#interface"><code>@interface</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="method">
      +    <td><code>method</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * Returns this model&#x27;s attributes as...
      + *
      + * @method toJSON
      + * @return {Object} Copy of ...
      + *&#x2F;
      +toJSON: function () {</pre>
      +
      +    </td>
      +    <td>
      +        <p>Indicates that the block describes a method for the current class.
      +        By default, the "current" class is the last class that YUIDoc parsed, but
      +        you can reset this with the <a href="#for"><code>@for</code></a> tag.</p>
      +
      +        <p>A <code>@method</code> block should always reside directly above the method's definition.
      +        At a minimum, you should also document any 
      +        parameters (<a href="#param"><code>@param</code></a>) and
      +        return values (<a href="#return"><code>@return</code></a>).</p>
      +
      +        <p>
      +            See also: 
      +            <a href="#chainable"><code>@chainable</code></a>,
      +            <a href="#class"><code>@class</code></a>,
      +            <a href="#constructor"><code>@constructor</code></a>,
      +            <a href="#for"><code>@for</code></a>,
      +            <a href="#param"><code>@param</code></a>,
      +            <a href="#return"><code>@return</code></a>,
      +            <a href="#throws"><code>@throws</code></a>,
      +            <a href="#static"><code>@static</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="event">
      +    <td><code>event</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * Fired when an error occurs...
      + *
      + * @event error
      + * @param {String} msg A description of...
      + *&#x2F;
      +var EVT_ERROR = &#x27;error&#x27;,</pre>
      +
      +    </td>
      +    <td>
      +        <p>Indicates that the block describes a custom event that the class can fire 
      +        at some interesting moment of code execution. 
      +        An <code>@event</code> block is somewhat similar to a <a href="#param"><code>@method</code></a> block, 
      +        except that <a href="#return"><code>@return</code></a> is irrelevant, and  
      +        <a href="#param"><code>@param</code></a> is used to describe properties hanging off 
      +        the event object that callbacks listening for the event receive. </p>
      +
      +        <p>Ideally, an <code>@event</code> block should reside above the code that defines the event, 
      +        even if that code is just a simple string declaration.
      +        If you find that your <code>@event</code> block is "floating in space,"
      +        you should at least place it underneath the class that owns the event, 
      +        grouped with any other events that the class can fire.</p>
      +        
      +        <p>
      +            See also: 
      +            <a href="#bubbles"><code>@bubbles</code></a>,
      +            <a href="#class"><code>@class</code></a>,
      +            <a href="#for"><code>@for</code></a>,
      +            <a href="#param"><code>@param</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="property">
      +    <td><code>property</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * Template for this view&#x27;s container...
      + *
      + * @property containerTemplate
      + * @type String
      + * @default &quot;&lt;div&#x2F;&gt;&quot;
      + *&#x2F;
      +containerTemplate: &#x27;&lt;div&#x2F;&gt;&#x27;,</pre>
      +
      +    </td>
      +    <td>
      +        <p>Indicates that the block describes a property belonging to the current class.</p>
      +
      +        <p>As with methods, a <code>@property</code> block should always reside 
      +        directly above the point where the property is defined.
      +        At a minimum, you should also provide the property's <code>@type</code>, 
      +        even if the value is <code>&quot;any&quot;</code> or <code>&quot;mixed&quot;</code>.</p>
      +
      +        <p>
      +            See also: 
      +            <a href="#attribute"><code>@attribute</code></a>,
      +            <a href="#default"><code>@default</code></a>,
      +            <a href="#class"><code>@class</code></a>,
      +            <a href="#for"><code>@for</code></a>,
      +            <a href="#type"><code>@type</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="attribute">
      +    <td><code>attribute</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * Indicates whether this Widget
      + * has been rendered...
      + *
      + * @attribute rendered
      + * @readOnly
      + * @default false
      + * @type boolean
      + *&#x2F;
      +ATTRS[RENDERED] = {</pre>
      +
      +    </td>
      +    <td>
      +        <p>[YUI-specific] Indicates that the block describes a managed configuration attribute.  
      +        An attribute is an object created and managed by the YUI
      +        <a href="http://yuilibrary.com/yui/docs/api/classes/Attribute.html"><code>Attribute</code> API</a>.
      +        It is a kind of "super-property", with getters, setters, and other nifty features, 
      +        including the ability to automatically fire change events.</p>
      +
      +        <p>An <code>@attribute</code> block should reside directly above the definition of the attribute,
      +        whether that is inside a <code>Y.Base</code> object's <code>ATTRS</code> property or elsewhere.
      +        Note that if your <code>yuidoc.json</code> file sets <code>attributesEmit</code> to <code>true</code>, 
      +        YUI will automatically generate documentation for the attribute's change events throughout the source tree, 
      +        with no extra YUIDoc comments needed from you.</p>
      +
      +        <p>If you specify a <a href="#element"><code>@element</code></a> tag, the <code>@attribute</code> tag works as
      +        a attribute of the element.</p>
      +
      +        <p>
      +            See also: <a href="#element"><code>@element</code></a>,
      +            <a href="#property"><code>@property</code></a>,
      +            <a href="#default"><code>@default</code></a>,
      +            <a href="#class"><code>@class</code></a>,
      +            <a href="#for"><code>@for</code></a>,
      +            <a href="#type"><code>@type</code></a>,
      +            <a href="#required"><code>@required</code></a>,
      +            <a href="#optional"><code>@optional</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +</table>
      +
      +<h2 id="secondary-tags">Secondary tags</h2>
      +<p>
      +    After choosing one of the five primary tags, you can further document a module, 
      +    class, method, event or property with one or more of the following secondary tags.
      +</p>
      +<table>
      +<tr>
      +    <th>Name</th>
      +    <th>Example</th>
      +    <th>Description</th>
      +</tr>
      +<tr id="submodule">
      +    <td><code>submodule</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @module app
      + * @submodule view
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Specifies that the module is actually a submodule of some parent module. 
      +        For example, the <code>app-transitions</code> module is a submodule of the larger <code>app</code> module.</p>
      +
      +        <p>In YUI, submodules enable you to make very fine-grained choices about loading code.
      +        For example, the <code>foo</code> module might have a minimal <code>foo-core</code> or <code>foo-base</code> submodule
      +        that supplies <code>foo</code>'s basic functionality,
      +        plus additional <code>foo-*</code> modules that carry optional features.
      +        Using the YUI Loader, you can choose to load just <code>foo-core</code>, 
      +        <code>foo-core</code> plus a couple of extra modules, 
      +        or the entire <code>foo</code> "rollup".</p> 
      +
      +        <p>
      +            See also:
      +            <a href="#module"><code>@module</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="namespace">
      +    <td><code>namespace</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @namespace Test.Mock
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Specifies a class's namespace.
      +        The <code>@namespace</code> should <em>not</em> include the "root" or "global" object 
      +        that your entire library hangs off of. 
      +        For example, <code>Y.DD.Drag</code> has 
      +        a <a href="#class"><code>@class</code></a> of <code>Drag</code>
      +        and a <code>@namespace</code> of <code>DD</code>, not <code>Y.DD</code>.</p> 
      +
      +        <p>Supplying a <code>@namespace</code> enables you to refer to the class in YUIDoc using just the simple class name.</p>
      +
      +        <p>
      +            See also:
      +            <a href="#class"><code>@class</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="extends">
      +    <td><code>extends</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @class View
      + * @constructor
      + * @extends Base
      + *&#x2F;</pre>
      +
      +   </td>
      +   <td>
      +        <p>Specifies that the class inherits members from a parent class, 
      +        perhaps using <a href="http://yuilibrary.com/yui/docs/api/classes/YUI.html#method_extend"><code>Y.extend()</code></a>, 
      +        <a href="http://yuilibrary.com/yui/docs/api/classes/Base.html#method_create"><code>Y.Base.create()</code></a>,
      +        or similar methods.
      +        YUIDoc will generate API documentation for 
      +        methods, properties, events, and attributes inherited from the parent class,
      +        and link back to the parent class's documentation.
      +        In the default YUIDoc theme, users can toggle whether inherited members should display.</p>
      +
      +        <p>
      +            See also:
      +            <a href="#class"><code>@class</code></a>,
      +            <a href="#extensionfor"><code>@extensionfor</code></a>,
      +            <a href="#uses"><code>@uses</code></a>.
      +        </p>
      +   </td>
      +</tr>
      +<tr id="config">
      +    <td><code>config</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @config docScrollX
      + * @type Number
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>[YUI-specific] Alias for <a href="#attribute"><code>@attribute</code></a>. 
      +        In older versions of YUI, <code>@config</code> was a slightly different take on attributes, 
      +        but the two concepts have merged.  
      +        Modern YUIDoc comments should use <code>@attribute</code> instead.</p>
      +    </td>
      +</tr>
      +<tr id="constructor">
      +    <td><code>constructor</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @class IO
      + * @constructor
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Indicates that the class is instantiable
      +        (created with the <code>new</code> keyword).
      +        A <a href="#class"><code>@class</code></a> tag should be paired with 
      +        either a <code>@constructor</code> tag or a <code>@static</code> tag.</p> 
      +        <p>
      +            See also:
      +            <a href="#class"><code>@class</code></a>,
      +            <a href="#static"><code>@static</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="static">
      +    <td><code>static</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * YUI user agent detection...
      + *
      + * @class UA
      + * @static
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Indicates that the method or class is static:</p> 
      +        <ul>
      +            <li>For methods, indicates that the method is meant to be 
      +            called without instantiating the class: 
      +            <code>var node = Y.Node.create(&#x27;&lt;div&#x2F;&gt;&#x27;);</code></li>
      +            <li>For classes, indicates that you should not 
      +            instantiate the class with <code>new</code>. 
      +            You can call all of the class's methods statically.
      +        </ul>    
      +        <p>A <a href="#class"><code>@class</code></a> tag should be paired with 
      +        either a <code>@constructor</code> tag or a <code>@static</code> tag.</p> 
      +        <p>
      +            See also:
      +            <a href="#class"><code>@class</code></a>,
      +            <a href="#constructor"><code>@constructor</code></a>,
      +            <a href="#method"><code>@method</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="final">
      +    <td><code>final</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * Identifies state changes
      + * originating from...
      + *
      + * @property SRC_REPLACE
      + * @type String
      + * @static
      + * @final
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Indicates that the property or attribute is a constant and should not be changed.</p>
      +        <p>
      +            See also:
      +            <a href="#attribute"><code>@attribute</code></a>,
      +            <a href="#property"><code>@property</code></a>,
      +            <a href="#readOnly"><code>@readOnly</code></a>,
      +            <a href="#writeOnce"><code>@writeOnce</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="readOnly">
      +    <td><code>readOnly</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * The current default button
      + * as configured through...
      + *
      + * @attribute defaultButton
      + * @type Node
      + * @default null
      + * @readOnly
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>[YUI-specific] Indicates that the attribute is configured with the 
      +        <a href="http://yuilibrary.com/yui/docs/api/classes/Attribute.html#method_addAttr"><code>readOnly</code></a> property
      +        and cannot be changed by calling the 
      +        <a href="http://yuilibrary.com/yui/docs/api/classes/Attribute.html#method_set"><code>set()</code></a> method.
      +        Read-only attributes should always document their <a href="#default"><code>@default</code></a> value.</p>
      +        
      +        <p>Sometimes used with properties, as an alias for <a href="#final"><code>@final</code></a>.</p>
      +
      +        <p>
      +            See also:
      +            <a href="#attribute"><code>@attribute</code></a>,
      +            <a href="#default"><code>@default</code></a>,
      +            <a href="#final"><code>@final</code></a>,
      +            <a href="#property"><code>@property</code></a>,
      +            <a href="#required"><code>@required</code></a>,
      +            <a href="#optional"><code>@optional</code></a>,
      +            <a href="#writeOnce"><code>@writeOnce</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="writeOnce">
      +    <td><code>writeOnce</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * Diameter of the circular
      + * background object. Other
      + * objects scale accordingly.
      + * Set this only before
      + * rendering.
      + *
      + * @attribute diameter
      + * @type {Number} number of px
      + * in diameter
      + * @default 100
      + * @writeOnce
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>[YUI-specific] Indicates that the attribute is configured with the
      +        <a href="http://yuilibrary.com/yui/docs/api/classes/Attribute.html#method_addAttr"><code>writeOnce</code></a> property
      +        and can only be set once --
      +        by applying a <a href="#default"><code>@default</code></a>, 
      +        by setting the value in the constructior, 
      +        or by calling the 
      +        <a href="http://yuilibrary.com/yui/docs/api/classes/Attribute.html#method_set"><code>set()</code></a> method
      +        for the first time.</p>
      +        
      +        <p>
      +            See also:
      +            <a href="#attribute"><code>@attribute</code></a>,
      +            <a href="#default"><code>@default</code></a>,
      +            <a href="#final"><code>@final</code></a>,
      +            <a href="#required"><code>@required</code></a>,
      +            <a href="#optional"><code>@optional</code></a>,
      +            <a href="#readOnly"><code>@readOnly</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="optional">
      +    <td><code>optional</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * An optional attribute,
      + * not required for proper
      + * use.
      + *
      + * @attribute extras
      + * @type {Object} extra data
      + * @optional
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>
      +        [YUI-specific] Indicates that the attribute is not
      +        required to be provided for proper use of this class.
      +        </p>
      +        
      +        <p>
      +            See also:
      +            <a href="#attribute"><code>@attribute</code></a>,
      +            <a href="#default"><code>@default</code></a>,
      +            <a href="#final"><code>@final</code></a>,
      +            <a href="#required"><code>@required</code></a>,
      +            <a href="#readOnly"><code>@readOnly</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +
      +<tr id="required">
      +    <td><code>required</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * A required attribute
      + * that is required for proper
      + * use, module will likely fail
      + * if this is not provided.
      + *
      + * @attribute url
      + * @type {String} url to fetch remote data from
      + * @required
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>
      +        [YUI-specific] Indicates that the attribute is
      +        required to be provided for proper use of this class.
      +        </p>
      +        
      +        <p>
      +            See also:
      +            <a href="#attribute"><code>@attribute</code></a>,
      +            <a href="#default"><code>@default</code></a>,
      +            <a href="#final"><code>@final</code></a>,
      +            <a href="#optional"><code>@optional</code></a>,
      +            <a href="#readOnly"><code>@readOnly</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +
      +
      +<tr id="param">
      +    <td><code>*param</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @param {String} name An
      + * Attribute name or
      + * object property path.
      + *&#x2F;</pre>
      +
      +
      +<pre class="code prettyprint">&#x2F;**
      + * @param {Object} [options] Data
      + * to be mixed into the event
      + * facade of the &#x60;change&#x60;
      + * event(s) for these attributes.
      + * @param {Boolean} [options.silent]
      + * If &#x60;true&#x60;, no &#x60;change&#x60; event
      + * will be fired.
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Defines a parameter for an ordinary <a href="#method"><code>@method</code></a>, 
      +        a parameter for a <a href="#constructor"><code>@constructor</code></a>
      +        (generally defined inside a <a href="#class"><code>@class</code></a> block),
      +        <em>or</em> a property that resides on an <a href="#method"><code>@event</code></a> object.
      +        Can take either of the forms:</p>
      +
      +        <ul>
      +            <li><code>@param {type} name description</code></li> 
      +            <li><code>@param name {type} description</code></li>
      +        </ul>
      +
      +        <p>The <code>{type}</code> is optional, but if you include it, 
      +        you must surround it in curly braces so that YUIDoc 
      +        can distinguish it from the <code>name</code>. 
      +        The <code>name</code> also has optional syntax:</p>
      +        <ul>
      +            <li><code>[name]</code> &mdash; optional parameter</li>
      +            <li><code>[name=foo]</code> &mdash; default value is foo</li>
      +            <li><code>...name</code> &mdash; placeholder for 1..n args</li>
      +            <li><code>[...name]</code> &mdash; placeholder for 0..n args</li>
      +        </ul>
      +
      +        <p>As shown in the example, you can also nest <code>@param</code> tags. 
      +        This enables you to document object parameters that 
      +        have their own particular nested structure.</p> 
      +
      +        <p>
      +            See also:
      +            <a href="#class"><code>@class</code></a>,
      +            <a href="#constructor"><code>@constructor</code></a>,
      +            <a href="#event"><code>@event</code></a>,
      +            <a href="#method"><code>@method</code></a>,
      +            <a href="#return"><code>@return</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="return">
      +    <td><code>return</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @method generateClientId
      + * @return {String} Unique clientId.
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Specifies a method's return value. 
      +        A <code>@return</code> tag has the structure <code>@return {type} description</code>.
      +        The <code>{type}</code> is optional.</p>
      +
      +        <!--p>If a return value is an object with a complex structure,
      +        you can <a href="#param">nest <code>@param</code> tags</a> 
      +        underneath the <code>@return</code> value.</p-->
      +
      +        <p>
      +            See also:
      +            <a href="#method"><code>@method</code></a>,
      +            <a href="#param"><code>@param</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="throws">
      +    <td><code>throws</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @method generateClientId
      + * @throws {Error} An error.
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Specifies an error which method throws.
      +        A <code>@throws</code> tag has the structure <code>@throws {type} description</code>.
      +        The <code>{type}</code> is optional.</p>
      +        <p>
      +            See also:
      +            <a href="#method"><code>@method</code></a>,
      +            <a href="#return"><code>@return</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="for">
      +    <td><code>for</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * Some inner class &#x27;foo&#x27;...
      + *
      + * @class foo
      + * @for OuterClass
      + *&#x2F;</pre>
      +
      +<pre class="code prettyprint">&#x2F;**
      + * Some method &#x27;bar&#x27;
      + * disconnected from
      + * its class &#x27;FarawayClass&#x27;...
      + *
      + * @method bar
      + * @for FarawayClass
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Sets YUIDoc's class scope.</p> 
      +
      +        <p>Using <code>@for OuterClass</code> in a <code>@class</code> block creates an inner class.
      +        YUIDoc will document methods and other items that follow that block 
      +        as belonging to the inner class, but the inner class is correctly 
      +        shown as belonging to its parent outer class.</p>
      +
      +        <p>To close an inner class, add <code>@for OuterClass</code> (again!) 
      +        to the <em>last</em>
      +        <code>@attribute</code>, <code>@event</code>, <code>@method</code>, or <code>@property</code> block 
      +        in the inner class. 
      +        This resets the YUIDoc parser to use <code>OuterClass</code> 
      +        as the owner of subsequent items.</p>
      +
      +        <p>If you are not inside an inner class, 
      +        using <code>@for FarawayClass</code> 
      +        in an <code>@attribute</code>, <code>@event</code>, <code>@method</code>, or <code>@property</code> block
      +        will attach all that item and subsequent items 
      +        to the specified faraway class. 
      +        This is useful when you have a module that attaches extra
      +        methods to a class's prototype, 
      +        but the main class definition is in some entirely different file.</p>
      +
      +        <p>
      +            See also:
      +            <a href="#class"><code>@class</code></a>,
      +            <a href="#method"><code>@method</code></a>.
      +        </p>
      +</td>
      +</tr>
      +<tr id="type">
      +    <td><code>type</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @type String
      + *&#x2F;</pre>
      +
      +<pre class="code prettyprint">&#x2F;**
      + * @type HTMLElement|Node|String
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Specifies the type of a property or attribute.  
      +        You can specify a single type, 
      +        a list of legal types separated by vertical bars, 
      +        or if you are lazy, "any" or "mixed".</p>
      +
      +        <p>
      +            See also:
      +            <a href="#attribute"><code>@attribute</code></a>,
      +            <a href="#default"><code>@default</code></a>,
      +            <a href="#property"><code>@property</code></a>.
      +        <p>
      +    </td>
      +</tr>
      +<tr id="private">
      +    <td><code>private</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * Reference to the internal JSONP
      + * instance used to make the queries.
      + *
      + * @private
      + * @property _jsonp
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Indicates a member that should not be used externally. 
      +        Although YUIDoc does not generate documentation for <code>@private</code> blocks, 
      +        YUIDoc comments are still a nice, structured way to document internals in source code.
      +        All methods and properties are assumed to be public 
      +        unless marked as private or protected.</p>
      +
      +        <p>
      +            See also:
      +            <a href="#protected"><code>@protected</code></a>.
      +        <p>
      +    </td>
      +</tr>
      +<tr id="protected">
      +    <td><code>protected</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * Removes the &#x60;container&#x60; from
      + * the DOM and ...
      + *
      + * @method _destroyContainer
      + * @protected
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Indicates a member that should not be modified 
      +        by implementers unless they are creating a subclass.
      +        All methods and properties are assumed to be public 
      +        unless marked as private or protected.</p>
      +
      +        <p>
      +            See also:
      +            <a href="#private"><code>@private</code></a>.
      +        <p>
      +    </td>
      +</tr>
      +<tr id="requires">
      +    <td><code>requires</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @module event-simulate
      + * @requires event
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>[Uncommon] Identifies one or more dependencies in the module declaration.
      +        Can be a single module name or a comma-separated list.</p>
      +
      +        <p>
      +            See also:
      +            <a href="#extends"><code>@extends</code></a>,
      +            <a href="#extensionfor"><code>@extensionfor</code></a>,
      +            <a href="#module"><code>@module</code></a>,
      +            <a href="#submodule"><code>@submodule</code></a>.
      +        <p>
      +    </td>
      +</tr>
      +<tr id="default">
      +    <td><code>default</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @default false
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Specifies the default value of a property or attribute.
      +        Should be paired with a <a href="#type"><code>@type</code></a> tag.</p>
      +
      +        <p>
      +            See also:
      +            <a href="#attribute"><code>@attribute</code></a>,
      +            <a href="#property"><code>@property</code></a>,
      +            <a href="#type"><code>@type</code></a>.
      +        <p>
      +    </td>
      +</tr>
      +<tr id="uses">
      +    <td><code>*uses</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @class Panel
      + * @constructor
      + * @extends Widget
      + * @uses WidgetAutohide
      + * @uses WidgetButtons
      +...
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Specifies that the class has some other class's 
      +        properties, methods, and other members mixed into its prototype, 
      +        perhaps using <a href="http://yuilibrary.com/yui/docs/api/classes/YUI.html#method_mix"><code>Y.mix()</code></a>, 
      +        <a href="http://yuilibrary.com/yui/docs/api/classes/Base.html#method_mix"><code>Y.Base.mix()</code></a>,
      +        <a href="http://yuilibrary.com/yui/docs/api/classes/Base.html#method_create"><code>Y.Base.create()</code></a>,
      +        or similar methods.
      +        YUIDoc will generate API documentation for 
      +        methods, properties, events, and attributes mixed into the parent class,
      +        and link back to the parent class's documentation.
      +        In the default YUIDoc theme, users can toggle whether mixed in members should display.</p>
      +        
      +        <p>Note that <code>@uses</code> does not indicate inheritance.
      +        To establish an "is a" relationship, use <a href="#extends"><code>@extends</code></a>.
      +        Unlike <code>@extends</code>, you can provide multiple <code>@uses</code> tags. </p>
      +
      +        <p>
      +            See also:
      +            <a href="#class"><code>@class</code></a>,
      +            <a href="#extends"><code>@extends</code></a>,
      +            <a href="#extensionfor"><code>@extensionfor</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="example">
      +    <td><code>*example</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @example
      + *     model.set(&#x27;foo&#x27;, &#x27;bar&#x27;);
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Indicates a block of example code 
      +        to be automatically parsed and displayed with 
      +        YUIDoc's Markdown and code highlighting parser.
      +        Your code sample should be indented beneath the <code>@example</code> tag.
      +        YUIDoc displays all examples highlighted with 
      +        <code>&lt;span&gt;</code> elements and other markup.</p>
      +
      +        <p>A block may include multiple <code>@example</code> tags.</p>
      +    </td>
      +</tr>
      +<tr id="chainable">
      +    <td><code>chainable</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * Renders this view ...
      + *
      + * @method render
      + * @chainable
      + *&#x2F;
      +render: function () {
      +    return this;
      +},</pre>
      +
      +    </td>
      +    <td>
      +        <p>Indicates that a method returns <code>this</code> (the parent object), 
      +        enabling you to chain it with other calls on the same object.</p>
      +
      +        <p>
      +            See also:
      +            <a href="#method"><code>@method</code></a>.
      +        </p>
      +</tr>
      +<tr id="deprecated">
      +    <td><code>deprecated</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @property locale
      + * @type String
      + * @deprecated Use &#x60;config.lang&#x60;
      + * instead.
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Indicates that the module, class, or member is deprecated 
      +        and will be removed in a future release.
      +        You can optionally supply a string message 
      +        describing what to use instead.</p>
      +
      +        <p>
      +            See also:
      +            <a href="#beta"><code>@beta</code></a>,
      +            <a href="#since"><code>@since</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="since">
      +    <td><code>since</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @since 3.4.0
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Indicates that the module, class, or member 
      +        was added to the source at the specified version.</p>
      +
      +        <p>
      +            See also:
      +            <a href="#beta"><code>@beta</code></a>,
      +            <a href="#deprecated"><code>@deprecated</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="async">
      +    <td><code>async</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @async
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>[Uncommon] Indicates that the method is 
      +        asynchronous and requires a callback.</p>
      +    </td>
      +</tr>
      +<tr id="beta">
      +    <td><code>beta</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @beta
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Indicates that the method, class, or member is in beta 
      +        and might undergo backwards-incompatible changes in the near future.</p>
      +
      +        <p>
      +            See also:
      +            <a href="#deprecated"><code>@deprecated</code></a>,
      +            <a href="#since"><code>@since</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="bubbles">
      +    <td><code>bubbles</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * Handles the mouseup DOM event...
      + *
      + * @event drag:mouseup
      + * @bubbles DDM
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Specifies the default target that a custom event bubbles to.
      +        This is a useful tag if your API has a "manager" class that 
      +        is responsible for capturing a set of related custom events.</p>
      +
      +        <p>
      +            See also:
      +            <a href="#event"><code>@event</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="extensionfor">
      +    <td><code>extension</code><br><code>extensionfor</code><br><code>extension_for</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @class PjaxBase
      + * @extensionfor Router
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>Indicates that the class is an extension object
      +        designed to be optionally mixed into the specified class.</p>
      +
      +        <p><code>@extensionfor</code> is <em>almost</em> the inverse of <a href="#uses"><code>@uses</code></a>.
      +        The key difference is that <code>@uses</code> means, 
      +        "this class <em>always</em> has the 'used' class mixed into its prototype," 
      +        while <code>@extensionfor</code> means, 
      +        "this class <em>can</em> be mixed into the 'extensionfor' class, 
      +        but it isn't baked in by default."</p>
      +
      +        <p>
      +            See also:
      +            <a href="#class"><code>@class</code></a>,
      +            <a href="#extends"><code>@extends</code></a>,
      +            <a href="#uses"><code>@uses</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="parents">
      +    <td><code>parents</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @element x-foo
      + * @parents &lt;body&gt;
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>It's a secondary tag for the <a href="#element"><code>@element</code></a> tag.
      +        Indicates that the parent element of the element you specified.</p>
      +
      +        <p>
      +            See also:
      +            <a href="#element"><code>@element</code></a>,
      +            <a href="#attribute"><code>@attribute</code></a>,
      +            <a href="#contents"><code>@contents</code></a>,
      +            <a href="#interface"><code>@interface</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="contents">
      +    <td><code>contents</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @element x-foo
      + * @contents &lt;x-bar&gt;
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>It's a secondary tag for the <a href="#element"><code>@element</code></a> tag.
      +        Indicates that the element contains in the element you specified.</p>
      +
      +        <p>
      +            See also:
      +            <a href="#element"><code>@element</code></a>,
      +            <a href="#attribute"><code>@attribute</code></a>,
      +            <a href="#parents"><code>@parents</code></a>,
      +            <a href="#interface"><code>@interface</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +<tr id="interface">
      +    <td><code>interface</code></td>
      +    <td>
      +<pre class="code prettyprint">&#x2F;**
      + * @element x-foo
      + * @interface XFooElement
      + *&#x2F;</pre>
      +
      +    </td>
      +    <td>
      +        <p>It's a secondary tag for the <a href="#element"><code>@element</code></a> tag.
      +        Indicates that the interface for the element you specified.</p>
      +
      +        <p>
      +            See also:
      +            <a href="#element"><code>@element</code></a>,
      +            <a href="#attribute"><code>@attribute</code></a>,
      +            <a href="#parents"><code>@parents</code></a>,
      +            <a href="#contents"><code>@contents</code></a>.
      +        </p>
      +    </td>
      +</tr>
      +</table>
      +
      +<p>A <strong>*</strong> indicates that you can supply multiple tags of that type in the same block.</p>
      +
      +<h3 id="parsed-but-not-in-the-theme-yet">Parsed but not in the theme yet</h3>
      +<p>
      +    The following tags are parsed by the <code>DocParser</code> but are not in the default theme yet.
      +</p>
      +<table>
      +<tr id="author">
      +    <td><code>author</code></td>
      +    <td>
      +<pre class="code prettyprint"></pre>
      +
      +    </td>
      +    <td>Author information about this item</td>
      +</tr>
      +<tr id="broadcast">
      +    <td><code>broadcast</code></td>
      +    <td>
      +<pre class="code prettyprint"></pre>
      +
      +    </td>
      +    <td>Event broadcasts to a large audience than scoped</td>
      +</tr>
      +<tr id="category">
      +    <td><code>*category</code></td>
      +    <td>
      +<pre class="code prettyprint"></pre>
      +
      +    </td>
      +    <td>Category to place this item into.</td>
      +</tr>
      +</table>
      +
      +<h2 id="comment-styles">Comment Styles</h2>
      +<p>
      +  The comment blocks can start with any amount of whitespace, and
      +  optionally one or more asterisks. Valid examples include:
      +</p>
      +<p>
      +<pre class="code prettyprint">&#x2F;**
      + * Description
      + * @method description
      + *&#x2F;</pre>
      +
      +</p>
      +<p>
      +<pre class="code prettyprint">&#x2F;**
      + * Description
      + * @method description
      +**&#x2F;</pre>
      +
      +</p>
      +<p>
      +<pre class="code prettyprint">&#x2F;**
      +Description
      +@method description
      +*&#x2F;</pre>
      +
      +</p>
      +<p>
      +<pre class="code prettyprint">&#x2F;**
      +Description
      +@method description
      +**&#x2F;</pre>
      +
      +</p>
      +
      +<h2 id="extra-formatting">Extra formatting</h2>
      +
      +<p>
      +    YUIDoc supports 3 main forms of formatting your documentation. HTML,
      +    <a href="http://daringfireball.net/projects/markdown/">Markdown</a> &amp; <a href="http://rgrove.github.com/selleck/">Selleck</a>.
      +</p>
      +
      +<table>
      +<tr>
      +    <td><code>HTML</code></td>
      +    <td>Doc comments may contain standard HTML markup and YUIDoc will display it as is.</td>
      +</tr>
      +<tr>
      +    <td><code>Markdown</code></td>
      +    <td>Full <a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a>
      +    is also supported.
      +    </td>
      +</tr>
      +<tr>
      +    <td><code>Selleck</code></td>
      +    <td><a href="http://rgrove.github.com/selleck/">Selleck's</a> additional parsing is also supported.</td>
      +</tr>
      +</table>
      +
      +<h3 id="markdown-and-code-highlighting">Markdown and Code Highlighting</h3>
      +
      +<p>
      +Inside any documentation block you may use Markdown or Selleck based markup. If you indent your code snippets,
      +YUIDoc will automatically wrap them in a code block and syntax highlight them for you.
      +</p>
      +
      +<pre class="code prettyprint">&#x2F;**
      + * This is the __module__ description for the &#x60;YUIDoc&#x60; module.
      + *
      + *     var options = {
      + *         paths: [ &#x27;.&#x2F;lib&#x27; ],
      + *         outdir: &#x27;.&#x2F;out&#x27;
      + *     };
      + *
      + *     var Y = require(&#x27;yuidoc&#x27;);
      + *     var json = (new Y.YUIDoc(options)).run();
      + *
      + * @class YUIDoc
      + * @main yuidoc
      + *&#x2F;</pre>
      +
      +
      +<p>
      +This would render as:
      +</p>
      +
      +<div class="intro">
      +<p>This is the <strong>module</strong> description for the <code>YUIDoc</code> module.</p>
      +<pre class="code prettyprint">var options = {
      +    paths: [ &#x27;.&#x2F;lib&#x27; ],
      +    outdir: &#x27;.&#x2F;out&#x27;
      +};
      +
      +var Y = require(&#x27;yuidoc&#x27;);
      +var json = (new Y.YUIDoc(options)).run();</pre>
      +
      +</div>
      +
      +<h3 id="cross-referencing-modules-and-classes">Cross-referencing Modules and Classes</h3>
      +
      +<p>YUIDoc also includes a Handlebars <code>blockHelper</code> that enables you to 
      +easily cross-reference classes and modules. It uses this pattern: 
      +</p>
      +
      +<pre class="code prettyprint">#crossLink &quot;Class&#x2F;item:type&quot;
      +
      +#crossLink &quot;Foo&#x2F;bar:event&quot;
      +#crossLink &quot;Foo&#x2F;bar:attribute&quot;
      +#crossLink &quot;Foo&#x2F;bar:method&quot; --default</pre>
      +
      +
      +<p>
      +So, for example, if you include:
      +</p>
      +
      +<pre class="code prettyprint">&#x2F;**
      + *
      + * This module also uses {{#crossLink &quot;Foo&quot;}}{{&#x2F;crossLink}}, where Foo is a class name.
      + * Also see {{#crossLink &quot;myClass&#x2F;Foo:method&quot;}}{{&#x2F;crossLink}}, where myClass is a class name and Foo is a method on that class.
      + *
      + * This module uses {{#crossLinkModule &quot;widget&quot;}}{{&#x2F;crossLinkModule}}, where widget is a module name
      + *
      + * This module also uses {{#crossLink &quot;Bar&quot;}} an awesome class {{&#x2F;crossLink}} named Bar.
      + *&#x2F;</pre>
      +
      +
      +<p>
      +This automatically generates an internal link to Foo's API reference page:
      +</p>
      +
      +<pre class="code prettyprint">&lt;p&gt;
      +This module also uses &lt;a href=&quot;..&#x2F;classes&#x2F;Foo.html&quot; class=&quot;crosslink&quot;&gt;Foo&lt;&#x2F;a&gt;, 
      +where Foo is a class or module name.
      +&lt;&#x2F;p&gt;
      +&lt;p&gt;
      +Also see &lt;a href=&quot;..&#x2F;classes&#x2F;myClass.html#method_Foo&quot;&gt;Foo&lt;&#x2F;a&gt;, where myClass 
      +is a class name and Foo is a method on that class.
      +&lt;&#x2F;p&gt;
      +&lt;p&gt;
      +This module uses &lt;a href=&quot;..&#x2F;modules&#x2F;widget.html&quot;&gt;widget&lt;&#x2F;a&gt;, where widget is a module name
      +&lt;&#x2F;p&gt;
      +&lt;p&gt;
      +This module also uses &lt;a href=&quot;..&#x2F;classes&#x2F;Bar.html&quot; class=&quot;crosslink&quot;&gt;an awesome class&lt;&#x2F;a&gt;
      +named Bar.
      +&lt;&#x2F;p&gt;</pre>
      +
      +
      +<p>
      +You can also call <code>crossLinkRaw</code> to return only the HREF portion of the link, so you can link it
      +yourself.
      +</p>
      +
      +<h3 id="using-custom-handlebars-block-helpers">Using custom Handlebars block helpers</h3>
      +
      +<p>
      +You can tell <code>YUIDoc</code> to include custom <code>Y.Handlebars</code> helpers with the <code>-H</code> or <code>--helpers</code> command line arguments
      +(or <code>helpers</code> Array in the <code>yuidoc.json</code> file).
      +
      +Here is an example <code>helper.js</code> file:
      +
      +<pre class="code prettyprint">module.exports = {
      +    davglass: function(item) {
      +        return &quot;Dav Glass says: &quot; + item
      +    }
      +};</pre>
      +
      +
      +<p>
      +Now you can use the <code>davglass</code> helper inside your own docs like this:
      +</p>
      +
      +<pre class="code prettyprint">&#x2F;**
      + * This is also a test {{#davglass &quot;Foo&quot;}}{{&#x2F;davglass}}
      + *&#x2F;</pre>
      +
      +
      +This will output this in your documentation:
      +
      +<pre class="code prettyprint">&lt;p&gt;
      + This is also a test Dav Glass says: Foo
      +&lt;&#x2F;p&gt;</pre>
      +
      +</div>
      +            </div>
      +        </div>
      +
      +        <div class="yui3-u-1-4">
      +            <div class="sidebar">
      +                <ul class="links">
      +                    <li><a href="https://github.com/yui/yuidoc/" class="button">Get the Source</a></li>
      +                    <li><a href="https://groups.google.com/forum/#!forum/yuidoc" class="button">Questions? Join the Mailing List</a></li>
      +                    <li><a href="https://github.com/yui/yuidoc/issues/" class="button">File an Issue</a></li>
      +                    <li><a href="../api/" class="button">View API Documentation</a></li>
      +                </ul>
      +                <div class="sidebox">
      +                    <div class="hd">
      +                        <h2 class="no-toc">Build Status</h2>
      +                    </div>
      +
      +                    <div class="bd">
      +                        <a href="http://travis-ci.org/yui/yuidoc"><img src="https://secure.travis-ci.org/yui/yuidoc.png?branch=master" border="0"></a>
      +                    </div>
      +                </div>
      +                
      +                    <div id="toc" class="sidebox">
      +                        <div class="hd">
      +                            <h2 class="no-toc">Table of Contents</h2>
      +                        </div>
      +
      +                        <div class="bd">
      +                            <ul class="toc">
      +<li>
      +<a href="#basic-requirements">Basic Requirements</a>
      +</li>
      +<li>
      +<a href="#primary-tags">Primary Tags</a>
      +</li>
      +<li>
      +<a href="#secondary-tags">Secondary tags</a>
      +<ul class="toc">
      +<li>
      +<a href="#parsed-but-not-in-the-theme-yet">Parsed but not in the theme yet</a>
      +</li>
      +</ul>
      +</li>
      +<li>
      +<a href="#comment-styles">Comment Styles</a>
      +</li>
      +<li>
      +<a href="#extra-formatting">Extra formatting</a>
      +<ul class="toc">
      +<li>
      +<a href="#markdown-and-code-highlighting">Markdown and Code Highlighting</a>
      +</li>
      +<li>
      +<a href="#cross-referencing-modules-and-classes">Cross-referencing Modules and Classes</a>
      +</li>
      +<li>
      +<a href="#using-custom-handlebars-block-helpers">Using custom Handlebars block helpers</a>
      +</li>
      +</ul>
      +</li>
      +</ul>
      +                        </div>
      +                    </div>
      +                
      +
      +                
      +
      +                
      +            </div>
      +        </div>
      +    </div>
      +</div>
      +
      +<script src="../assets/vendor/prettify/prettify-min.js"></script>
      +<script>prettyPrint();</script>
      +
      +</body>
      +</html>
      diff --git a/output/themes/index.html b/output/themes/index.html
      new file mode 100644
      index 00000000..e907ff0c
      --- /dev/null
      +++ b/output/themes/index.html
      @@ -0,0 +1,207 @@
      +<!DOCTYPE html>
      +<html lang="en">
      +<head>
      +    <meta charset="utf-8">
      +    <title>YUIDoc Themes</title>
      +    <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Maven+Pro:400,700">
      +    <link rel="stylesheet" href="http://yui.yahooapis.com/3.4.1/build/cssgrids/grids-min.css">
      +    <link rel="stylesheet" href="../assets/css/main.css">
      +    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
      +    <link rel="icon" href="../assets/favicon.ico">
      +    <script src="http://yui.yahooapis.com/3.5.1/build/yui/yui.js"></script>
      +</head>
      +<body>
      +<a href="https://github.com/yui/yuidoc"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub"></a>
      +<div id="doc">
      +    <div id="hd">
      +        <h1><img src="http://yuilibrary.com/img/yui-logo-2x.png" width="117" height="52">YUIDoc Themes</h1>
      +    </div>
      +    
      +    <div class="crumbs">
      +        <a href="../">Main Page</a> <a name="Arrow">&gt;</a> <a href="../themes/index.html">YUIDoc Themes</a>
      +    </div>
      +    
      +    
      +        <a href="#toc" class="jump">Jump to Table of Contents</a>
      +    
      +
      +    <div class="yui3-g">
      +        <div class="yui3-u-3-4">
      +            <div id="main">
      +                <div class="content"><p>
      +    YUIDoc uses <a href="http://handlebarsjs.com/">Handlebars.js</a> to render its templates. 
      +    For easy customization, YUIDoc's default templates provide a specific set of file overrides.
      +</p>
      +
      +<h2 id="directories">Directories</h2>
      +
      +<p>
      +    The default theme consists of <code>assets&#x2F;</code>, <code>layouts&#x2F;</code> and <code>partials&#x2F;</code> directories, 
      +    along with a <code>theme.json</code> file that describes theme-related variables, 
      +    such as the JS and CSS to load.
      +</p>
      +
      +<pre class="code terminal">themes&#x2F;
      +    default&#x2F;
      +        assets&#x2F;             &#x2F;&#x2F;Project assets, css, js
      +        layouts&#x2F;
      +            *.handlebars    &#x2F;&#x2F;Handlebars files for layouts
      +        partials&#x2F;
      +            *.handlebars    &#x2F;&#x2F;Handlebars files for partials
      +        theme.json   &#x2F;&#x2F;JSON file with theme variables</pre>
      +
      +
      +<h3 id="layouts">Layouts</h3>
      +
      +<p>
      +    A YUIDoc template has two primary layout files: <code>main.handlebars</code> and <code>xhr.handlebars</code>.
      +</p>
      +
      +<table>
      +<tr>
      +    <th><code>main</code></th>
      +    <td>
      +        Provides a complete wrapper around every rendered page. 
      +        <code>main.handlebars</code> includes the full HTML header and footer markup, CSS, and JS
      +        for every YUIDoc API page.
      +    </td>
      +</tr>
      +<tr>
      +    <th><code>xhr</code></th>
      +    <td>
      +        Provides a smaller layout for the built-in doc server to use when requesting an individual page via XHR. 
      +        This enables the browser to refresh just the content pane and avoid loading the complete  markup for the entire page.
      +        The <code>xhr</code> template enables YUIDoc to progressively enhance the API documentation in an efficient manner.
      +    </td>
      +</tr>
      +</table>
      +
      +<h3 id="partials">Partials</h3>
      +
      +<p>
      +    For each section of the layout that derives from parsed YUIDoc comment data, 
      +    YUIDoc provides a Handlebars partial. 
      +</p>
      +
      +<table>
      +<tr>
      +    <th><code>index</code></th>
      +    <td>Renders the main index content.</td>
      +</tr>
      +<tr>
      +    <th><code>sidebar</code></th>
      +    <td>Renders the tabview containing the lists of classes and modules.</td>
      +</tr>
      +<tr>
      +    <th><code>options</code></th>
      +    <td>Renders the filter options at the top of the page, which enable the user to hide and show private methods, inherited methods, and so on.</td>
      +</tr>
      +<tr>
      +    <th><code>attrs</code></th>
      +    <td>Renders documentation for an individual YUI Attribute.</td>
      +</tr>
      +<tr>
      +    <th><code>classes</code></th>
      +    <td>Renders documentation for an individual class.</td>
      +</tr>
      +<tr>
      +    <th><code>events</code></th>
      +    <td>Renders documentation for an individual event.</td>
      +</tr>
      +<tr>
      +    <th><code>files</code></th>
      +    <td>Renders the API's source files.</td>
      +</tr>
      +<tr>
      +    <th><code>method</code></th>
      +    <td>Renders documentation for an individual method.</td>
      +</tr>
      +<tr>
      +    <th><code>module</code></th>
      +    <td>Renders documentation for an individual module.</td>
      +</tr>
      +<tr>
      +    <th><code>props</code></th>
      +    <td>Renders documentation for an individual property.</td>
      +</tr>
      +</table>
      +
      +
      +<h2 id="overriding-a-partiallayout">Overriding a Partial/Layout</h2>
      +
      +<p>
      +YUIDoc's <code>--themedir</code> option specifies a directory containing 
      +layouts and partials that override the default theme. For example:
      +</p>
      +
      +<pre class="code terminal"><span class="noselect">$ </span>yuidoc --themedir .&#x2F;mytheme</pre>
      +
      +
      +<p>
      +causes YUIDoc to inspect the directory <code>.&#x2F;mytheme</code> for template overrides.
      +If this directory contains an override such as <code>.&#x2F;mytheme&#x2F;partials&#x2F;method.handlebars</code>,
      +YUI will parse its internal templates first, then apply the custom <code>method.handlebars</code> partial.
      +If a theme has no explicit override for a given template file, 
      +YUIDoc simply falls back to using the default layout or partial.
      +</p>
      +</div>
      +            </div>
      +        </div>
      +
      +        <div class="yui3-u-1-4">
      +            <div class="sidebar">
      +                <ul class="links">
      +                    <li><a href="https://github.com/yui/yuidoc/" class="button">Get the Source</a></li>
      +                    <li><a href="https://groups.google.com/forum/#!forum/yuidoc" class="button">Questions? Join the Mailing List</a></li>
      +                    <li><a href="https://github.com/yui/yuidoc/issues/" class="button">File an Issue</a></li>
      +                    <li><a href="../api/" class="button">View API Documentation</a></li>
      +                </ul>
      +                <div class="sidebox">
      +                    <div class="hd">
      +                        <h2 class="no-toc">Build Status</h2>
      +                    </div>
      +
      +                    <div class="bd">
      +                        <a href="http://travis-ci.org/yui/yuidoc"><img src="https://secure.travis-ci.org/yui/yuidoc.png?branch=master" border="0"></a>
      +                    </div>
      +                </div>
      +                
      +                    <div id="toc" class="sidebox">
      +                        <div class="hd">
      +                            <h2 class="no-toc">Table of Contents</h2>
      +                        </div>
      +
      +                        <div class="bd">
      +                            <ul class="toc">
      +<li>
      +<a href="#directories">Directories</a>
      +<ul class="toc">
      +<li>
      +<a href="#layouts">Layouts</a>
      +</li>
      +<li>
      +<a href="#partials">Partials</a>
      +</li>
      +</ul>
      +</li>
      +<li>
      +<a href="#overriding-a-partiallayout">Overriding a Partial/Layout</a>
      +</li>
      +</ul>
      +                        </div>
      +                    </div>
      +                
      +
      +                
      +
      +                
      +            </div>
      +        </div>
      +    </div>
      +</div>
      +
      +<script src="../assets/vendor/prettify/prettify-min.js"></script>
      +<script>prettyPrint();</script>
      +
      +</body>
      +</html>
      diff --git a/package.json b/package.json
      new file mode 100644
      index 00000000..506562f2
      --- /dev/null
      +++ b/package.json
      @@ -0,0 +1,112 @@
      +{
      +  "name": "yuidocjs",
      +  "version": "0.10.1",
      +  "description": "YUIDoc, YUI's JavaScript Documentation engine.",
      +  "author": "Dav Glass <davglass@gmail.com>",
      +  "bugs": {
      +    "url": "http://github.com/yui/yuidoc/issues"
      +  },
      +  "contributors": [
      +    {
      +      "name": "Adam Moore",
      +      "email": "amoore@gmail.com"
      +    },
      +    {
      +      "name": "Ryan Grove",
      +      "email": "ryan@wonko.com"
      +    },
      +    {
      +      "name": "Eric Ferraiuolo",
      +      "email": "eferraiuolo@gmail.com"
      +    },
      +    {
      +      "name": "Felipe Gasper",
      +      "email": "felipe@cpanel.net"
      +    },
      +    {
      +      "name": "Evan Goer",
      +      "email": "evan@goer.org"
      +    },
      +    {
      +      "name": "Alberto Gragera",
      +      "email": "albgra@gmail.com"
      +    },
      +    {
      +      "name": "Pat Cavit",
      +      "email": "pcavit@gmail.com"
      +    },
      +    {
      +      "name": "Kazuhito Hokamura",
      +      "email": "k.hokamura@gmail.com"
      +    },
      +    {
      +      "name": "prodaea",
      +      "email": "rlee@etherealnation.net"
      +    },
      +    {
      +      "name": "Wei Wang",
      +      "email": "weiwang85@gmail.com"
      +    },
      +    {
      +      "name": "Thomas Boyt",
      +      "email": "me@thomasboyt.com"
      +    }
      +  ],
      +  "engines": {
      +    "node": ">=0.10.0"
      +  },
      +  "keywords": [
      +    "yui",
      +    "jsdoc",
      +    "coffeescript",
      +    "api",
      +    "documentation",
      +    "javadoc",
      +    "docs",
      +    "apidocs"
      +  ],
      +  "main": "./lib/index",
      +  "bin": {
      +    "yuidoc": "./lib/cli.js"
      +  },
      +  "dependencies": {
      +    "express": "^4.13.1",
      +    "graceful-fs": "^4.1.2",
      +    "markdown-it": "^4.3.0",
      +    "mdn-links": "^0.1.0",
      +    "minimatch": "^3.0.0",
      +    "rimraf": "^2.4.1",
      +    "yui": "^3.18.1"
      +  },
      +  "devDependencies": {
      +    "eslint": "^1.10.3",
      +    "istanbul": "^0.3.16",
      +    "selleck": "^0.1.18",
      +    "ytestrunner": "^0.3.3",
      +    "yuitest": "^0.7.9"
      +  },
      +  "scripts": {
      +    "pretest": "eslint lib/*.js tests/*.js",
      +    "test": "istanbul cover --print=both --yui ytestrunner -- --include ./tests/options.js --include ./tests/builder.js --include ./tests/parser.js --include ./tests/parser_coffee.js --include ./tests/files.js --include ./tests/utils.js --include ./tests/preprocessor.js"
      +  },
      +  "preferGlobal": "true",
      +  "license": "BSD-3-Clause",
      +  "repository": {
      +    "type": "git",
      +    "url": "http://github.com/yui/yuidoc.git"
      +  },
      +  "yuidoc": {
      +    "name": "YUIDoc",
      +    "options": {
      +      "external": {
      +        "data": "http://yuilibrary.com/yui/docs/api/data.json"
      +      },
      +      "linkNatives": "true",
      +      "attributesEmit": "true",
      +      "paths": [
      +        "./lib"
      +      ],
      +      "outdir": "./output/api"
      +    }
      +  }
      +}
      diff --git a/scripts/docs.sh b/scripts/docs.sh
      new file mode 100755
      index 00000000..1cfca6a5
      --- /dev/null
      +++ b/scripts/docs.sh
      @@ -0,0 +1,29 @@
      +#!/bin/bash
      +
      +cd "$(dirname "$0")"
      +
      +out=../../yuidoc-pages
      +
      +cd $out
      +
      +out=`pwd`
      +
      +cd -
      +
      +if [ ! -d $out ]; then
      +
      +    echo "Could not find $out"
      +    exit;
      +fi
      +
      +echo "Deploying Doc Files to Github Pages"
      +
      +cd ../
      +wait
      +make docs
      +wait
      +rm -rRf $out/*
      +wait
      +cp -R output/* $out/
      +wait
      +echo "Doc Deploy Complete, checkin and push now."
      diff --git a/scripts/help.sh b/scripts/help.sh
      new file mode 100755
      index 00000000..36ad9f84
      --- /dev/null
      +++ b/scripts/help.sh
      @@ -0,0 +1,5 @@
      +#!/bin/bash
      +
      +cd "$(dirname "$0")"
      +
      +../lib/cli.js --help 2> ../docs/args/partials/help.mustache
      diff --git a/scripts/prep.sh b/scripts/prep.sh
      new file mode 100755
      index 00000000..68f26a9a
      --- /dev/null
      +++ b/scripts/prep.sh
      @@ -0,0 +1,18 @@
      +#!/bin/bash
      +
      +cd "$(dirname "$0")"
      +
      +if [ ! -d ../node_modules ]; then
      +    echo "Dependencies are not installed, installing"
      +    cd ../ && npm install --loglevel silent && cd ./scripts
      +fi
      +
      +if [ ! -x ../node_modules/.bin/yuitest ]; then
      +    echo "YUITest is not installed, installing"
      +    cd ../ && npm install --loglevel silent && cd ./scripts
      +fi
      +
      +if [ -d ../tests/out ]; then
      +    echo "Prior out directory found, removing."
      +    rm -rRf ../tests/out/
      +fi
      diff --git a/scripts/report.js b/scripts/report.js
      new file mode 100755
      index 00000000..a1d9dc1b
      --- /dev/null
      +++ b/scripts/report.js
      @@ -0,0 +1,15 @@
      +#!/usr/bin/env node
      +
      +var istanbul = require('istanbul');
      +var fs = require('fs');
      +var path = require('path');
      +var json = JSON.parse(fs.readFileSync(path.join(__dirname, '../coverage/test-coverage.json')));
      +
      +var collect = new istanbul.Collector(),
      +    report = istanbul.Report.create('text'),
      +    summary = istanbul.Report.create('text-summary');
      +
      +    collect.add(json);
      +
      +report.writeReport(collect);
      +summary.writeReport(collect);
      diff --git a/scripts/versions.js b/scripts/versions.js
      new file mode 100755
      index 00000000..8b51e42e
      --- /dev/null
      +++ b/scripts/versions.js
      @@ -0,0 +1,17 @@
      +#!/usr/bin/env node
      +
      +var path = require('path'),
      +    fs = require('fs'),
      +    package = require(path.join(__dirname, '../', 'package.json')),
      +    version = package.version,
      +    doc = path.join(__dirname, '../', 'conf', 'docs', 'project.json');
      +
      +console.log('[version]', version);
      +console.log('[doc]', doc);
      +
      +var docJSON = require(doc);
      +
      +docJSON.version = version;
      +
      +fs.writeFileSync(doc, JSON.stringify(docJSON, null, 2));
      +console.log('[done]');
      diff --git a/tests/builder.js b/tests/builder.js
      new file mode 100644
      index 00000000..3133aebe
      --- /dev/null
      +++ b/tests/builder.js
      @@ -0,0 +1,197 @@
      +'use strict';
      +
      +var YUITest = require('yuitest');
      +var Assert = YUITest.Assert;
      +var path = require('path');
      +var fs = require('fs');
      +var Y = require(path.join(__dirname, '../', 'lib', 'index'));
      +
      +//Move to the test dir before running the tests.
      +process.chdir(__dirname);
      +
      +var suite = new YUITest.TestSuite({
      +    name: 'Builder Test Suite',
      +    findByName: function (name, cl) {
      +        var items = this.data.classitems,
      +            ret;
      +
      +        items.forEach(function (i) {
      +            if (i.name === name && i.class === cl) {
      +                ret = i;
      +            }
      +        });
      +
      +        return ret;
      +    },
      +    setUp: function () {
      +        var options, json, builder;
      +
      +        options = {
      +            quiet: true,
      +            paths: [
      +                'input/inherit',
      +                'input/json',
      +                'input/test'
      +            ],
      +            outdir: './out',
      +            helpers: [
      +                path.join(__dirname, 'lib/davglass.js')
      +            ],
      +            markdown: {
      +                langPrefix: 'language-'
      +            }
      +        };
      +        process.chdir(__dirname);
      +        json = (new Y.YUIDoc(options)).run();
      +
      +        this.project = json.project;
      +        this.data = json;
      +
      +        builder = new Y.DocBuilder(options, json);
      +        builder.compile(function () {
      +            suite._setupComplete = true;
      +        });
      +        this.builder = builder;
      +    }
      +});
      +
      +
      +var exists = fs.existsSync || path.existsSync;
      +
      +suite.add(new YUITest.TestCase({
      +    name: 'Builder setup',
      +    'test: prep': function () {
      +        this.project = suite.project;
      +        this.data = suite.data;
      +        /*
      +            This test is a total crap test, I need to setup something
      +            that is async, but suite's don't appear to support .wait/.resume
      +            so I have to check it in the first test to make sure my
      +            async task in the setup is complete before I can test against it.
      +        */
      +        var test = this,
      +            timer = setInterval(function () {
      +                if (suite._setupComplete) {
      +                    clearInterval(timer);
      +                    test.resume(function () {
      +                        Assert.isTrue(suite._setupComplete);
      +                    });
      +                }
      +            }, 10);
      +        this.wait();
      +    },
      +    'test: Directories': function () {
      +        var dirs = ['assets', 'classes', 'files', 'modules', 'elements'];
      +        dirs.forEach(function (d) {
      +            var p = path.join(__dirname, 'out', d);
      +            Assert.isTrue(exists(p), 'Failed to find: ' + p);
      +        });
      +
      +    },
      +    'test: Assets Directories': function () {
      +        var dirs = ['css', 'js', 'img', 'vendor', 'index.html'];
      +        dirs.forEach(function (d) {
      +            var p = path.join(__dirname, 'out', 'assets', d);
      +            Assert.isTrue(exists(p), 'Failed to find: ' + p);
      +        });
      +
      +    },
      +    'test: index.html': function () {
      +        var p = path.join(__dirname, 'out', 'index.html');
      +        Assert.isTrue(exists(p), 'Failed to find: ' + p);
      +    },
      +    'test: data.json': function () {
      +        var p = path.join(__dirname, 'out', 'data.json');
      +        Assert.isTrue(exists(p), 'Failed to find: ' + p);
      +    },
      +    'test: api.js': function () {
      +        var p = path.join(__dirname, 'out', 'api.js');
      +        Assert.isTrue(exists(p), 'Failed to find: ' + p);
      +    },
      +    'test: classes/JSON.html': function () {
      +        var p = path.join(__dirname, 'out', 'classes', 'JSON.html');
      +        Assert.isTrue(exists(p), 'Failed to find: ' + p);
      +    },
      +    'test: files name filter': function () {
      +        var dir = path.join(__dirname, 'out', 'files');
      +        fs.readdirSync(dir).forEach(function (file) {
      +            Assert.isTrue(((file.indexOf('input_') === 0) || file.indexOf('index.html') === 0), 'Filed to parse: ' + file);
      +        });
      +    },
      +    'test: module files': function () {
      +        var mods = this.data.modules;
      +        Object.keys(mods).forEach(function (name) {
      +            var m = mods[name],
      +                p = path.join(__dirname, 'out', 'modules', m.name + '.html');
      +            Assert.isTrue(exists(p), 'Failed to render: ' + m.name + '.html');
      +        });
      +    },
      +    'test: class files': function () {
      +        var mods = this.data.classes;
      +        Object.keys(mods).forEach(function (name) {
      +            var m = mods[name],
      +                p = path.join(__dirname, 'out', 'classes', m.name + '.html');
      +            Assert.isTrue(exists(p), 'Failed to render: ' + m.name + '.html');
      +        });
      +    },
      +    'test: element files': function () {
      +        var mods = this.data.elements;
      +        Object.keys(mods).forEach(function (name) {
      +            var m = mods[name],
      +                p = path.join(__dirname, 'out', 'elements', m.name + '.html');
      +            Assert.isTrue(exists(p), 'Failed to render: ' + m.name + '.html');
      +        });
      +    }
      +}));
      +
      +suite.add(new YUITest.TestCase({
      +    name: 'Builder Augmentation Tests',
      +    'test: inherited methods': function () {
      +        var item = suite.data.classes['mywidget.SubWidget'];
      +        Assert.isObject(item, 'Failed to parse class');
      +        suite.builder.renderClass(function (html, view, opts) {
      +            var method;
      +            opts.meta.methods.forEach(function (i) {
      +                if (i.name === 'myMethod' && i.class === 'mywidget.SubWidget') {
      +                    method = i;
      +                }
      +            });
      +
      +            Assert.isObject(method, 'Failed to find inherited method');
      +            Assert.isObject(method.overwritten_from, 'Failed to find overwritten data');
      +        }, item);
      +    },
      +    'test: helper methods': function () {
      +        var item = suite.data.classes['mywidget.SuperWidget'];
      +        Assert.isObject(item, 'Failed to parse class');
      +        suite.builder.renderClass(function (html, view, opts) {
      +            var method;
      +            opts.meta.methods.forEach(function (i) {
      +                if (i.name === 'getTargets2' && i.class === 'mywidget.SuperWidget') {
      +                    method = i;
      +                }
      +            });
      +
      +            Assert.isObject(method, 'Failed to find inherited method');
      +            Assert.isTrue((method.description.indexOf('DAVGLASS_WAS_HERE::Foo') > 0), 'Helper failed to parse');
      +        }, item);
      +    },
      +
      +    'test: markdown options': function () {
      +        var item = suite.data.classes['mywidget.SuperWidget'];
      +        Assert.isObject(item, 'Failed to parse class');
      +        suite.builder.renderClass(function (html, view, opts) {
      +            var method;
      +            opts.meta.methods.forEach(function (i) {
      +                if (i.name === 'getTargets3' && i.class === 'mywidget.SuperWidget') {
      +                    method = i;
      +                }
      +            });
      +
      +            Assert.isTrue((method.description.indexOf('language-javascript') > 0), 'Markdown options were not applied');
      +        }, item);
      +    }
      +}));
      +
      +
      +YUITest.TestRunner.add(suite);
      diff --git a/tests/files.js b/tests/files.js
      new file mode 100644
      index 00000000..29852c8f
      --- /dev/null
      +++ b/tests/files.js
      @@ -0,0 +1,182 @@
      +'use strict';
      +
      +var YUITest = require('yuitest');
      +var Assert = YUITest.Assert;
      +var path = require('path');
      +var fs = require('fs');
      +var Y = require(path.join(__dirname, '../', 'lib', 'index'));
      +
      +//Move to the test dir before running the tests.
      +process.chdir(__dirname);
      +
      +var suite = new YUITest.TestSuite('Files Test Suite');
      +
      +suite.add(new YUITest.TestCase({
      +    name: 'Files Test Case',
      +    'test: exists': function () {
      +        var test = this;
      +        fs.writeFileSync('file1.txt', 'Files Test');
      +        Y.Files.exists('file1.txt', function (exists) {
      +            test.resume(function () {
      +                Assert.isTrue(exists);
      +                fs.unlinkSync('file1.txt');
      +            });
      +        });
      +        test.wait(100);
      +    },
      +    'test: copyDirectory': function () {
      +        var test = this;
      +        fs.mkdirSync('dir1');
      +        Y.Files.copyDirectory('dir1', 'dir2', true, function (err) {
      +            test.resume(function () {
      +                Assert.isUndefined(err);
      +                fs.rmdirSync('dir1');
      +                fs.rmdirSync('dir2');
      +            });
      +        });
      +        test.wait(100);
      +    },
      +    'test: copyFile': function () {
      +        var test = this;
      +        fs.writeFileSync('file1.txt', 'Files Test');
      +        Y.Files.copyFile('file1.txt', 'file2.txt', true, function (err) {
      +            test.resume(function () {
      +                Assert.isUndefined(err);
      +                fs.unlinkSync('file1.txt');
      +                fs.unlinkSync('file2.txt');
      +            });
      +        });
      +        test.wait(100);
      +    },
      +    'test: copyPath for file': function () {
      +        var test = this;
      +        fs.writeFileSync('file1.txt', 'Files Test');
      +        Y.Files.copyPath('file1.txt', 'file2.txt', true, function (err) {
      +            test.resume(function () {
      +                Assert.isUndefined(err);
      +                fs.unlinkSync('file1.txt');
      +                fs.unlinkSync('file2.txt');
      +            });
      +        });
      +        test.wait(100);
      +    },
      +    'test: copyPath for directory': function () {
      +        var test = this;
      +        fs.mkdirSync('dir1');
      +        Y.Files.copyPath('dir1', 'dir2', true, function (err) {
      +            test.resume(function () {
      +                Assert.isUndefined(err);
      +                fs.rmdirSync('dir1');
      +                fs.rmdirSync('dir2');
      +            });
      +        });
      +        test.wait(100);
      +    },
      +    'test: deletePath for file': function () {
      +        fs.writeFileSync('file1.txt', 'Files Test');
      +        Y.Files.deletePath('file1.txt');
      +        Assert.isFalse(fs.existsSync('file1.txt'));
      +    },
      +    'test: deletePath for symbolic link': function () {
      +        fs.writeFileSync('file1.txt', 'Files Test');
      +        fs.symlinkSync('file1.txt', 'file2.txt');
      +        Y.Files.deletePath('file2.txt');
      +        Assert.isFalse(fs.existsSync('file2.txt'));
      +        Assert.isTrue(fs.existsSync('file1.txt'));
      +        fs.unlinkSync('file1.txt');
      +    },
      +    'test: deletePath for directory': function () {
      +        fs.mkdirSync('dir1');
      +        Y.Files.deletePath('dir1');
      +        Assert.isFalse(fs.existsSync('dir1'));
      +    },
      +    'test: isDirectory for directory': function () {
      +        fs.mkdirSync('dir1');
      +        Assert.isTrue(Y.Files.isDirectory('dir1'));
      +        fs.rmdirSync('dir1');
      +    },
      +    'test: isDirectory for symbolic link': function () {
      +        fs.mkdirSync('dir1');
      +        fs.symlinkSync('dir1', 'dir2');
      +        Assert.isTrue(Y.Files.isDirectory('dir2', true));
      +        fs.unlinkSync('dir2');
      +        fs.rmdirSync('dir1');
      +    },
      +    'test: isFile for file': function () {
      +        fs.writeFileSync('file1.txt', 'Files Test');
      +        Assert.isTrue(Y.Files.isFile('file1.txt'));
      +        fs.unlinkSync('file1.txt');
      +    },
      +    'test: isFile for symbolic link': function () {
      +        fs.writeFileSync('file1.txt', 'Files Test');
      +        fs.symlinkSync('file1.txt', 'file2.txt');
      +        Assert.isTrue(Y.Files.isFile('file2.txt', true));
      +        fs.unlinkSync('file2.txt');
      +        fs.unlinkSync('file1.txt');
      +    },
      +    'test: isSymbolicLink': function () {
      +        fs.writeFileSync('file1.txt', 'Files Test');
      +        fs.symlinkSync('file1.txt', 'file2.txt');
      +        Assert.isTrue(Y.Files.isSymbolicLink('file2.txt'));
      +        fs.unlinkSync('file2.txt');
      +        fs.unlinkSync('file1.txt');
      +    },
      +    'test: lstatSync': function () {
      +        fs.writeFileSync('file1.txt', 'Files Test');
      +        Assert.isInstanceOf(fs.Stats, Y.Files.lstatSync('file1.txt'));
      +        fs.unlinkSync('file1.txt');
      +    },
      +    'test: statSync': function () {
      +        fs.writeFileSync('file1.txt', 'Files Test');
      +        Assert.isInstanceOf(fs.Stats, Y.Files.statSync('file1.txt'));
      +        fs.unlinkSync('file1.txt');
      +    },
      +    'test: copyAssets': function () {
      +        var test = this;
      +        fs.mkdirSync('dir1');
      +        fs.mkdirSync('dir2');
      +        fs.writeFileSync('dir1/file1.txt', 'Files Test');
      +        fs.writeFileSync('dir2/file2.txt', 'Files Test');
      +        Y.Files.copyAssets(['dir1', 'dir2'], 'dir3', false, function () {
      +            test.resume(function () {
      +                Assert.isTrue(fs.existsSync('dir3/file1.txt'));
      +                Assert.isTrue(fs.existsSync('dir3/file2.txt'));
      +                fs.unlinkSync('dir3/file1.txt');
      +                fs.unlinkSync('dir3/file2.txt');
      +                fs.unlinkSync('dir2/file2.txt');
      +                fs.unlinkSync('dir1/file1.txt');
      +                fs.rmdirSync('dir1');
      +                fs.rmdirSync('dir2');
      +                fs.rmdirSync('dir3');
      +            });
      +        });
      +        test.wait(100);
      +    },
      +    'test: getJSON': function () {
      +        var data = Y.Files.getJSON('input/folders1/yuidoc.json');
      +        Assert.isTypeOf('object', data);
      +        Assert.areSame('yuidoc-root', data.name);
      +    },
      +    'test: writeFile': function () {
      +        var test = this;
      +        Y.Files.writeFile('file1.txt', 'Files Test', function () {
      +            test.resume(function () {
      +                Assert.isTrue(fs.existsSync('file1.txt'));
      +                fs.unlinkSync('file1.txt');
      +            });
      +        });
      +        test.wait(100);
      +    },
      +    'test: readFile': function () {
      +        var test = this;
      +        Y.Files.readFile('input/test/test.js', 'utf8', function (err) {
      +
      +            test.resume(function () {
      +                Assert.isFalse(!!err);
      +            });
      +        });
      +        test.wait(100);
      +    }
      +}));
      +
      +YUITest.TestRunner.add(suite);
      diff --git a/tests/input/charts/AreaSeries.js b/tests/input/charts/AreaSeries.js
      new file mode 100644
      index 00000000..ee04a99d
      --- /dev/null
      +++ b/tests/input/charts/AreaSeries.js
      @@ -0,0 +1,91 @@
      +/**
      + * The AreaSeries class renders quantitative data on a graph by creating a fill between 0
      + * and the relevant data points.
      + *
      + * @module charts
      + * @class AreaSeries
      + * @extends CartesianSeries
      + * @uses Fills
      + * @constructor
      + */
      +Y.AreaSeries = Y.Base.create("areaSeries", Y.CartesianSeries, [Y.Fills], {
      +    /**
      +     * @protected
      +     *
      +     * Renders the series. 
      +     *
      +     * @method drawSeries
      +     */
      +    drawSeries: function()
      +    {
      +        this.drawFill.apply(this, this._getClosingPoints());
      +    },
      +    
      +    /**
      +     * @protected
      +     *
      +     * Method used by `styles` setter. Overrides base implementation.
      +     *
      +     * @method _setStyles
      +     * @param {Object} newStyles Hash of properties to update.
      +     * @return Object
      +     */
      +    _setStyles: function(val)
      +    {
      +        if(!val.area)
      +        {
      +            val = {area:val};
      +        }
      +        return Y.AreaSeries.superclass._setStyles.apply(this, [val]);
      +    },
      +
      +    /**
      +     * @protected
      +     *
      +     * Gets the default value for the `styles` attribute. Overrides
      +     * base implementation.
      +     *
      +     * @method _getDefaultStyles
      +     * @return Object
      +     */
      +    _getDefaultStyles: function()
      +    {
      +        var styles = this._mergeStyles({area:this._getAreaDefaults()}, Y.AreaSeries.superclass._getDefaultStyles());
      +        return styles;
      +    }
      +},
      +{
      +    ATTRS: {
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @default area
      +         */
      +        type: {
      +            value:"area"
      +        }
      +        
      +        /**
      +         * Style properties used for drawing area fills. This attribute is inherited from `Renderer`. Below are the default values:
      +         *
      +         *  <dl>
      +         *      <dt>color</dt><dd>The color of the fill. The default value is determined by the order of the series on the graph. The color will be 
      +         *      retrieved from the following array:
      +         *      `["#66007f", "#a86f41", "#295454", "#996ab2", "#e8cdb7", "#90bdbd","#000000","#c3b8ca", "#968373", "#678585"]`
      +         *      </dd>
      +         *      <dt>alpha</dt><dd>Number between 0 and 1 that indicates the opacity of the fill. The default value is 1</dd>
      +         *  </dl>
      +         *
      +         * @attribute styles
      +         * @type Object
      +         */
      +    }
      +});
      +
      +
      +
      +		
      +
      +		
      diff --git a/tests/input/charts/AreaSplineSeries.js b/tests/input/charts/AreaSplineSeries.js
      new file mode 100644
      index 00000000..9308cdef
      --- /dev/null
      +++ b/tests/input/charts/AreaSplineSeries.js
      @@ -0,0 +1,52 @@
      +/**
      + * AreaSplineSeries renders an area graph with data points connected by a curve.
      + *
      + * @module charts
      + * @class AreaSplineSeries
      + * @constructor
      + * @extends CartesianSeries
      + * @uses Fills
      + * @uses CurveUtil
      + */
      +Y.AreaSplineSeries = Y.Base.create("areaSplineSeries", Y.CartesianSeries, [Y.Fills, Y.CurveUtil], {
      +    /**
      +     * @protected
      +     *
      +     * Draws the series.
      +     *
      +     * @method drawSeries
      +     */
      +    drawSeries: function()
      +    {
      +        this.drawAreaSpline();
      +    }
      +}, {
      +	ATTRS : {
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @default areaSpline
      +         */
      +        type: {
      +            value:"areaSpline"
      +        }
      +        
      +        /**
      +         * Style properties used for drawing area fills. This attribute is inherited from `Renderer`. Below are the default values:
      +         *
      +         *  <dl>
      +         *      <dt>color</dt><dd>The color of the fill. The default value is determined by the order of the series on the graph. The color will be 
      +         *      retrieved from the following array:
      +         *      `["#66007f", "#a86f41", "#295454", "#996ab2", "#e8cdb7", "#90bdbd","#000000","#c3b8ca", "#968373", "#678585"]`
      +         *      </dd>
      +         *      <dt>alpha</dt><dd>Number between 0 and 1 that indicates the opacity of the fill. The default value is 1</dd>
      +         *  </dl>
      +         *
      +         * @attribute styles
      +         * @type Object
      +         */
      +    }
      +});
      +
      diff --git a/tests/input/charts/Axis.js b/tests/input/charts/Axis.js
      new file mode 100644
      index 00000000..ae607663
      --- /dev/null
      +++ b/tests/input/charts/Axis.js
      @@ -0,0 +1,1516 @@
      +/**
      + * The Axis class. Generates axes for a chart.
      + *
      + * @module charts
      + * @class Axis
      + * @extends Widget
      + * @uses Renderer
      + * @constructor
      + * @param {Object} config (optional) Configuration parameters for the Chart.
      + */
      +Y.Axis = Y.Base.create("axis", Y.Widget, [Y.Renderer], {
      +    /**
      +     * Storage for calculatedWidth value.
      +     *
      +     * @property _calculatedWidth
      +     * @type Number
      +     * @private
      +     */
      +    _calculatedWidth: 0,
      +
      +    /**
      +     * Storage for calculatedHeight value.
      +     *
      +     * @property _calculatedHeight
      +     * @type Number
      +     * @private
      +     */
      +    _calculatedHeight: 0,
      +
      +    /**
      +     * Handles change to the dataProvider
      +     * 
      +     * @method _dataChangeHandler
      +     * @param {Object} e Event object
      +     * @private
      +     */
      +    _dataChangeHandler: function(e)
      +    {
      +        if(this.get("rendered"))
      +        {
      +            this._drawAxis();
      +        }
      +    },
      +
      +    /**
      +     * Handles change to the position attribute
      +     *
      +     * @method _positionChangeHandler
      +     * @param {Object} e Event object
      +     * @private
      +     */
      +    _positionChangeHandler: function(e)
      +    {
      +        this._updateGraphic(e.newVal);
      +        this._updateHandler();
      +    },
      +
      +    /**
      +     * Updates the the Graphic instance
      +     *
      +     * @method _updateGraphic
      +     * @param {String} position Position of axis 
      +     * @private
      +     */
      +    _updateGraphic: function(position)
      +    {
      +        var graphic = this.get("graphic");
      +        if(position == "none")
      +        {
      +            if(graphic)
      +            {
      +                graphic.destroy();
      +            }
      +        }
      +        else
      +        {
      +            if(!graphic)
      +            {
      +                this._setCanvas();
      +            }
      +        }
      +    },
      +
      +    /**
      +     * Handles changes to axis.
      +     *
      +     * @method _updateHandler
      +     * @param {Object} e Event object
      +     * @private
      +     */
      +    _updateHandler: function(e)
      +    {
      +        if(this.get("rendered"))
      +        {
      +            this._drawAxis();
      +        }
      +    },
      +   
      +    /**
      +     * @method renderUI
      +     * @private
      +     */
      +    renderUI: function()
      +    {
      +        this._updateGraphic(this.get("position"));
      +    },
      +
      +    /**
      +     * @method syncUI
      +     * @private
      +     */
      +    syncUI: function()
      +    {
      +        var layout = this._layout,
      +            defaultMargins,
      +            styles,
      +            label,
      +            title,
      +            i;
      +        if(layout)
      +        {
      +            defaultMargins = layout._getDefaultMargins();
      +            styles = this.get("styles");
      +            label = styles.label.margin;
      +            title =styles.title.margin;
      +            //need to defaultMargins method to the layout classes.
      +            for(i in defaultMargins)
      +            {
      +                if(defaultMargins.hasOwnProperty(i))
      +                {
      +                    label[i] = label[i] === undefined ? defaultMargins[i] : label[i];
      +                    title[i] = title[i] === undefined ? defaultMargins[i] : title[i];
      +                }
      +            }
      +        }
      +        this._drawAxis();
      +    },
      +
      +    /**
      +     * Creates a graphic instance to be used for the axis line and ticks.
      +     *
      +     * @method _setCanvas
      +     * @private
      +     */
      +    _setCanvas: function()
      +    {
      +        var cb = this.get("contentBox"),
      +            bb = this.get("boundingBox"),
      +            p = this.get("position"),
      +            pn = this._parentNode,
      +            w = this.get("width"),
      +            h = this.get("height");
      +        bb.setStyle("position", "absolute");
      +        bb.setStyle("zIndex", 2);
      +        w = w ? w + "px" : pn.getStyle("width");
      +        h = h ? h + "px" : pn.getStyle("height");
      +        if(p === "top" || p === "bottom")
      +        {
      +            cb.setStyle("width", w);
      +        }
      +        else
      +        {
      +            cb.setStyle("height", h);
      +        }
      +        cb.setStyle("position", "relative");
      +        cb.setStyle("left", "0px");
      +        cb.setStyle("top", "0px");
      +        this.set("graphic", new Y.Graphic());
      +        this.get("graphic").render(cb);
      +    },
      +	
      +    /**
      +     * Gets the default value for the `styles` attribute. Overrides
      +     * base implementation.
      +     *
      +     * @method _getDefaultStyles
      +     * @return Object
      +     * @protected
      +     */
      +    _getDefaultStyles: function()
      +    {
      +        var axisstyles = {
      +            majorTicks: {
      +                display:"inside",
      +                length:4,
      +                color:"#dad8c9",
      +                weight:1,
      +                alpha:1
      +            },
      +            minorTicks: {
      +                display:"none",
      +                length:2,
      +                color:"#dad8c9",
      +                weight:1
      +            },
      +            line: {
      +                weight:1,
      +                color:"#dad8c9",
      +                alpha:1
      +            },
      +            majorUnit: {
      +                determinant:"count",
      +                count:11,
      +                distance:75
      +            },
      +            top: "0px",
      +            left: "0px",
      +            width: "100px",
      +            height: "100px",
      +            label: {
      +                color:"#808080",
      +                alpha: 1,
      +                fontSize:"85%",
      +                rotation: 0,
      +                margin: {
      +                    top: undefined,
      +                    right: undefined,
      +                    bottom: undefined,
      +                    left: undefined
      +                }
      +            },
      +            title: {
      +                color:"#808080",
      +                alpha: 1,
      +                fontSize:"85%",
      +                rotation: undefined,
      +                margin: {
      +                    top: undefined,
      +                    right: undefined,
      +                    bottom: undefined,
      +                    left: undefined
      +                }
      +            },
      +            hideOverlappingLabelTicks: false
      +        };
      +        
      +        return Y.merge(Y.Renderer.prototype._getDefaultStyles(), axisstyles); 
      +    },
      +
      +    /**
      +     * Updates the axis when the size changes.
      +     *
      +     * @method _handleSizeChange
      +     * @param {Object} e Event object.
      +     * @private
      +     */
      +    _handleSizeChange: function(e)
      +    {
      +        var attrName = e.attrName,
      +            pos = this.get("position"),
      +            vert = pos == "left" || pos == "right",
      +            cb = this.get("contentBox"),
      +            hor = pos == "bottom" || pos == "top";
      +        cb.setStyle("width", this.get("width"));
      +        cb.setStyle("height", this.get("height"));
      +        if((hor && attrName == "width") || (vert && attrName == "height"))
      +        {
      +            this._drawAxis();
      +        }
      +    },
      +   
      +    /**
      +     * Maps key values to classes containing layout algorithms
      +     *
      +     * @property _layoutClasses
      +     * @type Object
      +     * @private
      +     */
      +    _layoutClasses: 
      +    {
      +        top : TopAxisLayout,
      +        bottom: BottomAxisLayout,
      +        left: LeftAxisLayout,
      +        right : RightAxisLayout
      +    },
      +    
      +    /**
      +     * Draws a line segment between 2 points
      +     *
      +     * @method drawLine
      +     * @param {Object} startPoint x and y coordinates for the start point of the line segment
      +     * @param {Object} endPoint x and y coordinates for the for the end point of the line segment
      +     * @param {Object} line styles (weight, color and alpha to be applied to the line segment)
      +     * @private
      +     */
      +    drawLine: function(path, startPoint, endPoint)
      +    {
      +        path.moveTo(startPoint.x, startPoint.y);
      +        path.lineTo(endPoint.x, endPoint.y);
      +    },
      +
      +    /**
      +     * Generates the properties necessary for rotating and positioning a text field.
      +     *
      +     * @method _getTextRotationProps
      +     * @param {Object} styles properties for the text field
      +     * @return Object
      +     * @private
      +     */
      +    _getTextRotationProps: function(styles)
      +    {
      +        if(styles.rotation === undefined)
      +        {
      +            switch(this.get("position"))
      +            {
      +                case "left" :
      +                    styles.rotation = -90;
      +                break; 
      +                case "right" : 
      +                    styles.rotation = 90;
      +                break;
      +                default :
      +                    styles.rotation = 0;
      +                break;
      +            }
      +        }
      +        var rot =  Math.min(90, Math.max(-90, styles.rotation)),
      +            absRot = Math.abs(rot),
      +            radCon = Math.PI/180,
      +            sinRadians = parseFloat(parseFloat(Math.sin(absRot * radCon)).toFixed(8)),
      +            cosRadians = parseFloat(parseFloat(Math.cos(absRot * radCon)).toFixed(8));
      +        return {
      +            rot: rot,
      +            absRot: absRot,
      +            radCon: radCon,
      +            sinRadians: sinRadians,
      +            cosRadians: cosRadians,
      +            textAlpha: styles.alpha
      +        };
      +    },
      +
      +    /**
      +     * Draws an axis. 
      +     *
      +     * @method _drawAxis
      +     * @private
      +     */
      +    _drawAxis: function ()
      +    {
      +        if(this._drawing)
      +        {
      +            this._callLater = true;
      +            return;
      +        }
      +        this._drawing = true;
      +        this._callLater = false;
      +        if(this._layout)
      +        {
      +            var styles = this.get("styles"),
      +                line = styles.line,
      +                labelStyles = styles.label,
      +                majorTickStyles = styles.majorTicks,
      +                drawTicks = majorTickStyles.display != "none",
      +                tickPoint,
      +                majorUnit = styles.majorUnit,
      +                len,
      +                majorUnitDistance,
      +                i = 0,
      +                layout = this._layout,
      +                layoutLength,
      +                position,
      +                lineStart,
      +                label,
      +                labelWidth,
      +                labelHeight,
      +                labelFunction = this.get("labelFunction"),
      +                labelFunctionScope = this.get("labelFunctionScope"),
      +                labelFormat = this.get("labelFormat"),
      +                graphic = this.get("graphic"),
      +                path = this.get("path"),
      +                tickPath,
      +                explicitlySized;
      +            this._labelWidths = [];
      +            this._labelHeights = [];
      +            graphic.set("autoDraw", false);
      +            path.clear();
      +            path.set("stroke", {
      +                weight: line.weight, 
      +                color: line.color, 
      +                opacity: line.alpha
      +            });
      +            this._labelRotationProps = this._getTextRotationProps(labelStyles);
      +            this._labelRotationProps.transformOrigin = layout._getTransformOrigin(this._labelRotationProps.rot);
      +            layout.setTickOffsets.apply(this);
      +            layoutLength = this.getLength();
      +            lineStart = layout.getLineStart.apply(this);
      +            len = this.getTotalMajorUnits(majorUnit);
      +            majorUnitDistance = this.getMajorUnitDistance(len, layoutLength, majorUnit);
      +            this.set("edgeOffset", this.getEdgeOffset(len, layoutLength) * 0.5);
      +            if(len < 1)
      +            {
      +                this._clearLabelCache();
      +            }
      +            else
      +            {
      +                tickPoint = this.getFirstPoint(lineStart);
      +                this.drawLine(path, lineStart, this.getLineEnd(tickPoint));
      +                if(drawTicks) 
      +                {
      +                    tickPath = this.get("tickPath");
      +                    tickPath.clear();
      +                    tickPath.set("stroke", {
      +                        weight: majorTickStyles.weight,
      +                        color: majorTickStyles.color,
      +                        opacity: majorTickStyles.alpha
      +                    });
      +                   layout.drawTick.apply(this, [tickPath, tickPoint, majorTickStyles]);
      +                }
      +                this._createLabelCache();
      +                this._tickPoints = [];
      +                this._maxLabelSize = 0; 
      +                this._totalTitleSize = 0;
      +                this._titleSize = 0;
      +                this._setTitle();
      +                explicitlySized = layout.getExplicitlySized.apply(this, [styles]);
      +                for(; i < len; ++i)
      +                {
      +                    if(drawTicks) 
      +                    {
      +                        layout.drawTick.apply(this, [tickPath, tickPoint, majorTickStyles]);
      +                    }
      +                    position = this.getPosition(tickPoint);
      +                    label = this.getLabel(tickPoint, labelStyles);
      +                    this._labels.push(label);
      +                    this._tickPoints.push({x:tickPoint.x, y:tickPoint.y});
      +                    this.get("appendLabelFunction")(label, labelFunction.apply(labelFunctionScope, [this.getLabelByIndex(i, len), labelFormat]));
      +                    labelWidth = Math.round(label.offsetWidth);
      +                    labelHeight = Math.round(label.offsetHeight);
      +                    if(!explicitlySized)
      +                    {
      +                        this._layout.updateMaxLabelSize.apply(this, [labelWidth, labelHeight]);
      +                    }
      +                    this._labelWidths.push(labelWidth);
      +                    this._labelHeights.push(labelHeight);
      +                    tickPoint = this.getNextPoint(tickPoint, majorUnitDistance);
      +                }
      +                this._clearLabelCache();
      +                if(this.get("overlapGraph"))
      +                {
      +                   layout.offsetNodeForTick.apply(this, [this.get("contentBox")]);
      +                }
      +                layout.setCalculatedSize.apply(this);
      +                if(this._titleTextField)
      +                {
      +                    this._layout.positionTitle.apply(this, [this._titleTextField]);
      +                }
      +                for(i = 0; i < len; ++i)
      +                {
      +                    layout.positionLabel.apply(this, [this.get("labels")[i], this._tickPoints[i], styles, i]);
      +                }
      +            }
      +        }
      +        this._drawing = false;
      +        if(this._callLater)
      +        {
      +            this._drawAxis();
      +        }
      +        else
      +        {
      +            this._updatePathElement();
      +            this.fire("axisRendered");
      +        }
      +    },
      +    
      +    /**
      +     * Calculates and sets the total size of a title.
      +     *
      +     * @method _setTotalTitleSize
      +     * @param {Object} styles Properties for the title field.
      +     * @private
      +     */
      +    _setTotalTitleSize: function(styles)
      +    {
      +        var title = this._titleTextField,
      +            w = title.offsetWidth,
      +            h = title.offsetHeight,
      +            rot = this._titleRotationProps.rot,
      +            bounds,
      +            size,
      +            margin = styles.margin,
      +            position = this.get("position"),
      +            matrix = new Y.Matrix();
      +        matrix.rotate(rot);
      +        bounds = matrix.getContentRect(w, h);
      +        if(position == "left" || position == "right")
      +        {
      +            size = bounds.right - bounds.left;
      +            if(margin)
      +            {
      +                size += margin.left + margin.right;
      +            }
      +        }
      +        else
      +        {
      +            size = bounds.bottom - bounds.top;
      +            if(margin)
      +            {
      +                size += margin.top + margin.bottom;
      +            }
      +        }
      +        this._titleBounds = bounds;
      +        this._totalTitleSize = size;
      +    },
      +
      +    /**
      +     *  Updates path.
      +     *
      +     *  @method _updatePathElement
      +     *  @private
      +     */
      +    _updatePathElement: function()
      +    {
      +        var path = this._path,
      +            tickPath = this._tickPath,
      +            redrawGraphic = false,
      +            graphic = this.get("graphic");
      +        if(path)
      +        {
      +            redrawGraphic = true;
      +            path.end();
      +        }
      +        if(tickPath)
      +        {
      +            redrawGraphic = true;
      +            tickPath.end();
      +        }
      +        if(redrawGraphic)
      +        {
      +            graphic._redraw();
      +        }
      +    },
      +
      +    /**
      +     * Updates the content and style properties for a title field.
      +     *
      +     * @method _updateTitle
      +     * @private
      +     */
      +    _setTitle: function()
      +    {
      +        var i,
      +            styles,
      +            customStyles,
      +            title = this.get("title"),
      +            titleTextField = this._titleTextField,
      +            parentNode;
      +        if(title !== null && title !== undefined)
      +        {
      +            customStyles = {
      +                    rotation: "rotation",
      +                    margin: "margin",
      +                    alpha: "alpha"
      +            };
      +            styles = this.get("styles").title;
      +            if(!titleTextField)
      +            {
      +                titleTextField = DOCUMENT.createElement('span');
      +                titleTextField.style.display = "block";
      +                titleTextField.style.whiteSpace = "nowrap";
      +                titleTextField.setAttribute("class", "axisTitle");
      +                this.get("contentBox").append(titleTextField);
      +            }
      +            else if(!DOCUMENT.createElementNS)
      +            {
      +                if(titleTextField.style.filter)
      +                {
      +                    titleTextField.style.filter = null;
      +                }
      +            }
      +            titleTextField.style.position = "absolute";
      +            for(i in styles)
      +            {
      +                if(styles.hasOwnProperty(i) && !customStyles.hasOwnProperty(i))
      +                {
      +                    titleTextField.style[i] = styles[i];
      +                }
      +            }
      +            this.get("appendTitleFunction")(titleTextField, title);
      +            this._titleTextField = titleTextField;
      +            this._titleRotationProps = this._getTextRotationProps(styles);
      +            this._setTotalTitleSize(styles);
      +        }
      +        else if(titleTextField)
      +        {
      +            parentNode = titleTextField.parentNode;
      +            if(parentNode)
      +            {
      +                parentNode.removeChild(titleTextField);
      +            }
      +            this._titleTextField = null;
      +            this._totalTitleSize = 0;
      +        }
      +    },
      +
      +    /**
      +     * Creates or updates an axis label.
      +     *
      +     * @method getLabel
      +     * @param {Object} pt x and y coordinates for the label
      +     * @param {Object} styles styles applied to label
      +     * @return HTMLElement 
      +     * @private
      +     */
      +    getLabel: function(pt, styles)
      +    {
      +        var i,
      +            label,
      +            labelCache = this._labelCache,
      +            customStyles = {
      +                rotation: "rotation",
      +                margin: "margin",
      +                alpha: "alpha"
      +            };
      +        if(labelCache && labelCache.length > 0)
      +        {
      +            label = labelCache.shift();
      +        }
      +        else
      +        {
      +            label = DOCUMENT.createElement("span");
      +            label.className = Y.Lang.trim([label.className, "axisLabel"].join(' '));
      +            this.get("contentBox").append(label);
      +        }
      +        if(!DOCUMENT.createElementNS)
      +        {
      +            if(label.style.filter)
      +            {
      +                label.style.filter = null;
      +            }
      +        }
      +        label.style.display = "block";
      +        label.style.whiteSpace = "nowrap";
      +        label.style.position = "absolute";
      +        for(i in styles)
      +        {
      +            if(styles.hasOwnProperty(i) && !customStyles.hasOwnProperty(i))
      +            {
      +                label.style[i] = styles[i];
      +            }
      +        }
      +        return label;
      +    },
      +
      +    /**
      +     * Creates a cache of labels that can be re-used when the axis redraws.
      +     *
      +     * @method _createLabelCache
      +     * @private
      +     */
      +    _createLabelCache: function()
      +    {
      +        if(this._labels)
      +        {
      +            while(this._labels.length > 0)
      +            {
      +                this._labelCache.push(this._labels.shift());
      +            }
      +        }
      +        else
      +        {
      +            this._clearLabelCache();
      +        }
      +        this._labels = [];
      +    },
      +    
      +    /**
      +     * Removes axis labels from the dom and clears the label cache.
      +     *
      +     * @method _clearLabelCache
      +     * @private
      +     */
      +    _clearLabelCache: function()
      +    {
      +        if(this._labelCache)
      +        {
      +            var len = this._labelCache.length,
      +                i = 0,
      +                label;
      +            for(; i < len; ++i)
      +            {
      +                label = this._labelCache[i];
      +                this._removeChildren(label);
      +                Y.Event.purgeElement(label, true);
      +                label.parentNode.removeChild(label);
      +            }
      +        }
      +        this._labelCache = [];
      +    },
      +
      +    /**
      +     * Gets the end point of an axis.
      +     *
      +     * @method getLineEnd
      +     * @return Object
      +     * @private 
      +     */
      +    getLineEnd: function(pt)
      +    {
      +        var w = this.get("width"),
      +            h = this.get("height"),
      +            pos = this.get("position");
      +        if(pos === "top" || pos === "bottom")
      +        {
      +            return {x:w, y:pt.y};
      +        }
      +        else
      +        {
      +            return {x:pt.x, y:h};
      +        }
      +    },
      +
      +    /**
      +     * Calcuates the width or height of an axis depending on its direction.
      +     *
      +     * @method getLength
      +     * @return Number
      +     * @private
      +     */
      +    getLength: function()
      +    {
      +        var l,
      +            style = this.get("styles"),
      +            padding = style.padding,
      +            w = this.get("width"),
      +            h = this.get("height"),
      +            pos = this.get("position");
      +        if(pos === "top" || pos === "bottom")
      +        {
      +            l = w - (padding.left + padding.right);
      +        }
      +        else
      +        {
      +            l = h - (padding.top + padding.bottom);
      +        }
      +        return l;
      +    },
      +
      +    /**
      +     * Gets the position of the first point on an axis.
      +     *
      +     * @method getFirstPoint
      +     * @param {Object} pt Object containing x and y coordinates.
      +     * @return Object
      +     * @private
      +     */
      +    getFirstPoint:function(pt)
      +    {
      +        var style = this.get("styles"),
      +            pos = this.get("position"),
      +            padding = style.padding,
      +            np = {x:pt.x, y:pt.y};
      +        if(pos === "top" || pos === "bottom")
      +        {
      +            np.x += padding.left + this.get("edgeOffset");
      +        }
      +        else
      +        {
      +            np.y += this.get("height") - (padding.top + this.get("edgeOffset"));
      +        }
      +        return np;
      +    },
      +
      +    /**
      +     * Gets the position of the next point on an axis.
      +     *
      +     * @method getNextPoint
      +     * @param {Object} point Object containing x and y coordinates.
      +     * @param {Number} majorUnitDistance Distance in pixels between ticks.
      +     * @return Object
      +     * @private
      +     */
      +    getNextPoint: function(point, majorUnitDistance)
      +    {
      +        var pos = this.get("position");
      +        if(pos === "top" || pos === "bottom")
      +        {
      +            point.x = point.x + majorUnitDistance;		
      +        }
      +        else
      +        {
      +            point.y = point.y - majorUnitDistance;
      +        }
      +        return point;
      +    },
      +
      +    /**
      +     * Calculates the placement of last tick on an axis.
      +     *
      +     * @method getLastPoint
      +     * @return Object
      +     * @private 
      +     */
      +    getLastPoint: function()
      +    {
      +        var style = this.get("styles"),
      +            padding = style.padding,
      +            w = this.get("width"),
      +            pos = this.get("position");
      +        if(pos === "top" || pos === "bottom")
      +        {
      +            return {x:w - padding.right, y:padding.top};
      +        }
      +        else
      +        {
      +            return {x:padding.left, y:padding.top};
      +        }
      +    },
      +
      +    /**
      +     * Calculates position on the axis.
      +     *
      +     * @method getPosition
      +     * @param {Object} point contains x and y values
      +     * @private 
      +     */
      +    getPosition: function(point)
      +    {
      +        var p,
      +            h = this.get("height"),
      +            style = this.get("styles"),
      +            padding = style.padding,
      +            pos = this.get("position"),
      +            dataType = this.get("dataType");
      +        if(pos === "left" || pos === "right") 
      +        {
      +            //Numeric data on a vertical axis is displayed from bottom to top.
      +            //Categorical and Timeline data is displayed from top to bottom.
      +            if(dataType === "numeric")
      +            {
      +                p = (h - (padding.top + padding.bottom)) - (point.y - padding.top);
      +            }
      +            else
      +            {
      +                p = point.y - padding.top;
      +            }
      +        }
      +        else
      +        {
      +            p = point.x - padding.left;
      +        }
      +        return p;
      +    },
      +
      +    /**
      +     * Rotates and positions a text field.
      +     *
      +     * @method _rotate
      +     * @param {HTMLElement} label text field to rotate and position
      +     * @param {Object} props properties to be applied to the text field. 
      +     * @private
      +     */
      +    _rotate: function(label, props)
      +    {
      +        var rot = props.rot,
      +            x = props.x,
      +            y = props.y,
      +            filterString,
      +            textAlpha,
      +            matrix = new Y.Matrix(),
      +            transformOrigin = props.transformOrigin || [0, 0],
      +            offsetRect;
      +        if(DOCUMENT.createElementNS)
      +        {
      +            matrix.translate(x, y);
      +            matrix.rotate(rot);
      +            label.style.MozTransformOrigin = (transformOrigin[0] * 100) + "% " + (transformOrigin[1] * 100) + "%";
      +            label.style.MozTransform = matrix.toCSSText();
      +            label.style.webkitTransformOrigin = (transformOrigin[0] * 100) + "% " + (transformOrigin[1] * 100) + "%";
      +            label.style.webkitTransform = matrix.toCSSText();
      +            label.style.msTransformOrigin = (transformOrigin[0] * 100) + "% " + (transformOrigin[1] * 100) + "%";
      +            label.style.msTransform = matrix.toCSSText();
      +            label.style.OTransformOrigin = (transformOrigin[0] * 100) + "% " + (transformOrigin[1] * 100) + "%";
      +            label.style.OTransform = matrix.toCSSText();
      +        }
      +        else
      +        {
      +            textAlpha = props.textAlpha;
      +            if(Y_Lang.isNumber(textAlpha) && textAlpha < 1 && textAlpha > -1 && !isNaN(textAlpha))
      +            {
      +                filterString = "progid:DXImageTransform.Microsoft.Alpha(Opacity=" + Math.round(textAlpha * 100) + ")";
      +            }
      +            if(rot !== 0)
      +            {
      +                //ms filters kind of, sort of uses a transformOrigin of 0, 0. 
      +                //we'll translate the difference to create a true 0, 0 origin.
      +                matrix.rotate(rot);
      +                offsetRect = matrix.getContentRect(props.labelWidth, props.labelHeight);
      +                matrix.init();
      +                matrix.translate(offsetRect.left, offsetRect.top);
      +                matrix.translate(x, y);
      +                this._simulateRotateWithTransformOrigin(matrix, rot, transformOrigin, props.labelWidth, props.labelHeight);
      +                if(filterString)
      +                {
      +                    filterString += " ";
      +                }
      +                else
      +                {
      +                    filterString = ""; 
      +                }
      +                filterString += matrix.toFilterText();
      +                label.style.left = matrix.dx + "px";
      +                label.style.top = matrix.dy + "px";
      +            }
      +            else
      +            {
      +                label.style.left = x + "px";
      +                label.style.top = y + "px";
      +            }
      +            if(filterString)
      +            {
      +                label.style.filter = filterString;
      +            }
      +        }
      +    },
      +    
      +    /**
      +     * Simulates a rotation with a specified transformOrigin. 
      +     *
      +     * @method _simulateTransformOrigin
      +     * @param {Matrix} matrix Reference to a `Matrix` instance.
      +     * @param {Number} rot The rotation (in degrees) that will be performed on a matrix.
      +     * @param {Array} transformOrigin An array represeniting the origin in which to perform the transform. The first 
      +     * index represents the x origin and the second index represents the y origin.
      +     * @param {Number} w The width of the object that will be transformed.
      +     * @param {Number} h The height of the object that will be transformed.
      +     * @private
      +     */
      +    _simulateRotateWithTransformOrigin: function(matrix, rot, transformOrigin, w, h)
      +    {
      +        var transformX = transformOrigin[0] * w,
      +            transformY = transformOrigin[1] * h;
      +        transformX = !isNaN(transformX) ? transformX : 0;
      +        transformY = !isNaN(transformY) ? transformY : 0;
      +        matrix.translate(transformX, transformY);
      +        matrix.rotate(rot);
      +        matrix.translate(-transformX, -transformY);
      +    },
      +
      +    /**
      +     * Returns the coordinates (top, right, bottom, left) for the bounding box of the last label. 
      +     *
      +     * @method getMaxLabelBounds
      +     * @return Object
      +     */
      +    getMaxLabelBounds: function()
      +    {
      +        return this._getLabelBounds(this.getMaximumValue());
      +    },
      +
      +    /**
      +     * Returns the coordinates (top, right, bottom, left) for the bounding box of the first label. 
      +     *
      +     * @method getMinLabelBounds
      +     * @return Object
      +     */
      +    getMinLabelBounds: function()
      +    {
      +        return this._getLabelBounds(this.getMinimumValue());
      +    },
      +    
      +    /**
      +     * Returns the coordinates (top, right, bottom, left) for the bounding box of a label. 
      +     *
      +     * @method _getLabelBounds
      +     * @param {String} Value of the label
      +     * @return Object
      +     * @private
      +     */
      +    _getLabelBounds: function(val)
      +    {
      +        var layout = this._layout,
      +            labelStyles = this.get("styles").label,
      +            matrix = new Y.Matrix(),
      +            label,
      +            props = this._getTextRotationProps(labelStyles);
      +            props.transformOrigin = layout._getTransformOrigin(props.rot);
      +        label = this.getLabel({x: 0, y: 0}, labelStyles);
      +        this.get("appendLabelFunction")(label, this.get("labelFunction").apply(this, [val, this.get("labelFormat")]));
      +        props.labelWidth = label.offsetWidth;
      +        props.labelHeight = label.offsetHeight;
      +        this._removeChildren(label);
      +        Y.Event.purgeElement(label, true);
      +        label.parentNode.removeChild(label);
      +        props.x = 0;
      +        props.y = 0;
      +        layout._setRotationCoords(props);
      +        matrix.translate(props.x, props.y);
      +        this._simulateRotateWithTransformOrigin(matrix, props.rot, props.transformOrigin, props.labelWidth, props.labelHeight);
      +        return matrix.getContentRect(props.labelWidth, props.labelHeight);
      +    },
      +
      +    /**
      +     * Removes all DOM elements from an HTML element. Used to clear out labels during detruction
      +     * phase.
      +     *
      +     * @method _removeChildren
      +     * @private
      +     */
      +    _removeChildren: function(node)
      +    {
      +        if(node.hasChildNodes())
      +        {
      +            var child;
      +            while(node.firstChild)
      +            {
      +                child = node.firstChild;
      +                this._removeChildren(child);
      +                node.removeChild(child);
      +            }
      +        }
      +    },
      +    
      +    /**
      +     * Destructor implementation Axis class. Removes all labels and the Graphic instance from the widget.
      +     *
      +     * @method destructor
      +     * @protected
      +     */
      +    destructor: function()
      +    {
      +        var cb = this.get("contentBox").getDOMNode(),
      +            labels = this.get("labels"),
      +            graphic = this.get("graphic"),
      +            label,
      +            len = labels ? labels.length : 0;
      +        if(len > 0)
      +        {
      +            while(labels.length > 0)
      +            {
      +                label = labels.shift();
      +                this._removeChildren(label);
      +                cb.removeChild(label);
      +                label = null;
      +            }
      +        }
      +        if(graphic)
      +        {
      +            graphic.destroy();
      +        }
      +    },
      +
      +    /**
      +     * Length in pixels of largest text bounding box. Used to calculate the height of the axis.
      +     *
      +     * @property maxLabelSize
      +     * @type Number
      +     * @protected
      +     */
      +    _maxLabelSize: 0,
      +    
      +    /**
      +     * Updates the content of text field. This method writes a value into a text field using 
      +     * `appendChild`. If the value is a `String`, it is converted to a `TextNode` first. 
      +     *
      +     * @method _setText
      +     * @param label {HTMLElement} label to be updated
      +     * @param val {String} value with which to update the label
      +     * @private
      +     */
      +    _setText: function(textField, val)
      +    { 
      +        textField.innerHTML = "";
      +        if(Y_Lang.isNumber(val))
      +        {
      +            val = val + "";
      +        }
      +        else if(!val)
      +        {
      +            val = "";
      +        }
      +        if(IS_STRING(val))
      +        {
      +            val = DOCUMENT.createTextNode(val);
      +        }
      +        textField.appendChild(val);
      +    }
      +}, {
      +    ATTRS: 
      +    {
      +        /**
      +         * When set, defines the width of a vertical axis instance. By default, vertical axes automatically size based on their contents. When the
      +         * width attribute is set, the axis will not calculate its width. When the width attribute is explicitly set, axis labels will postion themselves off of the 
      +         * the inner edge of the axis and the title, if present, will position itself off of the outer edge. If a specified width is less than the sum of 
      +         * the axis' contents, excess content will overflow.
      +         *
      +         * @attribute width
      +         * @type Number
      +         */
      +        width: {
      +            lazyAdd: false,
      +
      +            getter: function() 
      +            {
      +                if(this._explicitWidth)
      +                {
      +                    return this._explicitWidth;        
      +                }
      +                return this._calculatedWidth;
      +            },
      +
      +            setter: function(val)
      +            {
      +                this._explicitWidth = val;
      +                return val;
      +            }
      +        },
      +
      +        /**
      +         * When set, defines the height of a horizontal axis instance. By default, horizontal axes automatically size based on their contents. When the
      +         * height attribute is set, the axis will not calculate its height. When the height attribute is explicitly set, axis labels will postion themselves off of the 
      +         * the inner edge of the axis and the title, if present, will position itself off of the outer edge. If a specified height is less than the sum of 
      +         * the axis' contents, excess content will overflow.
      +         *
      +         * @attribute height
      +         * @type Number
      +         */
      +        height: {
      +            lazyAdd: false,
      +
      +            getter: function() 
      +            {
      +                if(this._explicitHeight)
      +                {
      +                    return this._explicitHeight;        
      +                }
      +                return this._calculatedHeight;
      +            },
      +
      +            setter: function(val)
      +            {
      +                this._explicitHeight = val;
      +                return val;
      +            }
      +        },
      +
      +        /**
      +         * Calculated value of an axis' width. By default, the value is used internally for vertical axes. If the `width` attribute is explicitly set, this value will be ignored.
      +         *
      +         * @attribute calculatedWidth
      +         * @type Number
      +         * @private
      +         */
      +        calculatedWidth: {
      +            getter: function()
      +            {
      +                return this._calculatedWidth;
      +            },
      +
      +            setter: function(val)
      +            {
      +                this._calculatedWidth = val;
      +                return val;
      +            }
      +        },
      +
      +        /**
      +         * Calculated value of an axis' height. By default, the value is used internally for horizontal axes. If the `height` attribute is explicitly set, this value will be ignored.
      +         *
      +         * @attribute calculatedHeight
      +         * @type Number
      +         * @private
      +         */
      +        calculatedHeight: {
      +            getter: function()
      +            {
      +                return this._calculatedHeight;
      +            },
      +
      +            setter: function(val)
      +            {
      +                this._calculatedHeight = val;
      +                return val;
      +            }
      +        },
      +
      +        /**
      +         * Difference betweend the first/last tick and edge of axis.
      +         *
      +         * @attribute edgeOffset
      +         * @type Number
      +         * @protected
      +         */
      +        edgeOffset: 
      +        {
      +            value: 0
      +        },
      +
      +        /**
      +         * The graphic in which the axis line and ticks will be rendered.
      +         *
      +         * @attribute graphic
      +         * @type Graphic
      +         */
      +        graphic: {},
      +    
      +        /**
      +         *  @attribute path
      +         *  @type Shape
      +         *  @readOnly
      +         *  @private
      +         */
      +        path: {
      +            readOnly: true,
      +
      +            getter: function()
      +            {
      +                if(!this._path)
      +                {
      +                    var graphic = this.get("graphic");
      +                    if(graphic)
      +                    {
      +                        this._path = graphic.addShape({type:"path"});
      +                    }
      +                }
      +                return this._path;
      +            }
      +        },
      +
      +        /**
      +         *  @attribute tickPath
      +         *  @type Shape
      +         *  @readOnly
      +         *  @private
      +         */
      +        tickPath: {
      +            readOnly: true,
      +
      +            getter: function()
      +            {
      +                if(!this._tickPath)
      +                {
      +                    var graphic = this.get("graphic");
      +                    if(graphic)
      +                    {
      +                        this._tickPath = graphic.addShape({type:"path"});
      +                    }
      +                }
      +                return this._tickPath;
      +            }
      +        },
      +        
      +        /**
      +         * Contains the contents of the axis. 
      +         *
      +         * @attribute node
      +         * @type HTMLElement
      +         */
      +        node: {},
      +
      +        /**
      +         * Direction of the axis.
      +         *
      +         * @attribute position
      +         * @type String
      +         */
      +        position: {
      +            setter: function(val)
      +            {
      +                var layoutClass = this._layoutClasses[val];
      +                if(val && val != "none")
      +                {
      +                    this._layout = new layoutClass();
      +                }
      +                return val;
      +            }
      +        },
      +
      +        /**
      +         * Distance determined by the tick styles used to calculate the distance between the axis
      +         * line in relation to the top of the axis.
      +         *
      +         * @attribute topTickOffset
      +         * @type Number
      +         */
      +        topTickOffset: {
      +            value: 0
      +        },
      +
      +        /**
      +         * Distance determined by the tick styles used to calculate the distance between the axis
      +         * line in relation to the bottom of the axis.
      +         *
      +         * @attribute bottomTickOffset
      +         * @type Number
      +         */
      +        bottomTickOffset: {
      +            value: 0
      +        },
      +
      +        /**
      +         * Distance determined by the tick styles used to calculate the distance between the axis
      +         * line in relation to the left of the axis.
      +         *
      +         * @attribute leftTickOffset
      +         * @type Number
      +         */
      +        leftTickOffset: {
      +            value: 0
      +        },
      +
      +        /**
      +         * Distance determined by the tick styles used to calculate the distance between the axis
      +         * line in relation to the right side of the axis.
      +         *
      +         * @attribute rightTickOffset
      +         * @type Number
      +         */
      +        rightTickOffset: {
      +            value: 0
      +        },
      +        
      +        /**
      +         * Collection of labels used to render the axis.
      +         *
      +         * @attribute labels
      +         * @type Array
      +         */
      +        labels: {
      +            readOnly: true,
      +            getter: function()
      +            {
      +                return this._labels;
      +            }
      +        },
      +
      +        /**
      +         * Collection of points used for placement of labels and ticks along the axis.
      +         *
      +         * @attribute tickPoints
      +         * @type Array
      +         */
      +        tickPoints: {
      +            readOnly: true,
      +
      +            getter: function()
      +            {
      +                if(this.get("position") == "none")
      +                {
      +                    return this.get("styles").majorUnit.count;
      +                }
      +                return this._tickPoints;
      +            }
      +        },
      +
      +        /**
      +         * Indicates whether the axis overlaps the graph. If an axis is the inner most axis on a given
      +         * position and the tick position is inside or cross, the axis will need to overlap the graph.
      +         *
      +         * @attribute overlapGraph
      +         * @type Boolean
      +         */
      +        overlapGraph: {
      +            value:true,
      +
      +            validator: function(val)
      +            {
      +                return Y_Lang.isBoolean(val);
      +            }
      +        },
      +
      +        /**
      +         * Object which should have by the labelFunction
      +         *
      +         * @attribute labelFunctionScope
      +         * @type Object
      +         */
      +        labelFunctionScope: {},
      +        
      +        /**
      +         * Length in pixels of largest text bounding box. Used to calculate the height of the axis.
      +         *
      +         * @attribute maxLabelSize
      +         * @type Number
      +         * @protected
      +         */
      +        maxLabelSize: {
      +            getter: function()
      +            {
      +                return this._maxLabelSize;
      +            },
      +
      +            setter: function(val)
      +            {
      +                this._maxLabelSize = val;
      +                return val; 
      +            }
      +        },
      +        
      +        /**
      +         *  Title for the axis. When specified, the title will display. The position of the title is determined by the axis position. 
      +         *  <dl>
      +         *      <dt>top</dt><dd>Appears above the axis and it labels. The default rotation is 0.</dd>
      +         *      <dt>right</dt><dd>Appears to the right of the axis and its labels. The default rotation is 90.</dd>
      +         *      <dt>bottom</dt><dd>Appears below the axis and its labels. The default rotation is 0.</dd>
      +         *      <dt>left</dt><dd>Appears to the left of the axis and its labels. The default rotation is -90.</dd>
      +         *  </dl>
      +         *
      +         *  @attribute title
      +         *  @type String
      +         */
      +        title: {
      +            value: null
      +        },
      +        
      +        /**
      +         * Method used for formatting a label. This attribute allows for the default label formatting method to overridden. The method use would need
      +         * to implement the arguments below and return a `String` or `HTMLElement`. 
      +         * <dl>
      +         *      <dt>val</dt><dd>Label to be formatted. (`String`)</dd>
      +         *      <dt>format</dt><dd>Template for formatting label. (optional)</dd>
      +         * </dl>
      +         *
      +         * @attribute labelFunction
      +         * @type Function
      +         */
      +        labelFunction: {
      +            value: function(val, format)
      +            {
      +                return val;
      +            }
      +        },
      +        
      +        /**
      +         * Function used to append an axis value to an axis label. This function has the following signature:
      +         *  <dl>
      +         *      <dt>textField</dt><dd>The axis label to be appended. (`HTMLElement`)</dd>
      +         *      <dt>val</dt><dd>The value to attach to the text field. This method will accept an `HTMLELement`
      +         *      or a `String`. This method does not use (`HTMLElement` | `String`)</dd>
      +         *  </dl>
      +         * The default method appends a value to the `HTMLElement` using the `appendChild` method. If the given 
      +         * value is a `String`, the method will convert the the value to a `textNode` before appending to the 
      +         * `HTMLElement`. This method will not convert an `HTMLString` to an `HTMLElement`. 
      +         *
      +         * @attribute appendLabelFunction
      +         * @type Function
      +         */
      +        appendLabelFunction: {
      +            getter: function()
      +            {
      +                return this._setText;
      +            }
      +        },
      +        
      +        /**
      +         * Function used to append a title value to the title object. This function has the following signature:
      +         *  <dl>
      +         *      <dt>textField</dt><dd>The title text field to be appended. (`HTMLElement`)</dd>
      +         *      <dt>val</dt><dd>The value to attach to the text field. This method will accept an `HTMLELement`
      +         *      or a `String`. This method does not use (`HTMLElement` | `String`)</dd>
      +         *  </dl>
      +         * The default method appends a value to the `HTMLElement` using the `appendChild` method. If the given 
      +         * value is a `String`, the method will convert the the value to a `textNode` before appending to the 
      +         * `HTMLElement` element. This method will not convert an `HTMLString` to an `HTMLElement`. 
      +         *
      +         * @attribute appendTitleFunction
      +         * @type Function
      +         */
      +        appendTitleFunction: {
      +            getter: function()
      +            {
      +                return this._setText;
      +            }
      +        }
      +            
      +        /**
      +         * Style properties used for drawing an axis. This attribute is inherited from `Renderer`. Below are the default values:
      +         *  <dl>
      +         *      <dt>majorTicks</dt><dd>Properties used for drawing ticks.
      +         *          <dl>
      +         *              <dt>display</dt><dd>Position of the tick. Possible values are `inside`, `outside`, `cross` and `none`. The
      +         *              default value is `inside`.</dd>
      +         *              <dt>length</dt><dd>The length (in pixels) of the tick. The default value is 4.</dd>
      +         *              <dt>color</dt><dd>The color of the tick. The default value is `#dad8c9`</dd>
      +         *              <dt>weight</dt><dd>Number indicating the width of the tick. The default value is 1.</dd>
      +         *              <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the tick. The default value is 1.</dd>
      +         *          </dl>
      +         *      </dd>
      +         *      <dt>line</dt><dd>Properties used for drawing the axis line. 
      +         *          <dl>
      +         *              <dt>weight</dt><dd>Number indicating the width of the axis line. The default value is 1.</dd>
      +         *              <dt>color</dt><dd>The color of the axis line. The default value is `#dad8c9`.</dd>
      +         *              <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the tick. The default value is 1.</dd>
      +         *          </dl>
      +         *      </dd>
      +         *      <dt>majorUnit</dt><dd>Properties used to calculate the `majorUnit` for the axis. 
      +         *          <dl>
      +         *              <dt>determinant</dt><dd>The algorithm used for calculating distance between ticks. The possible options are `count` and `distance`. If
      +         *              the `determinant` is `count`, the axis ticks will spaced so that a specified number of ticks appear on the axis. If the `determinant`
      +         *              is `distance`, the axis ticks will spaced out according to the specified distance. The default value is `count`.</dd>
      +         *              <dt>count</dt><dd>Number of ticks to appear on the axis when the `determinant` is `count`. The default value is 11.</dd>
      +         *              <dt>distance</dt><dd>The distance (in pixels) between ticks when the `determinant` is `distance`. The default value is 75.</dd>
      +         *          </dl>
      +         *      </dd>
      +         *      <dt>label</dt><dd>Properties and styles applied to the axis labels.
      +         *          <dl>
      +         *              <dt>color</dt><dd>The color of the labels. The default value is `#808080`.</dd>
      +         *              <dt>alpha</dt><dd>Number between 0 and 1 indicating the opacity of the labels. The default value is 1.</dd>
      +         *              <dt>fontSize</dt><dd>The font-size of the labels. The default value is 85%</dd>
      +         *              <dt>rotation</dt><dd>The rotation, in degrees (between -90 and 90) of the labels. The default value is 0.</dd>
      +         *              <dt>margin</dt><dd>The distance between the label and the axis/tick. Depending on the position of the `Axis`, only one of the properties used.
      +         *                  <dl>
      +         *                      <dt>top</dt><dd>Pixel value used for an axis with a `position` of `bottom`. The default value is 4.</dd>
      +         *                      <dt>right</dt><dd>Pixel value used for an axis with a `position` of `left`. The default value is 4.</dd>
      +         *                      <dt>bottom</dt><dd>Pixel value used for an axis with a `position` of `top`. The default value is 4.</dd>
      +         *                      <dt>left</dt><dd>Pixel value used for an axis with a `position` of `right`. The default value is 4.</dd>
      +         *                  </dl>
      +         *              </dd>
      +         *          </dl>
      +         *      </dd>
      +         *  </dl>
      +         *
      +         * @attribute styles
      +         * @type Object
      +         */
      +    }
      +});
      diff --git a/tests/input/charts/AxisType.js b/tests/input/charts/AxisType.js
      new file mode 100644
      index 00000000..686f7994
      --- /dev/null
      +++ b/tests/input/charts/AxisType.js
      @@ -0,0 +1,710 @@
      +/**
      + * AxisType is an abstract class that manages the data for an axis.
      + *
      + * @module charts
      + * @class AxisType
      + * @constructor
      + * @extends Axis
      + */
      +Y.AxisType = Y.Base.create("baseAxis", Y.Axis, [], {
      +    /**
      +     * @method initializer
      +     * @private
      +     */
      +    initializer: function()
      +    {
      +        this.after("dataReady", Y.bind(this._dataChangeHandler, this));
      +        this.after("dataUpdate", Y.bind(this._dataChangeHandler, this));
      +        this.after("minimumChange", Y.bind(this._keyChangeHandler, this));
      +        this.after("maximumChange", Y.bind(this._keyChangeHandler, this));
      +        this.after("keysChange", this._keyChangeHandler);
      +        this.after("dataProviderChange", this._dataProviderChangeHandler);
      +        this.after("alwaysShowZeroChange", this._keyChangeHandler);
      +        this.after("roundingMethodChange", this._keyChangeHandler);
      +    },
      +
      +    /**
      +     * @method bindUI
      +     * @private
      +     */
      +    bindUI: function()
      +    {
      +        this.after("stylesChange", this._updateHandler);
      +        this.after("overlapGraphChange", this._updateHandler);
      +        this.after("positionChange", this._positionChangeHandler);
      +        this.after("widthChange", this._handleSizeChange);
      +        this.after("heightChange", this._handleSizeChange);
      +        this.after("calculatedWidthChange", this._handleSizeChange);
      +        this.after("calculatedHeightChange", this._handleSizeChange);
      +    },
      +
      +    /**
      +     * Handles changes to `dataProvider`.
      +     *
      +     * @method _dataProviderChangeHandler
      +     * @param {Object} e Event object.
      +     * @private
      +     */
      +    _dataProviderChangeHandler: function(e)
      +    {
      +        var keyCollection = this.get("keyCollection").concat(),
      +            keys = this.get("keys"),
      +            i;
      +        if(keys)
      +        {
      +            for(i in keys)
      +            {
      +                if(keys.hasOwnProperty(i))
      +                {
      +                    delete keys[i];
      +                }
      +            }
      +        }
      +        if(keyCollection && keyCollection.length)
      +        {
      +            this.set("keys", keyCollection);
      +        }
      +    },
      +
      +    /**
      +     * Constant used to generate unique id.
      +     *
      +     * @property GUID
      +     * @type String
      +     * @private
      +     */
      +    GUID: "yuibaseaxis",
      +	
      +    /**
      +     * Type of data used in `Axis`.
      +     *
      +     * @property _type
      +     * @type String 
      +     * @readOnly
      +     * @private
      +     */
      +    _type: null,
      +	
      +    /**
      +     * Storage for `setMaximum` attribute.
      +     *
      +     * @property _setMaximum
      +     * @type Object
      +     * @private
      +     */
      +    _setMaximum: null,
      +	
      +    /**
      +     * Storage for `dataMaximum` attribute.
      +     *
      +     * @property _dataMaximum
      +     * @type Object
      +     * @private
      +     */
      +    _dataMaximum: null,
      +	
      +    /**
      +     * Storage for `setMinimum` attribute.
      +     *
      +     * @property _setMinimum
      +     * @type Object
      +     * @private
      +     */
      +    _setMinimum: null,
      +	
      +    /**
      +     * Reference to data array.
      +     *
      +     * @property _data
      +     * @type Array
      +     * @private
      +     */
      +    _data: null,
      +
      +    /**
      +     * Indicates whether the all data is up to date.
      +     *
      +     * @property _updateTotalDataFlag
      +     * @type Boolean
      +     * @private
      +     */
      +    _updateTotalDataFlag: true,
      +
      +    /**
      +     * Storage for `dataReady` attribute.
      +     *
      +     * @property _dataReady
      +     * @type Boolean
      +     * @readOnly
      +     * @private
      +     */
      +    _dataReady: false,
      +	
      +    /**
      +     * Adds an array to the key hash.
      +     *
      +     * @method addKey
      +     * @param value Indicates what key to use in retrieving
      +     * the array.
      +     */
      +    addKey: function (value)
      +	{
      +        this.set("keys", value);
      +	},
      +
      +    /**
      +     * Gets an array of values based on a key.
      +     *
      +     * @method _getKeyArray
      +     * @param {String} key Value key associated with the data array.
      +     * @param {Array} data Array in which the data resides.
      +     * @return Array
      +     * @private
      +     */
      +    _getKeyArray: function(key, data)
      +    {
      +        var i = 0,
      +            obj,
      +            keyArray = [],
      +            len = data.length;
      +        for(; i < len; ++i)
      +        {
      +            obj = data[i];
      +            keyArray[i] = obj[key];
      +        }
      +        return keyArray;
      +    },
      +
      +    /**
      +     * Sets data by key
      +     *
      +     * @method _setDataByKey
      +     * @param {String} key Key value to use.
      +     * @param {Array} data Array to use.
      +     * @private 
      +     */
      +    _setDataByKey: function(key, data)
      +    {
      +        var i,
      +            obj, 
      +            arr = [], 
      +            dv = this._dataClone.concat(), 
      +            len = dv.length;
      +        for(i = 0; i < len; ++i)
      +        {
      +            obj = dv[i];
      +            arr[i] = obj[key];
      +        }
      +        this.get("keys")[key] = arr;
      +        this._updateTotalDataFlag = true;
      +    },
      +
      +    /**
      +     * Updates the total data array.
      +     *
      +     * @method _updateTotalData
      +     * @private
      +     */
      +    _updateTotalData: function()
      +    {
      +		var keys = this.get("keys"),
      +            i;
      +        this._data = [];
      +        for(i in keys)
      +        {
      +            if(keys.hasOwnProperty(i))
      +            {
      +                this._data = this._data.concat(keys[i]);
      +            }
      +        }
      +        this._updateTotalDataFlag = false;
      +    },
      +
      +    /**
      +     * Removes an array from the key hash.
      +     * 
      +     * @method removeKey
      +     * @param {String} value Indicates what key to use in removing from 
      +     * the hash.
      +     */
      +    removeKey: function(value)
      +    {
      +        var keys = this.get("keys");
      +        if(keys.hasOwnProperty(value)) 
      +        {
      +            delete keys[value];
      +            this._keyChangeHandler();
      +        }
      +    },
      +
      +    /**
      +     * Returns a value based of a key value and an index.
      +     *
      +     * @method getKeyValueAt
      +     * @param {String} key value used to look up the correct array
      +     * @param {Number} index within the array
      +     * @return Number 
      +     */
      +    getKeyValueAt: function(key, index)
      +    {
      +        var value = NaN,
      +            keys = this.get("keys");
      +        if(keys[key] && Y_Lang.isNumber(parseFloat(keys[key][index])))
      +        {
      +            value = keys[key][index];
      +        }
      +        return parseFloat(value);
      +    },
      +
      +    /**
      +     * Returns an array of values based on an identifier key.
      +     *
      +     * @method getDataByKey
      +     * @param {String} value value used to identify the array
      +     * @return Object
      +     */
      +    getDataByKey: function (value)
      +    {
      +        var keys = this.get("keys");
      +        if(keys[value])
      +        {
      +            return keys[value];
      +        }
      +        return null;
      +    },
      +
      +    /**
      +     * Calculates the maximum and minimum values for the `Axis`.
      +     *
      +     * @method _updateMinAndMax
      +     * @private 
      +     */
      +    _updateMinAndMax: function() 
      +    {
      +        var data = this.get("data"),
      +            max = 0,
      +            min = 0,
      +            len,
      +            num,
      +            i;
      +        if(data && data.length && data.length > 0)
      +        {
      +            len = data.length;
      +            max = min = data[0];
      +            if(len > 1)
      +            {
      +                for(i = 1; i < len; i++)
      +                {	
      +                    num = data[i];
      +                    if(isNaN(num))
      +                    {
      +                        continue;
      +                    }
      +                    max = Math.max(num, max);
      +                    min = Math.min(num, min);
      +                }
      +            }
      +        }
      +        this._dataMaximum = max;
      +        this._dataMinimum = min;
      +    },
      +
      +    /**
      +     * Returns the total number of majorUnits that will appear on an axis.
      +     *
      +     * @method getTotalMajorUnits
      +     * @return Number
      +     */
      +    getTotalMajorUnits: function()
      +    {
      +        var units,
      +            majorUnit = this.get("styles").majorUnit,
      +            len = this.get("length");
      +        if(majorUnit.determinant === "count") 
      +        {
      +            units = majorUnit.count;
      +        }
      +        else if(majorUnit.determinant === "distance") 
      +        {
      +            units = (len/majorUnit.distance) + 1;
      +        }
      +        return units; 
      +    },
      +
      +    /**
      +     * Returns the distance between major units on an axis.
      +     *
      +     * @method getMajorUnitDistance
      +     * @param {Number} len Number of ticks
      +     * @param {Number} uiLen Size of the axis.
      +     * @param {Object} majorUnit Hash of properties used to determine the majorUnit
      +     * @return Number
      +     */
      +    getMajorUnitDistance: function(len, uiLen, majorUnit)
      +    {
      +        var dist;
      +        if(majorUnit.determinant === "count")
      +        {
      +            dist = uiLen/(len - 1);
      +        }
      +        else if(majorUnit.determinant === "distance")
      +        {
      +            dist = majorUnit.distance;
      +        }
      +        return dist;
      +    },
      +    
      +    /**
      +     * Gets the distance that the first and last ticks are offset from there respective
      +     * edges.
      +     *
      +     * @method getEdgeOffset
      +     * @param {Number} ct Number of ticks on the axis.
      +     * @param {Number} l Length (in pixels) of the axis.
      +     * @return Number
      +     */
      +    getEdgeOffset: function(ct, l)
      +    {
      +        return 0;
      +    },
      +
      +    /**
      +     * Calculates and returns a value based on the number of labels and the index of
      +     * the current label.
      +     *
      +     * @method getLabelByIndex
      +     * @param {Number} i Index of the label.
      +     * @param {Number} l Total number of labels.
      +     * @return String
      +     */
      +    getLabelByIndex: function(i, l)
      +    {
      +        var min = this.get("minimum"),
      +            max = this.get("maximum"),
      +            increm = (max - min)/(l-1),
      +            label;
      +            l -= 1;
      +        label = min + (i * increm);
      +        return label;
      +    },
      +
      +    /**
      +     * Updates the `Axis` after a change in keys.
      +     *
      +     * @method _keyChangeHandler
      +     * @param {Object} e Event object.
      +     * @private
      +     */
      +    _keyChangeHandler: function(e)
      +    {
      +        this._updateMinAndMax();
      +        this.fire("dataUpdate");
      +    },
      +
      +    /**
      +     * Checks to see if data extends beyond the range of the axis. If so,
      +     * that data will need to be hidden. This method is internal, temporary and subject
      +     * to removal in the future.
      +     *
      +     * @method _hasDataOverflow
      +     * @protected
      +     * @return Boolean
      +     */
      +    _hasDataOverflow: function()
      +    {
      +        if(this.get("setMin") || this.get("setMax"))
      +        {
      +            return true;
      +        }
      +        return false;
      +    },
      +
      +    /**
      +     * Returns a string corresponding to the first label on an 
      +     * axis.
      +     *
      +     * @method getMinimumValue
      +     * @return String
      +     */
      +    getMinimumValue: function()
      +    {
      +        return this.get("minimum");
      +    },
      +
      +    /**
      +     * Returns a string corresponding to the last label on an 
      +     * axis.
      +     *
      +     * @method getMaximumValue
      +     * @return String
      +     */
      +    getMaximumValue: function()
      +    {
      +        return this.get("maximum");
      +    }
      +}, {
      +    ATTRS: {
      +        /**
      +         * Hash of array identifed by a string value.
      +         *
      +         * @attribute keys
      +         * @type Object
      +         */
      +        keys: {
      +            value: {},
      +
      +            setter: function(val)
      +            {
      +                var keys = {},
      +                    i, 
      +                    len,
      +                    data = this.get("dataProvider");
      +                if(Y_Lang.isArray(val))
      +                {
      +                    len = val.length;
      +                    for(i = 0; i < len; ++i)
      +                    {
      +                        keys[val[i]] = this._getKeyArray(val[i], data);   
      +                    }
      +                    
      +                }
      +                else if(Y_Lang.isString(val))
      +                {
      +                    keys = this.get("keys");
      +                    keys[val] = this._getKeyArray(val, data);
      +                }
      +                else
      +                {
      +                    for(i in val)
      +                    {
      +                        if(val.hasOwnProperty(i))
      +                        {
      +                            keys[i] = this._getKeyArray(i, data);
      +                        }
      +                    }
      +                }
      +	            this._updateTotalDataFlag = true;
      +                return keys;
      +            }
      +        },
      +
      +        /**
      +         *Indicates how to round unit values.
      +         *  <dl>
      +         *      <dt>niceNumber</dt><dd>Units will be smoothed based on the number of ticks and data range.</dd>
      +         *      <dt>auto</dt><dd>If the range is greater than 1, the units will be rounded.</dd>
      +         *      <dt>numeric value</dt><dd>Units will be equal to the numeric value.</dd>
      +         *      <dt>null</dt><dd>No rounding will occur.</dd>
      +         *  </dl>
      +         *
      +         * @attribute roundingMethod
      +         * @type String
      +         * @default niceNumber
      +         */
      +        roundingMethod: {
      +            value: "niceNumber"
      +        },
      +
      +        /**
      +         *Returns the type of axis data
      +         *  <dl>
      +         *      <dt>time</dt><dd>Manages time data</dd>
      +         *      <dt>stacked</dt><dd>Manages stacked numeric data</dd>      
      +         *      <dt>numeric</dt><dd>Manages numeric data</dd>
      +         *      <dt>category</dt><dd>Manages categorical data</dd>
      +         *  </dl>
      +         *
      +         * @attribute type
      +         * @type String
      +         */
      +        type:
      +        {
      +            readOnly: true,
      +
      +            getter: function ()
      +            {
      +                return this._type;
      +            }
      +        },
      +
      +        /**
      +         * Instance of `ChartDataProvider` that the class uses
      +         * to build its own data.
      +         *
      +         * @attribute dataProvider
      +         * @type Array
      +         */
      +        dataProvider:{
      +            setter: function (value)
      +            {
      +                return value;
      +            }
      +        },
      +
      +        /**
      +         * The maximum value contained in the `data` array. Used for
      +         * `maximum` when `autoMax` is true.
      +         *
      +         * @attribute dataMaximum
      +         * @type Number
      +         */
      +        dataMaximum: {
      +            getter: function ()
      +            {
      +                if(!this._dataMaximum)
      +                {   
      +                    this._updateMinAndMax();
      +                }
      +                return this._dataMaximum;
      +            }
      +        },
      +
      +        /**
      +         * The maximum value that will appear on an axis.
      +         *
      +         * @attribute maximum
      +         * @type Number
      +         */
      +        maximum: {
      +            lazyAdd: false,
      +
      +            getter: function ()
      +            {
      +                var max = this.get("dataMaximum"),
      +                    min = this.get("minimum");
      +                //If all values are zero, force a range so that the Axis and related series
      +                //will still render.
      +                if(min === 0 && max === 0)
      +                {
      +                    max = 10;
      +                }
      +                if(Y_Lang.isNumber(this._setMaximum))
      +                {
      +                    max = this._setMaximum;
      +                }
      +                return parseFloat(max);
      +            },
      +            setter: function (value)
      +            {
      +                this._setMaximum = parseFloat(value);
      +                return value;
      +            }
      +        },
      +
      +        /**
      +         * The minimum value contained in the `data` array. Used for
      +         * `minimum` when `autoMin` is true.
      +         *
      +         * @attribute dataMinimum
      +         * @type Number
      +         */
      +        dataMinimum: {
      +            getter: function ()
      +            {
      +                if(!this._dataMinimum)
      +                {
      +                    this._updateMinAndMax();
      +                }
      +                return this._dataMinimum;
      +            }
      +        },
      +
      +        /**
      +         * The minimum value that will appear on an axis.
      +         *
      +         * @attribute minimum
      +         * @type Number
      +         */
      +        minimum: {
      +            lazyAdd: false,
      +
      +            getter: function ()
      +            {
      +                var min = this.get("dataMinimum");
      +                if(Y_Lang.isNumber(this._setMinimum))
      +                {
      +                    min = this._setMinimum;
      +                }
      +                return parseFloat(min);
      +            },
      +            setter: function(val)
      +            {
      +                this._setMinimum = parseFloat(val);
      +                return val;
      +            }
      +        },
      +
      +        /**
      +         * Determines whether the maximum is calculated or explicitly 
      +         * set by the user.
      +         *
      +         * @attribute setMax
      +         * @type Boolean
      +         */
      +        setMax: {
      +            readOnly: true,
      +
      +            getter: function()
      +            {
      +                return Y_Lang.isNumber(this._setMaximum);
      +            }
      +        },
      +
      +        /**
      +         * Determines whether the minimum is calculated or explicitly
      +         * set by the user.
      +         *
      +         * @attribute setMin
      +         * @type Boolean
      +         */
      +        setMin: {
      +            readOnly: true,
      +
      +            getter: function()
      +            {
      +                return Y_Lang.isNumber(this._setMinimum);
      +            }
      +        },
      +
      +        /**
      +         * Array of axis data
      +         *
      +         * @attribute data
      +         * @type Array
      +         */
      +        data: {
      +            getter: function ()
      +            {
      +                if(!this._data || this._updateTotalDataFlag)
      +                {
      +                    this._updateTotalData();
      +                }
      +                return this._data;
      +            }
      +        },
      +
      +        /**
      +         * Array containing all the keys in the axis.
      +        
      +         * @attribute keyCollection
      +         * @type Array
      +         */
      +        keyCollection: {
      +            getter: function()
      +            {
      +                var keys = this.get("keys"),
      +                    i, 
      +                    col = [];
      +                for(i in keys)
      +                {
      +                    if(keys.hasOwnProperty(i))
      +                    {
      +                        col.push(i);
      +                    }
      +                }
      +                return col;
      +            },
      +            readOnly: true
      +        }
      +    }
      +});
      diff --git a/tests/input/charts/BarSeries.js b/tests/input/charts/BarSeries.js
      new file mode 100644
      index 00000000..b26a13db
      --- /dev/null
      +++ b/tests/input/charts/BarSeries.js
      @@ -0,0 +1,158 @@
      +/**
      + * The BarSeries class renders bars positioned vertically along a category or time axis. The bars'
      + * lengths are proportional to the values they represent along a horizontal axis.
      + * and the relevant data points.
      + *
      + * @module charts
      + * @class BarSeries
      + * @extends MarkerSeries
      + * @uses Histogram
      + * @constructor
      + */
      +Y.BarSeries = Y.Base.create("barSeries", Y.MarkerSeries, [Y.Histogram], {
      +    /**
      +     * Helper method for calculating the size of markers. 
      +     *
      +     * @method _getMarkerDimensions
      +     * @param {Number} xcoord The x-coordinate representing the data point for the marker.
      +     * @param {Number} ycoord The y-coordinate representing the data point for the marker.
      +     * @param {Number} calculatedSize The calculated size for the marker. For a `BarSeries` is it the width. For a `ColumnSeries` it is the height.
      +     * @param {Number} offset Distance of position offset dictated by other marker series in the same graph.
      +     * @return Object
      +     * @private
      +     */
      +    _getMarkerDimensions: function(xcoord, ycoord, calculatedSize, offset)
      +    {
      +        var config = {
      +            top: ycoord + offset
      +        };
      +        if(xcoord >= this._leftOrigin)
      +        {
      +            config.left = this._leftOrigin;
      +            config.calculatedSize = xcoord - config.left;
      +        }
      +        else
      +        {
      +            config.left = xcoord;
      +            config.calculatedSize = this._leftOrigin - xcoord;
      +        }
      +        return config;
      +    },
      +    
      +    /**
      +     * Resizes and positions markers based on a mouse interaction.
      +     *
      +     * @method updateMarkerState
      +     * @param {String} type state of the marker
      +     * @param {Number} i index of the marker
      +     * @protected
      +     */
      +    updateMarkerState: function(type, i)
      +    {
      +        if(this._markers && this._markers[i])
      +        {
      +            var styles = Y.clone(this.get("styles").marker),
      +                markerStyles,
      +                state = this._getState(type),
      +                xcoords = this.get("xcoords"),
      +                ycoords = this.get("ycoords"),
      +                marker = this._markers[i],
      +                markers,
      +                graph = this.get("graph"),
      +                seriesCollection = graph.seriesTypes[this.get("type")],
      +                seriesLen = seriesCollection.length,
      +                seriesStyles,
      +                seriesSize = 0,
      +                offset = 0,
      +                renderer,
      +                n = 0,
      +                ys = [],
      +                order = this.get("order"),
      +                config;
      +            markerStyles = state == "off" || !styles[state] ? styles : styles[state]; 
      +            markerStyles.fill.color = this._getItemColor(markerStyles.fill.color, i);
      +            markerStyles.border.color = this._getItemColor(markerStyles.border.color, i);
      +            config = this._getMarkerDimensions(xcoords[i], ycoords[i], styles.height, offset);
      +            markerStyles.width = config.calculatedSize;
      +            markerStyles.height = Math.min(this._maxSize, markerStyles.height);
      +            marker.set(markerStyles);
      +            for(; n < seriesLen; ++n)
      +            {
      +                ys[n] = ycoords[i] + seriesSize;
      +                seriesStyles = seriesCollection[n].get("styles").marker;
      +                seriesSize += Math.min(this._maxSize, seriesStyles.height); 
      +                if(order > n)
      +                {
      +                    offset = seriesSize;
      +                }
      +                offset -= seriesSize/2;
      +            }
      +            for(n = 0; n < seriesLen; ++n)
      +            {
      +                markers = seriesCollection[n].get("markers");
      +                if(markers)
      +                {
      +                    renderer = markers[i];
      +                    if(renderer && renderer !== undefined)
      +                    {
      +                        renderer.set("y", (ys[n] - seriesSize/2));
      +                    }
      +                }
      +            }
      +        }
      +    }
      +}, {
      +    ATTRS: {
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @default bar
      +         */
      +        type: {
      +            value: "bar"
      +        },
      +
      +        /**
      +         * Indicates the direction of the category axis that the bars are plotted against.
      +         *
      +         * @attribute direction
      +         * @type String
      +         */
      +        direction: {
      +            value: "vertical"
      +        }
      +        
      +        /**
      +         * Style properties used for drawing markers. This attribute is inherited from `MarkerSeries`. Below are the default values:
      +         *  <dl>
      +         *      <dt>fill</dt><dd>A hash containing the following values:
      +         *          <dl>
      +         *              <dt>color</dt><dd>Color of the fill. The default value is determined by the order of the series on the graph. The color
      +         *              will be retrieved from the below array:<br/>
      +         *              `["#66007f", "#a86f41", "#295454", "#996ab2", "#e8cdb7", "#90bdbd","#000000","#c3b8ca", "#968373", "#678585"]`
      +         *              </dd>
      +         *              <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the marker fill. The default value is 1.</dd>
      +         *          </dl>
      +         *      </dd>
      +         *      <dt>border</dt><dd>A hash containing the following values:
      +         *          <dl>
      +         *              <dt>color</dt><dd>Color of the border. The default value is determined by the order of the series on the graph. The color
      +         *              will be retrieved from the below array:<br/>
      +         *              `["#205096", "#b38206", "#000000", "#94001e", "#9d6fa0", "#e55b00", "#5e85c9", "#adab9e", "#6ac291", "#006457"]`
      +         *              <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the marker border. The default value is 1.</dd>
      +         *              <dt>weight</dt><dd>Number indicating the width of the border. The default value is 1.</dd>
      +         *          </dl>
      +         *      </dd>
      +         *      <dt>height</dt><dd>indicates the width of the marker. The default value is 12.</dd>
      +         *      <dt>over</dt><dd>hash containing styles for markers when highlighted by a `mouseover` event. The default 
      +         *      values for each style is null. When an over style is not set, the non-over value will be used. For example,
      +         *      the default value for `marker.over.fill.color` is equivalent to `marker.fill.color`.</dd>
      +         *  </dl>
      +         *
      +         * @attribute styles
      +         * @type Object
      +         */
      +    }
      +});
      diff --git a/tests/input/charts/BottomAxisLayout.js b/tests/input/charts/BottomAxisLayout.js
      new file mode 100644
      index 00000000..94da1821
      --- /dev/null
      +++ b/tests/input/charts/BottomAxisLayout.js
      @@ -0,0 +1,349 @@
      +/**
      + * Contains algorithms for rendering a bottom axis.
      + *
      + * @module charts
      + * @class BottomAxisLayout
      + * @Constructor
      + */
      +BottomAxisLayout = function(){};
      +
      +BottomAxisLayout.prototype = {
      +    /**
      +     *  Default margins for text fields.
      +     *
      +     *  @private
      +     *  @method _getDefaultMargins
      +     *  @return Object
      +     */
      +    _getDefaultMargins: function() 
      +    {
      +        return {
      +            top: 4,
      +            left: 0,
      +            right: 0,
      +            bottom: 0
      +        };
      +    },
      +
      +    /**
      +     * Sets the length of the tick on either side of the axis line.
      +     *
      +     * @method setTickOffsets
      +     * @protected
      +     */
      +    setTickOffsets: function()
      +    {
      +        var host = this,
      +            majorTicks = host.get("styles").majorTicks,
      +            tickLength = majorTicks.length,
      +            halfTick = tickLength * 0.5,
      +            display = majorTicks.display;
      +        host.set("leftTickOffset",  0);
      +        host.set("rightTickOffset",  0);
      +
      +        switch(display)
      +        {
      +            case "inside" :
      +                host.set("topTickOffset", tickLength);
      +                host.set("bottomTickOffset", 0);
      +            break;
      +            case "outside" : 
      +                host.set("topTickOffset", 0);
      +                host.set("bottomTickOffset", tickLength);
      +            break;
      +            case "cross":
      +                host.set("topTickOffset",  halfTick);
      +                host.set("bottomTickOffset",  halfTick);
      +            break;
      +            default:
      +                host.set("topTickOffset", 0);
      +                host.set("bottomTickOffset", 0);
      +            break;
      +        }
      +    },
      +
      +    /**
      +     * Calculates the coordinates for the first point on an axis.
      +     *
      +     * @method getLineStart
      +     * @protected
      +     */
      +    getLineStart: function()
      +    {
      +        var style = this.get("styles"),
      +            padding = style.padding,
      +            majorTicks = style.majorTicks,
      +            tickLength = majorTicks.length,
      +            display = majorTicks.display,
      +            pt = {x:0, y:padding.top};
      +        if(display === "inside")
      +        {
      +            pt.y += tickLength;
      +        }
      +        else if(display === "cross")
      +        {
      +            pt.y += tickLength/2;
      +        }
      +        return pt; 
      +    },
      +    
      +    /**
      +     * Draws a tick
      +     *
      +     * @method drawTick
      +     * @param {Path} path reference to the path `Path` element in which to draw the tick.
      +     * @param {Object} pt hash containing x and y coordinates
      +     * @param {Object} tickStyles hash of properties used to draw the tick
      +     * @protected
      +     */
      +    drawTick: function(path, pt, tickStyles)
      +    {
      +        var host = this,
      +            style = host.get("styles"),
      +            padding = style.padding,
      +            tickLength = tickStyles.length,
      +            start = {x:pt.x, y:padding.top},
      +            end = {x:pt.x, y:tickLength + padding.top};
      +        host.drawLine(path, start, end);
      +    },
      +
      +    /**
      +     * Calculates the point for a label.
      +     *
      +     * @method getLabelPoint
      +     * @param {Object} pt Object containing x and y coordinates
      +     * @return Object
      +     * @protected
      +     */
      +    getLabelPoint: function(point)
      +    {
      +        return {x:point.x, y:point.y + this.get("bottomTickOffset")};
      +    },
      +    
      +    /**
      +     * Updates the value for the `maxLabelSize` for use in calculating total size.
      +     *
      +     * @method updateMaxLabelSize
      +     * @param {HTMLElement} label to measure
      +     * @protected
      +     */
      +    updateMaxLabelSize: function(labelWidth, labelHeight)
      +    {
      +        var host = this,
      +            props = this._labelRotationProps,
      +            rot = props.rot,
      +            absRot = props.absRot,
      +            sinRadians = props.sinRadians,
      +            cosRadians = props.cosRadians,
      +            max;
      +        if(rot === 0)
      +        {
      +            max = labelHeight;
      +        }
      +        else if(absRot === 90)
      +        {
      +            max = labelWidth;
      +        }
      +        else
      +        {
      +            max = (sinRadians * labelWidth) + (cosRadians * labelHeight); 
      +        }
      +        host._maxLabelSize = Math.max(host._maxLabelSize, max);
      +    },
      +    
      +    /**
      +     * Determines the available label height when the axis width has been explicitly set.
      +     *
      +     * @method getExplicitlySized
      +     * @return Boolean
      +     * @protected
      +     */
      +    getExplicitlySized: function(styles)
      +    {
      +        if(this._explicitHeight)
      +        {
      +            var host = this,
      +                h = host._explicitHeight,
      +                totalTitleSize = host._totalTitleSize,
      +                bottomTickOffset = host.get("bottomTickOffset"),
      +                margin = styles.label.margin.right;
      +            host._maxLabelSize =  h - (bottomTickOffset + margin + totalTitleSize);
      +            return true;
      +        }
      +        return false;
      +    },
      +
      +    /**
      +     * Rotate and position title.
      +     *
      +     * @method positionTitle
      +     * @param {HTMLElement} label to rotate position
      +     * @protected
      +     */
      +    positionTitle: function(label)
      +    {
      +        var host = this,
      +            bounds = host._titleBounds,
      +            margin = host.get("styles").title.margin,
      +            props = host._titleRotationProps,
      +            h = bounds.bottom - bounds.top,
      +            labelWidth = label.offsetWidth,
      +            labelHeight = label.offsetHeight,
      +            x = (host.get("width") * 0.5) - (labelWidth * 0.5),
      +            y = host.get("height") - labelHeight/2 - h/2;
      +        props.labelWidth = labelWidth;
      +        props.labelHeight = labelHeight;
      +        if(margin && margin.bottom)
      +        {
      +            y -= margin.bottom;
      +        }
      +        props.x = x;
      +        props.y = y;
      +        props.transformOrigin = [0.5, 0.5];
      +        host._rotate(label, props);
      +    },
      +    
      +    /**
      +     * Rotate and position labels.
      +     *
      +     * @method positionLabel
      +     * @param {HTMLElement} label to rotate position
      +     * @param {Object} pt hash containing the x and y coordinates in which the label will be positioned
      +     * against.
      +     * @protected
      +     */
      +    positionLabel: function(label, pt, styles, i)
      +    {
      +        var host = this,
      +            tickOffset = host.get("bottomTickOffset"),
      +            labelStyles = styles.label,
      +            margin = 0,
      +            props = host._labelRotationProps,
      +            rot = props.rot,
      +            absRot = props.absRot,
      +            leftOffset = Math.round(pt.x),
      +            topOffset = Math.round(pt.y),
      +            labelWidth = host._labelWidths[i],
      +            labelHeight = host._labelHeights[i];
      +        if(labelStyles.margin && labelStyles.margin.top)
      +        {
      +            margin = labelStyles.margin.top;
      +        }
      +        if(rot > 0)
      +        {
      +            topOffset -= labelHeight/2 * rot/90;
      +        }
      +        else if(rot < 0)
      +        {
      +            leftOffset -= labelWidth;
      +            topOffset -= labelHeight/2 * absRot/90;
      +        }
      +        else
      +        {
      +            leftOffset -= labelWidth * 0.5;
      +        }
      +        topOffset += margin;
      +        topOffset += tickOffset;
      +        props.labelWidth = labelWidth;
      +        props.labelHeight = labelHeight;
      +        props.x = leftOffset;
      +        props.y = topOffset;
      +        host._rotate(label, props);
      +    },
      +    
      +    /**
      +     * Adjusts the coordinates of an axis label based on the rotation.
      +     *
      +     * @method _setRotationCoords
      +     * @param {Object} props Coordinates, dimension and rotation properties of the label.
      +     * @protected
      +     */
      +    _setRotationCoords: function(props)
      +    {
      +        var rot = props.rot,
      +            absRot = props.absRot,
      +            labelWidth = props.labelWidth,
      +            labelHeight = props.labelHeight,
      +            leftOffset,
      +            topOffset;
      +
      +        if(rot > 0)
      +        {
      +            leftOffset = 0;
      +            topOffset = labelHeight/2 * rot/90;
      +        }
      +        else if(rot < 0)
      +        {
      +            leftOffset = labelWidth;
      +            topOffset = labelHeight/2 * absRot/90;
      +        }
      +        else
      +        {
      +            leftOffset = labelWidth * 0.5;
      +            topOffset = 0;
      +        }
      +        props.x -= leftOffset;
      +        props.y -= topOffset;
      +    },
      +
      +    /**
      +     * Returns the transformOrigin to use for an axis label based on the position of the axis 
      +     * and the rotation of the label.
      +     *
      +     * @method _getTransformOrigin
      +     * @param {Number} rot The rotation (in degrees) of the label.
      +     * @return Array
      +     * @protected
      +     */
      +    _getTransformOrigin: function(rot)
      +    {
      +        var transformOrigin;
      +        if(rot > 0)
      +        {
      +            transformOrigin = [0, 0.5];
      +        }
      +        else if(rot < 0)
      +        {
      +            transformOrigin = [1, 0.5];
      +        }
      +        else
      +        {
      +            transformOrigin = [0, 0];
      +        }
      +        return transformOrigin;
      +    },
      +
      +    /**
      +     * Adjusts position for inner ticks.
      +     *
      +     * @method offsetNodeForTick
      +     * @param {Node} cb contentBox of the axis
      +     * @protected
      +     */
      +    offsetNodeForTick: function(cb)
      +    {
      +        var host = this;
      +        host.get("contentBox").setStyle("top", 0 - host.get("topTickOffset"));
      +    },
      +
      +    /**
      +     * Assigns a height based on the size of the contents.
      +     *
      +     * @method setCalculatedSize
      +     * @protected
      +     */
      +    setCalculatedSize: function()
      +    {
      +        var host = this,
      +            styles = host.get("styles"),
      +            labelStyle = styles.label,
      +            totalTitleSize = host._totalTitleSize,
      +            ttl = Math.round(host.get("bottomTickOffset") + host._maxLabelSize + labelStyle.margin.top + totalTitleSize);
      +        if(host._explicitHeight)
      +        {
      +            ttl = host._explicitHeight;
      +        }
      +        host.set("calculatedHeight", ttl);
      +    }
      +};
      +Y.BottomAxisLayout = BottomAxisLayout;
      diff --git a/tests/input/charts/CartesianChart.js b/tests/input/charts/CartesianChart.js
      new file mode 100644
      index 00000000..fe5e7ddf
      --- /dev/null
      +++ b/tests/input/charts/CartesianChart.js
      @@ -0,0 +1,2131 @@
      +/**
      + * The CartesianChart class creates a chart with horizontal and vertical axes.
      + *
      + * @module charts
      + * @class CartesianChart
      + * @extends ChartBase
      + * @constructor
      + */
      +Y.CartesianChart = Y.Base.create("cartesianChart", Y.Widget, [Y.ChartBase], {
      +    /**
      +     * @method renderUI
      +     * @private
      +     */
      +    renderUI: function()
      +    {
      +        var bb = this.get("boundingBox"),
      +            cb = this.get("contentBox"),
      +            tt = this.get("tooltip"),
      +            overlay,
      +            overlayClass = _getClassName("overlay");
      +        //move the position = absolute logic to a class file
      +        bb.setStyle("position", "absolute");
      +        cb.setStyle("position", "absolute");
      +        this._addAxes();
      +        this._addGridlines();
      +        this._addSeries();
      +        if(tt && tt.show)
      +        {
      +            this._addTooltip();
      +        }
      +        //If there is a style definition. Force them to set.
      +        this.get("styles");
      +        if(this.get("interactionType") == "planar")
      +        {
      +            overlay = DOCUMENT.createElement("div");
      +            this.get("contentBox").appendChild(overlay);
      +            this._overlay = Y.one(overlay); 
      +            this._overlay.setStyle("position", "absolute");
      +            this._overlay.setStyle("background", "#fff");
      +            this._overlay.setStyle("opacity", 0);
      +            this._overlay.addClass(overlayClass);
      +            this._overlay.setStyle("zIndex", 4);
      +        }
      +        this._setAriaElements(bb, cb);
      +        this._redraw();
      +    },
      +
      +    /**
      +     * When `interactionType` is set to `planar`, listens for mouse move events and fires `planarEvent:mouseover` or `planarEvent:mouseout` depending on the position of the mouse in relation to 
      +     * data points on the `Chart`.
      +     *
      +     * @method _planarEventDispatcher
      +     * @param {Object} e Event object.
      +     * @private
      +     */
      +    _planarEventDispatcher: function(e)
      +    {
      +        var graph = this.get("graph"),
      +            bb = this.get("boundingBox"),
      +            cb = graph.get("contentBox"),
      +            isTouch = e && e.hasOwnProperty("changedTouches"),
      +            pageX = isTouch ? e.changedTouches[0].pageX : e.pageX,
      +            pageY = isTouch ? e.changedTouches[0].pageY : e.pageY,
      +            posX = pageX - bb.getX(),
      +            posY = pageY - bb.getY(),
      +            offset = {
      +                x: pageX - cb.getX(),
      +                y: pageY - cb.getY()
      +            },
      +            sc = graph.get("seriesCollection"),
      +            series,
      +            i = 0,
      +            index,
      +            oldIndex = this._selectedIndex,
      +            item,
      +            items = [],
      +            categoryItems = [],
      +            valueItems = [],
      +            direction = this.get("direction"),
      +            hasMarkers,
      +            catAxis,
      +            valAxis,
      +            coord,
      +            //data columns and area data could be created on a graph level
      +            markerPlane,
      +            len,
      +            coords;
      +        e.halt(true);
      +        if(direction == "horizontal")
      +        {
      +            catAxis = "x";
      +            valAxis = "y";
      +        }
      +        else
      +        {
      +            valAxis = "x";
      +            catAxis = "y";
      +        }
      +        coord = offset[catAxis];
      +        if(sc)
      +        {
      +            len = sc.length;
      +            while(i < len && !markerPlane)
      +            {
      +                if(sc[i])
      +                {
      +                    markerPlane = sc[i].get(catAxis + "MarkerPlane");
      +                }
      +                i++;
      +            }
      +        }
      +        if(markerPlane)
      +        {
      +            len = markerPlane.length;
      +            for(i = 0; i < len; ++i)
      +            {
      +                if(coord <= markerPlane[i].end && coord >= markerPlane[i].start)
      +                {
      +                    index = i;
      +                    break;
      +                }
      +            }
      +            len = sc.length;
      +            for(i = 0; i < len; ++i)
      +            {
      +                series = sc[i];
      +                coords = series.get(valAxis + "coords");
      +                hasMarkers = series.get("markers");
      +                if(hasMarkers && !isNaN(oldIndex) && oldIndex > -1)
      +                {
      +                    series.updateMarkerState("mouseout", oldIndex);
      +                }
      +                if(coords && coords[index] > -1)
      +                {
      +                    if(hasMarkers && !isNaN(index) && index > -1)
      +                    {
      +                        series.updateMarkerState("mouseover", index);
      +                    }
      +                    item = this.getSeriesItems(series, index);
      +                    categoryItems.push(item.category);
      +                    valueItems.push(item.value);
      +                    items.push(series);
      +                }
      +                    
      +            }
      +            this._selectedIndex = index;
      +
      +            /**
      +             * Broadcasts when `interactionType` is set to `planar` and a series' marker plane has received a mouseover event.
      +             * 
      +             *
      +             * @event planarEvent:mouseover
      +             * @preventable false
      +             * @param {EventFacade} e Event facade with the following additional
      +             *   properties:
      +             *  <dl>
      +             *      <dt>categoryItem</dt><dd>An array of hashes, each containing information about the category `Axis` of each marker whose plane has been intersected.</dd>
      +             *      <dt>valueItem</dt><dd>An array of hashes, each containing information about the value `Axis` of each marker whose plane has been intersected.</dd>
      +             *      <dt>x</dt><dd>The x-coordinate of the mouse in relation to the Chart.</dd>
      +             *      <dt>y</dt><dd>The y-coordinate of the mouse in relation to the Chart.</dd>
      +             *      <dt>pageX</dt><dd>The x location of the event on the page (including scroll)</dd>
      +             *      <dt>pageY</dt><dd>The y location of the event on the page (including scroll)</dd>
      +             *      <dt>items</dt><dd>An array including all the series which contain a marker whose plane has been intersected.</dd>
      +             *      <dt>index</dt><dd>Index of the markers in their respective series.</dd>
      +             *      <dt>originEvent</dt><dd>Underlying dom event.</dd>
      +             *  </dl>
      +             */
      +            /**
      +             * Broadcasts when `interactionType` is set to `planar` and a series' marker plane has received a mouseout event.
      +             *
      +             * @event planarEvent:mouseout
      +             * @preventable false
      +             * @param {EventFacade} e 
      +             */
      +            if(index > -1)
      +            {
      +                this.fire("planarEvent:mouseover", {
      +                    categoryItem:categoryItems, 
      +                    valueItem:valueItems, 
      +                    x:posX, 
      +                    y:posY, 
      +                    pageX:pageX,
      +                    pageY:pageY,
      +                    items:items, 
      +                    index:index,
      +                    originEvent:e
      +                });
      +            }
      +            else
      +            {
      +                this.fire("planarEvent:mouseout");
      +            }
      +        }
      +    },
      +
      +    /**
      +     * Indicates the default series type for the chart.
      +     *
      +     * @property _type
      +     * @type {String}
      +     * @private
      +     */
      +    _type: "combo",
      +
      +    /**
      +     * Queue of axes instances that will be updated. This method is used internally to determine when all axes have been updated.
      +     *
      +     * @property _itemRenderQueue
      +     * @type Array
      +     * @private
      +     */
      +    _itemRenderQueue: null,
      +
      +    /**
      +     * Adds an `Axis` instance to the `_itemRenderQueue`.
      +     *
      +     * @method _addToAxesRenderQueue
      +     * @param {Axis} axis An `Axis` instance.
      +     * @private 
      +     */
      +    _addToAxesRenderQueue: function(axis)
      +    {
      +        if(!this._itemRenderQueue)
      +        {
      +            this._itemRenderQueue = [];
      +        }
      +        if(Y.Array.indexOf(this._itemRenderQueue, axis) < 0)
      +        {
      +            this._itemRenderQueue.push(axis);
      +        }
      +    },
      +
      +    /**
      +     * Adds axis instance to the appropriate array based on position
      +     *
      +     * @method _addToAxesCollection
      +     * @param {String} position The position of the axis
      +     * @param {Axis} axis The `Axis` instance
      +     */
      +    _addToAxesCollection: function(position, axis)
      +    {
      +        var axesCollection = this.get(position + "AxesCollection");
      +        if(!axesCollection)
      +        {
      +            axesCollection = [];
      +            this.set(position + "AxesCollection", axesCollection);
      +        }
      +        axesCollection.push(axis);
      +    },
      +
      +    /**
      +     * Returns the default value for the `seriesCollection` attribute.
      +     *
      +     * @method _getDefaultSeriesCollection
      +     * @param {Array} val Array containing either `CartesianSeries` instances or objects containing data to construct series instances.
      +     * @return Array
      +     * @private
      +     */
      +    _getDefaultSeriesCollection: function()
      +    {
      +        return this._parseSeriesCollection();
      +    },
      +
      +    /**
      +     * Parses and returns a series collection from an object and default properties.
      +     *
      +     * @method _parseSeriesCollection
      +     * @param {Object} val Object contain properties for series being set.
      +     * @return Object
      +     * @private
      +     */
      +    _parseSeriesCollection: function(val)
      +    {
      +        var dir = this.get("direction"), 
      +            sc = val || [], 
      +            catAxis,
      +            valAxis,
      +            tempKeys = [],
      +            series,
      +            seriesKeys = this.get("seriesKeys").concat(),
      +            i,
      +            index,
      +            l,
      +            type = this.get("type"),
      +            key,
      +            catKey,
      +            seriesKey,
      +            graph,
      +            categoryKey = this.get("categoryKey"),
      +            showMarkers = this.get("showMarkers"),
      +            showAreaFill = this.get("showAreaFill"),
      +            showLines = this.get("showLines");
      +        if(dir == "vertical")
      +        {
      +            catAxis = "yAxis";
      +            catKey = "yKey";
      +            valAxis = "xAxis";
      +            seriesKey = "xKey";
      +        }
      +        else
      +        {
      +            catAxis = "xAxis";
      +            catKey = "xKey";
      +            valAxis = "yAxis";
      +            seriesKey = "yKey";
      +        }
      +        l = sc.length;
      +        for(i = 0; i < l; ++i)
      +        {
      +            key = this._getBaseAttribute(sc[i], seriesKey);
      +            if(key)
      +            {
      +                index = Y.Array.indexOf(seriesKeys, key);
      +                if(index > -1)
      +                {
      +                    seriesKeys.splice(index, 1);
      +                }
      +               tempKeys.push(key);
      +            }
      +        }
      +        if(seriesKeys.length > 0)
      +        {
      +            tempKeys = tempKeys.concat(seriesKeys);
      +        }
      +        l = tempKeys.length;
      +        for(i = 0; i < l; ++i)
      +        {
      +            series = sc[i] || {type:type};
      +            if(series instanceof Y.CartesianSeries)
      +            {
      +                this._parseSeriesAxes(series);
      +                continue;
      +            }
      +            
      +            series[catKey] = series[catKey] || categoryKey;
      +            series[seriesKey] = series[seriesKey] || seriesKeys.shift();
      +            series[catAxis] = this._getCategoryAxis();
      +            series[valAxis] = this._getSeriesAxis(series[seriesKey]);
      +            
      +            series.type = series.type || type;
      +            
      +            if((series.type == "combo" || series.type == "stackedcombo" || series.type == "combospline" || series.type == "stackedcombospline"))
      +            {
      +                if(showAreaFill !== null)
      +                {
      +                    series.showAreaFill = (series.showAreaFill !== null && series.showAreaFill !== undefined) ? series.showAreaFill : showAreaFill;
      +                }
      +                if(showMarkers !== null)
      +                {
      +                    series.showMarkers = (series.showMarkers !== null && series.showMarkers !== undefined) ? series.showMarkers : showMarkers;
      +                }
      +                if(showLines !== null)
      +                {
      +                    series.showLines = (series.showLines !== null && series.showLines !== undefined) ? series.showLines : showLines;
      +                }
      +            }
      +            sc[i] = series;
      +        }
      +        if(val)
      +        {
      +            graph = this.get("graph");
      +            graph.set("seriesCollection", sc);
      +            sc = graph.get("seriesCollection");
      +        }
      +        return sc;
      +    },
      +
      +    /**
      +     * Parse and sets the axes for a series instance.
      +     *
      +     * @method _parseSeriesAxes
      +     * @param {CartesianSeries} series A `CartesianSeries` instance.
      +     * @private
      +     */
      +    _parseSeriesAxes: function(series)
      +    {
      +        var axes = this.get("axes"),
      +            xAxis = series.get("xAxis"),
      +            yAxis = series.get("yAxis"),
      +            YAxis = Y.Axis,
      +            axis;
      +        if(xAxis && !(xAxis instanceof YAxis) && Y_Lang.isString(xAxis) && axes.hasOwnProperty(xAxis))
      +        {
      +            axis = axes[xAxis];
      +            if(axis instanceof YAxis)
      +            {
      +                series.set("xAxis", axis);
      +            }
      +        }
      +        if(yAxis && !(yAxis instanceof YAxis) && Y_Lang.isString(yAxis) && axes.hasOwnProperty(yAxis))
      +        {   
      +            axis = axes[yAxis];
      +            if(axis instanceof YAxis)
      +            {
      +                series.set("yAxis", axis);
      +            }
      +        }
      +
      +    },
      +
      +    /**
      +     * Returns the category axis instance for the chart.
      +     *
      +     * @method _getCategoryAxis
      +     * @return Axis
      +     * @private
      +     */
      +    _getCategoryAxis: function()
      +    {
      +        var axis,
      +            axes = this.get("axes"),
      +            categoryAxisName = this.get("categoryAxisName") || this.get("categoryKey");
      +        axis = axes[categoryAxisName];
      +        return axis;
      +    },
      +
      +    /**
      +     * Returns the value axis for a series.
      +     *
      +     * @method _getSeriesAxis
      +     * @param {String} key The key value used to determine the axis instance.
      +     * @return Axis
      +     * @private
      +     */
      +    _getSeriesAxis:function(key, axisName)
      +    {
      +        var axes = this.get("axes"),
      +            i,
      +            keys,
      +            axis;
      +        if(axes)
      +        {
      +            if(axisName && axes.hasOwnProperty(axisName))
      +            {
      +                axis = axes[axisName];
      +            }
      +            else
      +            {
      +                for(i in axes)
      +                {
      +                    if(axes.hasOwnProperty(i))
      +                    {
      +                        keys = axes[i].get("keys");
      +                        if(keys && keys.hasOwnProperty(key))
      +                        {
      +                            axis = axes[i];
      +                            break;
      +                        }
      +                    }
      +                }
      +            }
      +        }
      +        return axis;
      +    },
      +
      +    /**
      +     * Gets an attribute from an object, using a getter for Base objects and a property for object
      +     * literals. Used for determining attributes from series/axis references which can be an actual class instance
      +     * or a hash of properties that will be used to create a class instance.
      +     *
      +     * @method _getBaseAttribute
      +     * @param {Object} item Object or instance in which the attribute resides.
      +     * @param {String} key Attribute whose value will be returned.
      +     * @return Object
      +     * @private
      +     */
      +    _getBaseAttribute: function(item, key)
      +    {
      +        if(item instanceof Y.Base)
      +        {
      +            return item.get(key);
      +        }
      +        if(item.hasOwnProperty(key))
      +        {
      +            return item[key];
      +        }
      +        return null;
      +    },
      +
      +    /**
      +     * Sets an attribute on an object, using a setter of Base objects and a property for object
      +     * literals. Used for setting attributes on a Base class, either directly or to be stored in an object literal
      +     * for use at instantiation.
      +     *
      +     * @method _setBaseAttribute
      +     * @param {Object} item Object or instance in which the attribute resides.
      +     * @param {String} key Attribute whose value will be assigned.
      +     * @param {Object} value Value to be assigned to the attribute.
      +     * @private
      +     */
      +    _setBaseAttribute: function(item, key, value)
      +    {
      +        if(item instanceof Y.Base)
      +        {
      +            item.set(key, value);
      +        }
      +        else
      +        {
      +            item[key] = value;
      +        }
      +    },
      +
      +    /**
      +     * Creates `Axis` instances.
      +     *
      +     * @method _setAxes
      +     * @param {Object} val Object containing `Axis` instances or objects in which to construct `Axis` instances.
      +     * @return Object
      +     * @private
      +     */
      +    _setAxes: function(val)
      +    {
      +        var hash = this._parseAxes(val),
      +            axes = {},
      +            axesAttrs = {
      +                edgeOffset: "edgeOffset", 
      +                position: "position",
      +                overlapGraph:"overlapGraph",
      +                labelFunction:"labelFunction",
      +                labelFunctionScope:"labelFunctionScope",
      +                labelFormat:"labelFormat",
      +                maximum:"maximum",
      +                minimum:"minimum", 
      +                roundingMethod:"roundingMethod",
      +                alwaysShowZero:"alwaysShowZero",
      +                title:"title",
      +                width:"width",
      +                height:"height"
      +            },
      +            dp = this.get("dataProvider"),
      +            ai,
      +            i, 
      +            pos, 
      +            axis,
      +            axisPosition,
      +            dh, 
      +            axisClass, 
      +            config,
      +            axesCollection;
      +        for(i in hash)
      +        {
      +            if(hash.hasOwnProperty(i))
      +            {
      +                dh = hash[i];
      +                if(dh instanceof Y.Axis)
      +                {
      +                    axis = dh;
      +                }
      +                else
      +                {
      +                    axis = null;
      +                    config = {};
      +                    config.dataProvider = dh.dataProvider || dp;
      +                    config.keys = dh.keys;
      +                    
      +                    if(dh.hasOwnProperty("roundingUnit"))
      +                    {
      +                        config.roundingUnit = dh.roundingUnit;
      +                    }
      +                    pos = dh.position;
      +                    if(dh.styles)
      +                    {
      +                        config.styles = dh.styles;
      +                    }
      +                    config.position = dh.position;
      +                    for(ai in axesAttrs)
      +                    {
      +                        if(axesAttrs.hasOwnProperty(ai) && dh.hasOwnProperty(ai))
      +                        {
      +                            config[ai] = dh[ai];
      +                        }
      +                    }
      +                   
      +                    //only check for existing axis if we constructed the default axes already
      +                    if(val)
      +                    {
      +                        axis = this.getAxisByKey(i);
      +                    }
      +                    
      +                    if(axis && axis instanceof Y.Axis)
      +                    {
      +                        axisPosition = axis.get("position");
      +                        if(pos != axisPosition)
      +                        {
      +                            if(axisPosition != "none")
      +                            {
      +                                axesCollection = this.get(axisPosition + "AxesCollection");
      +                                axesCollection.splice(Y.Array.indexOf(axesCollection, axis), 1);
      +                            }
      +                            if(pos != "none")
      +                            {
      +                                this._addToAxesCollection(pos, axis);
      +                            }
      +                        }
      +                        axis.setAttrs(config);
      +                    }
      +                    else
      +                    {
      +                        axisClass = this._getAxisClass(dh.type);
      +                        axis = new axisClass(config);
      +                        axis.after("axisRendered", Y.bind(this._itemRendered, this));
      +                    }
      +                }
      +
      +                if(axis)
      +                {
      +                    axesCollection = this.get(pos + "AxesCollection");
      +                    if(axesCollection && Y.Array.indexOf(axesCollection, axis) > 0)
      +                    {
      +                        axis.set("overlapGraph", false);
      +                    }
      +                    axes[i] = axis;
      +                }
      +            }
      +        }
      +        return axes;
      +    },
      +    
      +    /**
      +     * Adds axes to the chart.
      +     *
      +     * @method _addAxes
      +     * @private
      +     */
      +    _addAxes: function()
      +    {
      +        var axes = this.get("axes"),
      +            i, 
      +            axis, 
      +            pos,
      +            w = this.get("width"),
      +            h = this.get("height"),
      +            node = Y.Node.one(this._parentNode);
      +        if(!this._axesCollection)
      +        {   
      +            this._axesCollection = [];
      +        }
      +        for(i in axes)
      +        {
      +            if(axes.hasOwnProperty(i))
      +            {
      +                axis = axes[i];
      +                if(axis instanceof Y.Axis)
      +                {
      +                    if(!w)
      +                    {
      +                        this.set("width", node.get("offsetWidth"));
      +                        w = this.get("width");
      +                    }
      +                    if(!h)
      +                    {
      +                        this.set("height", node.get("offsetHeight"));
      +                        h = this.get("height");
      +                    }
      +                    this._addToAxesRenderQueue(axis);
      +                    pos = axis.get("position");
      +                    if(!this.get(pos + "AxesCollection"))
      +                    {
      +                        this.set(pos + "AxesCollection", [axis]);
      +                    }
      +                    else
      +                    {
      +                        this.get(pos + "AxesCollection").push(axis);
      +                    }
      +                    this._axesCollection.push(axis);
      +                    if(axis.get("keys").hasOwnProperty(this.get("categoryKey")))
      +                    {
      +                        this.set("categoryAxis", axis);
      +                    }
      +                    axis.render(this.get("contentBox"));
      +                }
      +            }
      +        }
      +    },
      +
      +    /**
      +     * Renders the Graph.
      +     *
      +     * @method _addSeries
      +     * @private
      +     */
      +    _addSeries: function()
      +    {
      +        var graph = this.get("graph"),
      +            sc = this.get("seriesCollection");
      +        graph.render(this.get("contentBox"));
      +
      +    },
      +
      +    /**
      +     * Adds gridlines to the chart.
      +     *
      +     * @method _addGridlines
      +     * @private
      +     */
      +    _addGridlines: function()
      +    {
      +        var graph = this.get("graph"),
      +            hgl = this.get("horizontalGridlines"),
      +            vgl = this.get("verticalGridlines"),
      +            direction = this.get("direction"),
      +            leftAxesCollection = this.get("leftAxesCollection"),
      +            rightAxesCollection = this.get("rightAxesCollection"),
      +            bottomAxesCollection = this.get("bottomAxesCollection"),
      +            topAxesCollection = this.get("topAxesCollection"),
      +            seriesAxesCollection,
      +            catAxis = this.get("categoryAxis"),
      +            hAxis,
      +            vAxis;
      +        if(this._axesCollection)
      +        {
      +            seriesAxesCollection = this._axesCollection.concat();
      +            seriesAxesCollection.splice(Y.Array.indexOf(seriesAxesCollection, catAxis), 1);
      +        }
      +        if(hgl)
      +        {
      +            if(leftAxesCollection && leftAxesCollection[0])
      +            {
      +                hAxis = leftAxesCollection[0];
      +            }
      +            else if(rightAxesCollection && rightAxesCollection[0])
      +            {
      +                hAxis = rightAxesCollection[0];
      +            }
      +            else 
      +            {
      +                hAxis = direction == "horizontal" ? catAxis : seriesAxesCollection[0];
      +            }
      +            if(!this._getBaseAttribute(hgl, "axis") && hAxis)
      +            {
      +                this._setBaseAttribute(hgl, "axis", hAxis);
      +            }
      +            if(this._getBaseAttribute(hgl, "axis"))
      +            {
      +                graph.set("horizontalGridlines", hgl);
      +            }
      +        }
      +        if(vgl)
      +        {
      +            if(bottomAxesCollection && bottomAxesCollection[0])
      +            {
      +                vAxis = bottomAxesCollection[0];
      +            }
      +            else if (topAxesCollection && topAxesCollection[0])
      +            {
      +                vAxis = topAxesCollection[0];
      +            }
      +            else 
      +            {
      +                vAxis = direction == "vertical" ? catAxis : seriesAxesCollection[0];
      +            }
      +            if(!this._getBaseAttribute(vgl, "axis") && vAxis)
      +            {
      +                this._setBaseAttribute(vgl, "axis", vAxis);
      +            }
      +            if(this._getBaseAttribute(vgl, "axis"))
      +            {
      +                graph.set("verticalGridlines", vgl);
      +            }
      +        }
      +    },
      +   
      +    /**
      +     * Returns all the keys contained in a  `dataProvider`.
      +     *
      +     * @method _getAllKeys
      +     * @param {Array} dp Collection of objects to be parsed.
      +     * @return Object
      +     */
      +    _getAllKeys: function(dp)
      +    {
      +        var i = 0,
      +            len = dp.length,
      +            item,
      +            key,
      +            keys = {};
      +        for(; i < len; ++i)
      +        {
      +            item = dp[i];
      +            for(key in item)
      +            {
      +                if(item.hasOwnProperty(key))
      +                {
      +                    keys[key] = true;
      +                }
      +            }
      +        }
      +        return keys;
      +    },
      +    
      +    /**
      +     * Default Function for the axes attribute.
      +     *
      +     * @method _getDefaultAxes
      +     * @return Object
      +     * @private
      +     */
      +    _getDefaultAxes: function()
      +    {
      +        return this._parseAxes();
      +    },
      +
      +    /**
      +     * Generates and returns a key-indexed object containing `Axis` instances or objects used to create `Axis` instances.
      +     *
      +     * @method _parseAxes
      +     * @param {Object} axes Object containing `Axis` instances or `Axis` attributes.
      +     * @return Object
      +     * @private
      +     */
      +    _parseAxes: function(axes)
      +    {
      +        var catKey = this.get("categoryKey"),
      +            axis,
      +            attr,
      +            keys,
      +            newAxes = {},
      +            claimedKeys = [],
      +            categoryAxisName = this.get("categoryAxisName") || this.get("categoryKey"),
      +            valueAxisName = this.get("valueAxisName"),
      +            seriesKeys = this.get("seriesKeys") || [], 
      +            i, 
      +            l,
      +            ii,
      +            ll,
      +            cIndex,
      +            dv,
      +            dp = this.get("dataProvider"),
      +            direction = this.get("direction"),
      +            seriesPosition,
      +            categoryPosition,
      +            valueAxes = [],
      +            seriesAxis = this.get("stacked") ? "stacked" : "numeric";
      +        if(direction == "vertical")
      +        {
      +            seriesPosition = "bottom";
      +            categoryPosition = "left";
      +        }
      +        else
      +        {
      +            seriesPosition = "left";
      +            categoryPosition = "bottom";
      +        }
      +        if(axes)
      +        {
      +            for(i in axes)
      +            {
      +                if(axes.hasOwnProperty(i))
      +                {
      +                    axis = axes[i];
      +                    keys = this._getBaseAttribute(axis, "keys");
      +                    attr = this._getBaseAttribute(axis, "type");
      +                    if(attr == "time" || attr == "category")
      +                    {
      +                        categoryAxisName = i;
      +                        this.set("categoryAxisName", i);
      +                        if(Y_Lang.isArray(keys) && keys.length > 0)
      +                        {
      +                            catKey = keys[0];
      +                            this.set("categoryKey", catKey);
      +                        }
      +                        newAxes[i] = axis;
      +                    }
      +                    else if(i == categoryAxisName)
      +                    {
      +                        newAxes[i] = axis;
      +                    }
      +                    else 
      +                    {
      +                        newAxes[i] = axis;
      +                        if(i != valueAxisName && keys && Y_Lang.isArray(keys))
      +                        {
      +                            ll = keys.length;
      +                            for(ii = 0; ii < ll; ++ii)
      +                            {
      +                                claimedKeys.push(keys[ii]);
      +                            }
      +                            valueAxes.push(newAxes[i]);
      +                        }
      +                        if(!(this._getBaseAttribute(newAxes[i], "type")))
      +                        {
      +                            this._setBaseAttribute(newAxes[i], "type", seriesAxis);
      +                        }
      +                        if(!(this._getBaseAttribute(newAxes[i], "position")))
      +                        {
      +                            this._setBaseAttribute(newAxes[i], "position", this._getDefaultAxisPosition(newAxes[i], valueAxes, seriesPosition));
      +                        }
      +                    }
      +                }
      +            }
      +        }
      +        if(seriesKeys.length < 1)
      +        {
      +            dv = this._getAllKeys(dp);
      +            for(i in dv)
      +            {
      +                if(dv.hasOwnProperty(i) && i != catKey && Y.Array.indexOf(claimedKeys, i) == -1)
      +                {
      +                    seriesKeys.push(i);
      +                }
      +            }
      +        }
      +        cIndex = Y.Array.indexOf(seriesKeys, catKey);
      +        if(cIndex > -1)
      +        {
      +            seriesKeys.splice(cIndex, 1);
      +        }
      +        l = claimedKeys.length;
      +        for(i = 0; i < l; ++i)
      +        {
      +            cIndex = Y.Array.indexOf(seriesKeys, claimedKeys[i]); 
      +            if(cIndex > -1)
      +            {
      +                seriesKeys.splice(cIndex, 1);
      +            }
      +        }
      +        if(!newAxes.hasOwnProperty(categoryAxisName))
      +        {
      +            newAxes[categoryAxisName] = {};
      +        }
      +        if(!(this._getBaseAttribute(newAxes[categoryAxisName], "keys")))
      +        {
      +            this._setBaseAttribute(newAxes[categoryAxisName], "keys", [catKey]);
      +        }
      +        
      +        if(!(this._getBaseAttribute(newAxes[categoryAxisName], "position")))
      +        {
      +            this._setBaseAttribute(newAxes[categoryAxisName], "position", categoryPosition);
      +        }
      +         
      +        if(!(this._getBaseAttribute(newAxes[categoryAxisName], "type")))
      +        {
      +            this._setBaseAttribute(newAxes[categoryAxisName], "type", this.get("categoryType"));
      +        }
      +        if(!newAxes.hasOwnProperty(valueAxisName) && seriesKeys && seriesKeys.length > 0)
      +        {
      +            newAxes[valueAxisName] = {keys:seriesKeys};
      +            valueAxes.push(newAxes[valueAxisName]);
      +        }
      +        if(claimedKeys.length > 0)
      +        {
      +            if(seriesKeys.length > 0)
      +            {
      +                seriesKeys = claimedKeys.concat(seriesKeys);
      +            }
      +            else
      +            {
      +                seriesKeys = claimedKeys;
      +            }
      +        }
      +        if(newAxes.hasOwnProperty(valueAxisName))
      +        {
      +            if(!(this._getBaseAttribute(newAxes[valueAxisName], "position")))
      +            {
      +                this._setBaseAttribute(newAxes[valueAxisName], "position", this._getDefaultAxisPosition(newAxes[valueAxisName], valueAxes, seriesPosition));
      +            }
      +            if(!(this._getBaseAttribute(newAxes[valueAxisName], "type")))
      +            {
      +                this._setBaseAttribute(newAxes[valueAxisName], "type", seriesAxis);
      +            }
      +            if(!(this._getBaseAttribute(newAxes[valueAxisName], "keys")))
      +            {
      +                this._setBaseAttribute(newAxes[valueAxisName], "keys", seriesKeys);
      +            }
      +        } 
      +        this.set("seriesKeys", seriesKeys);
      +        return newAxes;
      +    },
      +
      +    /**
      +     * Determines the position of an axis when one is not specified.
      +     *
      +     * @method _getDefaultAxisPosition
      +     * @param {Axis} axis `Axis` instance.
      +     * @param {Array} valueAxes Array of `Axis` instances.
      +     * @param {String} position Default position depending on the direction of the chart and type of axis.
      +     * @return String
      +     * @private
      +     */
      +    _getDefaultAxisPosition: function(axis, valueAxes, position)
      +    {
      +        var direction = this.get("direction"),
      +            i = Y.Array.indexOf(valueAxes, axis);
      +        
      +        if(valueAxes[i - 1] && valueAxes[i - 1].position)
      +        {
      +            if(direction == "horizontal")
      +            {
      +                if(valueAxes[i - 1].position == "left")
      +                {
      +                    position = "right";
      +                }
      +                else if(valueAxes[i - 1].position == "right")
      +                {
      +                    position = "left";
      +                }
      +            }
      +            else
      +            {
      +                if (valueAxes[i -1].position == "bottom")
      +                {
      +                    position = "top";
      +                }       
      +                else
      +                {
      +                    position = "bottom";
      +                }
      +            }
      +        }
      +        return position;
      +    },
      +
      +   
      +    /**
      +     * Returns an object literal containing a categoryItem and a valueItem for a given series index. Below is the structure of each:
      +     * 
      +     * @method getSeriesItems
      +     * @param {CartesianSeries} series Reference to a series.
      +     * @param {Number} index Index of the specified item within a series.
      +     * @return Object An object literal containing the following:
      +     *
      +     *  <dl>
      +     *      <dt>categoryItem</dt><dd>Object containing the following data related to the category axis of the series.
      +     *  <dl>
      +     *      <dt>axis</dt><dd>Reference to the category axis of the series.</dd>
      +     *      <dt>key</dt><dd>Category key for the series.</dd>
      +     *      <dt>value</dt><dd>Value on the axis corresponding to the series index.</dd>
      +     *  </dl>
      +     *      </dd>
      +     *      <dt>valueItem</dt><dd>Object containing the following data related to the category axis of the series.
      +     *  <dl>
      +     *      <dt>axis</dt><dd>Reference to the value axis of the series.</dd>
      +     *      <dt>key</dt><dd>Value key for the series.</dd>
      +     *      <dt>value</dt><dd>Value on the axis corresponding to the series index.</dd>
      +     *  </dl>
      +     *      </dd>
      +     *  </dl>
      +     */
      +    getSeriesItems: function(series, index)
      +    {
      +        var xAxis = series.get("xAxis"),
      +            yAxis = series.get("yAxis"),
      +            xKey = series.get("xKey"),
      +            yKey = series.get("yKey"),
      +            categoryItem,
      +            valueItem;
      +        if(this.get("direction") == "vertical")
      +        {
      +            categoryItem = {
      +                axis:yAxis,
      +                key:yKey,
      +                value:yAxis.getKeyValueAt(yKey, index)
      +            };
      +            valueItem = {
      +                axis:xAxis,
      +                key:xKey,
      +                value: xAxis.getKeyValueAt(xKey, index)
      +            };
      +        }
      +        else
      +        {
      +            valueItem = {
      +                axis:yAxis,
      +                key:yKey,
      +                value:yAxis.getKeyValueAt(yKey, index)
      +            };
      +            categoryItem = {
      +                axis:xAxis,
      +                key:xKey,
      +                value: xAxis.getKeyValueAt(xKey, index)
      +            };
      +        }
      +        categoryItem.displayName = series.get("categoryDisplayName");
      +        valueItem.displayName = series.get("valueDisplayName");
      +        categoryItem.value = categoryItem.axis.getKeyValueAt(categoryItem.key, index);
      +        valueItem.value = valueItem.axis.getKeyValueAt(valueItem.key, index);
      +        return {category:categoryItem, value:valueItem};
      +    },
      +
      +    /**
      +     * Handler for sizeChanged event.
      +     *
      +     * @method _sizeChanged
      +     * @param {Object} e Event object.
      +     * @private
      +     */
      +    _sizeChanged: function(e)
      +    {
      +        if(this._axesCollection)
      +        {
      +            var ac = this._axesCollection,
      +                i = 0,
      +                l = ac.length;
      +            for(; i < l; ++i)
      +            {
      +                this._addToAxesRenderQueue(ac[i]);
      +            }
      +            this._redraw();
      +        }
      +    },
      +    
      +    /**
      +     * Returns the maximum distance in pixels that the extends outside the top bounds of all vertical axes.
      +     *
      +     * @method _getTopOverflow
      +     * @param {Array} set1 Collection of axes to check.
      +     * @param {Array} set2 Seconf collection of axes to check.
      +     * @param {Number} width Width of the axes
      +     * @return Number
      +     * @private
      +     */
      +    _getTopOverflow: function(set1, set2, height)
      +    {
      +        var i = 0,
      +            len,
      +            overflow = 0,
      +            axis;
      +        if(set1)
      +        {
      +            len = set1.length;
      +            for(; i < len; ++i)
      +            {
      +                axis = set1[i];
      +                overflow = Math.max(overflow, Math.abs(axis.getMaxLabelBounds().top) - (axis.getEdgeOffset(axis.get("styles").majorTicks.count, height) * 0.5));
      +            }
      +        }
      +        if(set2)
      +        {
      +            i = 0;
      +            len = set2.length;
      +            for(; i < len; ++i)
      +            {
      +                axis = set2[i];
      +                overflow = Math.max(overflow, Math.abs(axis.getMaxLabelBounds().top) - (axis.getEdgeOffset(axis.get("styles").majorTicks.count, height) * 0.5));
      +            }
      +        }
      +        return overflow;
      +    },
      +    
      +    /**
      +     * Returns the maximum distance in pixels that the extends outside the right bounds of all horizontal axes.
      +     *
      +     * @method _getRightOverflow
      +     * @param {Array} set1 Collection of axes to check.
      +     * @param {Array} set2 Seconf collection of axes to check.
      +     * @param {Number} width Width of the axes
      +     * @return Number
      +     * @private
      +     */
      +    _getRightOverflow: function(set1, set2, width)
      +    {
      +        var i = 0,
      +            len,
      +            overflow = 0,
      +            axis;
      +        if(set1)
      +        {
      +            len = set1.length;
      +            for(; i < len; ++i)
      +            {
      +                axis = set1[i];
      +                overflow = Math.max(overflow, axis.getMaxLabelBounds().right - (axis.getEdgeOffset(axis.get("styles").majorTicks.count, width) * 0.5));
      +            }
      +        }
      +        if(set2)
      +        {
      +            i = 0;
      +            len = set2.length;
      +            for(; i < len; ++i)
      +            {
      +                axis = set2[i];
      +                overflow = Math.max(overflow, axis.getMaxLabelBounds().right - (axis.getEdgeOffset(axis.get("styles").majorTicks.count, width) * 0.5));
      +            }
      +        }
      +        return overflow;
      +    },
      +    
      +    /**
      +     * Returns the maximum distance in pixels that the extends outside the left bounds of all horizontal axes.
      +     *
      +     * @method _getLeftOverflow
      +     * @param {Array} set1 Collection of axes to check.
      +     * @param {Array} set2 Seconf collection of axes to check.
      +     * @param {Number} width Width of the axes
      +     * @return Number
      +     * @private
      +     */
      +    _getLeftOverflow: function(set1, set2, width)
      +    {
      +        var i = 0,
      +            len,
      +            overflow = 0,
      +            axis;
      +        if(set1)
      +        {
      +            len = set1.length;
      +            for(; i < len; ++i)
      +            {
      +                axis = set1[i];
      +                overflow = Math.max(overflow, Math.abs(axis.getMinLabelBounds().left) - (axis.getEdgeOffset(axis.get("styles").majorTicks.count, width) * 0.5));
      +            }
      +        }
      +        if(set2)
      +        {
      +            i = 0;
      +            len = set2.length;
      +            for(; i < len; ++i)
      +            {
      +                axis = set2[i];
      +                overflow = Math.max(overflow, Math.abs(axis.getMinLabelBounds().left) - (axis.getEdgeOffset(axis.get("styles").majorTicks.count, width) * 0.5));
      +            }
      +        }
      +        return overflow;
      +    },
      +    
      +    /**
      +     * Returns the maximum distance in pixels that the extends outside the bottom bounds of all vertical axes.
      +     *
      +     * @method _getBottomOverflow
      +     * @param {Array} set1 Collection of axes to check.
      +     * @param {Array} set2 Seconf collection of axes to check.
      +     * @param {Number} height Height of the axes
      +     * @return Number
      +     * @private
      +     */
      +    _getBottomOverflow: function(set1, set2, height)
      +    {
      +        var i = 0,
      +            len,
      +            overflow = 0,
      +            axis;
      +        if(set1)
      +        {
      +            len = set1.length;
      +            for(; i < len; ++i)
      +            {
      +                axis = set1[i];
      +                overflow = Math.max(overflow, axis.getMinLabelBounds().bottom - (axis.getEdgeOffset(axis.get("styles").majorTicks.count, height) * 0.5));
      +            }
      +        }
      +        if(set2)
      +        {
      +            i = 0;
      +            len = set2.length;
      +            for(; i < len; ++i)
      +            {
      +                axis = set2[i];
      +                overflow = Math.max(overflow, axis.getMinLabelBounds().bottom - (axis.getEdgeOffset(axis.get("styles").majorTicks.count, height) * 0.5));
      +            }
      +        }
      +        return overflow;
      +    },
      +
      +    /**
      +     * Redraws and position all the components of the chart instance.
      +     *
      +     * @method _redraw
      +     * @private
      +     */
      +    _redraw: function()
      +    {
      +        if(this._drawing)
      +        {
      +            this._callLater = true;
      +            return;
      +        }
      +        this._drawing = true;
      +        this._callLater = false;
      +        var w = this.get("width"),
      +            h = this.get("height"),
      +            leftPaneWidth = 0,
      +            rightPaneWidth = 0,
      +            topPaneHeight = 0,
      +            bottomPaneHeight = 0,
      +            leftAxesCollection = this.get("leftAxesCollection"),
      +            rightAxesCollection = this.get("rightAxesCollection"),
      +            topAxesCollection = this.get("topAxesCollection"),
      +            bottomAxesCollection = this.get("bottomAxesCollection"),
      +            i = 0,
      +            l,
      +            axis,
      +            graphOverflow = "visible",
      +            graph = this.get("graph"),
      +            topOverflow,
      +            bottomOverflow,
      +            leftOverflow,
      +            rightOverflow,
      +            graphWidth,
      +            graphHeight,
      +            graphX,
      +            graphY,
      +            allowContentOverflow = this.get("allowContentOverflow"),
      +            diff,
      +            rightAxesXCoords,
      +            leftAxesXCoords,
      +            topAxesYCoords,
      +            bottomAxesYCoords,
      +            graphRect = {};
      +        if(leftAxesCollection)
      +        {
      +            leftAxesXCoords = [];
      +            l = leftAxesCollection.length;
      +            for(i = l - 1; i > -1; --i)
      +            {
      +                leftAxesXCoords.unshift(leftPaneWidth);
      +                leftPaneWidth += leftAxesCollection[i].get("width");
      +            }
      +        }
      +        if(rightAxesCollection)
      +        {
      +            rightAxesXCoords = [];
      +            l = rightAxesCollection.length;
      +            i = 0;
      +            for(i = l - 1; i > -1; --i)
      +            {
      +                rightPaneWidth += rightAxesCollection[i].get("width");
      +                rightAxesXCoords.unshift(w - rightPaneWidth);
      +            }
      +        }
      +        if(topAxesCollection)
      +        {
      +            topAxesYCoords = [];
      +            l = topAxesCollection.length;
      +            for(i = l - 1; i > -1; --i)
      +            {
      +                topAxesYCoords.unshift(topPaneHeight);
      +                topPaneHeight += topAxesCollection[i].get("height");
      +            }
      +        }
      +        if(bottomAxesCollection)
      +        {
      +            bottomAxesYCoords = [];
      +            l = bottomAxesCollection.length;
      +            for(i = l - 1; i > -1; --i)
      +            {
      +                bottomPaneHeight += bottomAxesCollection[i].get("height");
      +                bottomAxesYCoords.unshift(h - bottomPaneHeight);
      +            }
      +        }
      +        
      +        graphWidth = w - (leftPaneWidth + rightPaneWidth);
      +        graphHeight = h - (bottomPaneHeight + topPaneHeight);
      +        graphRect.left = leftPaneWidth;
      +        graphRect.top = topPaneHeight;
      +        graphRect.bottom = h - bottomPaneHeight;
      +        graphRect.right = w - rightPaneWidth;
      +        if(!allowContentOverflow)
      +        {
      +            topOverflow = this._getTopOverflow(leftAxesCollection, rightAxesCollection);
      +            bottomOverflow = this._getBottomOverflow(leftAxesCollection, rightAxesCollection);
      +            leftOverflow = this._getLeftOverflow(bottomAxesCollection, topAxesCollection);
      +            rightOverflow = this._getRightOverflow(bottomAxesCollection, topAxesCollection);
      +            
      +            diff = topOverflow - topPaneHeight;
      +            if(diff > 0)
      +            {
      +                graphRect.top = topOverflow;
      +                if(topAxesYCoords)
      +                {
      +                    i = 0;
      +                    l = topAxesYCoords.length;
      +                    for(; i < l; ++i)
      +                    {
      +                        topAxesYCoords[i] += diff;
      +                    }
      +                }
      +            }
      +
      +            diff = bottomOverflow - bottomPaneHeight;
      +            if(diff > 0)
      +            {
      +                graphRect.bottom = h - bottomOverflow;
      +                if(bottomAxesYCoords)
      +                {
      +                    i = 0;
      +                    l = bottomAxesYCoords.length;
      +                    for(; i < l; ++i)
      +                    {
      +                        bottomAxesYCoords[i] -= diff;
      +                    }
      +                }
      +            }
      +
      +            diff = leftOverflow - leftPaneWidth;
      +            if(diff > 0)
      +            {
      +                graphRect.left = leftOverflow;
      +                if(leftAxesXCoords)
      +                {
      +                    i = 0;
      +                    l = leftAxesXCoords.length;
      +                    for(; i < l; ++i)
      +                    {
      +                        leftAxesXCoords[i] += diff;
      +                    }
      +                }
      +            }
      +
      +            diff = rightOverflow - rightPaneWidth;
      +            if(diff > 0)
      +            {
      +                graphRect.right = w - rightOverflow;
      +                if(rightAxesXCoords)
      +                {
      +                    i = 0;
      +                    l = rightAxesXCoords.length;
      +                    for(; i < l; ++i)
      +                    {
      +                        rightAxesXCoords[i] -= diff;
      +                    }
      +                }
      +            }
      +        }
      +        graphWidth = graphRect.right - graphRect.left;
      +        graphHeight = graphRect.bottom - graphRect.top;
      +        graphX = graphRect.left;
      +        graphY = graphRect.top;
      +        if(topAxesCollection)
      +        {
      +            l = topAxesCollection.length;
      +            i = 0;
      +            for(; i < l; i++)
      +            {
      +                axis = topAxesCollection[i];
      +                if(axis.get("width") !== graphWidth)
      +                {
      +                    axis.set("width", graphWidth);
      +                }
      +                axis.get("boundingBox").setStyle("left", graphX + "px");
      +                axis.get("boundingBox").setStyle("top", topAxesYCoords[i] + "px");
      +            }
      +            if(axis._hasDataOverflow())
      +            {
      +                graphOverflow = "hidden";
      +            }
      +        }
      +        if(bottomAxesCollection)
      +        {
      +            l = bottomAxesCollection.length;
      +            i = 0;
      +            for(; i < l; i++)
      +            {
      +                axis = bottomAxesCollection[i];
      +                if(axis.get("width") !== graphWidth)
      +                {
      +                    axis.set("width", graphWidth);
      +                }
      +                axis.get("boundingBox").setStyle("left", graphX + "px");
      +                axis.get("boundingBox").setStyle("top", bottomAxesYCoords[i] + "px");
      +            }
      +            if(axis._hasDataOverflow())
      +            {
      +                graphOverflow = "hidden";
      +            }
      +        }
      +        if(leftAxesCollection)
      +        {
      +            l = leftAxesCollection.length;
      +            i = 0;
      +            for(; i < l; ++i)
      +            {
      +                axis = leftAxesCollection[i];
      +                axis.get("boundingBox").setStyle("top", graphY + "px");
      +                axis.get("boundingBox").setStyle("left", leftAxesXCoords[i] + "px");
      +                if(axis.get("height") !== graphHeight)
      +                {
      +                    axis.set("height", graphHeight);
      +                }
      +            }
      +            if(axis._hasDataOverflow())
      +            {
      +                graphOverflow = "hidden";
      +            }
      +        }
      +        if(rightAxesCollection)
      +        {
      +            l = rightAxesCollection.length;
      +            i = 0;
      +            for(; i < l; ++i)
      +            {
      +                axis = rightAxesCollection[i];
      +                axis.get("boundingBox").setStyle("top", graphY + "px");
      +                axis.get("boundingBox").setStyle("left", rightAxesXCoords[i] + "px");
      +                if(axis.get("height") !== graphHeight)
      +                {
      +                    axis.set("height", graphHeight);
      +                }
      +            }
      +            if(axis._hasDataOverflow())
      +            {
      +                graphOverflow = "hidden";
      +            }
      +        }
      +        this._drawing = false;
      +        if(this._callLater)
      +        {
      +            this._redraw();
      +            return;
      +        }
      +        if(graph)
      +        {
      +            graph.get("boundingBox").setStyle("left", graphX + "px");
      +            graph.get("boundingBox").setStyle("top", graphY + "px");
      +            graph.set("width", graphWidth);
      +            graph.set("height", graphHeight);
      +            graph.get("boundingBox").setStyle("overflow", graphOverflow);
      +        }
      +
      +        if(this._overlay)
      +        {
      +            this._overlay.setStyle("left", graphX + "px");
      +            this._overlay.setStyle("top", graphY + "px");
      +            this._overlay.setStyle("width", graphWidth + "px");
      +            this._overlay.setStyle("height", graphHeight + "px");
      +        }
      +    },
      +
      +    /**
      +     * Destructor implementation for the CartesianChart class. Calls destroy on all axes, series and the Graph instance.
      +     * Removes the tooltip and overlay HTML elements.
      +     *
      +     * @method destructor
      +     * @protected
      +     */
      +    destructor: function()
      +    {
      +        var graph = this.get("graph"),
      +            i = 0,
      +            len,
      +            seriesCollection = this.get("seriesCollection"),
      +            axesCollection = this._axesCollection,
      +            tooltip = this.get("tooltip").node;
      +        if(this._description)
      +        {
      +            this._description.empty();
      +            this._description.remove(true);
      +        }
      +        if(this._liveRegion)
      +        {
      +            this._liveRegion.empty();
      +            this._liveRegion.remove(true);
      +        }
      +        len = seriesCollection ? seriesCollection.length : 0;
      +        for(; i < len; ++i)
      +        {
      +            if(seriesCollection[i] instanceof Y.CartesianSeries)
      +            {
      +                seriesCollection[i].destroy(true);
      +            }
      +        }
      +        len = axesCollection ? axesCollection.length : 0;
      +        for(i = 0; i < len; ++i)
      +        {
      +            if(axesCollection[i] instanceof Y.Axis)
      +            {
      +                axesCollection[i].destroy(true);
      +            }
      +        }
      +        if(graph)
      +        {
      +            graph.destroy(true);
      +        }
      +        if(tooltip)
      +        {
      +            tooltip.empty();
      +            tooltip.remove(true);
      +        }
      +        if(this._overlay)
      +        {
      +            this._overlay.empty();
      +            this._overlay.remove(true);
      +        }
      +    },
      +
      +    /**
      +     * Returns the appropriate message based on the key press.
      +     *
      +     * @method _getAriaMessage
      +     * @param {Number} key The keycode that was pressed.
      +     * @return String
      +     */
      +    _getAriaMessage: function(key)
      +    {
      +        var msg = "",
      +            series,
      +            items,
      +            categoryItem,
      +            valueItem,
      +            seriesIndex = this._seriesIndex,
      +            itemIndex = this._itemIndex,
      +            seriesCollection = this.get("seriesCollection"),
      +            len = seriesCollection.length,
      +            dataLength;
      +        if(key % 2 === 0)
      +        {
      +            if(len > 1)
      +            {
      +                if(key === 38)
      +                {
      +                    seriesIndex = seriesIndex < 1 ? len - 1 : seriesIndex - 1;
      +                }
      +                else if(key === 40)
      +                {
      +                    seriesIndex = seriesIndex >= len - 1 ? 0 : seriesIndex + 1;
      +                }
      +                this._itemIndex = -1;
      +            }
      +            else
      +            {
      +                seriesIndex = 0;
      +            }
      +            this._seriesIndex = seriesIndex;
      +            series = this.getSeries(parseInt(seriesIndex, 10));
      +            msg = series.get("valueDisplayName") + " series.";
      +        }
      +        else
      +        {
      +            if(seriesIndex > -1)
      +            {
      +                msg = "";
      +                series = this.getSeries(parseInt(seriesIndex, 10));
      +            }
      +            else
      +            {
      +                seriesIndex = 0;
      +                this._seriesIndex = seriesIndex;
      +                series = this.getSeries(parseInt(seriesIndex, 10));
      +                msg = series.get("valueDisplayName") + " series.";
      +            }
      +            dataLength = series._dataLength ? series._dataLength : 0;
      +            if(key === 37)
      +            {
      +                itemIndex = itemIndex > 0 ? itemIndex - 1 : dataLength - 1;
      +            }
      +            else if(key === 39)
      +            {
      +                itemIndex = itemIndex >= dataLength - 1 ? 0 : itemIndex + 1;
      +            }
      +            this._itemIndex = itemIndex;
      +            items = this.getSeriesItems(series, itemIndex);
      +            categoryItem = items.category;
      +            valueItem = items.value;
      +            if(categoryItem && valueItem && categoryItem.value && valueItem.value)
      +            {
      +                msg += categoryItem.displayName + ": " + categoryItem.axis.formatLabel.apply(this, [categoryItem.value, categoryItem.axis.get("labelFormat")]) + ", ";
      +                msg += valueItem.displayName + ": " + valueItem.axis.formatLabel.apply(this, [valueItem.value, valueItem.axis.get("labelFormat")]) + ", "; 
      +            }
      +            else
      +            {
      +                msg += "No data available.";
      +            }
      +            msg += (itemIndex + 1) + " of " + dataLength + ". ";
      +        }
      +        return msg;
      +    }
      +}, {
      +    ATTRS: {
      +        /**
      +         * Indicates whether axis labels are allowed to overflow beyond the bounds of the chart's content box.
      +         *
      +         * @attribute allowContentOverflow
      +         * @type Boolean
      +         */
      +        allowContentOverflow: {
      +            value: false
      +        },
      +
      +        /**
      +         * Style object for the axes.
      +         *
      +         * @attribute axesStyles
      +         * @type Object
      +         * @private
      +         */
      +        axesStyles: {
      +            getter: function()
      +            {
      +                var axes = this.get("axes"),
      +                    i,
      +                    styles = this._axesStyles;
      +                if(axes)
      +                {
      +                    for(i in axes)
      +                    {
      +                        if(axes.hasOwnProperty(i) && axes[i] instanceof Y.Axis)
      +                        {
      +                            if(!styles)
      +                            {
      +                                styles = {};
      +                            }
      +                            styles[i] = axes[i].get("styles");
      +                        }
      +                    }
      +                }
      +                return styles;
      +            },
      +            
      +            setter: function(val)
      +            {
      +                var axes = this.get("axes"),
      +                    i;
      +                for(i in val)
      +                {
      +                    if(val.hasOwnProperty(i) && axes.hasOwnProperty(i))
      +                    {
      +                        this._setBaseAttribute(axes[i], "styles", val[i]);
      +                    }
      +                }
      +            }
      +        },
      +
      +        /**
      +         * Style object for the series
      +         *
      +         * @attribute seriesStyles
      +         * @type Object
      +         * @private
      +         */
      +        seriesStyles: {
      +            getter: function()
      +            {
      +                var styles = this._seriesStyles,
      +                    graph = this.get("graph"),
      +                    dict,
      +                    i;
      +                if(graph)
      +                {
      +                    dict = graph.get("seriesDictionary");
      +                    if(dict)
      +                    {
      +                        styles = {};
      +                        for(i in dict)
      +                        {
      +                            if(dict.hasOwnProperty(i))
      +                            {
      +                                styles[i] = dict[i].get("styles");
      +                            }
      +                        }
      +                    }
      +                }
      +                return styles;
      +            },
      +            
      +            setter: function(val)
      +            {
      +                var i,
      +                    l,
      +                    s;
      +    
      +                if(Y_Lang.isArray(val))
      +                {
      +                    s = this.get("seriesCollection");
      +                    i = 0;
      +                    l = val.length;
      +
      +                    for(; i < l; ++i)
      +                    {
      +                        this._setBaseAttribute(s[i], "styles", val[i]);
      +                    }
      +                }
      +                else
      +                {
      +                    for(i in val)
      +                    {
      +                        if(val.hasOwnProperty(i))
      +                        {
      +                            s = this.getSeries(i);
      +                            this._setBaseAttribute(s, "styles", val[i]);
      +                        }
      +                    }
      +                }
      +            }
      +        },
      +
      +        /**
      +         * Styles for the graph.
      +         *
      +         * @attribute graphStyles
      +         * @type Object
      +         * @private
      +         */
      +        graphStyles: {
      +            getter: function()
      +            {
      +                var graph = this.get("graph");
      +                if(graph)
      +                {
      +                    return(graph.get("styles"));
      +                }
      +                return this._graphStyles;
      +            },
      +
      +            setter: function(val)
      +            {
      +                var graph = this.get("graph");
      +                this._setBaseAttribute(graph, "styles", val);
      +            }
      +
      +        },
      +
      +        /**
      +         * Style properties for the chart. Contains a key indexed hash of the following:
      +         *  <dl>
      +         *      <dt>series</dt><dd>A key indexed hash containing references to the `styles` attribute for each series in the chart.
      +         *      Specific style attributes vary depending on the series:
      +         *      <ul>
      +         *          <li><a href="AreaSeries.html#attr_styles">AreaSeries</a></li>
      +         *          <li><a href="BarSeries.html#attr_styles">BarSeries</a></li>
      +         *          <li><a href="ColumnSeries.html#attr_styles">ColumnSeries</a></li>
      +         *          <li><a href="ComboSeries.html#attr_styles">ComboSeries</a></li>
      +         *          <li><a href="LineSeries.html#attr_styles">LineSeries</a></li>
      +         *          <li><a href="MarkerSeries.html#attr_styles">MarkerSeries</a></li>
      +         *          <li><a href="SplineSeries.html#attr_styles">SplineSeries</a></li>
      +         *      </ul>
      +         *      </dd>
      +         *      <dt>axes</dt><dd>A key indexed hash containing references to the `styles` attribute for each axes in the chart. Specific
      +         *      style attributes can be found in the <a href="Axis.html#attr_styles">Axis</a> class.</dd>
      +         *      <dt>graph</dt><dd>A reference to the `styles` attribute in the chart. Specific style attributes can be found in the
      +         *      <a href="Graph.html#attr_styles">Graph</a> class.</dd>
      +         *  </dl>
      +         *
      +         * @attribute styles
      +         * @type Object
      +         */
      +        styles: {
      +            getter: function()
      +            {
      +                var styles = { 
      +                    axes: this.get("axesStyles"),
      +                    series: this.get("seriesStyles"),
      +                    graph: this.get("graphStyles")
      +                };
      +                return styles;
      +            },
      +            setter: function(val)
      +            {
      +                if(val.hasOwnProperty("axes"))
      +                {
      +                    if(this.get("axesStyles"))
      +                    {
      +                        this.set("axesStyles", val.axes);
      +                    }
      +                    else
      +                    {
      +                        this._axesStyles = val.axes;
      +                    }
      +                }
      +                if(val.hasOwnProperty("series"))
      +                {
      +                    if(this.get("seriesStyles"))
      +                    {
      +                        this.set("seriesStyles", val.series);
      +                    }
      +                    else
      +                    {
      +                        this._seriesStyles = val.series;
      +                    }
      +                }
      +                if(val.hasOwnProperty("graph"))
      +                {
      +                    this.set("graphStyles", val.graph);
      +                }
      +            }
      +        },
      +
      +        /**
      +         * Axes to appear in the chart. This can be a key indexed hash of axis instances or object literals
      +         * used to construct the appropriate axes.
      +         *
      +         * @attribute axes
      +         * @type Object
      +         */
      +        axes: {
      +            valueFn: "_getDefaultAxes",
      +
      +            setter: function(val)
      +            {
      +                return this._setAxes(val);
      +            }
      +        },
      +
      +        /**
      +         * Collection of series to appear on the chart. This can be an array of Series instances or object literals
      +         * used to construct the appropriate series.
      +         *
      +         * @attribute seriesCollection
      +         * @type Array
      +         */
      +        seriesCollection: {
      +            valueFn: "_getDefaultSeriesCollection",
      +            
      +            setter: function(val)
      +            {
      +                return this._parseSeriesCollection(val);
      +            }
      +        },
      +
      +        /**
      +         * Reference to the left-aligned axes for the chart.
      +         *
      +         * @attribute leftAxesCollection
      +         * @type Array
      +         * @private
      +         */
      +        leftAxesCollection: {},
      +
      +        /**
      +         * Reference to the bottom-aligned axes for the chart.
      +         *
      +         * @attribute bottomAxesCollection
      +         * @type Array
      +         * @private
      +         */
      +        bottomAxesCollection: {},
      +
      +        /**
      +         * Reference to the right-aligned axes for the chart.
      +         *
      +         * @attribute rightAxesCollection
      +         * @type Array
      +         * @private
      +         */
      +        rightAxesCollection: {},
      +
      +        /**
      +         * Reference to the top-aligned axes for the chart.
      +         *
      +         * @attribute topAxesCollection
      +         * @type Array
      +         * @private
      +         */
      +        topAxesCollection: {},
      +        
      +        /**
      +         * Indicates whether or not the chart is stacked.
      +         *
      +         * @attribute stacked
      +         * @type Boolean
      +         */
      +        stacked: {
      +            value: false
      +        },
      +
      +        /**
      +         * Direction of chart's category axis when there is no series collection specified. Charts can
      +         * be horizontal or vertical. When the chart type is column, the chart is horizontal.
      +         * When the chart type is bar, the chart is vertical. 
      +         *
      +         * @attribute direction
      +         * @type String
      +         */
      +        direction: {
      +            getter: function()
      +            {
      +                var type = this.get("type");
      +                if(type == "bar")
      +                {   
      +                    return "vertical";
      +                }
      +                else if(type == "column")
      +                {
      +                    return "horizontal";
      +                }
      +                return this._direction;
      +            },
      +
      +            setter: function(val)
      +            {
      +                this._direction = val;
      +                return this._direction;
      +            }
      +        },
      +
      +        /**
      +         * Indicates whether or not an area is filled in a combo chart.
      +         * 
      +         * @attribute showAreaFill
      +         * @type Boolean
      +         */
      +        showAreaFill: {},
      +
      +        /**
      +         * Indicates whether to display markers in a combo chart.
      +         *
      +         * @attribute showMarkers
      +         * @type Boolean
      +         */
      +        showMarkers:{},
      +
      +        /**
      +         * Indicates whether to display lines in a combo chart.
      +         *
      +         * @attribute showLines
      +         * @type Boolean
      +         */
      +        showLines:{},
      +
      +        /**
      +         * Indicates the key value used to identify a category axis in the `axes` hash. If
      +         * not specified, the categoryKey attribute value will be used.
      +         * 
      +         * @attribute categoryAxisName
      +         * @type String
      +         */
      +        categoryAxisName: {
      +        },
      +
      +        /**
      +         * Indicates the key value used to identify a the series axis when an axis not generated.
      +         *
      +         * @attribute valueAxisName
      +         * @type String
      +         */
      +        valueAxisName: {
      +            value: "values"
      +        },
      +
      +        /**
      +         * Reference to the horizontalGridlines for the chart.
      +         *
      +         * @attribute horizontalGridlines
      +         * @type Gridlines
      +         */
      +        horizontalGridlines: {
      +            getter: function()
      +            {
      +                var graph = this.get("graph");
      +                if(graph)
      +                {
      +                    return graph.get("horizontalGridlines");
      +                }
      +                return this._horizontalGridlines;
      +            },
      +            setter: function(val)
      +            {
      +                var graph = this.get("graph");
      +                if(val && !Y_Lang.isObject(val))
      +                {
      +                    val = {};
      +                }
      +                if(graph)
      +                {
      +                    graph.set("horizontalGridlines", val);
      +                }
      +                else
      +                {
      +                    this._horizontalGridlines = val;
      +                }
      +            }
      +        },
      +
      +        /**
      +         * Reference to the verticalGridlines for the chart.
      +         *
      +         * @attribute verticalGridlines
      +         * @type Gridlines
      +         */
      +        verticalGridlines: {
      +            getter: function()
      +            {
      +                var graph = this.get("graph");
      +                if(graph)
      +                {
      +                    return graph.get("verticalGridlines");
      +                }
      +                return this._verticalGridlines;
      +            },
      +            setter: function(val)
      +            {
      +                var graph = this.get("graph");
      +                if(val && !Y_Lang.isObject(val))
      +                {
      +                    val = {};
      +                }
      +                if(graph)
      +                {
      +                    graph.set("verticalGridlines", val);
      +                }
      +                else
      +                {
      +                    this._verticalGridlines = val;
      +                }
      +            }
      +        },
      +        
      +        /**
      +         * Type of chart when there is no series collection specified.
      +         *
      +         * @attribute type
      +         * @type String 
      +         */
      +        type: {
      +            getter: function()
      +            {
      +                if(this.get("stacked"))
      +                {
      +                    return "stacked" + this._type;
      +                }
      +                return this._type;
      +            },
      +
      +            setter: function(val)
      +            {
      +                if(this._type == "bar")
      +                {
      +                    if(val != "bar")
      +                    {
      +                        this.set("direction", "horizontal");
      +                    }
      +                }
      +                else
      +                {
      +                    if(val == "bar")
      +                    {
      +                        this.set("direction", "vertical");
      +                    }
      +                }
      +                this._type = val;
      +                return this._type;
      +            }
      +        },
      +        
      +        /**
      +         * Reference to the category axis used by the chart.
      +         *
      +         * @attribute categoryAxis
      +         * @type Axis
      +         */
      +        categoryAxis:{}
      +    }
      +});
      diff --git a/tests/input/charts/CartesianChartLegend.js b/tests/input/charts/CartesianChartLegend.js
      new file mode 100644
      index 00000000..4cfa2cf4
      --- /dev/null
      +++ b/tests/input/charts/CartesianChartLegend.js
      @@ -0,0 +1,738 @@
      +/**
      + * Adds legend functionality to charts.
      + *
      + * @module charts
      + * @submodule charts-legend
      + */
      +var DOCUMENT = Y.config.doc, 
      +TOP = "top",
      +RIGHT = "right",
      +BOTTOM = "bottom",
      +LEFT = "left",
      +EXTERNAL = "external",
      +HORIZONTAL = "horizontal",
      +VERTICAL = "vertical",
      +WIDTH = "width",
      +HEIGHT = "height",
      +POSITION = "position",
      +_X = "x",
      +_Y = "y",
      +PX = "px",
      +LEGEND = {
      +    setter: function(val)
      +    {   
      +        var legend = this.get("legend");
      +        if(legend)
      +        {
      +            legend.destroy(true);
      +        }
      +        if(val instanceof Y.ChartLegend)
      +        {
      +            legend = val;
      +            legend.set("chart", this);
      +        }
      +        else
      +        {
      +            val.chart = this;
      +            if(!val.hasOwnProperty("render"))
      +            {
      +                val.render = this.get("contentBox");
      +                val.includeInChartLayout = true;
      +            }
      +            legend = new Y.ChartLegend(val);
      +        }
      +        return legend;
      +    }
      +},
      +
      +/**
      + * Contains methods for displaying items horizontally in a legend.
      + *
      + * @module charts
      + * @submodule charts-legend
      + * @class HorizontalLegendLayout
      + */
      +HorizontalLegendLayout = {
      +    /**
      +     * Displays items horizontally in a legend.
      +     *
      +     * @method _positionLegendItems
      +     * @param {Array} items Array of items to display in the legend.
      +     * @param {Number} maxWidth The width of the largest item in the legend.
      +     * @param {Number} maxHeight The height of the largest item in the legend.
      +     * @param {Number} totalWidth The total width of all items in a legend.
      +     * @param {Number} totalHeight The total height of all items in a legend.
      +     * @param {Number} padding The left, top, right and bottom padding properties for the legend.
      +     * @param {Number} horizontalGap The horizontal distance between items in a legend.
      +     * @param {Number} verticalGap The vertical distance between items in a legend.
      +     * @param {String} hAlign The horizontal alignment of the legend.
      +     * @param {String} vAlign The vertical alignment of the legend.
      +     * @protected
      +     */
      +    _positionLegendItems: function(items, maxWidth, maxHeight, totalWidth, totalHeight, padding, horizontalGap, verticalGap, hAlign, vAlign)
      +    {
      +        var i = 0,
      +            rowIterator = 0,
      +            item,
      +            node,
      +            itemWidth,
      +            itemHeight,
      +            len,
      +            width = this.get("width"),
      +            rows,
      +            rowsLen,
      +            row,
      +            totalWidthArray,
      +            legendWidth,
      +            topHeight = padding.top - verticalGap,
      +            limit = width - (padding.left + padding.right),
      +            left, 
      +            top,
      +            right,
      +            bottom;
      +        HorizontalLegendLayout._setRowArrays(items, limit, horizontalGap);
      +        rows = HorizontalLegendLayout.rowArray;
      +        totalWidthArray = HorizontalLegendLayout.totalWidthArray;
      +        rowsLen = rows.length;
      +        for(; rowIterator < rowsLen; ++ rowIterator)
      +        {
      +            topHeight += verticalGap;
      +            row = rows[rowIterator];
      +            len = row.length;
      +            legendWidth =  HorizontalLegendLayout.getStartPoint(width, totalWidthArray[rowIterator], hAlign, padding);
      +            for(i = 0; i < len; ++i)
      +            {
      +                item = row[i];
      +                node = item.node;
      +                itemWidth = item.width;
      +                itemHeight = item.height;
      +                item.x = legendWidth;
      +                item.y = 0;
      +                left = !isNaN(left) ? Math.min(left, legendWidth) : legendWidth;
      +                top = !isNaN(top) ? Math.min(top, topHeight) : topHeight;
      +                right = !isNaN(right) ? Math.max(legendWidth + itemWidth, right) : legendWidth + itemWidth;
      +                bottom = !isNaN(bottom) ? Math.max(topHeight + itemHeight, bottom) : topHeight + itemHeight;
      +                node.setStyle("left", legendWidth + PX);
      +                node.setStyle("top", topHeight + PX);
      +                legendWidth += itemWidth + horizontalGap;
      +            }
      +            topHeight += item.height;
      +        }
      +        this._contentRect = {
      +            left: left,
      +            top: top,
      +            right: right,
      +            bottom: bottom
      +        };
      +        if(this.get("includeInChartLayout"))
      +        {
      +            this.set("height", topHeight + padding.bottom);
      +        }
      +    },
      +
      +    /**
      +     * Creates row and total width arrays used for displaying multiple rows of
      +     * legend items based on the items, available width and horizontalGap for the legend.
      +     *
      +     * @method _setRowArrays
      +     * @param {Array} items Array of legend items to display in a legend.
      +     * @param {Number} limit Total available width for displaying items in a legend.
      +     * @param {Number} horizontalGap Horizontal distance between items in a legend.
      +     * @protected
      +     */
      +    _setRowArrays: function(items, limit, horizontalGap)
      +    {
      +        var item = items[0],
      +            rowArray = [[item]],
      +            i = 1,
      +            rowIterator = 0,
      +            len = items.length,
      +            totalWidth = item.width,
      +            itemWidth,
      +            totalWidthArray = [[totalWidth]];
      +        for(; i < len; ++i)
      +        {
      +            item = items[i];
      +            itemWidth = item.width;
      +            if((totalWidth + horizontalGap + itemWidth) <= limit)
      +            {
      +                totalWidth += horizontalGap + itemWidth;
      +                rowArray[rowIterator].push(item);
      +            }
      +            else
      +            {
      +                totalWidth = horizontalGap + itemWidth;
      +                if(rowArray[rowIterator])
      +                {
      +                    rowIterator += 1;
      +                }
      +                rowArray[rowIterator] = [item];
      +            }
      +            totalWidthArray[rowIterator] = totalWidth;
      +        }
      +        HorizontalLegendLayout.rowArray = rowArray;
      +        HorizontalLegendLayout.totalWidthArray = totalWidthArray;
      +    },
      +
      +    /**
      +     * Returns the starting x-coordinate for a row of legend items.
      +     *
      +     * @method getStartPoint
      +     * @param {Number} w Width of the legend.
      +     * @param {Number} totalWidth Total width of all labels in the row.
      +     * @param {String} align Horizontal alignment of items for the legend.
      +     * @param {Object} padding Object contain left, top, right and bottom padding properties.
      +     * @return Number
      +     * @protected
      +     */
      +    getStartPoint: function(w, totalWidth, align, padding)
      +    {
      +        var startPoint;
      +        switch(align)
      +        {
      +            case LEFT :
      +                startPoint = padding.left;
      +            break;
      +            case "center" :
      +                startPoint = (w - totalWidth) * 0.5;
      +            break;
      +            case RIGHT :
      +                startPoint = w - totalWidth - padding.right;
      +            break;
      +        }
      +        return startPoint;
      +    }
      +},
      +
      +/**
      + * Contains methods for displaying items vertically in a legend.
      + *
      + * @module charts
      + * @submodule charts-legend
      + * @class VerticalLegendLayout
      + */
      +VerticalLegendLayout = {
      +    /**
      +     * Displays items vertically in a legend.
      +     *
      +     * @method _positionLegendItems
      +     * @param {Array} items Array of items to display in the legend.
      +     * @param {Number} maxWidth The width of the largest item in the legend.
      +     * @param {Number} maxHeight The height of the largest item in the legend.
      +     * @param {Number} totalWidth The total width of all items in a legend.
      +     * @param {Number} totalHeight The total height of all items in a legend.
      +     * @param {Number} padding The left, top, right and bottom padding properties for the legend.
      +     * @param {Number} horizontalGap The horizontal distance between items in a legend.
      +     * @param {Number} verticalGap The vertical distance between items in a legend.
      +     * @param {String} hAlign The horizontal alignment of the legend.
      +     * @param {String} vAlign The vertical alignment of the legend.
      +     * @protected
      +     */
      +    _positionLegendItems: function(items, maxWidth, maxHeight, totalWidth, totalHeight, padding, horizontalGap, verticalGap, hAlign, vAlign)
      +    {
      +        var i = 0,
      +            columnIterator = 0,
      +            item,
      +            node,
      +            itemHeight,
      +            itemWidth,
      +            len,
      +            height = this.get("height"),
      +            columns,
      +            columnsLen,
      +            column,
      +            totalHeightArray,
      +            legendHeight,
      +            leftWidth = padding.left - horizontalGap,
      +            legendWidth,
      +            limit = height - (padding.top + padding.bottom),
      +            left, 
      +            top,
      +            right,
      +            bottom;
      +        VerticalLegendLayout._setColumnArrays(items, limit, verticalGap);
      +        columns = VerticalLegendLayout.columnArray;
      +        totalHeightArray = VerticalLegendLayout.totalHeightArray;
      +        columnsLen = columns.length;
      +        for(; columnIterator < columnsLen; ++ columnIterator)
      +        {
      +            leftWidth += horizontalGap;
      +            column = columns[columnIterator];
      +            len = column.length;
      +            legendHeight =  VerticalLegendLayout.getStartPoint(height, totalHeightArray[columnIterator], vAlign, padding);
      +            legendWidth = 0;
      +            for(i = 0; i < len; ++i)
      +            {
      +                item = column[i];
      +                node = item.node;
      +                itemHeight = item.height;
      +                itemWidth = item.width;
      +                item.y = legendHeight;
      +                item.x = leftWidth;
      +                left = !isNaN(left) ? Math.min(left, leftWidth) : leftWidth;
      +                top = !isNaN(top) ? Math.min(top, legendHeight) : legendHeight;
      +                right = !isNaN(right) ? Math.max(leftWidth + itemWidth, right) : leftWidth + itemWidth;
      +                bottom = !isNaN(bottom) ? Math.max(legendHeight + itemHeight, bottom) : legendHeight + itemHeight;
      +                node.setStyle("left", leftWidth + PX);
      +                node.setStyle("top", legendHeight + PX);
      +                legendHeight += itemHeight + verticalGap;
      +                legendWidth = Math.max(legendWidth, item.width);
      +            }
      +            leftWidth += legendWidth;
      +        }
      +        this._contentRect = {
      +            left: left,
      +            top: top,
      +            right: right,
      +            bottom: bottom
      +        };
      +        if(this.get("includeInChartLayout"))
      +        {
      +            this.set("width", leftWidth + padding.right);
      +        }
      +    },
      +
      +    /**
      +     * Creates column and total height arrays used for displaying multiple columns of
      +     * legend items based on the items, available height and verticalGap for the legend.
      +     *
      +     * @method _setColumnArrays
      +     * @param {Array} items Array of legend items to display in a legend.
      +     * @param {Number} limit Total available height for displaying items in a legend.
      +     * @param {Number} verticalGap Vertical distance between items in a legend.
      +     * @protected
      +     */
      +    _setColumnArrays: function(items, limit, verticalGap)
      +    {
      +        var item = items[0],
      +            columnArray = [[item]],
      +            i = 1,
      +            columnIterator = 0,
      +            len = items.length,
      +            totalHeight = item.height,
      +            itemHeight,
      +            totalHeightArray = [[totalHeight]];
      +        for(; i < len; ++i)
      +        {
      +            item = items[i];
      +            itemHeight = item.height;
      +            if((totalHeight + verticalGap + itemHeight) <= limit)
      +            {
      +                totalHeight += verticalGap + itemHeight;
      +                columnArray[columnIterator].push(item);
      +            }
      +            else
      +            {
      +                totalHeight = verticalGap + itemHeight;
      +                if(columnArray[columnIterator])
      +                {
      +                    columnIterator += 1;
      +                }
      +                columnArray[columnIterator] = [item];
      +            }
      +            totalHeightArray[columnIterator] = totalHeight;
      +        }
      +        VerticalLegendLayout.columnArray = columnArray;
      +        VerticalLegendLayout.totalHeightArray = totalHeightArray;
      +    },
      +
      +    /**
      +     * Returns the starting y-coordinate for a column of legend items.
      +     *
      +     * @method getStartPoint
      +     * @param {Number} h Height of the legend.
      +     * @param {Number} totalHeight Total height of all labels in the column.
      +     * @param {String} align Vertical alignment of items for the legend.
      +     * @param {Object} padding Object contain left, top, right and bottom padding properties.
      +     * @return Number
      +     * @protected
      +     */
      +    getStartPoint: function(h, totalHeight, align, padding)
      +    {
      +        var startPoint;
      +        switch(align)
      +        {
      +            case TOP :
      +                startPoint = padding.top;
      +            break;
      +            case "middle" :
      +                startPoint = (h - totalHeight) * 0.5;
      +            break;
      +            case BOTTOM :
      +                startPoint = h - totalHeight - padding.bottom;
      +            break;
      +        }
      +        return startPoint;
      +    }
      +},
      +
      +CartesianChartLegend = Y.Base.create("cartesianChartLegend", Y.CartesianChart, [], {
      +    /**
      +     * Redraws and position all the components of the chart instance.
      +     *
      +     * @method _redraw
      +     * @private
      +     */
      +    _redraw: function()
      +    {
      +        if(this._drawing)
      +        {
      +            this._callLater = true;
      +            return;
      +        }
      +        this._drawing = true;
      +        this._callLater = false;
      +        var w = this.get("width"),
      +            h = this.get("height"),
      +            layoutBoxDimensions = this._getLayoutBoxDimensions(),
      +            leftPaneWidth = layoutBoxDimensions.left,
      +            rightPaneWidth = layoutBoxDimensions.right,
      +            topPaneHeight = layoutBoxDimensions.top,
      +            bottomPaneHeight = layoutBoxDimensions.bottom,
      +            leftAxesCollection = this.get("leftAxesCollection"),
      +            rightAxesCollection = this.get("rightAxesCollection"),
      +            topAxesCollection = this.get("topAxesCollection"),
      +            bottomAxesCollection = this.get("bottomAxesCollection"),
      +            i = 0,
      +            l,
      +            axis,
      +            graphOverflow = "visible",
      +            graph = this.get("graph"),
      +            topOverflow,
      +            bottomOverflow,
      +            leftOverflow,
      +            rightOverflow,
      +            graphWidth,
      +            graphHeight,
      +            graphX,
      +            graphY,
      +            allowContentOverflow = this.get("allowContentOverflow"),
      +            diff,
      +            rightAxesXCoords,
      +            leftAxesXCoords,
      +            topAxesYCoords,
      +            bottomAxesYCoords,
      +            legend = this.get("legend"),
      +            graphRect = {};
      +
      +        if(leftAxesCollection)
      +        {
      +            leftAxesXCoords = [];
      +            l = leftAxesCollection.length;
      +            for(i = l - 1; i > -1; --i)
      +            {
      +                leftAxesXCoords.unshift(leftPaneWidth);
      +                leftPaneWidth += leftAxesCollection[i].get("width");
      +            }
      +        }
      +        if(rightAxesCollection)
      +        {
      +            rightAxesXCoords = [];
      +            l = rightAxesCollection.length;
      +            i = 0;
      +            for(i = l - 1; i > -1; --i)
      +            {
      +                rightPaneWidth += rightAxesCollection[i].get("width");
      +                rightAxesXCoords.unshift(w - rightPaneWidth);
      +            }
      +        }
      +        if(topAxesCollection)
      +        {
      +            topAxesYCoords = [];
      +            l = topAxesCollection.length;
      +            for(i = l - 1; i > -1; --i)
      +            {
      +                topAxesYCoords.unshift(topPaneHeight);
      +                topPaneHeight += topAxesCollection[i].get("height");
      +            }
      +        }
      +        if(bottomAxesCollection)
      +        {
      +            bottomAxesYCoords = [];
      +            l = bottomAxesCollection.length;
      +            for(i = l - 1; i > -1; --i)
      +            {
      +                bottomPaneHeight += bottomAxesCollection[i].get("height");
      +                bottomAxesYCoords.unshift(h - bottomPaneHeight);
      +            }
      +        }
      +        
      +        graphWidth = w - (leftPaneWidth + rightPaneWidth);
      +        graphHeight = h - (bottomPaneHeight + topPaneHeight);
      +        graphRect.left = leftPaneWidth;
      +        graphRect.top = topPaneHeight;
      +        graphRect.bottom = h - bottomPaneHeight;
      +        graphRect.right = w - rightPaneWidth;
      +        if(!allowContentOverflow)
      +        {
      +            topOverflow = this._getTopOverflow(leftAxesCollection, rightAxesCollection);
      +            bottomOverflow = this._getBottomOverflow(leftAxesCollection, rightAxesCollection);
      +            leftOverflow = this._getLeftOverflow(bottomAxesCollection, topAxesCollection);
      +            rightOverflow = this._getRightOverflow(bottomAxesCollection, topAxesCollection);
      +            
      +            diff = topOverflow - topPaneHeight;
      +            if(diff > 0)
      +            {
      +                graphRect.top = topOverflow;
      +                if(topAxesYCoords)
      +                {
      +                    i = 0;
      +                    l = topAxesYCoords.length;
      +                    for(; i < l; ++i)
      +                    {
      +                        topAxesYCoords[i] += diff;
      +                    }
      +                }
      +            }
      +
      +            diff = bottomOverflow - bottomPaneHeight;
      +            if(diff > 0)
      +            {
      +                graphRect.bottom = h - bottomOverflow;
      +                if(bottomAxesYCoords)
      +                {
      +                    i = 0;
      +                    l = bottomAxesYCoords.length;
      +                    for(; i < l; ++i)
      +                    {
      +                        bottomAxesYCoords[i] -= diff;
      +                    }
      +                }
      +            }
      +
      +            diff = leftOverflow - leftPaneWidth;
      +            if(diff > 0)
      +            {
      +                graphRect.left = leftOverflow;
      +                if(leftAxesXCoords)
      +                {
      +                    i = 0;
      +                    l = leftAxesXCoords.length;
      +                    for(; i < l; ++i)
      +                    {
      +                        leftAxesXCoords[i] += diff;
      +                    }
      +                }
      +            }
      +
      +            diff = rightOverflow - rightPaneWidth;
      +            if(diff > 0)
      +            {
      +                graphRect.right = w - rightOverflow;
      +                if(rightAxesXCoords)
      +                {
      +                    i = 0;
      +                    l = rightAxesXCoords.length;
      +                    for(; i < l; ++i)
      +                    {
      +                        rightAxesXCoords[i] -= diff;
      +                    }
      +                }
      +            }
      +        }
      +        graphWidth = graphRect.right - graphRect.left;
      +        graphHeight = graphRect.bottom - graphRect.top;
      +        graphX = graphRect.left;
      +        graphY = graphRect.top;
      +        if(legend)
      +        {
      +            if(legend.get("includeInChartLayout"))
      +            {
      +                switch(legend.get("position"))
      +                {
      +                    case "left" : 
      +                        legend.set("y", graphY);
      +                        legend.set("height", graphHeight);
      +                    break;
      +                    case "top" :
      +                        legend.set("x", graphX);
      +                        legend.set("width", graphWidth);
      +                    break;
      +                    case "bottom" : 
      +                        legend.set("x", graphX);
      +                        legend.set("width", graphWidth);
      +                    break;
      +                    case "right" :
      +                        legend.set("y", graphY);
      +                        legend.set("height", graphHeight);
      +                    break;
      +                }
      +            }
      +        }
      +        if(topAxesCollection)
      +        {
      +            l = topAxesCollection.length;
      +            i = 0;
      +            for(; i < l; i++)
      +            {
      +                axis = topAxesCollection[i];
      +                if(axis.get("width") !== graphWidth)
      +                {
      +                    axis.set("width", graphWidth);
      +                }
      +                axis.get("boundingBox").setStyle("left", graphX + PX);
      +                axis.get("boundingBox").setStyle("top", topAxesYCoords[i] + PX);
      +            }
      +            if(axis._hasDataOverflow())
      +            {
      +                graphOverflow = "hidden";
      +            }
      +        }
      +        if(bottomAxesCollection)
      +        {
      +            l = bottomAxesCollection.length;
      +            i = 0;
      +            for(; i < l; i++)
      +            {
      +                axis = bottomAxesCollection[i];
      +                if(axis.get("width") !== graphWidth)
      +                {
      +                    axis.set("width", graphWidth);
      +                }
      +                axis.get("boundingBox").setStyle("left", graphX + PX);
      +                axis.get("boundingBox").setStyle("top", bottomAxesYCoords[i] + PX);
      +            }
      +            if(axis._hasDataOverflow())
      +            {
      +                graphOverflow = "hidden";
      +            }
      +        }
      +        if(leftAxesCollection)
      +        {
      +            l = leftAxesCollection.length;
      +            i = 0;
      +            for(; i < l; ++i)
      +            {
      +                axis = leftAxesCollection[i];
      +                axis.get("boundingBox").setStyle("top", graphY + PX);
      +                axis.get("boundingBox").setStyle("left", leftAxesXCoords[i] + PX);
      +                if(axis.get("height") !== graphHeight)
      +                {
      +                    axis.set("height", graphHeight);
      +                }
      +            }
      +            if(axis._hasDataOverflow())
      +            {
      +                graphOverflow = "hidden";
      +            }
      +        }
      +        if(rightAxesCollection)
      +        {
      +            l = rightAxesCollection.length;
      +            i = 0;
      +            for(; i < l; ++i)
      +            {
      +                axis = rightAxesCollection[i];
      +                axis.get("boundingBox").setStyle("top", graphY + PX);
      +                axis.get("boundingBox").setStyle("left", rightAxesXCoords[i] + PX);
      +                if(axis.get("height") !== graphHeight)
      +                {
      +                    axis.set("height", graphHeight);
      +                }
      +            }
      +            if(axis._hasDataOverflow())
      +            {
      +                graphOverflow = "hidden";
      +            }
      +        }
      +        this._drawing = false;
      +        if(this._callLater)
      +        {
      +            this._redraw();
      +            return;
      +        }
      +        if(graph)
      +        {
      +            graph.get("boundingBox").setStyle("left", graphX + PX);
      +            graph.get("boundingBox").setStyle("top", graphY + PX);
      +            graph.set("width", graphWidth);
      +            graph.set("height", graphHeight);
      +            graph.get("boundingBox").setStyle("overflow", graphOverflow);
      +        }
      +
      +        if(this._overlay)
      +        {
      +            this._overlay.setStyle("left", graphX + PX);
      +            this._overlay.setStyle("top", graphY + PX);
      +            this._overlay.setStyle("width", graphWidth + PX);
      +            this._overlay.setStyle("height", graphHeight + PX);
      +        }
      +    },
      +
      +    /**
      +     * Positions the legend in a chart and returns the properties of the legend to be used in the 
      +     * chart's layout algorithm.
      +     *
      +     * @method _getLayoutDimensions
      +     * @return {Object} The left, top, right and bottom values for the legend.
      +     * @protected
      +     */
      +    _getLayoutBoxDimensions: function()
      +    {
      +        var box = {
      +                top: 0,
      +                right: 0,
      +                bottom: 0,
      +                left: 0
      +            },
      +            legend = this.get("legend"),
      +            position,
      +            direction,
      +            dimension,
      +            size,
      +            w = this.get(WIDTH),
      +            h = this.get(HEIGHT),
      +            gap;
      +        if(legend && legend.get("includeInChartLayout"))
      +        {
      +            gap = legend.get("styles").gap;
      +            position = legend.get(POSITION);
      +            if(position != EXTERNAL)
      +            {
      +                direction = legend.get("direction");
      +                dimension = direction == HORIZONTAL ? HEIGHT : WIDTH;
      +                size = legend.get(dimension);
      +                box[position] = size + gap;
      +                switch(position)
      +                {
      +                    case TOP :
      +                        legend.set(_Y, 0); 
      +                    break;
      +                    case BOTTOM : 
      +                        legend.set(_Y, h - size); 
      +                    break;
      +                    case RIGHT :
      +                        legend.set(_X, w - size);
      +                    break;
      +                    case LEFT: 
      +                        legend.set(_X, 0);
      +                    break;
      +                }
      +            }
      +        }
      +        return box;
      +    },
      +
      +    /**
      +     * Destructor implementation for the CartesianChart class. Calls destroy on all axes, series, legend (if available) and the Graph instance.
      +     * Removes the tooltip and overlay HTML elements.
      +     *
      +     * @method destructor
      +     * @protected
      +     */
      +    destructor: function()
      +    {
      +        var legend = this.get("legend");
      +        if(legend)
      +        {
      +            legend.destroy(true);
      +        }
      +    }
      +}, {
      +    ATTRS: {
      +        legend: LEGEND
      +    }
      +});
      +
      +Y.CartesianChart = CartesianChartLegend;
      +
      diff --git a/tests/input/charts/CartesianSeries.js b/tests/input/charts/CartesianSeries.js
      new file mode 100644
      index 00000000..358005a2
      --- /dev/null
      +++ b/tests/input/charts/CartesianSeries.js
      @@ -0,0 +1,839 @@
      +/**
      + * The CartesianSeries class creates a chart with horizontal and vertical axes.
      + *
      + * @module charts
      + * @class CartesianSeries
      + * @extends Base
      + * @uses Renderer
      + * @constructor
      + */
      +Y.CartesianSeries = Y.Base.create("cartesianSeries", Y.Base, [Y.Renderer], {
      +    /**
      +     * Storage for `xDisplayName` attribute.
      +     *
      +     * @property _xDisplayName
      +     * @type String
      +     * @private
      +     */
      +    _xDisplayName: null,
      +
      +    /**
      +     * Storage for `yDisplayName` attribute.
      +     *
      +     * @property _yDisplayName
      +     * @type String
      +     * @private
      +     */
      +    _yDisplayName: null,
      +    
      +    /**
      +     * Th x-coordinate for the left edge of the series.
      +     *
      +     * @property _leftOrigin
      +     * @type String
      +     * @private
      +     */
      +    _leftOrigin: null,
      +
      +    /**
      +     * The y-coordinate for the bottom edge of the series.
      +     * 
      +     * @property _bottomOrigin
      +     * @type String
      +     * @private
      +     */
      +    _bottomOrigin: null,
      +
      +    /**
      +     * @method render
      +     * @private
      +     */
      +    render: function()
      +    {
      +        this._setCanvas();
      +        this.addListeners();
      +        this.set("rendered", true);
      +        this.validate();
      +    },
      +
      +    /**
      +     * Adds event listeners.
      +     *
      +     * @method addListeners
      +     * @private
      +     */
      +    addListeners: function()
      +    {
      +        var xAxis = this.get("xAxis"),
      +            yAxis = this.get("yAxis");
      +        if(xAxis)
      +        {
      +            xAxis.after("dataReady", Y.bind(this._xDataChangeHandler, this));
      +            xAxis.after("dataUpdate", Y.bind(this._xDataChangeHandler, this));
      +        }
      +        if(yAxis)
      +        {
      +            yAxis.after("dataReady", Y.bind(this._yDataChangeHandler, this));
      +            yAxis.after("dataUpdate", Y.bind(this._yDataChangeHandler, this));
      +        }
      +        this.after("xAxisChange", this._xAxisChangeHandler);
      +        this.after("yAxisChange", this._yAxisChangeHandler);
      +        this.after("stylesChange", function(e) {
      +            var axesReady = this._updateAxisData();
      +            if(axesReady)
      +            {
      +                this.draw();
      +            }
      +        });
      +        this.after("widthChange", function(e) {
      +            var axesReady = this._updateAxisData();
      +            if(axesReady)
      +            {
      +                this.draw();
      +            }
      +        });
      +        this.after("heightChange", function(e) {
      +            var axesReady = this._updateAxisData();
      +            if(axesReady)
      +            {
      +                this.draw();
      +            }
      +        });
      +        this.after("visibleChange", this._handleVisibleChange);
      +    },
      +  
      +    /**
      +     * Event handler for the xAxisChange event.
      +     *
      +     * @method _xAxisChangeHandler
      +     * @param {Object} e Event object.
      +     * @private
      +     */
      +    _xAxisChangeHandler: function(e)
      +    {
      +        var xAxis = this.get("xAxis");
      +        xAxis.after("dataReady", Y.bind(this._xDataChangeHandler, this));
      +        xAxis.after("dataUpdate", Y.bind(this._xDataChangeHandler, this));
      +    },
      +    
      +    /**
      +     * Event handler the yAxisChange event.
      +     *
      +     * @method _yAxisChangeHandler
      +     * @param {Object} e Event object.
      +     * @private
      +     */
      +    _yAxisChangeHandler: function(e)
      +    {
      +        var yAxis = this.get("yAxis");
      +        yAxis.after("dataReady", Y.bind(this._yDataChangeHandler, this));
      +        yAxis.after("dataUpdate", Y.bind(this._yDataChangeHandler, this));
      +    },
      +
      +    /**
      +     * Constant used to generate unique id.
      +     *
      +     * @property GUID
      +     * @type String
      +     * @private
      +     */
      +    GUID: "yuicartesianseries",
      +
      +    /**
      +     * Event handler for xDataChange event.
      +     *
      +     * @method _xDataChangeHandler
      +     * @param {Object} event Event object.
      +     * @private 
      +     */
      +    _xDataChangeHandler: function(event)
      +    {
      +        var axesReady = this._updateAxisData();
      +        if(axesReady)
      +        {
      +            this.draw();
      +        }
      +    },
      +
      +    /**
      +     * Event handler for yDataChange event.
      +     *
      +     * @method _yDataChangeHandler
      +     * @param {Object} event Event object.
      +     * @private 
      +     */
      +    _yDataChangeHandler: function(event)
      +    {
      +        var axesReady = this._updateAxisData();
      +        if(axesReady)
      +        {
      +            this.draw();
      +        }
      +    },
      +
      +    /**
      +     * Checks to ensure that both xAxis and yAxis data are available. If so, set the `xData` and `yData` attributes and return `true`. Otherwise, return `false`.
      +     *
      +     * @method _updateAxisData
      +     * @return Boolean
      +     * @private 
      +     */
      +    _updateAxisData: function()
      +    {
      +        var xAxis = this.get("xAxis"),
      +            yAxis = this.get("yAxis"),
      +            xKey = this.get("xKey"),
      +            yKey = this.get("yKey"),
      +            yData,
      +            xData;
      +        if(!xAxis || !yAxis || !xKey || !yKey)
      +        {
      +            return false;
      +        }
      +        xData = xAxis.getDataByKey(xKey);
      +        yData = yAxis.getDataByKey(yKey);
      +        if(!xData || !yData)
      +        {
      +            return false;
      +        }
      +        this.set("xData", xData.concat());
      +        this.set("yData", yData.concat());
      +        return true;
      +    },
      +
      +    /**
      +     * Draws the series is the xAxis and yAxis data are both available.
      +     *
      +     * @method validate
      +     * @private
      +     */
      +    validate: function()
      +    {
      +        if((this.get("xData") && this.get("yData")) || this._updateAxisData())
      +        {
      +            this.draw();
      +        }
      +        else
      +        {
      +            this.fire("drawingComplete");
      +        }
      +    },
      +
      +    /**
      +     * Creates a `Graphic` instance.
      +     *
      +     * @method _setCanvas
      +     * @protected
      +     */
      +    _setCanvas: function()
      +    {
      +        var graph = this.get("graph"),
      +            graphic = graph.get("graphic");
      +        this.set("graphic", graphic);
      +    },
      +
      +    /**
      +     * Calculates the coordinates for the series.
      +     *
      +     * @method setAreaData
      +     * @protected
      +     */
      +    setAreaData: function()
      +    {
      +        var isNumber = Y_Lang.isNumber,
      +            nextX, nextY,
      +            graph = this.get("graph"),
      +            w = graph.get("width"),
      +            h = graph.get("height"),
      +            xAxis = this.get("xAxis"),
      +            yAxis = this.get("yAxis"),
      +            xData = this.get("xData").concat(),
      +            yData = this.get("yData").concat(),
      +            xValue,
      +            yValue,
      +            xOffset = xAxis.getEdgeOffset(xData.length, w),
      +            yOffset = yAxis.getEdgeOffset(yData.length, h),
      +            padding = this.get("styles").padding,
      +			leftPadding = padding.left,
      +			topPadding = padding.top,
      +			dataWidth = w - (leftPadding + padding.right + xOffset),
      +			dataHeight = h - (topPadding + padding.bottom + yOffset),
      +			xcoords = [],
      +			ycoords = [],
      +			xMax = xAxis.get("maximum"),
      +			xMin = xAxis.get("minimum"),
      +			yMax = yAxis.get("maximum"),
      +			yMin = yAxis.get("minimum"),
      +            xScaleFactor = dataWidth / (xMax - xMin),
      +			yScaleFactor = dataHeight / (yMax - yMin),
      +            dataLength,
      +            direction = this.get("direction"),
      +            i = 0,
      +            xMarkerPlane = [],
      +            yMarkerPlane = [],
      +            xMarkerPlaneOffset = this.get("xMarkerPlaneOffset"),
      +            yMarkerPlaneOffset = this.get("yMarkerPlaneOffset"),
      +            graphic = this.get("graphic");
      +        graphic.set("width", w);
      +        graphic.set("height", h);
      +        dataLength = xData.length;
      +        xOffset *= 0.5;
      +        yOffset *= 0.5;
      +        //Assuming a vertical graph has a range/category for its vertical axis.    
      +        if(direction === "vertical")
      +        {
      +            yData = yData.reverse();
      +        }
      +        this._leftOrigin = Math.round(((0 - xMin) * xScaleFactor) + leftPadding + xOffset);
      +        this._bottomOrigin = Math.round((dataHeight + topPadding + yOffset)); 
      +        for (; i < dataLength; ++i) 
      +		{
      +            xValue = parseFloat(xData[i]);
      +            yValue = parseFloat(yData[i]);
      +            if(isNumber(xValue))
      +            {
      +                nextX = Math.round((((xValue - xMin) * xScaleFactor) + leftPadding + xOffset));
      +            }
      +            else
      +            {
      +                nextX = NaN;
      +            }
      +            if(isNumber(yValue))
      +            {
      +			    nextY = Math.round(((dataHeight + topPadding + yOffset) - (yValue - yMin) * yScaleFactor));
      +            }
      +            else
      +            {
      +                nextY = NaN;
      +            }
      +            xcoords.push(nextX);
      +            ycoords.push(nextY);
      +            xMarkerPlane.push({start:nextX - xMarkerPlaneOffset, end: nextX + xMarkerPlaneOffset});
      +            yMarkerPlane.push({start:nextY - yMarkerPlaneOffset, end: nextY + yMarkerPlaneOffset});
      +        }
      +        this.set("xcoords", xcoords);
      +		this.set("ycoords", ycoords);
      +        this.set("xMarkerPlane", xMarkerPlane);
      +        this.set("yMarkerPlane", yMarkerPlane);
      +        this._dataLength = dataLength;
      +    },
      +
      +    /**
      +     * Draws the series.
      +     *
      +     * @method draw
      +     * @protected
      +     */
      +    draw: function()
      +    {
      +        var graph = this.get("graph"),
      +            w = graph.get("width"),
      +            h = graph.get("height");
      +        if(this.get("rendered"))
      +        {
      +            if((isFinite(w) && isFinite(h) && w > 0 && h > 0) && ((this.get("xData") && this.get("yData")) || this._updateAxisData()))
      +            {
      +                if(this._drawing)
      +                {
      +                    this._callLater = true;
      +                    return;
      +                }
      +                this._drawing = true;
      +                this._callLater = false;
      +                this.setAreaData();
      +                if(this.get("xcoords") && this.get("ycoords"))
      +                {
      +                    this.drawSeries();
      +                }
      +                this._drawing = false;
      +                if(this._callLater)
      +                {
      +                    this.draw();
      +                }
      +                else
      +                {
      +                    this._toggleVisible(this.get("visible"));
      +                    this.fire("drawingComplete");
      +                }
      +            }
      +        }
      +    },
      +    
      +    /**
      +     * Default value for plane offsets when the parent chart's `interactiveType` is `planar`. 
      +     *
      +     * @property _defaultPlaneOffset
      +     * @type Number
      +     * @private
      +     */
      +    _defaultPlaneOffset: 4,
      +    
      +    /**
      +     * Gets the default value for the `styles` attribute. Overrides
      +     * base implementation.
      +     *
      +     * @method _getDefaultStyles
      +     * @return Object
      +     * @protected
      +     */
      +    _getDefaultStyles: function()
      +    {
      +        return {padding:{
      +                top: 0,
      +                left: 0,
      +                right: 0,
      +                bottom: 0
      +            }};
      +    },
      +
      +    /**
      +     * Collection of default colors used for lines in a series when not specified by user.
      +     *
      +     * @property _defaultLineColors
      +     * @type Array
      +     * @protected
      +     */
      +    _defaultLineColors:["#426ab3", "#d09b2c", "#000000", "#b82837", "#b384b5", "#ff7200", "#779de3", "#cbc8ba", "#7ed7a6", "#007a6c"],
      +
      +    /**
      +     * Collection of default colors used for marker fills in a series when not specified by user.
      +     *
      +     * @property _defaultFillColors
      +     * @type Array
      +     * @protected
      +     */
      +    _defaultFillColors:["#6084d0", "#eeb647", "#6c6b5f", "#d6484f", "#ce9ed1", "#ff9f3b", "#93b7ff", "#e0ddd0", "#94ecba", "#309687"],
      +    
      +    /**
      +     * Collection of default colors used for marker borders in a series when not specified by user.
      +     *
      +     * @property _defaultBorderColors
      +     * @type Array
      +     * @protected
      +     */
      +    _defaultBorderColors:["#205096", "#b38206", "#000000", "#94001e", "#9d6fa0", "#e55b00", "#5e85c9", "#adab9e", "#6ac291", "#006457"],
      +    
      +    /**
      +     * Collection of default colors used for area fills, histogram fills and pie fills in a series when not specified by user.
      +     *
      +     * @property _defaultSliceColors
      +     * @type Array
      +     * @protected
      +     */
      +    _defaultSliceColors: ["#66007f", "#a86f41", "#295454", "#996ab2", "#e8cdb7", "#90bdbd","#000000","#c3b8ca", "#968373", "#678585"],
      +
      +    /**
      +     * Parses a color based on a series order and type.
      +     *
      +     * @method _getDefaultColor
      +     * @param {Number} index Index indicating the series order.
      +     * @param {String} type Indicates which type of object needs the color.
      +     * @return String
      +     * @protected
      +     */
      +    _getDefaultColor: function(index, type)
      +    {
      +        var colors = {
      +                line: this._defaultLineColors,
      +                fill: this._defaultFillColors,
      +                border: this._defaultBorderColors,
      +                slice: this._defaultSliceColors
      +            },
      +            col = colors[type],
      +            l = col.length;
      +        index = index || 0;
      +        if(index >= l)
      +        {
      +            index = index % l;
      +        }
      +        type = type || "fill";
      +        return colors[type][index];
      +    },
      +    
      +    /**
      +     * Shows/hides contents of the series.
      +     *
      +     * @method _handleVisibleChange
      +     * @param {Object} e Event object.
      +     * @protected
      +     */
      +    _handleVisibleChange: function(e) 
      +    {
      +        this._toggleVisible(this.get("visible"));
      +    },
      +
      +    /**
      +     * Returns the sum of all values for the series.
      +     *
      +     * @method getTotalValues
      +     * @return Number
      +     */
      +    getTotalValues: function()
      +    {
      +        var total = this.get("valueAxis").getTotalByKey(this.get("valueKey"));
      +        return total;
      +    },
      +
      +    /**
      +     * Destructor implementation for the CartesianSeries class. Calls destroy on all Graphic instances.
      +     *
      +     * @method destructor
      +     * @protected
      +     */
      +    destructor: function()
      +    {
      +        if(this._path)
      +        {
      +            this._path.destroy();
      +        }
      +        if(this._lineGraphic)
      +        {
      +            this._lineGraphic.destroy();
      +            this._lineGraphic = null;
      +        }
      +        if(this.get("graphic"))
      +        {
      +            this.get("graphic").destroy();
      +        }   
      +    }
      +}, {
      +    ATTRS: {
      +        /**
      +         * Name used for for displaying data related to the x-coordinate.
      +         *
      +         * @attribute xDisplayName
      +         * @type String
      +         */
      +        xDisplayName: {
      +            getter: function()
      +            {
      +                return this._xDisplayName || this.get("xKey");
      +            },
      +
      +            setter: function(val)
      +            {
      +                this._xDisplayName = val.toString();
      +                return val;
      +            }
      +        },
      +
      +        /**
      +         * Name used for for displaying data related to the y-coordinate.
      +         *
      +         * @attribute yDisplayName
      +         * @type String
      +         */
      +        yDisplayName: {
      +            getter: function()
      +            {
      +                return this._yDisplayName || this.get("yKey");
      +            },
      +
      +            setter: function(val)
      +            {
      +                this._yDisplayName = val.toString();
      +                return val;
      +            }
      +        },
      +        
      +        /**
      +         * Name used for for displaying category data
      +         *
      +         * @attribute categoryDisplayName
      +         * @type String
      +         * @readOnly
      +         */
      +        categoryDisplayName: {
      +            readOnly: true,
      +
      +            getter: function()
      +            {
      +                return this.get("direction") == "vertical" ? this.get("yDisplayName") : this.get("xDisplayName");
      +            }
      +        },
      +
      +        /**
      +         * Name used for for displaying value data
      +         *
      +         * @attribute valueDisplayName
      +         * @type String
      +         * @readOnly
      +         */
      +        valueDisplayName: {
      +            readOnly: true,
      +
      +            getter: function()
      +            {
      +                return this.get("direction") == "vertical" ? this.get("xDisplayName") : this.get("yDisplayName");
      +            }
      +        },
      +        
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @default cartesian
      +         */
      +        type: {		
      +            value: "cartesian"
      +        },
      +
      +        /**
      +         * Order of this instance of this `type`.
      +         *
      +         * @attribute order
      +         * @type Number
      +         */
      +        order: {},
      +
      +        /**
      +         * Order of the instance
      +         *
      +         * @attribute graphOrder
      +         * @type Number
      +         */
      +        graphOrder: {},
      +
      +        /**
      +         * x coordinates for the series.
      +         *
      +         * @attribute xcoords
      +         * @type Array
      +         */
      +        xcoords: {},
      +        
      +        /**
      +         * y coordinates for the series
      +         *
      +         * @attribute ycoords
      +         * @type Array
      +         */
      +        ycoords: {},
      +
      +        /**
      +         * Reference to the `Chart` application.
      +         *
      +         * @attribute chart
      +         * @type ChartBase
      +         * @readOnly
      +         */
      +        chart: {
      +            readOnly: true,
      +
      +            getter: function()
      +            {
      +                return this.get("graph").get("chart");
      +            }
      +        },
      +        
      +        /**
      +         * Reference to the `Graph` in which the series is drawn into.
      +         *
      +         * @attribute graph
      +         * @type Graph
      +         */
      +        graph: {},
      +
      +        /**
      +         * Reference to the `Axis` instance used for assigning 
      +         * x-values to the graph.
      +         *
      +         * @attribute xAxis
      +         * @type Axis
      +         */
      +        xAxis: {},
      +        
      +        /**
      +         * Reference to the `Axis` instance used for assigning 
      +         * y-values to the graph.
      +         *
      +         * @attribute yAxis
      +         * @type Axis
      +         */
      +        yAxis: {},
      +        
      +        /**
      +         * Indicates which array to from the hash of value arrays in 
      +         * the x-axis `Axis` instance.
      +         *
      +         * @attribute xKey
      +         * @type String
      +         */
      +        xKey: {
      +            setter: function(val)
      +            {
      +                return val.toString();
      +            }
      +        },
      +
      +        /**
      +         * Indicates which array to from the hash of value arrays in 
      +         * the y-axis `Axis` instance.
      +         *
      +         * @attribute yKey
      +         * @type String
      +         */
      +        yKey: {
      +            setter: function(val)
      +            {
      +                return val.toString();
      +            }
      +        },
      +
      +        /**
      +         * Array of x values for the series.
      +         *
      +         * @attribute xData
      +         * @type Array
      +         */
      +        xData: {},
      +
      +        /**
      +         * Array of y values for the series.
      +         *
      +         * @attribute yData
      +         * @type Array
      +         */
      +        yData: {},
      +       
      +        /**
      +         * Indicates whether the Series has been through its initial set up.
      +         *
      +         * @attribute rendered
      +         * @type Boolean
      +         */
      +        rendered: {
      +            value: false
      +        },
      +
      +        /*
      +         * Returns the width of the parent graph
      +         *
      +         * @attribute width
      +         * @type Number
      +         */
      +        width: {
      +            readOnly: true,
      +            
      +            getter: function()
      +            {
      +                this.get("graph").get("width");
      +            }
      +        },
      +
      +        /**
      +         * Returns the height of the parent graph
      +         *
      +         * @attribute height
      +         * @type Number
      +         */
      +        height: {
      +            readOnly: true,
      +            
      +            getter: function()
      +            {
      +                this.get("graph").get("height");
      +            }
      +        },
      +
      +        /**
      +         * Indicates whether to show the series
      +         *
      +         * @attribute visible
      +         * @type Boolean
      +         * @default true
      +         */
      +        visible: {
      +            value: true
      +        },
      +
      +        /**
      +         * Collection of area maps along the xAxis. Used to determine mouseover for multiple
      +         * series.
      +         *
      +         * @attribute xMarkerPlane
      +         * @type Array
      +         */
      +        xMarkerPlane: {},
      +        
      +        /**
      +         * Collection of area maps along the yAxis. Used to determine mouseover for multiple
      +         * series.
      +         *
      +         * @attribute yMarkerPlane
      +         * @type Array
      +         */
      +        yMarkerPlane: {},
      +
      +        /**
      +         * Distance from a data coordinate to the left/right for setting a hotspot.
      +         *
      +         * @attribute xMarkerPlaneOffset
      +         * @type Number
      +         */
      +        xMarkerPlaneOffset: {
      +            getter: function() {
      +                var marker = this.get("styles").marker;
      +                if(marker && marker.width && isFinite(marker.width))
      +                {
      +                    return marker.width * 0.5;
      +                }
      +                return this._defaultPlaneOffset;
      +            }
      +        },
      +
      +        /**
      +         * Distance from a data coordinate to the top/bottom for setting a hotspot.
      +         *
      +         * @attribute yMarkerPlaneOffset
      +         * @type Number
      +         */
      +        yMarkerPlaneOffset: {
      +            getter: function() {
      +                var marker = this.get("styles").marker;
      +                if(marker && marker.height && isFinite(marker.height))
      +                {
      +                    return marker.height * 0.5;
      +                }
      +                return this._defaultPlaneOffset;
      +            }
      +        },
      +
      +        /**
      +         * Direction of the series
      +         *
      +         * @attribute direction
      +         * @type String
      +         */
      +        direction: {
      +            value: "horizontal"
      +        },
      +
      +        /**
      +         * Indicates whether or not markers for a series will be grouped and rendered in a single complex shape instance.
      +         *
      +         * @attribute groupMarkers
      +         * @type Boolean
      +         */
      +        groupMarkers: {
      +            getter: function()
      +            {
      +                if(this._groupMarkers === undefined)
      +                {
      +                    return this.get("graph").get("groupMarkers");
      +                }
      +                else
      +                {
      +                    return this._groupMarkers;
      +                }
      +            },
      +
      +            setter: function(val)
      +            {
      +                this._groupMarkers = val;
      +                return val;
      +            }
      +        }
      +    }
      +});
      diff --git a/tests/input/charts/CategoryAxis.js b/tests/input/charts/CategoryAxis.js
      new file mode 100644
      index 00000000..74434c96
      --- /dev/null
      +++ b/tests/input/charts/CategoryAxis.js
      @@ -0,0 +1,277 @@
      +/**
      + * CategoryAxis manages category data on an axis.
      + *
      + * @module charts
      + * @class CategoryAxis
      + * @constructor
      + * @param {Object} config (optional) Configuration parameters for the Chart.
      + * @extends AxisType
      + */
      +function CategoryAxis(config)
      +{
      +	CategoryAxis.superclass.constructor.apply(this, arguments);
      +}
      +
      +CategoryAxis.NAME = "categoryAxis";
      +
      +Y.extend(CategoryAxis, Y.AxisType,
      +{
      +    /**
      +     * Formats a label based on the axis type and optionally specified format.
      +     *
      +     * @method formatLabel
      +     * @param {Object} value
      +     * @param {Object} format Pattern used to format the value.
      +     * @return String
      +     */
      +    formatLabel: function(val, format)
      +    {
      +        return val;
      +    },
      +
      +    /**
      +     * Object storing key data.
      +     *
      +     * @property _indices
      +     * @private
      +     */
      +    _indices: null,
      +
      +    /**
      +     * Constant used to generate unique id.
      +     *
      +     * @property GUID
      +     * @type String
      +     * @private
      +     */
      +    GUID: "yuicategoryaxis",
      +
      +    /**
      +     * Type of data used in `Axis`.
      +     *
      +     * @property _dataType
      +     * @readOnly
      +     * @private
      +     */
      +    _type: "category",
      +        
      +    /**
      +     * Calculates the maximum and minimum values for the `Axis`.
      +     *
      +     * @method _updateMinAndMax
      +     * @private 
      +     */
      +    _updateMinAndMax: function()
      +    {
      +        this._dataMaximum = Math.max(this.get("data").length - 1, 0);
      +        this._dataMinimum = 0;
      +    },
      +
      +    /**
      +     * Gets an array of values based on a key.
      +     *
      +     * @method _getKeyArray
      +     * @param {String} key Value key associated with the data array.
      +     * @param {Array} data Array in which the data resides.
      +     * @return Array
      +     * @private
      +     */
      +    _getKeyArray: function(key, data)
      +    {
      +        var i = 0,
      +            obj,
      +            keyArr = [],
      +            labels = [],
      +            len = data.length;
      +        if(!this._indices)
      +        {
      +            this._indices = {};
      +        }
      +        for(; i < len; ++i)
      +        {
      +            obj = data[i];
      +            keyArr[i] = i;
      +            labels[i] = obj[key];
      +        }
      +        this._indices[key] = keyArr;
      +        return labels;
      +    },
      +
      +    /**
      +     * Sets data by key
      +     *
      +     * @method _setDataByKey
      +     * @param {String} key Key value to use.
      +     * @param {Array} data Array to use.
      +     * @private 
      +     */
      +    _setDataByKey: function(key)
      +    {
      +        var i,
      +            obj, 
      +            arr = [], 
      +            labels = [], 
      +            dv = this._dataClone.concat(), 
      +            len = dv.length;
      +        if(!this._indices)
      +        {
      +            this._indices = {};
      +        }
      +        for(i = 0; i < len; ++i)
      +        {
      +            obj = dv[i];
      +            arr[i] = i;
      +            labels[i] = obj[key];
      +        }
      +        this._indices[key] = arr;
      +        this.get("keys")[key] = labels.concat();
      +        this._updateTotalDataFlag = true;
      +    },
      +
      +    /**
      +     * Returns an array of values based on an identifier key.
      +     *
      +     * @method getDataByKey
      +     * @param {String} value value used to identify the array
      +     * @return Array
      +     */
      +    getDataByKey: function (value)
      +    {
      +        if(!this._indices)
      +        {
      +            this.get("keys");
      +        }
      +        var keys = this._indices;
      +        if(keys[value])
      +        {
      +            return keys[value];
      +        }
      +        return null;
      +    },
      +
      +    /**
      +     * Returns the total number of majorUnits that will appear on an axis.
      +     *
      +     * @method getTotalMajorUnits
      +     * @param {Object} majorUnit Object containing properties related to the majorUnit.
      +     * @param {Number} len Length of the axis.
      +     * @return Number
      +     */
      +    getTotalMajorUnits: function(majorUnit, len)
      +    {
      +        return this.get("data").length;
      +    },
      +    
      +    /**
      +     * Returns the distance between major units on an axis.
      +     *
      +     * @method getMajorUnitDistance
      +     * @param {Number} len Number of ticks
      +     * @param {Number} uiLen Size of the axis.
      +     * @param {Object} majorUnit Hash of properties used to determine the majorUnit
      +     * @return Number
      +     */
      +    getMajorUnitDistance: function(len, uiLen, majorUnit)
      +    {
      +        var dist;
      +        if(majorUnit.determinant === "count")
      +        {
      +            dist = uiLen/len;
      +        }
      +        else if(majorUnit.determinant === "distance")
      +        {
      +            dist = majorUnit.distance;
      +        }
      +        return dist;
      +    },
      +   
      +    /**
      +     * Gets the distance that the first and last ticks are offset from there respective
      +     * edges.
      +     *
      +     * @method getEdgeOffset
      +     * @param {Number} ct Number of ticks on the axis.
      +     * @param {Number} l Length (in pixels) of the axis.
      +     * @return Number
      +     */
      +    getEdgeOffset: function(ct, l)
      +    {
      +        return l/ct;
      +    },
      +
      +    /**
      +     * Returns a value based of a key value and an index.
      +     *
      +     * @method getKeyValueAt
      +     * @param {String} key value used to look up the correct array
      +     * @param {Number} index within the array
      +     * @return String 
      +     */
      +    getKeyValueAt: function(key, index)
      +    {
      +        var value = NaN,
      +            keys = this.get("keys");
      +        if(keys[key] && keys[key][index]) 
      +        {
      +            value = keys[key][index];
      +        }
      +        return value;
      +    },
      +   
      +    /**
      +     * Calculates and returns a value based on the number of labels and the index of
      +     * the current label.
      +     *
      +     * @method getLabelByIndex
      +     * @param {Number} i Index of the label.
      +     * @param {Number} l Total number of labels.
      +     * @return String
      +     */
      +    getLabelByIndex: function(i, l)
      +    {
      +        var label,
      +            data = this.get("data"),
      +            position = this.get("position");
      +        if(position == "bottom" || position == "top")
      +        {
      +            label = data[i];
      +        }
      +        else
      +        {
      +            label = data[l - (i + 1)];
      +        }   
      +        return label;
      +    },
      +
      +    /**
      +     * Returns a string corresponding to the first label on an 
      +     * axis.
      +     *
      +     * @method getMinimumValue
      +     * @return String
      +     */
      +    getMinimumValue: function()
      +    {
      +        var data = this.get("data"),
      +            label = data[0];
      +        return label;
      +    },
      +
      +    /**
      +     * Returns a string corresponding to the last label on an 
      +     * axis.
      +     *
      +     * @method getMaximumValue
      +     * @return String
      +     */
      +    getMaximumValue: function()
      +    {
      +        var data = this.get("data"),
      +            len = data.length - 1,
      +            label = data[len];
      +        return label;
      +    }
      +});
      +
      +Y.CategoryAxis = CategoryAxis;
      +		
      diff --git a/tests/input/charts/Chart.js b/tests/input/charts/Chart.js
      new file mode 100644
      index 00000000..54d659b3
      --- /dev/null
      +++ b/tests/input/charts/Chart.js
      @@ -0,0 +1,19 @@
      +/**
      + * The Chart class is the basic application used to create a chart.
      + *
      + * @module charts
      + * @class Chart
      + * @constructor
      + */
      +function Chart(cfg)
      +{
      +    if(cfg.type != "pie")
      +    {
      +        return new Y.CartesianChart(cfg);
      +    }
      +    else
      +    {
      +        return new Y.PieChart(cfg);
      +    }
      +}
      +Y.Chart = Chart;
      diff --git a/tests/input/charts/ChartBase.js b/tests/input/charts/ChartBase.js
      new file mode 100644
      index 00000000..2940cd99
      --- /dev/null
      +++ b/tests/input/charts/ChartBase.js
      @@ -0,0 +1,1183 @@
      +/**
      + * The ChartBase class is an abstract class used to create charts.
      + *
      + * @module charts
      + * @class ChartBase
      + * @constructor
      + */
      +function ChartBase() {}
      +
      +ChartBase.ATTRS = {
      +    /**
      +     * Sets the `aria-label` for the chart.
      +     *
      +     * @attribute ariaLabel
      +     * @type String
      +     */
      +    ariaLabel: {
      +        value: "Chart Application",
      +
      +        setter: function(val)
      +        {
      +            var cb = this.get("contentBox");
      +            if(cb)
      +            {
      +                cb.setAttribute("aria-label", val);
      +            }
      +            return val;
      +        }
      +    },
      +    
      +    /**
      +     * Sets the aria description for the chart.
      +     *
      +     * @attribute ariaDescription
      +     * @type String
      +     */
      +    ariaDescription: {
      +        value: "Use the up and down keys to navigate between series. Use the left and right keys to navigate through items in a series.",
      +
      +        setter: function(val)
      +        {
      +            if(this._description)
      +            {
      +                this._description.setContent("");
      +                this._description.appendChild(DOCUMENT.createTextNode(val));
      +            }
      +            return val;
      +        }
      +    },
      +    
      +    /**
      +     * Reference to the default tooltip available for the chart.
      +     * <p>Contains the following properties:</p>
      +     *  <dl>
      +     *      <dt>node</dt><dd>Reference to the actual dom node</dd>
      +     *      <dt>showEvent</dt><dd>Event that should trigger the tooltip</dd>
      +     *      <dt>hideEvent</dt><dd>Event that should trigger the removal of a tooltip (can be an event or an array of events)</dd>
      +     *      <dt>styles</dt><dd>A hash of style properties that will be applied to the tooltip node</dd>
      +     *      <dt>show</dt><dd>Indicates whether or not to show the tooltip</dd>
      +     *      <dt>markerEventHandler</dt><dd>Displays and hides tooltip based on marker events</dd>
      +     *      <dt>planarEventHandler</dt><dd>Displays and hides tooltip based on planar events</dd>
      +     *      <dt>markerLabelFunction</dt><dd>Reference to the function used to format a marker event triggered tooltip's text. The method contains 
      +     *      the following arguments:
      +     *  <dl>
      +     *      <dt>categoryItem</dt><dd>An object containing the following:
      +     *  <dl>
      +     *      <dt>axis</dt><dd>The axis to which the category is bound.</dd>
      +     *      <dt>displayName</dt><dd>The display name set to the category (defaults to key if not provided).</dd>
      +     *      <dt>key</dt><dd>The key of the category.</dd>
      +     *      <dt>value</dt><dd>The value of the category.</dd>
      +     *  </dl>
      +     *  </dd>
      +     *  <dt>valueItem</dt><dd>An object containing the following:
      +     *      <dl>
      +     *          <dt>axis</dt><dd>The axis to which the item's series is bound.</dd>
      +     *          <dt>displayName</dt><dd>The display name of the series. (defaults to key if not provided)</dd>
      +     *          <dt>key</dt><dd>The key for the series.</dd>
      +     *          <dt>value</dt><dd>The value for the series item.</dd> 
      +     *      </dl>
      +     *  </dd>
      +     *  <dt>itemIndex</dt><dd>The index of the item within the series.</dd>
      +     *  <dt>series</dt><dd> The `CartesianSeries` instance of the item.</dd>
      +     *  <dt>seriesIndex</dt><dd>The index of the series in the `seriesCollection`.</dd>
      +     *  </dl>
      +     *  The method returns an `HTMLElement` which is written into the DOM using `appendChild`. If you override this method and choose to return an html string, you
      +     *  will also need to override the tooltip's `setTextFunction` method to accept an html string.
      +     *  </dd>
      +     *  <dt>planarLabelFunction</dt><dd>Reference to the function used to format a planar event triggered tooltip's text
      +     *  <dl>
      +     *      <dt>categoryAxis</dt><dd> `CategoryAxis` Reference to the categoryAxis of the chart.
      +     *      <dt>valueItems</dt><dd>Array of objects for each series that has a data point in the coordinate plane of the event. Each object contains the following data:
      +     *  <dl>
      +     *      <dt>axis</dt><dd>The value axis of the series.</dd>
      +     *      <dt>key</dt><dd>The key for the series.</dd>
      +     *      <dt>value</dt><dd>The value for the series item.</dd>
      +     *      <dt>displayName</dt><dd>The display name of the series. (defaults to key if not provided)</dd>
      +     *  </dl> 
      +     *  </dd>
      +     *      <dt>index</dt><dd>The index of the item within its series.</dd>
      +     *      <dt>seriesArray</dt><dd>Array of series instances for each value item.</dd>
      +     *      <dt>seriesIndex</dt><dd>The index of the series in the `seriesCollection`.</dd>
      +     *  </dl>
      +     *  </dd>
      +     *  </dl>
      +     *  The method returns an `HTMLElement` which is written into the DOM using `appendChild`. If you override this method and choose to return an html string, you
      +     *  will also need to override the tooltip's `setTextFunction` method to accept an html string.
      +     *  </dd>
      +     *  <dt>setTextFunction</dt><dd>Method that writes content returned from `planarLabelFunction` or `markerLabelFunction` into the the tooltip node.
      +     *  has the following signature:
      +     *  <dl>
      +     *      <dt>label</dt><dd>The `HTMLElement` that the content is to be added.</dd>
      +     *      <dt>val</dt><dd>The content to be rendered into tooltip. This can be a `String` or `HTMLElement`. If an HTML string is used, it will be rendered as a
      +     *      string.</dd>
      +     *  </dl>
      +     *  </dd>
      +     *  </dl>
      +     * @attribute tooltip
      +     * @type Object
      +     */ 
      +    tooltip: {
      +        valueFn: "_getTooltip",
      +
      +        setter: function(val)
      +        {
      +            return this._updateTooltip(val);
      +        }
      +    },
      +
      +    /** 
      +     * The key value used for the chart's category axis. 
      +     *
      +     * @attribute categoryKey
      +     * @type String
      +     * @default category
      +     */
      +    categoryKey: {
      +        value: "category"
      +    },
      +        
      +    /**
      +     * Indicates the type of axis to use for the category axis.
      +     *
      +     *  <dl>
      +     *      <dt>category</dt><dd>Specifies a `CategoryAxis`.</dd>
      +     *      <dt>time</dt><dd>Specifies a `TimeAxis</dd>
      +     *  </dl>
      +     *
      +     * @attribute categoryType
      +     * @type String
      +     * @default category
      +     */
      +    categoryType:{
      +        value:"category"
      +    },
      +
      +    /**
      +     * Indicates the the type of interactions that will fire events.
      +     *
      +     *  <dl>
      +     *      <dt>marker</dt><dd>Events will be broadcasted when the mouse interacts with individual markers.</dd>
      +     *      <dt>planar</dt><dd>Events will be broadcasted when the mouse intersects the plane of any markers on the chart.</dd>
      +     *      <dt>none</dt><dd>No events will be broadcasted.</dd>
      +     *  </dl>
      +     *
      +     * @attribute interactionType
      +     * @type String
      +     * @default marker
      +     */
      +    interactionType: {
      +        value: "marker"
      +    },
      +
      +    /**
      +     * Data used to generate the chart.
      +     * 
      +     * @attribute dataProvider
      +     * @type Array
      +     */
      +    dataProvider: {
      +        setter: function(val)
      +        {
      +            return this._setDataValues(val);
      +        }
      +    },
      +        
      +    /**
      +     * A collection of keys that map to the series axes. If no keys are set,
      +     * they will be generated automatically depending on the data structure passed into 
      +     * the chart.
      +     *
      +     * @attribute seriesKeys
      +     * @type Array
      +     */
      +    seriesKeys: {},
      +
      +    /**
      +     * Reference to all the axes in the chart.
      +     *
      +     * @attribute axesCollection
      +     * @type Array
      +     */
      +    axesCollection: {},
      +
      +    /**
      +     * Reference to graph instance.
      +     * 
      +     * @attribute graph
      +     * @type Graph 
      +     */
      +    graph: {
      +        valueFn: "_getGraph"
      +    },
      +
      +    /**
      +     * Indicates whether or not markers for a series will be grouped and rendered in a single complex shape instance.
      +     *
      +     * @attribute groupMarkers
      +     * @type Boolean
      +     */
      +    groupMarkers: {
      +        value: false,
      +
      +        setter: function(val)
      +        {
      +            if(this.get("graph"))
      +            {
      +                this.get("graph").set("groupMarkers", val);
      +            }
      +            return val;
      +        }
      +    }
      +};
      +
      +ChartBase.prototype = {
      +    /**
      +     * Handler for itemRendered event.
      +     *
      +     * @method _itemRendered
      +     * @param {Object} e Event object.
      +     * @private
      +     */
      +    _itemRendered: function(e)
      +    {
      +        this._itemRenderQueue = this._itemRenderQueue.splice(1 + Y.Array.indexOf(this._itemRenderQueue, e.currentTarget), 1);
      +        if(this._itemRenderQueue.length < 1)
      +        {
      +            this._redraw();
      +        }
      +    },
      +
      +    /**
      +     * Default value function for the `Graph` attribute.
      +     *
      +     * @method _getGraph
      +     * @return Graph
      +     * @private
      +     */
      +    _getGraph: function()
      +    {
      +        var graph = new Y.Graph({
      +            chart:this,
      +            groupMarkers: this.get("groupMarkers")    
      +        });
      +        graph.after("chartRendered", Y.bind(function(e) {
      +            this.fire("chartRendered");
      +        }, this));
      +        return graph; 
      +    },
      +
      +    /**
      +     * Returns a series instance by index or key value.
      +     *
      +     * @method getSeries
      +     * @param val
      +     * @return CartesianSeries
      +     */
      +    getSeries: function(val)
      +    {
      +        var series = null, 
      +            graph = this.get("graph");
      +        if(graph)
      +        {
      +            if(Y_Lang.isNumber(val))
      +            {
      +                series = graph.getSeriesByIndex(val);
      +            }
      +            else
      +            {
      +                series = graph.getSeriesByKey(val);
      +            }
      +        }
      +        return series;
      +    },
      +
      +    /**
      +     * Returns an `Axis` instance by key reference. If the axis was explicitly set through the `axes` attribute,
      +     * the key will be the same as the key used in the `axes` object. For default axes, the key for
      +     * the category axis is the value of the `categoryKey` (`category`). For the value axis, the default 
      +     * key is `values`.
      +     *
      +     * @method getAxisByKey
      +     * @param {String} val Key reference used to look up the axis.
      +     * @return Axis
      +     */
      +    getAxisByKey: function(val)
      +    {
      +        var axis,
      +            axes = this.get("axes");
      +        if(axes && axes.hasOwnProperty(val))
      +        {
      +            axis = axes[val];
      +        }
      +        return axis;
      +    },
      +
      +    /**
      +     * Returns the category axis for the chart.
      +     *
      +     * @method getCategoryAxis
      +     * @return Axis
      +     */
      +    getCategoryAxis: function()
      +    {
      +        var axis,
      +            key = this.get("categoryKey"),
      +            axes = this.get("axes");
      +        if(axes.hasOwnProperty(key))
      +        {
      +            axis = axes[key];
      +        }
      +        return axis;
      +    },
      +
      +    /**
      +     * Default direction of the chart.
      +     *
      +     * @property _direction
      +     * @type String
      +     * @default horizontal
      +     * @private
      +     */
      +    _direction: "horizontal",
      +    
      +    /**
      +     * Storage for the `dataProvider` attribute.
      +     *
      +     * @property _dataProvider
      +     * @type Array
      +     * @private
      +     */
      +    _dataProvider: null,
      +
      +    /**
      +     * Setter method for `dataProvider` attribute.
      +     *
      +     * @method _setDataValues
      +     * @param {Array} val Array to be set as `dataProvider`.
      +     * @return Array
      +     * @private
      +     */
      +    _setDataValues: function(val)
      +    {
      +        if(Y_Lang.isArray(val[0]))
      +        {
      +            var hash, 
      +                dp = [], 
      +                cats = val[0], 
      +                i = 0, 
      +                l = cats.length, 
      +                n, 
      +                sl = val.length;
      +            for(; i < l; ++i)
      +            {
      +                hash = {category:cats[i]};
      +                for(n = 1; n < sl; ++n)
      +                {
      +                    hash["series" + n] = val[n][i];
      +                }
      +                dp[i] = hash; 
      +            }
      +            return dp;
      +        }
      +        return val;
      +    },
      +
      +    /**
      +     * Storage for `seriesCollection` attribute.
      +     *
      +     * @property _seriesCollection
      +     * @type Array
      +     * @private 
      +     */
      +    _seriesCollection: null,
      +
      +    /**
      +     * Setter method for `seriesCollection` attribute.
      +     *
      +     * @property _setSeriesCollection
      +     * @param {Array} val Array of either `CartesianSeries` instances or objects containing series attribute key value pairs.
      +     * @private
      +     */
      +    _setSeriesCollection: function(val)
      +    {
      +        this._seriesCollection = val;
      +    },
      +    /**
      +     * Helper method that returns the axis class that a key references.
      +     *
      +     * @method _getAxisClass
      +     * @param {String} t The type of axis.
      +     * @return Axis
      +     * @private
      +     */
      +    _getAxisClass: function(t)
      +    {
      +        return this._axisClass[t];
      +    },
      +  
      +    /**
      +     * Key value pairs of axis types. 
      +     *
      +     * @property _axisClass
      +     * @type Object
      +     * @private
      +     */
      +    _axisClass: {
      +        stacked: Y.StackedAxis,
      +        numeric: Y.NumericAxis,
      +        category: Y.CategoryAxis,
      +        time: Y.TimeAxis
      +    },
      +
      +    /**
      +     * Collection of axes.
      +     *
      +     * @property _axes
      +     * @type Array
      +     * @private
      +     */
      +    _axes: null,
      +
      +    /**
      +     * @method initializer
      +     * @private
      +     */
      +    initializer: function()
      +    {
      +        this._itemRenderQueue = [];
      +        this._seriesIndex = -1;
      +        this._itemIndex = -1;
      +        this.after("dataProviderChange", this._dataProviderChangeHandler);
      +    },
      +
      +    /**
      +     * @method renderUI
      +     * @private
      +     */
      +    renderUI: function()
      +    {
      +        var tt = this.get("tooltip"),
      +            bb = this.get("boundingBox"),
      +            cb = this.get("contentBox");
      +        //move the position = absolute logic to a class file
      +        bb.setStyle("position", "absolute");
      +        cb.setStyle("position", "absolute");
      +        this._addAxes();
      +        this._addSeries();
      +        if(tt && tt.show)
      +        {
      +            this._addTooltip();
      +        }
      +        this._setAriaElements(bb, cb);
      +    },
      +   
      +    /**
      +     * Creates an aria `live-region`, `aria-label` and `aria-describedby` for the Chart.
      +     *
      +     * @method _setAriaElements
      +     * @param {Node} cb Reference to the Chart's `contentBox` attribute.
      +     * @private
      +     */
      +    _setAriaElements: function(bb, cb)
      +    {
      +        var description = this._getAriaOffscreenNode(),
      +            id = this.get("id") + "_description",
      +            liveRegion = this._getAriaOffscreenNode();
      +        cb.set("tabIndex", 0);
      +        cb.set("role", "img");
      +        cb.setAttribute("aria-label", this.get("ariaLabel"));
      +        cb.setAttribute("aria-describedby", id);
      +        description.set("id", id);
      +        description.set("tabIndex", -1);
      +        description.appendChild(DOCUMENT.createTextNode(this.get("ariaDescription")));
      +        liveRegion.set("id", "live-region");
      +        liveRegion.set("aria-live", "polite");
      +        liveRegion.set("aria-atomic", "true");
      +        liveRegion.set("role", "status");
      +        bb.setAttribute("role", "application");
      +        bb.appendChild(description);
      +        bb.appendChild(liveRegion);
      +        this._description = description;
      +        this._liveRegion = liveRegion;
      +    },
      +
      +    /**
      +     * Sets a node offscreen for use as aria-description or aria-live-regin.
      +     *
      +     * @method _setOffscreen
      +     * @return Node 
      +     * @private
      +     */
      +    _getAriaOffscreenNode: function()  
      +    {
      +        var node = Y.Node.create("<div></div>"),
      +            ie = Y.UA.ie,
      +            clipRect = (ie && ie < 8) ? "rect(1px 1px 1px 1px)" : "rect(1px, 1px, 1px, 1px)";
      +        node.setStyle("position", "absolute");
      +        node.setStyle("height", "1px"); 
      +        node.setStyle("width", "1px"); 
      +        node.setStyle("overflow", "hidden");
      +        node.setStyle("clip", clipRect); 
      +        return node;
      +    },
      +  
      +    /**
      +     * @method syncUI
      +     * @private
      +     */
      +    syncUI: function()
      +    {
      +        this._redraw();
      +    },
      +
      +    /**
      +     * @method bindUI
      +     * @private
      +     */
      +    bindUI: function()
      +    {
      +        this.after("tooltipChange", Y.bind(this._tooltipChangeHandler, this));
      +        this.after("widthChange", this._sizeChanged);
      +        this.after("heightChange", this._sizeChanged);
      +        var tt = this.get("tooltip"),
      +            hideEvent = "mouseout",
      +            showEvent = "mouseover",
      +            cb = this.get("contentBox"),
      +            interactionType = this.get("interactionType"),
      +            i = 0,
      +            len,
      +            markerClassName = "." + SERIES_MARKER,
      +            isTouch = ((WINDOW && ("ontouchstart" in WINDOW)) && !(Y.UA.chrome && Y.UA.chrome < 6));
      +        Y.on("keydown", Y.bind(function(e) {
      +            var key = e.keyCode,
      +                numKey = parseFloat(key),
      +                msg;
      +            if(numKey > 36 && numKey < 41)
      +            {
      +                e.halt();
      +                msg = this._getAriaMessage(numKey);
      +                this._liveRegion.setContent("");
      +                this._liveRegion.appendChild(DOCUMENT.createTextNode(msg));
      +            }
      +        }, this), this.get("contentBox"));
      +        if(interactionType == "marker")
      +        {
      +            //if touch capabilities, toggle tooltip on touchend. otherwise, the tooltip attribute's hideEvent/showEvent types.
      +            hideEvent = tt.hideEvent;
      +            showEvent = tt.showEvent;
      +            if(isTouch)
      +            {
      +                Y.delegate("touchend", Y.bind(this._markerEventDispatcher, this), cb, markerClassName);
      +                //hide active tooltip if the chart is touched
      +                Y.on("touchend", Y.bind(function(e) {
      +                    e.halt(true);
      +                    if(this._activeMarker)
      +                    {
      +                        this._activeMarker = null;
      +                        this.hideTooltip(e);
      +                    }
      +                }, this));
      +            }
      +            else
      +            {
      +                Y.delegate("mouseenter", Y.bind(this._markerEventDispatcher, this), cb, markerClassName);
      +                Y.delegate("mousedown", Y.bind(this._markerEventDispatcher, this), cb, markerClassName);
      +                Y.delegate("mouseup", Y.bind(this._markerEventDispatcher, this), cb, markerClassName);
      +                Y.delegate("mouseleave", Y.bind(this._markerEventDispatcher, this), cb, markerClassName);
      +                Y.delegate("click", Y.bind(this._markerEventDispatcher, this), cb, markerClassName);
      +                Y.delegate("mousemove", Y.bind(this._positionTooltip, this), cb, markerClassName);
      +            }
      +        }
      +        else if(interactionType == "planar")
      +        {
      +            if(isTouch)
      +            {
      +                this._overlay.on("touchend", Y.bind(this._planarEventDispatcher, this));
      +            }
      +            else
      +            {
      +                this._overlay.on("mousemove", Y.bind(this._planarEventDispatcher, this));
      +                this.on("mouseout", this.hideTooltip);
      +            }
      +        }
      +        if(tt)
      +        {
      +            this.on("markerEvent:touchend", Y.bind(function(e) {
      +                var marker = e.series.get("markers")[e.index];
      +                if(this._activeMarker && marker === this._activeMarker)
      +                {
      +                    this._activeMarker = null;
      +                    this.hideTooltip(e);
      +                }
      +                else
      +                {
      +
      +                    this._activeMarker = marker;
      +                    tt.markerEventHandler.apply(this, [e]);
      +                }
      +            }, this));
      +            if(hideEvent && showEvent && hideEvent == showEvent)
      +            {
      +                this.on(interactionType + "Event:" + hideEvent, this.toggleTooltip);
      +            }
      +            else
      +            {
      +                if(showEvent)
      +                {
      +                    this.on(interactionType + "Event:" + showEvent, tt[interactionType + "EventHandler"]);
      +                }
      +                if(hideEvent)
      +                {
      +                    if(Y_Lang.isArray(hideEvent))
      +                    {
      +                        len = hideEvent.length;
      +                        for(; i < len; ++i)
      +                        {
      +                            this.on(interactionType + "Event:" + hideEvent[i], this.hideTooltip);
      +                        }
      +                    }
      +                    this.on(interactionType + "Event:" + hideEvent, this.hideTooltip);
      +                }
      +            }
      +        }
      +    },
      +    
      +    /**
      +     * Event handler for marker events.
      +     *
      +     * @method _markerEventDispatcher
      +     * @param {Object} e Event object.
      +     * @private
      +     */
      +    _markerEventDispatcher: function(e)
      +    {
      +        var type = e.type,
      +            cb = this.get("contentBox"),
      +            markerNode = e.currentTarget,
      +            strArr = markerNode.getAttribute("id").split("_"),
      +            index = strArr.pop(),
      +            seriesIndex = strArr.pop(),
      +            series = this.getSeries(parseInt(seriesIndex, 10)),
      +            items = this.getSeriesItems(series, index),
      +            isTouch = e && e.hasOwnProperty("changedTouches"),
      +            pageX = isTouch ? e.changedTouches[0].pageX : e.pageX,
      +            pageY = isTouch ? e.changedTouches[0].pageY : e.pageY,
      +            x = pageX - cb.getX(),
      +            y = pageY - cb.getY();
      +        if(type == "mouseenter")
      +        {
      +            type = "mouseover";
      +        }
      +        else if(type == "mouseleave")
      +        {
      +            type = "mouseout";
      +        }
      +        series.updateMarkerState(type, index);
      +        e.halt();
      +        /**
      +         * Broadcasts when `interactionType` is set to `marker` and a series marker has received a mouseover event.
      +         * 
      +         *
      +         * @event markerEvent:mouseover
      +         * @preventable false
      +         * @param {EventFacade} e Event facade with the following additional
      +         *   properties:
      +         *  <dl>
      +         *      <dt>categoryItem</dt><dd>Hash containing information about the category `Axis`.</dd>
      +         *      <dt>valueItem</dt><dd>Hash containing information about the value `Axis`.</dd>
      +         *      <dt>node</dt><dd>The dom node of the marker.</dd>
      +         *      <dt>x</dt><dd>The x-coordinate of the mouse in relation to the Chart.</dd>
      +         *      <dt>y</dt><dd>The y-coordinate of the mouse in relation to the Chart.</dd>
      +         *      <dt>series</dt><dd>Reference to the series of the marker.</dd>
      +         *      <dt>index</dt><dd>Index of the marker in the series.</dd>
      +         *      <dt>seriesIndex</dt><dd>The `order` of the marker's series.</dd>
      +         *  </dl>
      +         */
      +        /**
      +         * Broadcasts when `interactionType` is set to `marker` and a series marker has received a mouseout event.
      +         *
      +         * @event markerEvent:mouseout
      +         * @preventable false
      +         * @param {EventFacade} e Event facade with the following additional
      +         *   properties:
      +         *  <dl>
      +         *      <dt>categoryItem</dt><dd>Hash containing information about the category `Axis`.</dd>
      +         *      <dt>valueItem</dt><dd>Hash containing information about the value `Axis`.</dd>
      +         *      <dt>node</dt><dd>The dom node of the marker.</dd>
      +         *      <dt>x</dt><dd>The x-coordinate of the mouse in relation to the Chart.</dd>
      +         *      <dt>y</dt><dd>The y-coordinate of the mouse in relation to the Chart.</dd>
      +         *      <dt>series</dt><dd>Reference to the series of the marker.</dd>
      +         *      <dt>index</dt><dd>Index of the marker in the series.</dd>
      +         *      <dt>seriesIndex</dt><dd>The `order` of the marker's series.</dd>
      +         *  </dl>
      +         */
      +        /**
      +         * Broadcasts when `interactionType` is set to `marker` and a series marker has received a mousedown event.
      +         *
      +         * @event markerEvent:mousedown
      +         * @preventable false
      +         * @param {EventFacade} e Event facade with the following additional
      +         *   properties:
      +         *  <dl>
      +         *      <dt>categoryItem</dt><dd>Hash containing information about the category `Axis`.</dd>
      +         *      <dt>valueItem</dt><dd>Hash containing information about the value `Axis`.</dd>
      +         *      <dt>node</dt><dd>The dom node of the marker.</dd>
      +         *      <dt>x</dt><dd>The x-coordinate of the mouse in relation to the Chart.</dd>
      +         *      <dt>y</dt><dd>The y-coordinate of the mouse in relation to the Chart.</dd>
      +         *      <dt>series</dt><dd>Reference to the series of the marker.</dd>
      +         *      <dt>index</dt><dd>Index of the marker in the series.</dd>
      +         *      <dt>seriesIndex</dt><dd>The `order` of the marker's series.</dd>
      +         *  </dl>
      +         */
      +        /**
      +         * Broadcasts when `interactionType` is set to `marker` and a series marker has received a mouseup event.
      +         *
      +         * @event markerEvent:mouseup
      +         * @preventable false
      +         * @param {EventFacade} e Event facade with the following additional
      +         *   properties:
      +         *  <dl>
      +         *      <dt>categoryItem</dt><dd>Hash containing information about the category `Axis`.</dd>
      +         *      <dt>valueItem</dt><dd>Hash containing information about the value `Axis`.</dd>
      +         *      <dt>node</dt><dd>The dom node of the marker.</dd>
      +         *      <dt>x</dt><dd>The x-coordinate of the mouse in relation to the Chart.</dd>
      +         *      <dt>y</dt><dd>The y-coordinate of the mouse in relation to the Chart.</dd>
      +         *      <dt>series</dt><dd>Reference to the series of the marker.</dd>
      +         *      <dt>index</dt><dd>Index of the marker in the series.</dd>
      +         *      <dt>seriesIndex</dt><dd>The `order` of the marker's series.</dd>
      +         *  </dl>
      +         */
      +        /**
      +         * Broadcasts when `interactionType` is set to `marker` and a series marker has received a click event.
      +         *
      +         * @event markerEvent:click
      +         * @preventable false
      +         * @param {EventFacade} e Event facade with the following additional
      +         *   properties:
      +         *  <dl>
      +         *      <dt>categoryItem</dt><dd>Hash containing information about the category `Axis`.</dd>
      +         *      <dt>valueItem</dt><dd>Hash containing information about the value `Axis`.</dd>
      +         *      <dt>node</dt><dd>The dom node of the marker.</dd>
      +         *      <dt>x</dt><dd>The x-coordinate of the mouse in relation to the Chart.</dd>
      +         *      <dt>y</dt><dd>The y-coordinate of the mouse in relation to the Chart.</dd>
      +         *      <dt>pageX</dt><dd>The x location of the event on the page (including scroll)</dd>
      +         *      <dt>pageY</dt><dd>The y location of the event on the page (including scroll)</dd>
      +         *      <dt>series</dt><dd>Reference to the series of the marker.</dd>
      +         *      <dt>index</dt><dd>Index of the marker in the series.</dd>
      +         *      <dt>seriesIndex</dt><dd>The `order` of the marker's series.</dd>
      +         *      <dt>originEvent</dt><dd>Underlying dom event.</dd>
      +         *  </dl>
      +         */
      +        this.fire("markerEvent:" + type, {
      +            originEvent: e,
      +            pageX:pageX, 
      +            pageY:pageY, 
      +            categoryItem:items.category, 
      +            valueItem:items.value, 
      +            node:markerNode, 
      +            x:x, 
      +            y:y, 
      +            series:series, 
      +            index:index, 
      +            seriesIndex:seriesIndex
      +        });
      +    },
      +
      +    /**
      +     * Event handler for dataProviderChange.
      +     *
      +     * @method _dataProviderChangeHandler
      +     * @param {Object} e Event object.
      +     * @private
      +     */
      +    _dataProviderChangeHandler: function(e)
      +    {
      +        var dataProvider = this.get("dataProvider"),
      +            axes = this.get("axes"),
      +            i,
      +            axis;
      +        this._seriesIndex = -1;
      +        this._itemIndex = -1;
      +        if(axes)
      +        {
      +            for(i in axes)
      +            {
      +                if(axes.hasOwnProperty(i))
      +                {
      +                    axis = axes[i];
      +                    if(axis instanceof Y.Axis)
      +                    {
      +                        if(axis.get("position") != "none")
      +                        {
      +                            this._addToAxesRenderQueue(axis);
      +                        }
      +                        axis.set("dataProvider", dataProvider);
      +                    }
      +                }
      +            }
      +        }
      +    },
      +    
      +    /**
      +     * Event listener for toggling the tooltip. If a tooltip is visible, hide it. If not, it 
      +     * will create and show a tooltip based on the event object.
      +     * 
      +     * @method toggleTooltip
      +     * @param {Object} e Event object.
      +     */
      +    toggleTooltip: function(e)
      +    {
      +        var tt = this.get("tooltip");
      +        if(tt.visible)
      +        {
      +            this.hideTooltip();
      +        }
      +        else
      +        {
      +            tt.markerEventHandler.apply(this, [e]);
      +        }
      +    },
      +
      +    /**
      +     * Shows a tooltip
      +     *
      +     * @method _showTooltip
      +     * @param {String} msg Message to dispaly in the tooltip.
      +     * @param {Number} x x-coordinate 
      +     * @param {Number} y y-coordinate
      +     * @private
      +     */
      +    _showTooltip: function(msg, x, y)
      +    {
      +        var tt = this.get("tooltip"),
      +            node = tt.node;
      +        if(msg)
      +        {
      +            tt.visible = true;
      +            tt.setTextFunction(node, msg);
      +            node.setStyle("top", y + "px");
      +            node.setStyle("left", x + "px");
      +            node.setStyle("visibility", "visible");
      +        }
      +    },
      +
      +    /**
      +     * Positions the tooltip
      +     *
      +     * @method _positionTooltip
      +     * @param {Object} e Event object.
      +     * @private
      +     */
      +    _positionTooltip: function(e)
      +    {
      +        var tt = this.get("tooltip"),
      +            node = tt.node,
      +            cb = this.get("contentBox"),
      +            x = (e.pageX + 10) - cb.getX(),
      +            y = (e.pageY + 10) - cb.getY();
      +        if(node)
      +        {
      +            node.setStyle("left", x + "px");
      +            node.setStyle("top", y + "px");
      +        }
      +    },
      +
      +    /**
      +     * Hides the default tooltip
      +     *
      +     * @method hideTooltip
      +     */
      +    hideTooltip: function()
      +    {
      +        var tt = this.get("tooltip"),
      +            node = tt.node;
      +        tt.visible = false;
      +        node.set("innerHTML", "");
      +        node.setStyle("left", -10000);
      +        node.setStyle("top", -10000);
      +        node.setStyle("visibility", "hidden");
      +    },
      +
      +    /**
      +     * Adds a tooltip to the dom.
      +     *
      +     * @method _addTooltip
      +     * @private
      +     */
      +    _addTooltip: function()
      +    {
      +        var tt = this.get("tooltip"),
      +            id = this.get("id") + "_tooltip",
      +            cb = this.get("contentBox"),
      +            oldNode = DOCUMENT.getElementById(id);
      +        if(oldNode)
      +        {
      +            cb.removeChild(oldNode);
      +        }
      +        tt.node.set("id", id);
      +        tt.node.setStyle("visibility", "hidden");
      +        cb.appendChild(tt.node);
      +    },
      +
      +    /**
      +     * Updates the tooltip attribute.
      +     *
      +     * @method _updateTooltip
      +     * @param {Object} val Object containing properties for the tooltip.
      +     * @return Object
      +     * @private
      +     */
      +    _updateTooltip: function(val)
      +    {
      +        var tt = this._tooltip,
      +            i,
      +            styles,
      +            node,
      +            props = {
      +                markerLabelFunction:"markerLabelFunction",
      +                planarLabelFunction:"planarLabelFunction",
      +                setTextFunction:"setTextFunction",
      +                showEvent:"showEvent",
      +                hideEvent:"hideEvent",
      +                markerEventHandler:"markerEventHandler",
      +                planarEventHandler:"planarEventHandler",
      +                show:"show"
      +            };
      +        if(Y_Lang.isObject(val))
      +        {
      +            styles = val.styles;
      +            node = Y.one(val.node) || tt.node;
      +            if(styles)
      +            {
      +                for(i in styles)
      +                {
      +                    if(styles.hasOwnProperty(i))
      +                    {
      +                        node.setStyle(i, styles[i]);
      +                    }
      +                }
      +            }
      +            for(i in props)
      +            {
      +                if(val.hasOwnProperty(i))
      +                {
      +                    tt[i] = val[i];
      +                }
      +            }
      +            tt.node = node;
      +        }
      +        return tt;
      +    },
      +
      +    /**
      +     * Default getter for `tooltip` attribute.
      +     *
      +     * @method _getTooltip
      +     * @return Object
      +     * @private
      +     */
      +    _getTooltip: function()
      +    {
      +        var node = DOCUMENT.createElement("div"),
      +            tt = {
      +                setTextFunction: this._setText,
      +                markerLabelFunction: this._tooltipLabelFunction,
      +                planarLabelFunction: this._planarLabelFunction,
      +                show: true,
      +                hideEvent: "mouseout",
      +                showEvent: "mouseover",
      +                markerEventHandler: function(e)
      +                {
      +                    var tt = this.get("tooltip"),
      +                    msg = tt.markerLabelFunction.apply(this, [e.categoryItem, e.valueItem, e.index, e.series, e.seriesIndex]);
      +                    this._showTooltip(msg, e.x + 10, e.y + 10);
      +                },
      +                planarEventHandler: function(e)
      +                {
      +                    var tt = this.get("tooltip"),
      +                        msg ,
      +                        categoryAxis = this.get("categoryAxis");
      +                    msg = tt.planarLabelFunction.apply(this, [categoryAxis, e.valueItem, e.index, e.items, e.seriesIndex]);
      +                    this._showTooltip(msg, e.x + 10, e.y + 10);
      +                }
      +            };
      +        node = Y.one(node);
      +        node.set("id", this.get("id") + "_tooltip");
      +        node.setStyle("fontSize", "85%");
      +        node.setStyle("opacity", "0.83");
      +        node.setStyle("position", "absolute");
      +        node.setStyle("paddingTop", "2px");
      +        node.setStyle("paddingRight", "5px");
      +        node.setStyle("paddingBottom", "4px");
      +        node.setStyle("paddingLeft", "2px");
      +        node.setStyle("backgroundColor", "#fff");
      +        node.setStyle("border", "1px solid #dbdccc");
      +        node.setStyle("pointerEvents", "none");
      +        node.setStyle("zIndex", 3);
      +        node.setStyle("whiteSpace", "noWrap");
      +        node.setStyle("visibility", "hidden");
      +        tt.node = Y.one(node);
      +        this._tooltip = tt;
      +        return tt;
      +    },
      +
      +    /**
      +     * Formats tooltip text when `interactionType` is `planar`.
      +     *
      +     * @method _planarLabelFunction
      +     * @param {Axis} categoryAxis Reference to the categoryAxis of the chart.
      +     * @param {Array} valueItems Array of objects for each series that has a data point in the coordinate plane of the event. Each object contains the following data:
      +     *  <dl>
      +     *      <dt>axis</dt><dd>The value axis of the series.</dd>
      +     *      <dt>key</dt><dd>The key for the series.</dd>
      +     *      <dt>value</dt><dd>The value for the series item.</dd>
      +     *      <dt>displayName</dt><dd>The display name of the series. (defaults to key if not provided)</dd>
      +     *  </dl> 
      +     *  @param {Number} index The index of the item within its series.
      +     *  @param {Array} seriesArray Array of series instances for each value item.
      +     *  @param {Number} seriesIndex The index of the series in the `seriesCollection`.
      +     *  @return {String | HTML} 
      +     * @private
      +     */
      +    _planarLabelFunction: function(categoryAxis, valueItems, index, seriesArray, seriesIndex)
      +    {
      +        var msg = DOCUMENT.createElement("div"),
      +            valueItem,
      +            i = 0,
      +            len = seriesArray.length,
      +            axis,
      +            categoryValue,
      +            seriesValue,
      +            series;
      +        if(categoryAxis)
      +        {
      +            categoryValue = categoryAxis.get("labelFunction").apply(this, [categoryAxis.getKeyValueAt(this.get("categoryKey"), index), categoryAxis.get("labelFormat")]);
      +            if(Y_Lang.isString(categoryValue))
      +            {
      +                categoryValue = DOCUMENT.createTextNode(categoryValue);
      +            }
      +            msg.appendChild(categoryValue);
      +        }
      +
      +        for(; i < len; ++i)
      +        {
      +            series = seriesArray[i];
      +            if(series.get("visible"))
      +            {
      +                valueItem = valueItems[i];
      +                axis = valueItem.axis;
      +                seriesValue =  axis.get("labelFunction").apply(this, [axis.getKeyValueAt(valueItem.key, index), axis.get("labelFormat")]);
      +                msg.appendChild(DOCUMENT.createElement("br"));
      +                msg.appendChild(DOCUMENT.createTextNode(valueItem.displayName));
      +                msg.appendChild(DOCUMENT.createTextNode(": "));
      +                if(Y_Lang.isString(seriesValue))
      +                {
      +                    seriesValue = DOCUMENT.createTextNode(seriesValue);
      +                }
      +                msg.appendChild(seriesValue);
      +            }
      +        }
      +        return msg;
      +    },
      +
      +    /**
      +     * Formats tooltip text when `interactionType` is `marker`.
      +     *
      +     * @method _tooltipLabelFunction
      +     * @param {Object} categoryItem An object containing the following:
      +     *  <dl>
      +     *      <dt>axis</dt><dd>The axis to which the category is bound.</dd>
      +     *      <dt>displayName</dt><dd>The display name set to the category (defaults to key if not provided)</dd>
      +     *      <dt>key</dt><dd>The key of the category.</dd>
      +     *      <dt>value</dt><dd>The value of the category</dd>
      +     *  </dl>
      +     * @param {Object} valueItem An object containing the following:
      +     *  <dl>
      +     *      <dt>axis</dt><dd>The axis to which the item's series is bound.</dd>
      +     *      <dt>displayName</dt><dd>The display name of the series. (defaults to key if not provided)</dd>
      +     *      <dt>key</dt><dd>The key for the series.</dd>
      +     *      <dt>value</dt><dd>The value for the series item.</dd> 
      +     *  </dl>
      +     * @param {Number} itemIndex The index of the item within the series.
      +     * @param {CartesianSeries} series The `CartesianSeries` instance of the item.
      +     * @param {Number} seriesIndex The index of the series in the `seriesCollection`.
      +     * @return {String | HTML}
      +     * @private
      +     */
      +    _tooltipLabelFunction: function(categoryItem, valueItem, itemIndex, series, seriesIndex)
      +    {
      +        var msg = DOCUMENT.createElement("div"),
      +            categoryValue = categoryItem.axis.get("labelFunction").apply(this, [categoryItem.value, categoryItem.axis.get("labelFormat")]),
      +            seriesValue = valueItem.axis.get("labelFunction").apply(this, [valueItem.value, valueItem.axis.get("labelFormat")]);
      +        msg.appendChild(DOCUMENT.createTextNode(categoryItem.displayName)); 
      +        msg.appendChild(DOCUMENT.createTextNode(": ")); 
      +        if(Y_Lang.isString(categoryValue))
      +        {
      +            categoryValue = DOCUMENT.createTextNode(categoryValue);
      +        }
      +        msg.appendChild(categoryValue);
      +        msg.appendChild(DOCUMENT.createElement("br"));
      +        msg.appendChild(DOCUMENT.createTextNode(valueItem.displayName)); 
      +        msg.appendChild(DOCUMENT.createTextNode(": ")); 
      +        if(Y_Lang.isString(seriesValue))
      +        {
      +            seriesValue = DOCUMENT.createTextNode(seriesValue);
      +        }
      +        msg.appendChild(seriesValue);
      +        return msg; 
      +    },
      +
      +    /**
      +     * Event handler for the tooltipChange.
      +     *
      +     * @method _tooltipChangeHandler
      +     * @param {Object} e Event object.
      +     * @private
      +     */
      +    _tooltipChangeHandler: function(e)
      +    {
      +        if(this.get("tooltip"))
      +        {
      +            var tt = this.get("tooltip"),
      +                node = tt.node,
      +                show = tt.show,
      +                cb = this.get("contentBox");
      +            if(node && show)
      +            {
      +                if(!cb.contains(node))
      +                {
      +                    this._addTooltip();
      +                }
      +            }
      +        }
      +    },
      +    
      +    /**
      +     * Updates the content of text field. This method writes a value into a text field using 
      +     * `appendChild`. If the value is a `String`, it is converted to a `TextNode` first. 
      +     *
      +     * @method _setText
      +     * @param label {HTMLElement} label to be updated
      +     * @param val {String} value with which to update the label
      +     * @private
      +     */
      +    _setText: function(textField, val)
      +    { 
      +        textField.setContent("");
      +        if(Y_Lang.isNumber(val))
      +        {
      +            val = val + "";
      +        }
      +        else if(!val)
      +        {
      +            val = "";
      +        }
      +        if(IS_STRING(val))
      +        {
      +            val = DOCUMENT.createTextNode(val);
      +        }
      +        textField.appendChild(val);
      +    }
      +};
      +Y.ChartBase = ChartBase;
      diff --git a/tests/input/charts/ChartLegend.js b/tests/input/charts/ChartLegend.js
      new file mode 100644
      index 00000000..768fbcc8
      --- /dev/null
      +++ b/tests/input/charts/ChartLegend.js
      @@ -0,0 +1,768 @@
      +/**
      + * ChartLegend provides a legend for a chart.
      + *
      + * @class ChartLegend
      + * @module charts
      + * @submodule charts-legend
      + * @extends Widget
      + */
      +Y.ChartLegend = Y.Base.create("chartlegend", Y.Widget, [Y.Renderer], {
      +    /**
      +     * Initializes the chart.
      +     *
      +     * @method initializer
      +     * @private
      +     */
      +    initializer: function()
      +    {
      +        this._items = [];
      +    },
      +
      +    /**
      +     * @method renderUI
      +     * @private
      +     */
      +    renderUI: function()
      +    {
      +        var bb = this.get("boundingBox"),
      +            cb = this.get("contentBox"),
      +            styles = this.get("styles").background,
      +            background = new Y.Rect({
      +                graphic: cb,
      +                fill: styles.fill,
      +                stroke: styles.border
      +            });
      +        bb.setStyle("display", "block");
      +        bb.setStyle("position", "absolute");
      +        this.set("background", background);
      +    },
      +    
      +    /**
      +     * @method bindUI
      +     * @private
      +     */
      +    bindUI: function()
      +    {
      +        this.get("chart").after("seriesCollectionChange", this._updateHandler);
      +        this.after("stylesChange", this._updateHandler);
      +        this.after("positionChange", this._positionChangeHandler);
      +        this.after("widthChange", this._handleSizeChange);
      +        this.after("heightChange", this._handleSizeChange);
      +    },
      +    
      +    /**
      +     * @method syncUI
      +     * @private
      +     */
      +    syncUI: function()
      +    {
      +        var w = this.get("width"),
      +            h = this.get("height");
      +        if(isFinite(w) && isFinite(h) && w > 0 && h > 0)
      +        {
      +            this._drawLegend();
      +        }
      +    },
      +
      +    /**
      +     * Handles changes to legend.
      +     *
      +     * @method _updateHandler
      +     * @param {Object} e Event object
      +     * @private
      +     */
      +    _updateHandler: function(e)
      +    {
      +        if(this.get("rendered"))
      +        {
      +            this._drawLegend();
      +        }
      +    },
      +
      +    /** 
      +     * Handles position changes.
      +     *
      +     * @method _positionChangeHandler
      +     * @parma {Object} e Event object
      +     * @private
      +     */
      +    _positionChangeHandler: function(e)
      +    {
      +        var chart = this.get("chart"),
      +            parentNode = this._parentNode;
      +        if(parentNode && ((chart && this.get("includeInChartLayout"))))
      +        {
      +            this.fire("legendRendered");
      +        }
      +        else if(this.get("rendered"))
      +        {
      +            this._drawLegend();
      +        }
      +    },
      +
      +    /**
      +     * Updates the legend when the size changes.
      +     *
      +     * @method _handleSizeChange
      +     * @param {Object} e Event object.
      +     * @private
      +     */
      +    _handleSizeChange: function(e)
      +    {
      +        var attrName = e.attrName,
      +            pos = this.get(POSITION),
      +            vert = pos == LEFT || pos == RIGHT,
      +            hor = pos == BOTTOM || pos == TOP;
      +        if((hor && attrName == WIDTH) || (vert && attrName == HEIGHT))
      +        {
      +            this._drawLegend();
      +        }
      +    },
      +
      +    /**
      +     * Draws the legend
      +     *
      +     * @method _drawLegend
      +     * @private
      +     */
      +    _drawLegend: function()
      +    {
      +        if(this._drawing)
      +        {
      +            this._callLater = true;
      +            return;
      +        }
      +        this._drawing = true;
      +        this._callLater = false;
      +        if(this.get("includeInChartLayout"))
      +        {
      +            this.get("chart")._itemRenderQueue.unshift(this);
      +        }
      +        var chart = this.get("chart"),
      +            node = this.get("contentBox"),
      +            seriesCollection = chart.get("seriesCollection"),
      +            series,
      +            styles = this.get("styles"),
      +            padding = styles.padding,
      +            itemStyles = styles.item,
      +            seriesStyles,
      +            hSpacing = itemStyles.hSpacing,
      +            vSpacing = itemStyles.vSpacing,
      +            hAlign = styles.hAlign,
      +            vAlign = styles.vAlign,
      +            marker = styles.marker,
      +            labelStyles = itemStyles.label,
      +            displayName,
      +            layout = this._layout[this.get("direction")],
      +            i, 
      +            len,
      +            isArray,
      +            shape,
      +            shapeClass,
      +            item,
      +            fill,
      +            border,
      +            fillColors,
      +            borderColors,
      +            borderWeight,
      +            items = [],
      +            markerWidth = marker.width,
      +            markerHeight = marker.height,
      +            totalWidth = 0 - hSpacing,
      +            totalHeight = 0 - vSpacing,
      +            maxWidth = 0,
      +            maxHeight = 0,
      +            itemWidth,
      +            itemHeight;
      +        if(marker && marker.shape)
      +        {
      +            shape = marker.shape;
      +        }
      +        this._destroyLegendItems();
      +        if(chart instanceof Y.PieChart)
      +        {
      +            series = seriesCollection[0];
      +            displayName = series.get("categoryAxis").getDataByKey(series.get("categoryKey")); 
      +            seriesStyles = series.get("styles").marker;
      +            fillColors = seriesStyles.fill.colors;
      +            borderColors = seriesStyles.border.colors;
      +            borderWeight = seriesStyles.border.weight;
      +            i = 0;
      +            len = displayName.length;
      +            shape = shape || Y.Circle;
      +            isArray = Y.Lang.isArray(shape);
      +            for(; i < len; ++i)
      +            {
      +                shape = isArray ? shape[i] : shape;
      +                fill = {
      +                    color: fillColors[i]
      +                };
      +                border = {
      +                    colors: borderColors[i],
      +                    weight: borderWeight
      +                };
      +                displayName = chart.getSeriesItems(series, i).category.value;
      +                item = this._getLegendItem(node, this._getShapeClass(shape), fill, border, labelStyles, markerWidth, markerHeight, displayName);
      +                itemWidth = item.width;
      +                itemHeight = item.height;
      +                maxWidth = Math.max(maxWidth, itemWidth);
      +                maxHeight = Math.max(maxHeight, itemHeight);
      +                totalWidth += itemWidth + hSpacing;
      +                totalHeight += itemHeight + vSpacing;
      +                items.push(item);
      +            }
      +        }
      +        else
      +        {
      +            i = 0;
      +            len = seriesCollection.length;
      +            for(; i < len; ++i)
      +            {
      +                series = seriesCollection[i];
      +                seriesStyles = this._getStylesBySeriesType(series, shape);
      +                if(!shape)
      +                {
      +                    shape = seriesStyles.shape;
      +                    if(!shape)
      +                    {
      +                        shape = Y.Circle;
      +                    }
      +                }
      +                shapeClass = Y.Lang.isArray(shape) ? shape[i] : shape;
      +                item = this._getLegendItem(node, this._getShapeClass(shape), seriesStyles.fill, seriesStyles.border, labelStyles, markerWidth, markerHeight, series.get("valueDisplayName"));
      +                itemWidth = item.width;
      +                itemHeight = item.height;
      +                maxWidth = Math.max(maxWidth, itemWidth);
      +                maxHeight = Math.max(maxHeight, itemHeight);
      +                totalWidth += itemWidth + hSpacing;
      +                totalHeight += itemHeight + vSpacing;
      +                items.push(item);
      +            }
      +        }
      +        this.set("items", items);
      +        this._drawing = false;
      +        if(this._callLater)
      +        {
      +            this._drawLegend();
      +        }
      +        else
      +        {
      +            layout._positionLegendItems.apply(this, [items, maxWidth, maxHeight, totalWidth, totalHeight, padding, hSpacing, vSpacing, hAlign, vAlign]);
      +            this._updateBackground(styles);
      +            this.fire("legendRendered");
      +        }
      +    },
      +
      +    /**
      +     * Updates the background for the legend.
      +     *
      +     * @method _updateBackground
      +     * @param {Object} styles Reference to the legend's styles attribute
      +     * @private
      +     */
      +    _updateBackground: function(styles)
      +    {
      +        var backgroundStyles = styles.background,
      +            contentRect = this._contentRect,
      +            padding = styles.padding,
      +            x = contentRect.left - padding.left,
      +            y = contentRect.top - padding.top,
      +            w = contentRect.right - x + padding.right,
      +            h = contentRect.bottom - y + padding.bottom;
      +        this.get("background").set({
      +            fill: backgroundStyles.fill,
      +            stroke: backgroundStyles.border,
      +            width: w,
      +            height: h,
      +            x: x,
      +            y: y
      +        });
      +    },
      +
      +    /**
      +     * Retrieves the marker styles based on the type of series. For series that contain a marker, the marker styles are returned.
      +     * 
      +     * @method _getStylesBySeriesType
      +     * @param {CartesianSeries | PieSeries} The series in which the style properties will be received.
      +     * @return Object An object containing fill, border and shape information.
      +     * @private
      +     */
      +    _getStylesBySeriesType: function(series)
      +    {
      +        var styles = series.get("styles");
      +        if(series instanceof Y.LineSeries || series instanceof Y.StackedLineSeries)
      +        {
      +            styles = series.get("styles").line;
      +            return {
      +                border: {
      +                    weight: 1,
      +                    color: styles.color
      +                },
      +                fill: {
      +                    color: styles.color
      +                }
      +            };
      +        }
      +        else if(series instanceof Y.AreaSeries || series instanceof Y.StackedAreaSeries)
      +        {
      +            series = series.get("styles").fill;
      +            return {
      +                border: {
      +                    weight: 1,
      +                    color: styles.color
      +                },
      +                fill: {
      +                    color: styles.color
      +                }
      +            };
      +        }
      +        else 
      +        {
      +            styles = series.get("styles").marker;
      +            return {
      +                fill: styles.fill,
      +
      +                border: {
      +                    weight: styles.border.weight,
      +
      +                    color: styles.border.color,
      +
      +                    shape: styles.shape
      +                },
      +                shape: styles.shape
      +            };
      +        }
      +    },
      +
      +    /**
      +     * Returns a legend item consisting of the following properties:
      +     *  <dl>
      +     *    <dt>node</dt><dd>The `Node` containing the legend item elements.</dd>
      +     *      <dt>shape</dt><dd>The `Shape` element for the legend item.</dd>
      +     *      <dt>textNode</dt><dd>The `Node` containing the text></dd>
      +     *      <dt>text</dt><dd></dd>
      +     *  </dl>
      +     *
      +     * @method _getLegendItem
      +     * @param {Node} shapeProps Reference to the `node` attribute.
      +     * @param {String | Class} shapeClass The type of shape
      +     * @param {Object} fill Properties for the shape's fill
      +     * @param {Object} border Properties for the shape's border
      +     * @param {String} text String to be rendered as the legend's text
      +     * @param {Number} width Total width of the legend item
      +     * @param {Number} height Total height of the legend item
      +     * @param {HTML | String} text Text for the legendItem
      +     * @return Object
      +     * @private
      +     */
      +    _getLegendItem: function(node, shapeClass, fill, border, labelStyles, w, h, text) 
      +    {
      +        var containerNode = Y.one(DOCUMENT.createElement("div")),
      +            textField = Y.one(DOCUMENT.createElement("span")),
      +            shape,
      +            dimension,
      +            padding,
      +            left,
      +            item;
      +        containerNode.setStyle(POSITION, "absolute");
      +        textField.setStyle(POSITION, "absolute");
      +        textField.setStyles(labelStyles);
      +        textField.appendChild(DOCUMENT.createTextNode(text));
      +        containerNode.appendChild(textField);
      +        node.appendChild(containerNode);
      +        dimension = textField.get("offsetHeight");
      +        padding = dimension - h;
      +        left = w + padding + 2;
      +        textField.setStyle("left", left + PX);
      +        containerNode.setStyle("height", dimension + PX);
      +        containerNode.setStyle("width", (left + textField.get("offsetWidth")) + PX);
      +        shape = new shapeClass({
      +            fill: fill,
      +            stroke: border,
      +            width: w,
      +            height: h,
      +            x: padding * 0.5,
      +            y: padding * 0.5,
      +            w: w,
      +            h: h,
      +            graphic: containerNode
      +        });
      +        textField.setStyle("left", dimension + PX);
      +        item = {
      +            node: containerNode,
      +            width: containerNode.get("offsetWidth"),
      +            height: containerNode.get("offsetHeight"),
      +            shape: shape,
      +            textNode: textField,
      +            text: text
      +        };
      +        this._items.push(item);
      +        return item;
      +    },
      +
      +    /**
      +     * Evaluates and returns correct class for drawing a shape.
      +     *
      +     * @method _getShapeClass
      +     * @return Shape
      +     * @private
      +     */
      +    _getShapeClass: function()
      +    {   
      +        var graphic = this.get("background").get("graphic");
      +        return graphic._getShapeClass.apply(graphic, arguments);
      +    },
      +    
      +    /**
      +     * Returns the default hash for the `styles` attribute.
      +     *
      +     * @method _getDefaultStyles
      +     * @return Object
      +     * @protected
      +     */
      +    _getDefaultStyles: function()
      +    {
      +        var styles = { 
      +            padding: {
      +                top: 8,
      +                right: 8,
      +                bottom: 8,
      +                left: 9
      +            },
      +            gap: 10,
      +            hAlign: "center",
      +            vAlign: "top",
      +            marker: this._getPlotDefaults(),
      +            item: {
      +                hSpacing: 10,
      +                vSpacing: 5,
      +                label: {
      +                    color:"#808080",
      +                    fontSize:"85%"
      +                }
      +            },
      +            background: {
      +                shape: "rect",
      +                fill:{
      +                    color:"#faf9f2"
      +                },
      +                border: {
      +                    color:"#dad8c9",
      +                    weight: 1
      +                }
      +            }
      +        };
      +        return styles;
      +    },
      +
      +    /**
      +     * Gets the default values for series that use the utility. This method is used by
      +     * the class' `styles` attribute's getter to get build default values.
      +     *
      +     * @method _getPlotDefaults
      +     * @return Object
      +     * @protected
      +     */
      +    _getPlotDefaults: function()
      +    {
      +        var defs = {
      +            width: 10,
      +            height: 10
      +        };
      +        return defs;
      +    },
      +
      +    /**
      +     * Destroys legend items.
      +     *
      +     * @method _destroyLegendItems
      +     * @private
      +     */
      +    _destroyLegendItems: function()
      +    {
      +        var item;
      +        if(this._items)
      +        {
      +            while(this._items.length > 0)
      +            {
      +                item = this._items.shift();
      +                item.shape.get("graphic").destroy();
      +                item.node.empty();
      +                item.node.remove(true);
      +                item = null;
      +            }
      +        }
      +        this._items = [];
      +    },
      +
      +    /**
      +     * Maps layout classes.
      +     *
      +     * @property _layout
      +     * @private
      +     */
      +    _layout: {
      +        vertical: VerticalLegendLayout,
      +        horizontal: HorizontalLegendLayout
      +    },
      +
      +    /**
      +     * Destructor implementation ChartLegend class. Removes all items and the Graphic instance from the widget.
      +     *
      +     * @method destructor
      +     * @protected
      +     */
      +    destructor: function()
      +    {
      +        var graphic = this.get("graphic");
      +        this._destroyLegendItems();
      +        if(graphic)
      +        {
      +            graphic.destroy();
      +        }
      +    }
      +}, {
      +    ATTRS: {
      +        /**
      +         * Indicates whether the chart's contentBox is the parentNode for the legend.
      +         *
      +         * @attribute includeInChartLayout
      +         * @type Boolean
      +         * @private
      +         */
      +        includeInChartLayout: {
      +            value: false
      +        },
      +
      +        /**
      +         * Reference to the `Chart` instance.
      +         *
      +         * @attribute chart
      +         * @type Chart
      +         */
      +        chart: {
      +            setter: function(val)
      +            {
      +                this.after("legendRendered", Y.bind(val._itemRendered, val));
      +                return val;
      +            }
      +        },
      +
      +        /**
      +         * Indicates the direction in relation of the legend's layout. The `direction` of the legend is determined by its
      +         * `position` value.
      +         *
      +         * @attribute direction
      +         * @type String
      +         */
      +        direction: {
      +            value: "vertical"
      +        },
      +       
      +        /**
      +         * Indicates the position and direction of the legend. Possible values are `left`, `top`, `right` and `bottom`. Values of `left` and
      +         * `right` values have a `direction` of `vertical`. Values of `top` and `bottom` values have a `direction` of `horizontal`.
      +         *
      +         * @attribute position
      +         * @type String
      +         */
      +        position: {
      +            lazyAdd: false,
      +
      +            value: "right",
      +
      +            setter: function(val)
      +            {
      +                if(val == TOP || val == BOTTOM)
      +                {
      +                    this.set("direction", HORIZONTAL);
      +                }
      +                else if(val == LEFT || val == RIGHT)
      +                {
      +                    this.set("direction", VERTICAL);
      +                }
      +                return val;
      +            }
      +        },
      + 
      +        /**
      +         * The width of the legend. Depending on the implementation of the ChartLegend, this value is `readOnly`. By default, the legend is included in the layout of the `Chart` that 
      +         * it references. Under this circumstance, `width` is always `readOnly`. When the legend is rendered in its own dom element, the `readOnly` status is determined by the 
      +         * direction of the legend. If the `position` is `left` or `right` or the `direction` is `vertical`, width is `readOnly`. If the position is `top` or `bottom` or the `direction`
      +         * is `horizontal`, width can be explicitly set. If width is not explicitly set, the width will be determined by the width of the legend's parent element.
      +         *
      +         * @attribute width
      +         * @type Number
      +         */
      +        width: {
      +            getter: function()
      +            {
      +                var chart = this.get("chart"),
      +                    parentNode = this._parentNode;
      +                if(parentNode)
      +                {
      +                    if((chart && this.get("includeInChartLayout")) || this._width)
      +                    {
      +                        if(!this._width)
      +                        {
      +                            this._width = 0;
      +                        }
      +                        return this._width;
      +                    }
      +                    else
      +                    {
      +                        return parentNode.get("offsetWidth");
      +                    }
      +                }
      +                return "";
      +            },
      +
      +            setter: function(val)
      +            {
      +                this._width = val;
      +                return val;
      +            }
      +        },
      +
      +        /**
      +         * The height of the legend. Depending on the implementation of the ChartLegend, this value is `readOnly`. By default, the legend is included in the layout of the `Chart` that 
      +         * it references. Under this circumstance, `height` is always `readOnly`. When the legend is rendered in its own dom element, the `readOnly` status is determined by the 
      +         * direction of the legend. If the `position` is `top` or `bottom` or the `direction` is `horizontal`, height is `readOnly`. If the position is `left` or `right` or the `direction`
      +         * is `vertical`, height can be explicitly set. If height is not explicitly set, the height will be determined by the width of the legend's parent element.
      +         *
      +         * @attribute height 
      +         * @type Number
      +         */
      +        height: {
      +            valueFn: "_heightGetter",
      +
      +            getter: function()
      +            {
      +                var chart = this.get("chart"),
      +                    parentNode = this._parentNode;
      +                if(parentNode) 
      +                {
      +                    if((chart && this.get("includeInChartLayout")) || this._height)
      +                    {
      +                        if(!this._height)
      +                        {
      +                            this._height = 0;
      +                        }
      +                        return this._height;
      +                    }
      +                    else
      +                    {
      +                        return parentNode.get("offsetHeight");
      +                    }
      +                }
      +                return "";
      +            },
      +
      +            setter: function(val)
      +            {
      +                this._height = val;
      +                return val;
      +            }
      +        },
      +
      +        /**
      +         * Indicates the x position of legend.
      +         *
      +         * @attribute x
      +         * @type Number
      +         * @readOnly
      +         */
      +        x: {
      +            lazyAdd: false,
      +
      +            value: 0,
      +            
      +            setter: function(val)
      +            {
      +                var node = this.get("boundingBox");
      +                if(node)
      +                {
      +                    node.setStyle(LEFT, val + PX);
      +                }
      +                return val;
      +            }
      +        },
      +
      +        /**
      +         * Indicates the y position of legend.
      +         *
      +         * @attribute y
      +         * @type Number
      +         * @readOnly
      +         */
      +        y: {
      +            lazyAdd: false,
      +
      +            value: 0,
      +            
      +            setter: function(val)
      +            {
      +                var node = this.get("boundingBox");
      +                if(node)
      +                {
      +                    node.setStyle(TOP, val + PX);
      +                }
      +                return val;
      +            }
      +        },
      +
      +        /**
      +         * Background for the legend.
      +         *
      +         * @attribute background
      +         * @type Rect
      +         */
      +        background: {}
      +
      +        /**
      +         * Properties used to display and style the ChartLegend.  This attribute is inherited from `Renderer`. Below are the default values:
      +         *
      +         *  <dl>
      +         *      <dt>gap</dt><dd>Distance, in pixels, between the `ChartLegend` instance and the chart's content. When `ChartLegend` is rendered within a `Chart` instance this value is applied.</dd>
      +         *      <dt>hAlign</dt><dd>Defines the horizontal alignment of the `items` in a `ChartLegend` rendered in a horizontal direction. This value is applied when the instance's `position` is set to top or bottom. This attribute can be set to left, center or right. The default value is center.</dd>
      +         *      <dt>vAlign</dt><dd>Defines the vertical alignment of the `items` in a `ChartLegend` rendered in vertical direction. This value is applied when the instance's `position` is set to left or right. The attribute can be set to top, middle or bottom. The default value is middle.</dd>
      +         *      <dt>item</dt><dd>Set of style properties applied to the `items` of the `ChartLegend`.
      +         *          <dl>
      +         *              <dt>hSpacing</dt><dd>Horizontal distance, in pixels, between legend `items`.</dd>
      +         *              <dt>vSpacing</dt><dd>Vertical distance, in pixels, between legend `items`.</dd>
      +         *              <dt>label</dt><dd>Properties for the text of an `item`.
      +         *                  <dl>
      +         *                      <dt>color</dt><dd>Color of the text. The default values is "#808080".</dd>
      +         *                      <dt>fontSize</dt><dd>Font size for the text. The default value is "85%".</dd>
      +         *                  </dl>
      +         *              </dd>
      +         *              <dt>marker</dt><dd>Properties for the `item` markers.
      +         *                  <dl>
      +         *                      <dt>width</dt><dd>Specifies the width of the markers.</dd>
      +         *                      <dt>height</dt><dd>Specifies the height of the markers.</dd>
      +         *                  </dl>
      +         *              </dd>
      +         *          </dl>
      +         *      </dd>
      +         *      <dt>background</dt><dd>Properties for the `ChartLegend` background.
      +         *          <dl>
      +         *              <dt>fill</dt><dd>Properties for the background fill.
      +         *                  <dl>
      +         *                      <dt>color</dt><dd>Color for the fill. The default value is "#faf9f2".</dd>
      +         *                  </dl>
      +         *              </dd>
      +         *              <dt>border</dt><dd>Properties for the background border.
      +         *                  <dl>
      +         *                      <dt>color</dt><dd>Color for the border. The default value is "#dad8c9".</dd>
      +         *                      <dt>weight</dt><dd>Weight of the border. The default values is 1.</dd>
      +         *                  </dl>
      +         *              </dd>
      +         *          </dl>
      +         *      </dd>
      +         * </dl>
      +         *
      +         * @attribute styles
      +         * @type Object
      +         */
      +    }
      +});
      diff --git a/tests/input/charts/CircleGroup.js b/tests/input/charts/CircleGroup.js
      new file mode 100755
      index 00000000..26021206
      --- /dev/null
      +++ b/tests/input/charts/CircleGroup.js
      @@ -0,0 +1,59 @@
      +/**
      + * Abstract class for creating groups of circles with the same styles and dimensions.
      + *
      + * @module graphics
      + * @class GroupCircle
      + * @constructor
      + */
      + CircleGroup = function(cfg)
      + {
      +    CircleGroup.superclass.constructor.apply(this, arguments);
      + };
      +    
      + CircleGroup.NAME = "circleGroup";
      +
      + Y.extend(CircleGroup, Y.ShapeGroup, {    
      +    /**
      +     * Algorithm for drawing shape.
      +     *
      +     * @method drawShape
      +     * @param {Object} cfg Parameters used to draw the shape.
      +     */
      +    drawShape: function(cfg)
      +    {
      +        this.drawCircle(cfg.x, cfg.y, cfg.radius);
      +    }
      + });
      +
      +CircleGroup.ATTRS = Y.merge(Y.ShapeGroup.ATTRS, {
      +    dimensions: {
      +        getter: function()
      +        {
      +            var dimensions = this._dimensions,
      +                radius,
      +                yRadius,
      +                width,
      +                height;
      +            if(dimensions.hasOwnProperty("radius"))
      +            {
      +                return dimensions;
      +            }
      +            else
      +            {
      +                width = dimensions.width;
      +                height = dimensions.height;
      +                radius = Y_Lang.isArray(width) ? this._getRadiusCollection(width) : (width * 0.5);
      +                yRadius = radius;
      +                return {
      +                    width: width,
      +                    height: height,
      +                    radius: radius,
      +                    yRadius: yRadius
      +                };
      +            }
      +        }
      +    }
      +});
      +    
      +CircleGroup.ATTRS = Y.ShapeGroup.ATTRS;
      +Y.CircleGroup = CircleGroup;
      diff --git a/tests/input/charts/ColumnSeries.js b/tests/input/charts/ColumnSeries.js
      new file mode 100644
      index 00000000..d3dab589
      --- /dev/null
      +++ b/tests/input/charts/ColumnSeries.js
      @@ -0,0 +1,149 @@
      +/**
      + * The ColumnSeries class renders columns positioned horizontally along a category or time axis. The columns'
      + * lengths are proportional to the values they represent along a vertical axis.
      + * and the relevant data points.
      + *
      + * @module charts
      + * @class ColumnSeries
      + * @extends MarkerSeries
      + * @uses Histogram
      + * @constructor
      + */
      +Y.ColumnSeries = Y.Base.create("columnSeries", Y.MarkerSeries, [Y.Histogram], {
      +    /**
      +     * Helper method for calculating the size of markers. 
      +     *
      +     * @method _getMarkerDimensions
      +     * @param {Number} xcoord The x-coordinate representing the data point for the marker.
      +     * @param {Number} ycoord The y-coordinate representing the data point for the marker.
      +     * @param {Number} calculatedSize The calculated size for the marker. For a `BarSeries` is it the width. For a `ColumnSeries` it is the height.
      +     * @param {Number} offset Distance of position offset dictated by other marker series in the same graph.
      +     * @return Object
      +     * @private
      +     */
      +    _getMarkerDimensions: function(xcoord, ycoord, calculatedSize, offset)
      +    {
      +        var config = {
      +            left: xcoord + offset
      +        };
      +        if(this._bottomOrigin >= ycoord)
      +        {
      +            config.top = ycoord;
      +            config.calculatedSize = this._bottomOrigin - config.top;
      +        }
      +        else
      +        {
      +            config.top = this._bottomOrigin;
      +            config.calculatedSize = ycoord - this._bottomOrigin;
      +        }
      +        return config;
      +    },
      +
      +    /**
      +     * Resizes and positions markers based on a mouse interaction.
      +     *
      +     * @method updateMarkerState
      +     * @param {String} type state of the marker
      +     * @param {Number} i index of the marker
      +     * @protected
      +     */
      +    updateMarkerState: function(type, i)
      +    {
      +        if(this._markers && this._markers[i])
      +        {
      +            var styles = Y.clone(this.get("styles").marker),
      +                markerStyles,
      +                state = this._getState(type),
      +                xcoords = this.get("xcoords"),
      +                ycoords = this.get("ycoords"),
      +                marker = this._markers[i],
      +                markers,
      +                graph = this.get("graph"),
      +                seriesStyles,
      +                seriesCollection = graph.seriesTypes[this.get("type")],
      +                seriesLen = seriesCollection.length,
      +                seriesSize = 0,
      +                offset = 0,
      +                renderer,
      +                n = 0,
      +                xs = [],
      +                order = this.get("order"),
      +                config;
      +            markerStyles = state == "off" || !styles[state] ? Y.clone(styles) : Y.clone(styles[state]); 
      +            markerStyles.fill.color = this._getItemColor(markerStyles.fill.color, i);
      +            markerStyles.border.color = this._getItemColor(markerStyles.border.color, i);
      +            config = this._getMarkerDimensions(xcoords[i], ycoords[i], styles.width, offset);
      +            markerStyles.height = config.calculatedSize;
      +            markerStyles.width = Math.min(this._maxSize, markerStyles.width);
      +            marker.set(markerStyles);
      +            for(; n < seriesLen; ++n)
      +            {
      +                xs[n] = xcoords[i] + seriesSize;
      +                seriesStyles = seriesCollection[n].get("styles").marker;
      +                seriesSize += Math.min(this._maxSize, seriesStyles.width);
      +                if(order > n)
      +                {
      +                    offset = seriesSize;
      +                }
      +                offset -= seriesSize/2;
      +            }
      +            for(n = 0; n < seriesLen; ++n)
      +            {
      +                markers = seriesCollection[n].get("markers");
      +                if(markers)
      +                {
      +                    renderer = markers[i];
      +                    if(renderer && renderer !== undefined)
      +                    {
      +                        renderer.set("x", (xs[n] - seriesSize/2));
      +                    }
      +                }
      +            }
      +        }
      +    }
      +}, {
      +    ATTRS: {
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @readOnly
      +         * @default column
      +         */
      +        type: {
      +            value: "column"
      +        }
      +        
      +        /**
      +         * Style properties used for drawing markers. This attribute is inherited from `MarkerSeries`. Below are the default values:
      +         *  <dl>
      +         *      <dt>fill</dt><dd>A hash containing the following values:
      +         *          <dl>
      +         *              <dt>color</dt><dd>Color of the fill. The default value is determined by the order of the series on the graph. The color
      +         *              will be retrieved from the below array:<br/>
      +         *              `["#66007f", "#a86f41", "#295454", "#996ab2", "#e8cdb7", "#90bdbd","#000000","#c3b8ca", "#968373", "#678585"]`
      +         *              </dd>
      +         *              <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the marker fill. The default value is 1.</dd>
      +         *          </dl>
      +         *      </dd>
      +         *      <dt>border</dt><dd>A hash containing the following values:
      +         *          <dl>
      +         *              <dt>color</dt><dd>Color of the border. The default value is determined by the order of the series on the graph. The color
      +         *              will be retrieved from the below array:<br/>
      +         *              `["#205096", "#b38206", "#000000", "#94001e", "#9d6fa0", "#e55b00", "#5e85c9", "#adab9e", "#6ac291", "#006457"]`
      +         *              <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the marker border. The default value is 1.</dd>
      +         *              <dt>weight</dt><dd>Number indicating the width of the border. The default value is 1.</dd>
      +         *          </dl>
      +         *      </dd>
      +         *      <dt>width</dt><dd>indicates the width of the marker. The default value is 12.</dd>
      +         *      <dt>over</dt><dd>hash containing styles for markers when highlighted by a `mouseover` event. The default 
      +         *      values for each style is null. When an over style is not set, the non-over value will be used. For example,
      +         *      the default value for `marker.over.fill.color` is equivalent to `marker.fill.color`.</dd>
      +         *  </dl>
      +         *
      +         * @attribute styles
      +         * @type Object
      +         */
      +    }
      +});
      diff --git a/tests/input/charts/ComboSeries.js b/tests/input/charts/ComboSeries.js
      new file mode 100644
      index 00000000..4ddee658
      --- /dev/null
      +++ b/tests/input/charts/ComboSeries.js
      @@ -0,0 +1,267 @@
      +/**
      + * The ComboSeries class renders a combination of lines, plots and area fills in a single series. Each
      + * series type has a corresponding boolean attribute indicating if it is rendered. By default, lines and plots 
      + * are rendered and area is not. 
      + *
      + * @module charts
      + * @class ComboSeries
      + * @extends CartesianSeries 
      + * @uses Fills
      + * @uses Lines
      + * @uses Plots
      + * @constructor
      + */
      +Y.ComboSeries = Y.Base.create("comboSeries", Y.CartesianSeries, [Y.Fills, Y.Lines, Y.Plots], {
      +	/**
      +     * @protected
      +     * 
      +     * Draws the series.
      +     *
      +     * @method drawSeries
      +     */
      +    drawSeries: function()
      +    {
      +        if(this.get("showAreaFill"))
      +        {
      +            this.drawFill.apply(this, this._getClosingPoints());
      +        }
      +        if(this.get("showLines")) 
      +        {
      +            this.drawLines();
      +        }
      +        if(this.get("showMarkers"))
      +        {
      +            this.drawPlots();
      +        }   
      +    },
      +    
      +    /**
      +     * Toggles visibility
      +     *
      +     * @method _toggleVisible
      +     * @param {Boolean} visible indicates visibilitye
      +     * @private
      +     */
      +    _toggleVisible: function(visible)
      +    {
      +        var markers,
      +            marker,
      +            len,
      +            i;
      +        if(this.get("showAreaFill") && this._path)
      +        {
      +            this._path.set("visible", visible);
      +        }
      +        if(this.get("showLines") && this._lineGraphic)
      +        {
      +            this._lineGraphic.set("visible", visible);
      +        }
      +        if(this.get("showMarkers"))
      +        {
      +            markers = this.get("markers");
      +            if(markers)
      +            {
      +                i = 0;
      +                len = markers.length;
      +                for(; i < len; ++i)
      +                {
      +                    marker = markers[i];
      +                    if(marker)
      +                    {
      +                        marker.set("visible", visible);
      +                    }
      +                }
      +            }
      +        }
      +    },
      +
      +    /**
      +     * @protected
      +     *
      +     * Returns the default hash for the `styles` attribute.
      +     *
      +     * @method _getDefaultStyles
      +     * @return Object
      +     */
      +    _getDefaultStyles: function()
      +    {
      +        var styles = Y.ComboSeries.superclass._getDefaultStyles();
      +        styles.line = this._getLineDefaults();
      +        styles.marker = this._getPlotDefaults();
      +        styles.area = this._getAreaDefaults();
      +        return styles;
      +    }
      +},
      +{
      +    ATTRS: {
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @default combo
      +         */
      +        type: {
      +            value:"combo"
      +        },
      +
      +        /**
      +         * Indicates whether a fill is displayed.
      +         *
      +         * @attribute showAreaFill
      +         * @type Boolean
      +         * @default false
      +         */
      +        showAreaFill: {
      +            value: false
      +        },
      +
      +        /**
      +         * Indicates whether lines are displayed.
      +         *
      +         * @attribute showLines
      +         * @type Boolean
      +         * @default true
      +         */
      +        showLines: {
      +            value: true
      +        },
      +
      +        /**
      +         * Indicates whether markers are displayed.
      +         *
      +         * @attribute showMarkers
      +         * @type Boolean
      +         * @default true
      +         */
      +        showMarkers: {
      +            value: true
      +        },
      +
      +        /**
      +         * Reference to the styles of the markers. These styles can also
      +         * be accessed through the `styles` attribute. Below are default
      +         * values:
      +         *  <dl>
      +         *      <dt>fill</dt><dd>A hash containing the following values:
      +         *          <dl>
      +         *              <dt>color</dt><dd>Color of the fill. The default value is determined by the order of the series on the graph. The color
      +         *              will be retrieved from the below array:<br/>
      +         *              `["#6084d0", "#eeb647", "#6c6b5f", "#d6484f", "#ce9ed1", "#ff9f3b", "#93b7ff", "#e0ddd0", "#94ecba", "#309687"]`
      +         *              </dd>
      +         *              <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the marker fill. The default value is 1.</dd>
      +         *          </dl>
      +         *      </dd>
      +         *      <dt>border</dt><dd>A hash containing the following values:
      +         *          <dl>
      +         *              <dt>color</dt><dd>Color of the border. The default value is determined by the order of the series on the graph. The color
      +         *              will be retrieved from the below array:<br/>
      +         *              `["#205096", "#b38206", "#000000", "#94001e", "#9d6fa0", "#e55b00", "#5e85c9", "#adab9e", "#6ac291", "#006457"]`
      +         *              <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the marker border. The default value is 1.</dd>
      +         *              <dt>weight</dt><dd>Number indicating the width of the border. The default value is 1.</dd>
      +         *          </dl>
      +         *      </dd>
      +         *      <dt>width</dt><dd>indicates the width of the marker. The default value is 10.</dd>
      +         *      <dt>height</dt><dd>indicates the height of the marker The default value is 10.</dd>
      +         *      <dt>over</dt><dd>hash containing styles for markers when highlighted by a `mouseover` event. The default 
      +         *      values for each style is null. When an over style is not set, the non-over value will be used. For example,
      +         *      the default value for `marker.over.fill.color` is equivalent to `marker.fill.color`.</dd>
      +         *  </dl>
      +         *
      +         * @attribute marker
      +         * @type Object
      +         */
      +        marker: {
      +            lazyAdd: false,
      +            getter: function()
      +            {
      +                return this.get("styles").marker;
      +            },
      +            setter: function(val)
      +            {
      +                this.set("styles", {marker:val});
      +            }
      +        },
      +        
      +        /**
      +         * Reference to the styles of the lines. These styles can also be accessed through the `styles` attribute.
      +         * Below are the default values:
      +         *  <dl>
      +         *      <dt>color</dt><dd>The color of the line. The default value is determined by the order of the series on the graph. The color will be
      +         *      retrieved from the following array: 
      +         *      `["#426ab3", "#d09b2c", "#000000", "#b82837", "#b384b5", "#ff7200", "#779de3", "#cbc8ba", "#7ed7a6", "#007a6c"]`
      +         *      <dt>weight</dt><dd>Number that indicates the width of the line. The default value is 6.</dd>
      +         *      <dt>alpha</dt><dd>Number between 0 and 1 that indicates the opacity of the line. The default value is 1.</dd>
      +         *      <dt>lineType</dt><dd>Indicates whether the line is solid or dashed. The default value is solid.</dd> 
      +         *      <dt>dashLength</dt><dd>When the `lineType` is dashed, indicates the length of the dash. The default value is 10.</dd>
      +         *      <dt>gapSpace</dt><dd>When the `lineType` is dashed, indicates the distance between dashes. The default value is 10.</dd>
      +         *      <dt>connectDiscontinuousPoints</dt><dd>Indicates whether or not to connect lines when there is a missing or null value between points. The default value is true.</dd> 
      +         *      <dt>discontinuousType</dt><dd>Indicates whether the line between discontinuous points is solid or dashed. The default value is solid.</dd>
      +         *      <dt>discontinuousDashLength</dt><dd>When the `discontinuousType` is dashed, indicates the length of the dash. The default value is 10.</dd>
      +         *      <dt>discontinuousGapSpace</dt><dd>When the `discontinuousType` is dashed, indicates the distance between dashes. The default value is 10.</dd>
      +         *  </dl>
      +         *
      +         * @attribute line
      +         * @type Object
      +         */
      +        line: {
      +            lazyAdd: false,
      +            getter: function()
      +            {
      +                return this.get("styles").line;
      +            },
      +            setter: function(val)
      +            {
      +                this.set("styles", {line:val});
      +            }
      +        },
      +        
      +        /**
      +         * Reference to the styles of the area fills. These styles can also be accessed through the `styles` attribute.
      +         * Below are the default values:
      +         *
      +         *  <dl>
      +         *      <dt>color</dt><dd>The color of the fill. The default value is determined by the order of the series on the graph. The color will be 
      +         *      retrieved from the following array:
      +         *      `["#66007f", "#a86f41", "#295454", "#996ab2", "#e8cdb7", "#90bdbd","#000000","#c3b8ca", "#968373", "#678585"]`
      +         *      </dd>
      +         *      <dt>alpha</dt><dd>Number between 0 and 1 that indicates the opacity of the fill. The default value is 1</dd>
      +         *  </dl>
      +         *
      +         * @attribute area
      +         * @type Object
      +         */
      +        area: {
      +            lazyAdd: false,
      +            getter: function()
      +            {
      +                return this.get("styles").area;
      +            },
      +            setter: function(val)
      +            {
      +                this.set("styles", {area:val});
      +            }
      +        }
      +
      +        /**
      +         * Style properties for the series. Contains a key indexed hash of the following:
      +         *  <dl>
      +         *      <dt>marker</dt><dd>Style properties for the markers in the series. Specific style attributes are listed
      +         *      <a href="#attr_marker">here</a>.</dd>
      +         *      <dt>line</dt><dd>Style properties for the lines in the series. Specific
      +         *      style attributes are listed <a href="#attr_line">here</a>.</dd>
      +         *      <dt>area</dt><dd>Style properties for the area fills in the series. Specific style attributes are listed
      +         *      <a href="#attr_area">here</a>.</dd>
      +         *  </dl>
      +         *
      +         * @attribute styles
      +         * @type Object
      +         */
      +    }
      +});
      +
      +
      +
      +		
      +
      +		
      diff --git a/tests/input/charts/ComboSplineSeries.js b/tests/input/charts/ComboSplineSeries.js
      new file mode 100644
      index 00000000..f1bd37a2
      --- /dev/null
      +++ b/tests/input/charts/ComboSplineSeries.js
      @@ -0,0 +1,48 @@
      +/**
      + * The ComboSplineSeries class renders a combination of splines, plots and areaspline fills in a single series. Each
      + * series type has a corresponding boolean attribute indicating if it is rendered. By default, splines and plots 
      + * are rendered and areaspline is not. 
      + *
      + * @module charts
      + * @class ComboSplineSeries
      + * @extends ComboSeries
      + * @extends CurveUtil
      + * @constructor
      + */
      +Y.ComboSplineSeries = Y.Base.create("comboSplineSeries", Y.ComboSeries, [Y.CurveUtil], {
      +    /**
      +     * @protected
      +     * 
      +     * Draws the series.
      +     *
      +     * @method drawSeries
      +     */
      +    drawSeries: function()
      +    {
      +        if(this.get("showAreaFill"))
      +        {
      +            this.drawAreaSpline();
      +        }
      +        if(this.get("showLines")) 
      +        {
      +            this.drawSpline();
      +        }
      +        if(this.get("showMarkers"))
      +        {
      +            this.drawPlots();
      +        }   
      +    }
      +}, {
      +    ATTRS: {
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @default comboSpline
      +         */
      +        type: {
      +            value : "comboSpline"
      +        }
      +    }
      +});
      diff --git a/tests/input/charts/CurveUtil.js b/tests/input/charts/CurveUtil.js
      new file mode 100644
      index 00000000..551a6f6d
      --- /dev/null
      +++ b/tests/input/charts/CurveUtil.js
      @@ -0,0 +1,119 @@
      +/**
      + * Utility class used for calculating curve points.
      + *
      + * @module charts
      + * @class CurveUtil
      + * @constructor
      + */
      +function CurveUtil()
      +{
      +}
      +
      +CurveUtil.prototype = {
      +    /**
      +     * Creates an array of start, end and control points for splines.
      +     *
      +     * @method getCurveControlPoints
      +     * @param {Array} xcoords Collection of x-coordinates used for calculate the curves
      +     * @param {Array} ycoords Collection of y-coordinates used for calculate the curves
      +     * @return Object
      +     * @protected
      +     */
      +    getCurveControlPoints: function(xcoords, ycoords) 
      +    {
      +		var outpoints = [],
      +            i = 1,
      +            l = xcoords.length - 1,
      +		    xvals = [],
      +		    yvals = [];
      +		
      +		
      +		// Too few points, need at least two
      +		if (l < 1) 
      +        {
      +			return null;
      +		} 
      +        
      +        outpoints[0] = {
      +            startx: xcoords[0], 
      +            starty: ycoords[0],
      +            endx: xcoords[1],
      +            endy: ycoords[1]
      +        };
      +        
      +		// Special case, the Bezier should be a straight line
      +        if (l === 1) 
      +        {
      +			outpoints[0].ctrlx1 = (2.0*xcoords[0] + xcoords[1])/3.0;  
      +			outpoints[0].ctrly2 = (2.0*ycoords[0] + ycoords[1])/3.0;
      +			outpoints[0].ctrlx2 = 2.0*outpoints[0].ctrlx1 - xcoords[0];
      +            outpoints[0].ctrly2 = 2.0*outpoints[0].ctrly1 - ycoords[0];
      +            return outpoints;
      +		}
      +
      +		for (; i < l; ++i) 
      +        {
      +			outpoints.push({startx: Math.round(xcoords[i]), starty: Math.round(ycoords[i]), endx: Math.round(xcoords[i+1]), endy: Math.round(ycoords[i+1])});
      +			xvals[i] = 4.0 * xcoords[i] + 2*xcoords[i+1];
      +			yvals[i] = 4.0*ycoords[i] + 2*ycoords[i+1];
      +		}
      +		
      +		xvals[0] = xcoords[0] + (2.0 * xcoords[1]);
      +		xvals[l-1] = (8.0 * xcoords[l-1] + xcoords[l]) / 2.0;
      +		xvals = this.getControlPoints(xvals.concat());
      +        yvals[0] = ycoords[0] + (2.0 * ycoords[1]);
      +		yvals[l-1] = (8.0 * ycoords[l-1] + ycoords[l]) / 2.0;	
      +		yvals = this.getControlPoints(yvals.concat());
      +		
      +        for (i = 0; i < l; ++i) 
      +        {
      +			outpoints[i].ctrlx1 = Math.round(xvals[i]);
      +            outpoints[i].ctrly1 = Math.round(yvals[i]);
      +			
      +			if (i < l-1) 
      +            {
      +				outpoints[i].ctrlx2 = Math.round(2*xcoords[i+1] - xvals[i+1]);
      +                outpoints[i].ctrly2 = Math.round(2*ycoords[i+1] - yvals[i+1]);
      +			}
      +			else 
      +            {
      +				outpoints[i].ctrlx2 = Math.round((xcoords[l] + xvals[l-1])/2);
      +                outpoints[i].ctrly2 = Math.round((ycoords[l] + yvals[l-1])/2);
      +			}
      +		}
      +		
      +		return outpoints;	
      +	},
      +
      +    /**
      +     * Gets the control points for the curve.
      +     *
      +     * @method getControlPoints
      +     * @param {Array} vals Collection of values coords used to generate control points.
      +     * @return Array
      +     * @private
      +     */
      +	getControlPoints: function(vals) 
      +    {
      +		var l = vals.length,
      +            x = [],
      +            tmp = [],
      +            b = 2.0,
      +            i = 1;
      +		x[0] = vals[0] / b;
      +		for (; i < l; ++i) 
      +        {
      +			tmp[i] = 1/b;
      +			b = (i < l-1 ? 4.0 : 3.5) - tmp[i];
      +			x[i] = (vals[i] - x[i-1]) / b;
      +		}
      +		
      +		for (i = 1; i < l; ++i) 
      +        {
      +			x[l-i-1] -= tmp[l-i] * x[l-i];
      +		}
      +		
      +		return x;
      +	}
      +};
      +Y.CurveUtil = CurveUtil;
      diff --git a/tests/input/charts/DiamondGroup.js b/tests/input/charts/DiamondGroup.js
      new file mode 100755
      index 00000000..dc34cdc0
      --- /dev/null
      +++ b/tests/input/charts/DiamondGroup.js
      @@ -0,0 +1,29 @@
      +/**
      + * Abstract class for creating groups of diamonds with the same styles and dimensions.
      + *
      + * @module graphics
      + * @class GroupDiamond
      + * @constructor
      + */
      + DiamondGroup = function(cfg)
      + {
      +    DiamondGroup.superclass.constructor.apply(this, arguments);
      + };
      +    
      + DiamondGroup.NAME = "diamondGroup";
      +
      + Y.extend(DiamondGroup, Y.ShapeGroup, {    
      +    /**
      +     * Updates the diamond.
      +     *
      +     * @method _draw
      +     * @private
      +     */
      +    drawShape: function(cfg)
      +    {
      +        this.drawDiamond(cfg.x, cfg.y, cfg.width, cfg.height);
      +    }
      + });
      +    
      +DiamondGroup.ATTRS = Y.ShapeGroup.ATTRS;
      +Y.DiamondGroup = DiamondGroup;
      diff --git a/tests/input/charts/EllipseGroup.js b/tests/input/charts/EllipseGroup.js
      new file mode 100755
      index 00000000..648804ff
      --- /dev/null
      +++ b/tests/input/charts/EllipseGroup.js
      @@ -0,0 +1,29 @@
      +/**
      + * Abstract class for creating groups of diamonds with the same styles and dimensions.
      + *
      + * @module graphics
      + * @class EllipseGroup
      + * @constructor
      + */
      + EllipseGroup = function(cfg)
      + {
      +    EllipseGroup.superclass.constructor.apply(this, arguments);
      + };
      +    
      + EllipseGroup.NAME = "diamondGroup";
      +
      + Y.extend(EllipseGroup, Y.ShapeGroup, {    
      +    /**
      +     * Updates the diamond.
      +     *
      +     * @method _draw
      +     * @private
      +     */
      +    drawShape: function(cfg)
      +    {
      +        this.drawEllipse(cfg.x, cfg.y, cfg.width, cfg.height);
      +    }
      + });
      +    
      +EllipseGroup.ATTRS = Y.ShapeGroup.ATTRS;
      +Y.EllipseGroup = EllipseGroup;
      diff --git a/tests/input/charts/Fills.js b/tests/input/charts/Fills.js
      new file mode 100644
      index 00000000..a9192fdc
      --- /dev/null
      +++ b/tests/input/charts/Fills.js
      @@ -0,0 +1,363 @@
      +/**
      + * Utility class used for drawing area fills.
      + *
      + * @module charts
      + * @class Fills
      + * @constructor
      + */
      +function Fills(cfg)
      +{
      +    var attrs = {
      +        area: {
      +            getter: function()
      +            {
      +                return this._defaults || this._getAreaDefaults();
      +            },
      +
      +            setter: function(val)
      +            {
      +                var defaults = this._defaults || this._getAreaDefaults();
      +                this._defaults = Y.merge(defaults, val);
      +            }
      +        }
      +    };
      +    this.addAttrs(attrs, cfg);
      +    this.get("styles");
      +}
      +
      +Fills.prototype = {
      +    /**
      +     * Returns a path shape used for drawing fills.
      +     *
      +     * @method _getPath
      +     * @return Path
      +     * @private
      +     */
      +    _getPath: function()
      +    {
      +        var path = this._path;
      +        if(!path)
      +        {
      +            path = this.get("graph").get("graphic").addShape({type:"path"});
      +            this._path = path;
      +        }
      +        return path;
      +    },
      +    
      +    /**
      +     * Toggles visibility
      +     *
      +     * @method _toggleVisible
      +     * @param {Boolean} visible indicates visibilitye
      +     * @private
      +     */
      +    _toggleVisible: function(visible)
      +    {   
      +        if(this._path)
      +        {
      +            this._path.set("visible", visible);
      +        }
      +    },
      +
      +    /**
      +     * Draws fill
      +     *
      +     * @method drawFill
      +     * @param {Array} xcoords The x-coordinates for the series.
      +     * @param {Array} ycoords The y-coordinates for the series.
      +     * @protected
      +     */
      +    drawFill: function(xcoords, ycoords)
      +    {
      +        if(xcoords.length < 1) 
      +        {
      +            return;
      +        }
      +        var len = xcoords.length,
      +            firstX = xcoords[0],
      +            firstY = ycoords[0],
      +            lastValidX = firstX,
      +            lastValidY = firstY,
      +            nextX,
      +            nextY,
      +            i = 1,
      +            styles = this.get("styles").area,
      +            path = this._getPath(),
      +            color = styles.color || this._getDefaultColor(this.get("graphOrder"), "slice");
      +        path.clear();
      +        path.set("fill", {
      +            color: color, 
      +            opacity: styles.alpha
      +        });
      +        path.set("stroke", {weight: 0});
      +        path.moveTo(firstX, firstY);
      +        for(; i < len; i = ++i)
      +        {
      +            nextX = xcoords[i];
      +            nextY = ycoords[i];
      +            if(isNaN(nextY))
      +            {
      +                lastValidX = nextX;
      +                lastValidY = nextY;
      +                continue;
      +            }
      +            path.lineTo(nextX, nextY);
      +            lastValidX = nextX;
      +            lastValidY = nextY;
      +        }
      +        path.end();
      +    },
      +	
      +    /**
      +     * Draws a fill for a spline
      +     *
      +     * @method drawAreaSpline
      +     * @protected
      +     */
      +    drawAreaSpline: function()
      +    {
      +        if(this.get("xcoords").length < 1) 
      +        {
      +            return;
      +        }
      +        var xcoords = this.get("xcoords"),
      +            ycoords = this.get("ycoords"),
      +            curvecoords = this.getCurveControlPoints(xcoords, ycoords),
      +            len = curvecoords.length,
      +            cx1,
      +            cx2,
      +            cy1,
      +            cy2,
      +            x,
      +            y,
      +            i = 0,
      +            firstX = xcoords[0],
      +            firstY = ycoords[0],
      +            styles = this.get("styles").area,
      +            path = this._getPath(),
      +            color = styles.color || this._getDefaultColor(this.get("graphOrder"), "slice");
      +        path.set("fill", {
      +            color: color, 
      +            opacity: styles.alpha
      +        });
      +        path.set("stroke", {weight: 0});
      +        path.moveTo(firstX, firstY);
      +        for(; i < len; i = ++i)
      +        {
      +            x = curvecoords[i].endx;
      +            y = curvecoords[i].endy;
      +            cx1 = curvecoords[i].ctrlx1;
      +            cx2 = curvecoords[i].ctrlx2;
      +            cy1 = curvecoords[i].ctrly1;
      +            cy2 = curvecoords[i].ctrly2;
      +            path.curveTo(cx1, cy1, cx2, cy2, x, y);
      +        }
      +        if(this.get("direction") === "vertical")
      +        {
      +            path.lineTo(this._leftOrigin, y);
      +            path.lineTo(this._leftOrigin, firstY);
      +        }
      +        else
      +        {
      +            path.lineTo(x, this._bottomOrigin);
      +            path.lineTo(firstX, this._bottomOrigin);
      +        }
      +        path.lineTo(firstX, firstY);
      +        path.end();
      +    },
      +    
      +    /**
      +     * Draws a a stacked area spline
      +     *
      +     * @method drawStackedAreaSpline
      +     * @protected
      +     */
      +    drawStackedAreaSpline: function()
      +    {
      +        if(this.get("xcoords").length < 1) 
      +        {
      +            return;
      +        }
      +        var xcoords = this.get("xcoords"),
      +            ycoords = this.get("ycoords"),
      +            curvecoords,
      +            order = this.get("order"),
      +            type = this.get("type"),
      +            graph = this.get("graph"),
      +            seriesCollection = graph.seriesTypes[type],
      +            prevXCoords,
      +            prevYCoords,
      +            len,
      +            cx1,
      +            cx2,
      +            cy1,
      +            cy2,
      +            x,
      +            y,
      +            i = 0,
      +            firstX,
      +            firstY,
      +            styles = this.get("styles").area,
      +            path = this._getPath(),
      +            color = styles.color || this._getDefaultColor(this.get("graphOrder"), "slice");
      +        firstX = xcoords[0];
      +        firstY = ycoords[0];
      +        curvecoords = this.getCurveControlPoints(xcoords, ycoords);
      +        len = curvecoords.length;
      +        path.set("fill", {
      +            color: color, 
      +            opacity: styles.alpha
      +        });
      +        path.set("stroke", {weight: 0});
      +        path.moveTo(firstX, firstY);
      +        for(; i < len; i = ++i)
      +        {
      +            x = curvecoords[i].endx;
      +            y = curvecoords[i].endy;
      +            cx1 = curvecoords[i].ctrlx1;
      +            cx2 = curvecoords[i].ctrlx2;
      +            cy1 = curvecoords[i].ctrly1;
      +            cy2 = curvecoords[i].ctrly2;
      +            path.curveTo(cx1, cy1, cx2, cy2, x, y);
      +        }
      +        if(order > 0)
      +        {
      +            prevXCoords = seriesCollection[order - 1].get("xcoords").concat().reverse();
      +            prevYCoords = seriesCollection[order - 1].get("ycoords").concat().reverse();
      +            curvecoords = this.getCurveControlPoints(prevXCoords, prevYCoords);
      +            i = 0;
      +            len = curvecoords.length;
      +            path.lineTo(prevXCoords[0], prevYCoords[0]);
      +            for(; i < len; i = ++i)
      +            {
      +                x = curvecoords[i].endx;
      +                y = curvecoords[i].endy;
      +                cx1 = curvecoords[i].ctrlx1;
      +                cx2 = curvecoords[i].ctrlx2;
      +                cy1 = curvecoords[i].ctrly1;
      +                cy2 = curvecoords[i].ctrly2;
      +                path.curveTo(cx1, cy1, cx2, cy2, x, y);
      +            }
      +        }
      +        else
      +        {
      +            if(this.get("direction") === "vertical")
      +            {
      +                path.lineTo(this._leftOrigin, ycoords[ycoords.length-1]);
      +                path.lineTo(this._leftOrigin, firstY);
      +            }
      +            else
      +            {
      +                path.lineTo(xcoords[xcoords.length-1], this._bottomOrigin);
      +                path.lineTo(firstX, this._bottomOrigin);
      +            }
      +
      +        }
      +        path.lineTo(firstX, firstY);
      +        path.end();
      +    },
      +    
      +    /**
      +     * Storage for default area styles.
      +     *
      +     * @property _defaults
      +     * @type Object
      +     * @private
      +     */
      +    _defaults: null,
      +
      +    /**
      +     * Concatenates coordinate array with correct coordinates for closing an area fill.
      +     *
      +     * @method _getClosingPoints
      +     * @return Array
      +     * @protected
      +     */
      +    _getClosingPoints: function()
      +    {
      +        var xcoords = this.get("xcoords").concat(),
      +            ycoords = this.get("ycoords").concat();
      +        if(this.get("direction") === "vertical")
      +        {
      +            xcoords.push(this._leftOrigin);
      +            xcoords.push(this._leftOrigin);
      +            ycoords.push(ycoords[ycoords.length - 1]);
      +            ycoords.push(ycoords[0]);
      +        }
      +        else
      +        {
      +            xcoords.push(xcoords[xcoords.length - 1]);
      +            xcoords.push(xcoords[0]);
      +            ycoords.push(this._bottomOrigin);
      +            ycoords.push(this._bottomOrigin);
      +        }
      +        xcoords.push(xcoords[0]);
      +        ycoords.push(ycoords[0]);
      +        return [xcoords, ycoords];
      +    },
      +
      +    /**
      +     * Concatenates coordinate array with the correct coordinates for closing an area stack.
      +     *
      +     * @method _getStackedClosingPoints
      +     * @return Array
      +     * @protected
      +     */
      +    _getStackedClosingPoints: function()
      +    {
      +        var order = this.get("order"),
      +            type = this.get("type"),
      +            graph = this.get("graph"),
      +            direction = this.get("direction"),
      +            seriesCollection = graph.seriesTypes[type],
      +            prevXCoords,
      +            prevYCoords,
      +            allXCoords = this.get("xcoords").concat(),
      +            allYCoords = this.get("ycoords").concat(),
      +            firstX = allXCoords[0],
      +            firstY = allYCoords[0];
      +        
      +        if(order > 0)
      +        {
      +            prevXCoords = seriesCollection[order - 1].get("xcoords").concat();
      +            prevYCoords = seriesCollection[order - 1].get("ycoords").concat();
      +            allXCoords = allXCoords.concat(prevXCoords.concat().reverse());
      +            allYCoords = allYCoords.concat(prevYCoords.concat().reverse());
      +            allXCoords.push(allXCoords[0]);
      +            allYCoords.push(allYCoords[0]);
      +        }
      +        else
      +        {
      +            if(direction === "vertical")
      +            {
      +                allXCoords.push(this._leftOrigin);
      +                allXCoords.push(this._leftOrigin);
      +                allYCoords.push(allYCoords[allYCoords.length-1]);
      +                allYCoords.push(firstY);
      +            }
      +            else
      +            {
      +                allXCoords.push(allXCoords[allXCoords.length-1]);
      +                allXCoords.push(firstX);
      +                allYCoords.push(this._bottomOrigin);
      +                allYCoords.push(this._bottomOrigin);
      +            }
      +        }
      +        return [allXCoords, allYCoords];
      +    },
      +
      +    /**
      +     * Returns default values for area styles.
      +     *
      +     * @method _getAreaDefaults
      +     * @return Object
      +     * @private
      +     */
      +    _getAreaDefaults: function()
      +    {
      +        return {
      +        };
      +    }
      +};
      +Y.augment(Fills, Y.Attribute);
      +Y.Fills = Fills;
      diff --git a/tests/input/charts/Graph.js b/tests/input/charts/Graph.js
      new file mode 100644
      index 00000000..371d1505
      --- /dev/null
      +++ b/tests/input/charts/Graph.js
      @@ -0,0 +1,792 @@
      +/**
      + * Graph manages and contains series instances for a `CartesianChart`
      + * instance.
      + *
      + * @module charts
      + * @class Graph
      + * @constructor
      + * @extends Widget
      + * @uses Renderer
      + */
      +Y.Graph = Y.Base.create("graph", Y.Widget, [Y.Renderer], {
      +    /**
      +     * @method bindUI
      +     * @private
      +     */
      +    bindUI: function()
      +    {
      +        var bb = this.get("boundingBox");
      +        bb.setStyle("position", "absolute");
      +        this.after("widthChange", this._sizeChangeHandler);
      +        this.after("heightChange", this._sizeChangeHandler);
      +        this.after("stylesChange", this._updateStyles);
      +    },
      +
      +    /**
      +     * @method syncUI
      +     * @private
      +     */
      +    syncUI: function()
      +    {
      +        var background,
      +            cb,
      +            bg,
      +            sc = this.get("seriesCollection"),
      +            series,
      +            i = 0,
      +            len = sc.length,
      +            hgl = this.get("horizontalGridlines"),
      +            vgl = this.get("verticalGridlines");
      +        if(this.get("showBackground"))
      +        {
      +            background = this.get("background");
      +            cb = this.get("contentBox");
      +            bg = this.get("styles").background;
      +            bg.stroke = bg.border;
      +            bg.stroke.opacity = bg.stroke.alpha;
      +            bg.fill.opacity = bg.fill.alpha;
      +            bg.width = this.get("width");
      +            bg.height = this.get("height");
      +            bg.type = bg.shape;
      +            background.set(bg);
      +        }
      +        for(; i < len; ++i)
      +        {
      +            series = sc[i];
      +            if(series instanceof Y.CartesianSeries)
      +            {
      +                series.render();
      +            }
      +        }
      +        if(hgl && hgl instanceof Y.Gridlines)
      +        {
      +            hgl.draw();
      +        }
      +        if(vgl && vgl instanceof Y.Gridlines)
      +        {
      +            vgl.draw();
      +        }
      +    },
      +   
      +    /**
      +     * Object of arrays containing series mapped to a series type.
      +     *
      +     * @property seriesTypes
      +     * @type Object
      +     * @private
      +     */
      +    seriesTypes: null,
      +
      +    /**
      +     * Returns a series instance based on an index.
      +     * 
      +     * @method getSeriesByIndex
      +     * @param {Number} val index of the series
      +     * @return CartesianSeries
      +     */
      +    getSeriesByIndex: function(val)
      +    {
      +        var col = this.get("seriesCollection"),
      +            series;
      +        if(col && col.length > val)
      +        {
      +            series = col[val];
      +        }
      +        return series;
      +    },
      +
      +    /**
      +     * Returns a series instance based on a key value.
      +     * 
      +     * @method getSeriesByKey
      +     * @param {String} val key value of the series
      +     * @return CartesianSeries
      +     */
      +    getSeriesByKey: function(val)
      +    {
      +        var obj = this._seriesDictionary,
      +            series;
      +        if(obj && obj.hasOwnProperty(val))
      +        {
      +            series = obj[val];
      +        }
      +        return series;
      +    },
      +
      +    /**
      +     * Adds dispatcher to a `_dispatcher` used to
      +     * to ensure all series have redrawn before for firing event.
      +     *
      +     * @method addDispatcher
      +     * @param {CartesianSeries} val series instance to add
      +     * @protected
      +     */
      +    addDispatcher: function(val)
      +    {
      +        if(!this._dispatchers)
      +        {
      +            this._dispatchers = [];
      +        }
      +        this._dispatchers.push(val);
      +    },
      +
      +    /**
      +     * Collection of series to be displayed in the graph.
      +     *
      +     * @property _seriesCollection
      +     * @type Array
      +     * @private 
      +     */
      +    _seriesCollection: null,
      +    
      +    /**
      +     * Object containing key value pairs of `CartesianSeries` instances.
      +     *
      +     * @property _seriesDictionary
      +     * @type Object
      +     * @private
      +     */
      +    _seriesDictionary: null,
      +
      +    /**
      +     * Parses series instances to be displayed in the graph.
      +     *
      +     * @method _parseSeriesCollection
      +     * @param {Array} Collection of `CartesianSeries` instances or objects container `CartesianSeries` attributes values.
      +     * @private
      +     */
      +    _parseSeriesCollection: function(val)
      +    {
      +        if(!val)
      +        {
      +            return;
      +        }	
      +        var len = val.length,
      +            i = 0,
      +            series,
      +            seriesKey;
      +        if(!this.get("seriesCollection"))
      +        {
      +            this._seriesCollection = [];
      +        }
      +        if(!this._seriesDictionary)
      +        {
      +            this._seriesDictionary = {};
      +        }
      +        if(!this.seriesTypes)
      +        {
      +            this.seriesTypes = [];
      +        }
      +        for(; i < len; ++i)
      +        {	
      +            series = val[i];
      +            if(!(series instanceof Y.CartesianSeries) && !(series instanceof Y.PieSeries))
      +            {
      +                this._createSeries(series);
      +                continue;
      +            }
      +            this._addSeries(series);
      +        }
      +        len = this.get("seriesCollection").length;
      +        for(i = 0; i < len; ++i)
      +        {
      +            series = this.get("seriesCollection")[i];
      +            seriesKey = series.get("direction") == "horizontal" ? "yKey" : "xKey";
      +            this._seriesDictionary[series.get(seriesKey)] = series;
      +        }
      +    },
      +
      +    /**
      +     * Adds a series to the graph.
      +     *
      +     * @method _addSeries
      +     * @param {CartesianSeries} series Series to add to the graph.
      +     * @private
      +     */
      +    _addSeries: function(series)
      +    {
      +        var type = series.get("type"),
      +            seriesCollection = this.get("seriesCollection"),
      +            graphSeriesLength = seriesCollection.length,
      +            seriesTypes = this.seriesTypes,
      +            typeSeriesCollection;	
      +        if(!series.get("graph")) 
      +        {
      +            series.set("graph", this);
      +        }
      +        seriesCollection.push(series);
      +        if(!seriesTypes.hasOwnProperty(type))
      +        {
      +            this.seriesTypes[type] = [];
      +        }
      +        typeSeriesCollection = this.seriesTypes[type];
      +        series.set("graphOrder", graphSeriesLength);
      +        series.set("order", typeSeriesCollection.length);
      +        typeSeriesCollection.push(series);
      +        this.addDispatcher(series);
      +        series.after("drawingComplete", Y.bind(this._drawingCompleteHandler, this));
      +        this.fire("seriesAdded", series);
      +    },
      +
      +    /**
      +     * Creates a `CartesianSeries` instance from an object containing attribute key value pairs. The key value pairs include attributes for the specific series and a type value which defines the type of
      +     * series to be used. 
      +     *
      +     * @method createSeries
      +     * @param {Object} seriesData Series attribute key value pairs.
      +     * @private
      +     */
      +    _createSeries: function(seriesData)
      +    {
      +        var type = seriesData.type,
      +            seriesCollection = this.get("seriesCollection"),
      +            seriesTypes = this.seriesTypes,
      +            typeSeriesCollection,
      +            seriesType,
      +            series;
      +            seriesData.graph = this;
      +        if(!seriesTypes.hasOwnProperty(type))
      +        {
      +            seriesTypes[type] = [];
      +        }
      +        typeSeriesCollection = seriesTypes[type];
      +        seriesData.graph = this;
      +        seriesData.order = typeSeriesCollection.length;
      +        seriesData.graphOrder = seriesCollection.length;
      +        seriesType = this._getSeries(seriesData.type);
      +        series = new seriesType(seriesData);
      +        this.addDispatcher(series);
      +        series.after("drawingComplete", Y.bind(this._drawingCompleteHandler, this));
      +        typeSeriesCollection.push(series);
      +        seriesCollection.push(series);
      +    },
      +    
      +    /**
      +     * String reference for pre-defined `Series` classes.
      +     *
      +     * @property _seriesMap
      +     * @type Object
      +     * @private
      +     */
      +    _seriesMap: {
      +        line : Y.LineSeries,
      +        column : Y.ColumnSeries,
      +        bar : Y.BarSeries,
      +        area :  Y.AreaSeries,
      +        candlestick : Y.CandlestickSeries,
      +        ohlc : Y.OHLCSeries,
      +        stackedarea : Y.StackedAreaSeries,
      +        stackedline : Y.StackedLineSeries,
      +        stackedcolumn : Y.StackedColumnSeries,
      +        stackedbar : Y.StackedBarSeries,
      +        markerseries : Y.MarkerSeries,
      +        spline : Y.SplineSeries,
      +        areaspline : Y.AreaSplineSeries,
      +        stackedspline : Y.StackedSplineSeries,
      +        stackedareaspline : Y.StackedAreaSplineSeries,
      +        stackedmarkerseries : Y.StackedMarkerSeries,
      +        pie : Y.PieSeries,
      +        combo : Y.ComboSeries,
      +        stackedcombo : Y.StackedComboSeries,
      +        combospline : Y.ComboSplineSeries,
      +        stackedcombospline : Y.StackedComboSplineSeries
      +    },
      +
      +    /**
      +     * Returns a specific `CartesianSeries` class based on key value from a look up table of a direct reference to a class. When specifying a key value, the following options
      +     * are available:
      +     *
      +     *  <table>
      +     *      <tr><th>Key Value</th><th>Class</th></tr>
      +     *      <tr><td>line</td><td>Y.LineSeries</td></tr>    
      +     *      <tr><td>column</td><td>Y.ColumnSeries</td></tr>    
      +     *      <tr><td>bar</td><td>Y.BarSeries</td></tr>    
      +     *      <tr><td>area</td><td>Y.AreaSeries</td></tr>    
      +     *      <tr><td>stackedarea</td><td>Y.StackedAreaSeries</td></tr>    
      +     *      <tr><td>stackedline</td><td>Y.StackedLineSeries</td></tr>    
      +     *      <tr><td>stackedcolumn</td><td>Y.StackedColumnSeries</td></tr>    
      +     *      <tr><td>stackedbar</td><td>Y.StackedBarSeries</td></tr>    
      +     *      <tr><td>markerseries</td><td>Y.MarkerSeries</td></tr>    
      +     *      <tr><td>spline</td><td>Y.SplineSeries</td></tr>    
      +     *      <tr><td>areaspline</td><td>Y.AreaSplineSeries</td></tr>    
      +     *      <tr><td>stackedspline</td><td>Y.StackedSplineSeries</td></tr>
      +     *      <tr><td>stackedareaspline</td><td>Y.StackedAreaSplineSeries</td></tr>
      +     *      <tr><td>stackedmarkerseries</td><td>Y.StackedMarkerSeries</td></tr>
      +     *      <tr><td>pie</td><td>Y.PieSeries</td></tr>
      +     *      <tr><td>combo</td><td>Y.ComboSeries</td></tr>
      +     *      <tr><td>stackedcombo</td><td>Y.StackedComboSeries</td></tr>
      +     *      <tr><td>combospline</td><td>Y.ComboSplineSeries</td></tr>
      +     *      <tr><td>stackedcombospline</td><td>Y.StackedComboSplineSeries</td></tr>
      +     *  </table>
      +     * 
      +     * When referencing a class directly, you can specify any of the above classes or any custom class that extends `CartesianSeries` or `PieSeries`.
      +     *
      +     * @method _getSeries
      +     * @param {String | Object} type Series type.
      +     * @return CartesianSeries
      +     * @private
      +     */
      +    _getSeries: function(type)
      +    {
      +        var seriesClass;
      +        if(Y_Lang.isString(type))
      +        {
      +            seriesClass = this._seriesMap[type];
      +        }
      +        else 
      +        {
      +            seriesClass = type;
      +        }
      +        return seriesClass;
      +    },
      +
      +    /**
      +     * Event handler for marker events.
      +     *
      +     * @method _markerEventHandler
      +     * @param {Object} e Event object.
      +     * @private
      +     */
      +    _markerEventHandler: function(e)
      +    {
      +        var type = e.type,
      +            markerNode = e.currentTarget,
      +            strArr = markerNode.getAttribute("id").split("_"),
      +            series = this.getSeriesByIndex(strArr[1]),
      +            index = strArr[2];
      +        series.updateMarkerState(type, index);
      +    },
      +
      +    /**
      +     * Collection of `CartesianSeries` instances to be redrawn.
      +     *
      +     * @property _dispatchers
      +     * @type Array
      +     * @private
      +     */
      +    _dispatchers: null,
      +
      +    /**
      +     * Updates the `Graph` styles.
      +     *
      +     * @method _updateStyles
      +     * @private
      +     */
      +    _updateStyles: function()
      +    {
      +        var styles = this.get("styles").background,
      +            border = styles.border;
      +            border.opacity = border.alpha;
      +            styles.stroke = border;
      +            styles.fill.opacity = styles.fill.alpha;
      +        this.get("background").set(styles);
      +        this._sizeChangeHandler();
      +    },
      +
      +    /**
      +     * Event handler for size changes.
      +     *
      +     * @method _sizeChangeHandler
      +     * @param {Object} e Event object.
      +     * @private
      +     */
      +    _sizeChangeHandler: function(e)
      +    {
      +        var hgl = this.get("horizontalGridlines"),
      +            vgl = this.get("verticalGridlines"),
      +            w = this.get("width"),
      +            h = this.get("height"),
      +            bg = this.get("styles").background,
      +            weight,
      +            background;
      +        if(bg && bg.border)
      +        {
      +            weight = bg.border.weight || 0;
      +        }
      +        if(this.get("showBackground"))
      +        {
      +            background = this.get("background");
      +            if(w && h)
      +            {
      +                background.set("width", w);
      +                background.set("height", h);
      +            }
      +        }
      +        if(this._gridlines)
      +        {
      +            this._gridlines.clear();
      +        }
      +        if(hgl && hgl instanceof Y.Gridlines)
      +        {
      +            hgl.draw();
      +        }
      +        if(vgl && vgl instanceof Y.Gridlines)
      +        {
      +            vgl.draw();
      +        }
      +        this._drawSeries();
      +    },
      +
      +    /**
      +     * Draws each series.
      +     *
      +     * @method _drawSeries
      +     * @private
      +     */
      +    _drawSeries: function()
      +    {
      +        if(this._drawing)
      +        {
      +            this._callLater = true;
      +            return;
      +        }
      +        var sc,
      +            i,
      +            len,
      +            graphic = this.get("graphic");
      +        graphic.set("autoDraw", false);
      +        this._callLater = false;
      +        this._drawing = true;
      +        sc = this.get("seriesCollection");
      +        i = 0;
      +        len = sc.length;
      +        for(; i < len; ++i)
      +        {
      +            sc[i].draw();
      +            if((!sc[i].get("xcoords") || !sc[i].get("ycoords")) && !sc[i] instanceof Y.PieSeries)
      +            {
      +                this._callLater = true;
      +                break;
      +            }
      +        }
      +        this._drawing = false;
      +        if(this._callLater)
      +        {
      +            this._drawSeries();
      +        }
      +    },  
      +
      +    /**
      +     * Event handler for series drawingComplete event.
      +     *
      +     * @method _drawingCompleteHandler
      +     * @param {Object} e Event object.
      +     * @private
      +     */
      +    _drawingCompleteHandler: function(e)
      +    {
      +        var series = e.currentTarget,
      +            graphic,
      +            index = Y.Array.indexOf(this._dispatchers, series);
      +        if(index > -1)
      +        {
      +            this._dispatchers.splice(index, 1);
      +        }
      +        if(this._dispatchers.length < 1)
      +        {
      +            graphic = this.get("graphic");
      +            if(!graphic.get("autoDraw"))
      +            {
      +                graphic._redraw();
      +            }
      +            this.fire("chartRendered");
      +        }
      +    },
      +
      +    /**
      +     * Gets the default value for the `styles` attribute. Overrides
      +     * base implementation.
      +     *
      +     * @method _getDefaultStyles
      +     * @return Object
      +     * @protected
      +     */
      +    _getDefaultStyles: function()
      +    {
      +        var defs = {
      +            background: {
      +                shape: "rect",
      +                fill:{
      +                    color:"#faf9f2"
      +                },
      +                border: {
      +                    color:"#dad8c9",
      +                    weight: 1
      +                }
      +            }
      +        };
      +        return defs;
      +    },
      +
      +    /**
      +     * Destructor implementation Graph class. Removes all Graphic instances from the widget.
      +     *
      +     * @method destructor
      +     * @protected
      +     */
      +    destructor: function()
      +    {
      +        if(this._graphic)
      +        {
      +            this._graphic.destroy();
      +        }
      +        if(this._background)
      +        {
      +            this._background.get("graphic").destroy();
      +        }
      +        if(this._gridlines)
      +        {
      +            this._gridlines.get("graphic").destroy();
      +        }
      +    }
      +}, {
      +    ATTRS: {
      +        /**
      +         * The x-coordinate for the graph.
      +         *
      +         * @attribute x
      +         * @type Number
      +         * @protected
      +         */
      +        x: {
      +            setter: function(val)
      +            {
      +                this.get("boundingBox").setStyle("left", val + "px");
      +                return val;
      +            }
      +        },
      +
      +        /**
      +         * The y-coordinate for the graph.
      +         *
      +         * @attribute y
      +         * @type Number
      +         * @protected
      +         */
      +        y: {
      +            setter: function(val)
      +            {
      +                this.get("boundingBox").setStyle("top", val + "px");
      +                return val;
      +            }
      +        },
      +
      +        /**
      +         * Reference to the chart instance using the graph.
      +         *
      +         * @attribute chart
      +         * @type ChartBase
      +         * @readOnly
      +         */
      +        chart: {},
      +
      +        /**
      +         * Collection of series. When setting the `seriesCollection` the array can contain a combination of either
      +         * `CartesianSeries` instances or object literals with properties that will define a series.
      +         *
      +         * @attribute seriesCollection
      +         * @type CartesianSeries
      +         */
      +        seriesCollection: {
      +            getter: function()
      +            {
      +                return this._seriesCollection;
      +            },
      +
      +            setter: function(val)
      +            {
      +                this._parseSeriesCollection(val);
      +                return this._seriesCollection;
      +            }
      +        },
      +       
      +        /**
      +         * Indicates whether the `Graph` has a background.
      +         *
      +         * @attribute showBackground
      +         * @type Boolean
      +         * @default true
      +         */
      +        showBackground: {
      +            value: true
      +        },
      +
      +        /**
      +         * Read-only hash lookup for all series on in the `Graph`.
      +         *
      +         * @attribute seriesDictionary
      +         * @type Object
      +         * @readOnly
      +         */
      +        seriesDictionary: {
      +            readOnly: true,
      +
      +            getter: function()
      +            {
      +                return this._seriesDictionary;
      +            }
      +        },
      +
      +        /**
      +         * Reference to the horizontal `Gridlines` instance.
      +         *
      +         * @attribute horizontalGridlines
      +         * @type Gridlines
      +         * @default null
      +         */
      +        horizontalGridlines: {
      +            value: null,
      +
      +            setter: function(val)
      +            {
      +                var gl = this.get("horizontalGridlines");
      +                if(gl && gl instanceof Y.Gridlines)
      +                {
      +                    gl.remove();
      +                }
      +                if(val instanceof Y.Gridlines)
      +                {
      +                    gl = val;
      +                    val.set("graph", this);
      +                    return val;
      +                }
      +                else if(val && val.axis)
      +                {
      +                    gl = new Y.Gridlines({direction:"horizontal", axis:val.axis, graph:this, styles:val.styles});
      +                    return gl;
      +                }
      +            }
      +        },
      +        
      +        /**
      +         * Reference to the vertical `Gridlines` instance.
      +         *
      +         * @attribute verticalGridlines
      +         * @type Gridlines
      +         * @default null
      +         */
      +        verticalGridlines: {
      +            value: null,
      +
      +            setter: function(val)
      +            {
      +                var gl = this.get("verticalGridlines");
      +                if(gl && gl instanceof Y.Gridlines)
      +                {
      +                    gl.remove();
      +                }
      +                if(val instanceof Y.Gridlines)
      +                {
      +                    gl = val;
      +                    val.set("graph", this);
      +                    return val;
      +                }
      +                else if(val && val.axis)
      +                {
      +                    gl = new Y.Gridlines({direction:"vertical", axis:val.axis, graph:this, styles:val.styles});
      +                    return gl;
      +                }
      +            }
      +        },
      +
      +        /**
      +         * Reference to graphic instance used for the background.
      +         *
      +         * @attribute background
      +         * @type Graphic
      +         * @readOnly
      +         */
      +        background: {
      +            getter: function()
      +            {
      +                if(!this._background)
      +                {
      +                    this._backgroundGraphic = new Y.Graphic({render:this.get("contentBox")});
      +                    this._backgroundGraphic.get("node").style.zIndex = 0; 
      +                    this._background = this._backgroundGraphic.addShape({type: "rect"});
      +                }
      +                return this._background;
      +            }
      +        },
      +
      +        /**
      +         * Reference to graphic instance used for gridlines.
      +         *
      +         * @attribute gridlines
      +         * @type Graphic
      +         * @readOnly
      +         */
      +        gridlines: {
      +            readOnly: true,
      +
      +            getter: function()
      +            {
      +                if(!this._gridlines)
      +                {
      +                    this._gridlinesGraphic = new Y.Graphic({render:this.get("contentBox")});
      +                    this._gridlinesGraphic.get("node").style.zIndex = 1; 
      +                    this._gridlines = this._gridlinesGraphic.addShape({type: "path"});
      +                }
      +                return this._gridlines;
      +            }
      +        },
      +        
      +        /**
      +         * Reference to graphic instance used for series.
      +         *
      +         * @attribute graphic
      +         * @type Graphic
      +         * @readOnly
      +         */
      +        graphic: {
      +            readOnly: true,
      +
      +            getter: function() 
      +            {
      +                if(!this._graphic)
      +                {
      +                    this._graphic = new Y.Graphic({render:this.get("contentBox")});
      +                    this._graphic.get("node").style.zIndex = 2; 
      +                    this._graphic.set("autoDraw", false);
      +                }
      +                return this._graphic;
      +            }
      +        },
      +
      +        /**
      +         * Indicates whether or not markers for a series will be grouped and rendered in a single complex shape instance.
      +         *
      +         * @attribute groupMarkers
      +         * @type Boolean
      +         */
      +        groupMarkers: {
      +            value: false
      +        }
      +
      +        /**
      +         * Style properties used for drawing a background. Below are the default values:
      +         *  <dl>
      +         *      <dt>background</dt><dd>An object containing the following values:
      +         *          <dl>
      +         *              <dt>fill</dt><dd>Defines the style properties for the fill. Contains the following values:
      +         *                  <dl>
      +         *                      <dt>color</dt><dd>Color of the fill. The default value is #faf9f2.</dd>
      +         *                      <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the background fill. The default value is 1.</dd>
      +         *                  </dl>
      +         *              </dd>
      +         *              <dt>border</dt><dd>Defines the style properties for the border. Contains the following values:
      +         *                  <dl>
      +         *                      <dt>color</dt><dd>Color of the border. The default value is #dad8c9.</dd>
      +         *                      <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the background border. The default value is 1.</dd>
      +         *                      <dt>weight</dt><dd>Number indicating the width of the border. The default value is 1.</dd>
      +         *                  </dl>
      +         *              </dd>
      +         *          </dl>
      +         *      </dd>
      +         *  </dl>
      +         *
      +         * @attribute styles
      +         * @type Object
      +         */
      +    }
      +});
      diff --git a/tests/input/charts/Gridlines.js b/tests/input/charts/Gridlines.js
      new file mode 100644
      index 00000000..da7a3f10
      --- /dev/null
      +++ b/tests/input/charts/Gridlines.js
      @@ -0,0 +1,189 @@
      +/**
      + * Gridlines draws gridlines on a Graph.
      + *
      + * @module charts
      + * @class Gridlines
      + * @constructor
      + * @extends Base
      + * @uses Renderer
      + */
      +Y.Gridlines = Y.Base.create("gridlines", Y.Base, [Y.Renderer], {
      +    /**
      +     * Reference to the `Path` element used for drawing Gridlines.
      +     *
      +     * @property _path
      +     * @type Path
      +     * @private
      +     */
      +    _path: null,
      +
      +    /**
      +     * Removes the Gridlines.
      +     *
      +     * @method remove
      +     * @private
      +     */
      +    remove: function()
      +    {
      +        var path = this._path;
      +        if(path)
      +        {
      +            path.destroy();
      +        }
      +    },
      +
      +    /**
      +     * Draws the gridlines
      +     *
      +     * @method draw
      +     * @protected
      +     */
      +    draw: function()
      +    {
      +        if(this.get("axis") && this.get("graph"))
      +        {
      +            this._drawGridlines();
      +        }
      +    },
      +
      +    /**
      +     * Algorithm for drawing gridlines
      +     *
      +     * @method _drawGridlines
      +     * @private
      +     */
      +    _drawGridlines: function()
      +    {
      +        var path,
      +            axis = this.get("axis"),
      +            axisPosition = axis.get("position"),
      +            points,
      +            i = 0,
      +            l,
      +            direction = this.get("direction"),
      +            graph = this.get("graph"),
      +            w = graph.get("width"),
      +            h = graph.get("height"),
      +            line = this.get("styles").line,
      +            color = line.color,
      +            weight = line.weight,
      +            alpha = line.alpha,
      +            lineFunction = direction == "vertical" ? this._verticalLine : this._horizontalLine;
      +        if(isFinite(w) && isFinite(h) && w > 0 && h > 0)
      +        {
      +            if(axisPosition != "none" && axis && axis.get("tickPoints"))
      +            {
      +                points = axis.get("tickPoints");
      +                l = points.length;
      +            }
      +            else
      +            {
      +                points = [];
      +                l = axis.get("styles").majorUnit.count;
      +                for(; i < l; ++i)
      +                {
      +                    points[i] = {
      +                        x: w * (i/(l-1)),
      +                        y: h * (i/(l-1))
      +                    };
      +                }
      +                i = 0;
      +            }
      +            path = graph.get("gridlines");
      +            path.set("width", w);
      +            path.set("height", h);
      +            path.set("stroke", {
      +                weight: weight,
      +                color: color,
      +                opacity: alpha
      +            });
      +            for(; i < l; ++i)
      +            {
      +                lineFunction(path, points[i], w, h);
      +            }
      +            path.end();
      +        }
      +    },
      +
      +    /**
      +     * Algorithm for horizontal lines.
      +     *
      +     * @method _horizontalLine
      +     * @param {Path} path Reference to path element
      +     * @param {Object} pt Coordinates corresponding to a major unit of an axis.
      +     * @param {Number} w Width of the Graph
      +     * @param {Number} h Height of the Graph
      +     * @private
      +     */
      +    _horizontalLine: function(path, pt, w, h)
      +    {
      +        path.moveTo(0, pt.y);
      +        path.lineTo(w, pt.y);
      +    },
      +
      +    /**
      +     * Algorithm for vertical lines.
      +     *
      +     * @method _verticalLine
      +     * @param {Path} path Reference to path element
      +     * @param {Object} pt Coordinates corresponding to a major unit of an axis.
      +     * @param {Number} w Width of the Graph
      +     * @param {Number} h Height of the Graph
      +     * @private
      +     */
      +    _verticalLine: function(path, pt, w, h)
      +    {
      +        path.moveTo(pt.x, 0);
      +        path.lineTo(pt.x, h);
      +    },
      +    
      +    /**
      +     * Gets the default value for the `styles` attribute. Overrides
      +     * base implementation.
      +     *
      +     * @method _getDefaultStyles
      +     * @return Object
      +     * @protected
      +     */
      +    _getDefaultStyles: function()
      +    {
      +        var defs = {
      +            line: {
      +                color:"#f0efe9",
      +                weight: 1,
      +                alpha: 1
      +            }
      +        };
      +        return defs;
      +    }
      +
      +},
      +{
      +    ATTRS: {
      +        /**
      +         * Indicates the direction of the gridline.
      +         *
      +         * @attribute direction
      +         * @type String
      +         */
      +        direction: {},
      +        
      +        /**
      +         * Indicate the `Axis` in which to bind
      +         * the gridlines.
      +         *
      +         * @attribute axis
      +         * @type Axis
      +         */
      +        axis: {},
      +        
      +        /**
      +         * Indicates the `Graph` in which the gridlines 
      +         * are drawn.
      +         *
      +         * @attribute graph
      +         * @type Graph
      +         */
      +        graph: {}
      +    }
      +});
      diff --git a/tests/input/charts/Histogram.js b/tests/input/charts/Histogram.js
      new file mode 100644
      index 00000000..85a38551
      --- /dev/null
      +++ b/tests/input/charts/Histogram.js
      @@ -0,0 +1,219 @@
      +/**
      + * Histogram is the base class for Column and Bar series.
      + *
      + * @module charts
      + * @class Histogram
      + * @constructor
      + */
      +function Histogram(){}
      +
      +Histogram.prototype = {
      +    /**
      +     * Draws the series.
      +     *
      +     * @method drawSeries
      +     * @protected
      +     */
      +    drawSeries: function()
      +    {
      +        if(this.get("xcoords").length < 1) 
      +        {
      +            return;
      +        }
      +        var style = Y.clone(this.get("styles").marker),
      +            setSize,
      +            calculatedSize,
      +            xcoords = this.get("xcoords"),
      +            ycoords = this.get("ycoords"),
      +            i = 0,
      +            len = xcoords.length,
      +            top = ycoords[0],
      +            type = this.get("type"),
      +            graph = this.get("graph"),
      +            seriesCollection = graph.seriesTypes[type],
      +            seriesLen = seriesCollection.length,
      +            seriesSize = 0,
      +            totalSize = 0,
      +            offset = 0,
      +            ratio,
      +            renderer,
      +            order = this.get("order"),
      +            graphOrder = this.get("graphOrder"),
      +            left,
      +            marker,
      +            setSizeKey,
      +            calculatedSizeKey,
      +            config,
      +            fillColors = null,
      +            borderColors = null,
      +            xMarkerPlane = [],
      +            yMarkerPlane = [],
      +            xMarkerPlaneLeft,
      +            xMarkerPlaneRight,
      +            yMarkerPlaneTop,
      +            yMarkerPlaneBottom,
      +            dimensions = {
      +                width: [],
      +                height: []
      +            },
      +            xvalues = [],
      +            yvalues = [],
      +            groupMarkers = this.get("groupMarkers");
      +        if(Y_Lang.isArray(style.fill.color))
      +        {
      +            fillColors = style.fill.color.concat(); 
      +        }
      +        if(Y_Lang.isArray(style.border.color))
      +        {
      +            borderColors = style.border.color.concat();
      +        }
      +        if(this.get("direction") == "vertical")
      +        {
      +            setSizeKey = "height";
      +            calculatedSizeKey = "width";
      +        }
      +        else
      +        {
      +            setSizeKey = "width";
      +            calculatedSizeKey = "height";
      +        }
      +        setSize = style[setSizeKey];
      +        calculatedSize = style[calculatedSizeKey];
      +        this._createMarkerCache();
      +        for(; i < seriesLen; ++i)
      +        {
      +            renderer = seriesCollection[i];
      +            seriesSize += renderer.get("styles").marker[setSizeKey];
      +            if(order > i) 
      +            {
      +                offset = seriesSize;
      +            }
      +        }
      +        totalSize = len * seriesSize;
      +        this._maxSize = graph.get(setSizeKey);
      +        if(totalSize > this._maxSize)
      +        {
      +            ratio = graph.get(setSizeKey)/totalSize;
      +            seriesSize *= ratio;
      +            offset *= ratio;
      +            setSize *= ratio;
      +            setSize = Math.max(setSize, 1);
      +            this._maxSize = setSize;
      +        }
      +        offset -= seriesSize/2;
      +        for(i = 0; i < len; ++i)
      +        {
      +            xMarkerPlaneLeft = xcoords[i] - seriesSize/2;
      +            xMarkerPlaneRight = xMarkerPlaneLeft + seriesSize;
      +            yMarkerPlaneTop = ycoords[i] - seriesSize/2;
      +            yMarkerPlaneBottom = yMarkerPlaneTop + seriesSize;
      +            xMarkerPlane.push({start: xMarkerPlaneLeft, end: xMarkerPlaneRight});
      +            yMarkerPlane.push({start: yMarkerPlaneTop, end: yMarkerPlaneBottom});
      +            if(isNaN(xcoords[i]) || isNaN(ycoords[i]))
      +            {
      +                this._markers.push(null);
      +                continue;
      +            }
      +            config = this._getMarkerDimensions(xcoords[i], ycoords[i], calculatedSize, offset);
      +            if(!isNaN(config.calculatedSize) && config.calculatedSize > 0)
      +            {
      +                top = config.top;
      +                left = config.left;
      +
      +                if(groupMarkers)
      +                {
      +                    dimensions[setSizeKey][i] = setSize;
      +                    dimensions[calculatedSizeKey][i] = config.calculatedSize;
      +                    xvalues.push(left);
      +                    yvalues.push(top);
      +                }
      +                else
      +                {
      +                    style[setSizeKey] = setSize;
      +                    style[calculatedSizeKey] = config.calculatedSize;
      +                    style.x = left;
      +                    style.y = top;
      +                    if(fillColors)
      +                    {
      +                        style.fill.color = fillColors[i % fillColors.length];
      +                    }
      +                    if(borderColors)
      +                    {
      +                        style.border.color = borderColors[i % borderColors.length];
      +                    }
      +                    marker = this.getMarker(style, graphOrder, i);
      +                }
      +
      +            }
      +            else if(!groupMarkers)
      +            {
      +                this._markers.push(null);
      +            }
      +        }
      +        this.set("xMarkerPlane", xMarkerPlane);
      +        this.set("yMarkerPlane", yMarkerPlane);
      +        if(groupMarkers)
      +        {
      +            this._createGroupMarker({
      +                fill: style.fill,
      +                border: style.border,
      +                dimensions: dimensions,
      +                xvalues: xvalues,
      +                yvalues: yvalues,
      +                shape: style.shape
      +            });
      +        }
      +        else
      +        {
      +            this._clearMarkerCache();
      +        }
      +    },
      +    
      +    /**
      +     * Collection of default colors used for marker fills in a series when not specified by user.
      +     *
      +     * @property _defaultFillColors
      +     * @type Array
      +     * @protected
      +     */
      +    _defaultFillColors: ["#66007f", "#a86f41", "#295454", "#996ab2", "#e8cdb7", "#90bdbd","#000000","#c3b8ca", "#968373", "#678585"],
      +    
      +    /**
      +     * Gets the default style values for the markers.
      +     *
      +     * @method _getPlotDefaults
      +     * @return Object
      +     * @private
      +     */
      +    _getPlotDefaults: function()
      +    {
      +        var defs = {
      +            fill:{
      +                type: "solid",
      +                alpha: 1,
      +                colors:null,
      +                alphas: null,
      +                ratios: null
      +            },
      +            border:{
      +                weight: 0,
      +                alpha: 1
      +            },
      +            width: 12,
      +            height: 12,
      +            shape: "rect",
      +
      +            padding:{
      +                top: 0,
      +                left: 0,
      +                right: 0,
      +                bottom: 0
      +            }
      +        };
      +        defs.fill.color = this._getDefaultColor(this.get("graphOrder"), "fill");
      +        defs.border.color = this._getDefaultColor(this.get("graphOrder"), "border");
      +        return defs;
      +    }
      +};
      +
      +Y.Histogram = Histogram;
      diff --git a/tests/input/charts/LeftAxisLayout.js b/tests/input/charts/LeftAxisLayout.js
      new file mode 100644
      index 00000000..1924cd39
      --- /dev/null
      +++ b/tests/input/charts/LeftAxisLayout.js
      @@ -0,0 +1,361 @@
      +/**
      + * Algorithmic strategy for rendering a left axis.
      + *
      + * @module charts
      + * @class LeftAxisLayout
      + * @constructor
      + */
      +LeftAxisLayout = function() {};
      +
      +LeftAxisLayout.prototype = {
      +    /**
      +     *  Default margins for text fields.
      +     *
      +     *  @private
      +     *  @method _getDefaultMargins
      +     *  @return Object
      +     */
      +    _getDefaultMargins: function() 
      +    {
      +        return {
      +            top: 0,
      +            left: 0,
      +            right: 4,
      +            bottom: 0
      +        };
      +    },
      +
      +    /**
      +     * Sets the length of the tick on either side of the axis line.
      +     *
      +     * @method setTickOffset
      +     * @protected
      +     */
      +    setTickOffsets: function()
      +    {
      +        var host = this,
      +            majorTicks = host.get("styles").majorTicks,
      +            tickLength = majorTicks.length,
      +            halfTick = tickLength * 0.5,
      +            display = majorTicks.display;
      +        host.set("topTickOffset",  0);
      +        host.set("bottomTickOffset",  0);
      +        
      +        switch(display)
      +        {
      +            case "inside" :
      +                host.set("rightTickOffset",  tickLength);
      +                host.set("leftTickOffset", 0);
      +            break;
      +            case "outside" : 
      +                host.set("rightTickOffset", 0);
      +                host.set("leftTickOffset",  tickLength);
      +            break;
      +            case "cross":
      +                host.set("rightTickOffset", halfTick); 
      +                host.set("leftTickOffset",  halfTick);
      +            break;
      +            default:
      +                host.set("rightTickOffset", 0);
      +                host.set("leftTickOffset", 0);
      +            break;
      +        }
      +    },
      +    
      +    /**
      +     * Draws a tick
      +     *
      +     * @method drawTick
      +     * @param {Path} path reference to the path `Path` element in which to draw the tick.
      +     * @param {Object} pt Point on the axis in which the tick will intersect.
      +     * @param {Object} tickStyle Hash of properties to apply to the tick.
      +     * @protected
      +     */
      +    drawTick: function(path, pt, tickStyles)
      +    {
      +        var host = this,
      +            style = host.get("styles"),
      +            padding = style.padding,
      +            tickLength = tickStyles.length,
      +            start = {x:padding.left, y:pt.y},
      +            end = {x:tickLength + padding.left, y:pt.y};
      +        host.drawLine(path, start, end);
      +    },
      +
      +    /**
      +     * Calculates the coordinates for the first point on an axis.
      +     *
      +     * @method getLineStart
      +     * @return {Object}
      +     * @protected
      +     */
      +    getLineStart: function()
      +    {
      +        var style = this.get("styles"),
      +            padding = style.padding,
      +            majorTicks = style.majorTicks,
      +            tickLength = majorTicks.length,
      +            display = majorTicks.display,
      +            pt = {x:padding.left, y:0};
      +        if(display === "outside")
      +        {
      +            pt.x += tickLength;
      +        }
      +        else if(display === "cross")
      +        {
      +            pt.x += tickLength/2;
      +        }
      +        return pt; 
      +    },
      +    
      +    /**
      +     * Calculates the point for a label.
      +     *
      +     * @method getLabelPoint
      +     * @param {Object} point Point on the axis in which the tick will intersect.
      +     * @return {Object} 
      +     * @protected
      +     */
      +    getLabelPoint: function(point)
      +    {
      +        return {x:point.x - this.get("leftTickOffset"), y:point.y};
      +    },
      +    
      +    /**
      +     * Updates the value for the `maxLabelSize` for use in calculating total size.
      +     *
      +     * @method updateMaxLabelSize
      +     * @param {HTMLElement} label to measure
      +     * @protected
      +     */
      +    updateMaxLabelSize: function(labelWidth, labelHeight)
      +    {
      +        var host = this,
      +            props = this._labelRotationProps,
      +            rot = props.rot,
      +            absRot = props.absRot,
      +            sinRadians = props.sinRadians,
      +            cosRadians = props.cosRadians,
      +            max;
      +        if(rot === 0)
      +        {
      +            max = labelWidth;
      +        }
      +        else if(absRot === 90)
      +        {
      +            max = labelHeight;
      +        }
      +        else
      +        {
      +            max = (cosRadians * labelWidth) + (sinRadians * labelHeight);
      +        }
      +        host._maxLabelSize = Math.max(host._maxLabelSize, max);
      +    },
      +    
      +    /**
      +     * Determines the available label width when the axis width has been explicitly set.
      +     *
      +     * @method getExplicitlySized
      +     * @return Boolean
      +     * @protected
      +     */
      +    getExplicitlySized: function(styles)
      +    {
      +        if(this._explicitWidth)
      +        {
      +            var host = this,
      +                w = host._explicitWidth,
      +                totalTitleSize = host._totalTitleSize,
      +                leftTickOffset = host.get("leftTickOffset"),
      +                margin = styles.label.margin.right;
      +            host._maxLabelSize =  w - (leftTickOffset + margin + totalTitleSize);
      +            return true;
      +        }
      +        return false;
      +    },
      +
      +    /**
      +     * Rotate and position title.
      +     *
      +     * @method positionTitle
      +     * @param {HTMLElement} label to rotate position
      +     * @protected
      +     */
      +    positionTitle: function(label)
      +    {
      +        var host = this,
      +            bounds = host._titleBounds,
      +            margin = host.get("styles").title.margin,
      +            props = host._titleRotationProps,
      +            w = bounds.right - bounds.left,
      +            labelWidth = label.offsetWidth,
      +            labelHeight = label.offsetHeight,
      +            x = (labelWidth * -0.5) + (w * 0.5),
      +            y = (host.get("height") * 0.5) - (labelHeight * 0.5);
      +        props.labelWidth = labelWidth;
      +        props.labelHeight = labelHeight;
      +        if(margin && margin.left)
      +        {
      +            x += margin.left;
      +        }
      +        props.x = x;
      +        props.y = y;
      +        props.transformOrigin = [0.5, 0.5];
      +        host._rotate(label, props);
      +    },
      +
      +    /**
      +     * Rotate and position labels.
      +     *
      +     * @method positionLabel
      +     * @param {HTMLElement} label to rotate position
      +     * @param {Object} pt hash containing the x and y coordinates in which the label will be positioned
      +     * against.
      +     * @protected
      +     */
      +    positionLabel: function(label, pt, styles, i)
      +    {
      +        var host = this,
      +            tickOffset = host.get("leftTickOffset"),
      +            totalTitleSize = this._totalTitleSize,
      +            leftOffset = pt.x + totalTitleSize - tickOffset,
      +            topOffset = pt.y,
      +            props = this._labelRotationProps,
      +            rot = props.rot,
      +            absRot = props.absRot,
      +            maxLabelSize = host._maxLabelSize,
      +            labelWidth = this._labelWidths[i],
      +            labelHeight = this._labelHeights[i];
      +        if(rot === 0)
      +        {
      +            leftOffset -= labelWidth;
      +            topOffset -= labelHeight * 0.5;
      +        }
      +        else if(rot === 90)
      +        {
      +            leftOffset -= labelWidth * 0.5;
      +        }
      +        else if(rot === -90)
      +        {
      +            leftOffset -= labelWidth * 0.5;
      +            topOffset -= labelHeight;
      +        }
      +        else
      +        {
      +            leftOffset -= labelWidth + (labelHeight * absRot/360);
      +            topOffset -= labelHeight * 0.5;
      +        }
      +        props.labelWidth = labelWidth;
      +        props.labelHeight = labelHeight;
      +        props.x = Math.round(maxLabelSize + leftOffset);
      +        props.y = Math.round(topOffset);
      +        this._rotate(label, props);
      +    },
      +
      +    /**
      +     * Adjusts the coordinates of an axis label based on the rotation.
      +     *
      +     * @method _setRotationCoords
      +     * @param {Object} props Coordinates, dimension and rotation properties of the label.
      +     * @protected
      +     */
      +    _setRotationCoords: function(props)
      +    {
      +        var rot = props.rot,
      +            absRot = props.absRot,
      +            leftOffset,
      +            topOffset,
      +            labelWidth = props.labelWidth,
      +            labelHeight = props.labelHeight;
      +        if(rot === 0)
      +        {
      +            leftOffset = labelWidth;
      +            topOffset = labelHeight * 0.5;
      +        }
      +        else if(rot === 90)
      +        {
      +            topOffset = 0;
      +            leftOffset = labelWidth * 0.5;
      +        }
      +        else if(rot === -90)
      +        {
      +            leftOffset = labelWidth * 0.5;
      +            topOffset = labelHeight;
      +        }
      +        else
      +        {
      +            leftOffset = labelWidth + (labelHeight * absRot/360);
      +            topOffset = labelHeight * 0.5;
      +        }
      +        props.x -= leftOffset;
      +        props.y -= topOffset;
      +    },
      +
      +    /**
      +     * Returns the transformOrigin to use for an axis label based on the position of the axis 
      +     * and the rotation of the label.
      +     *
      +     * @method _getTransformOrigin
      +     * @param {Number} rot The rotation (in degrees) of the label.
      +     * @return Array
      +     * @protected
      +     */
      +    _getTransformOrigin: function(rot)
      +    {
      +        var transformOrigin;
      +        if(rot === 0)
      +        {
      +            transformOrigin = [0, 0];
      +        }
      +        else if(rot === 90)
      +        {
      +            transformOrigin = [0.5, 0];
      +        }
      +        else if(rot === -90)
      +        {
      +            transformOrigin = [0.5, 1];
      +        }
      +        else
      +        {
      +            transformOrigin = [1, 0.5];
      +        }
      +        return transformOrigin;
      +    },
      +
      +    /**
      +     * Adjust the position of the Axis widget's content box for internal axes.
      +     *
      +     * @method offsetNodeForTick
      +     * @param {Node} cb Content box of the Axis.
      +     * @protected
      +     */
      +    offsetNodeForTick: function(cb)
      +    {
      +    },
      +
      +    /**
      +     * Sets the width of the axis based on its contents.
      +     *
      +     * @method setCalculatedSize
      +     * @protected
      +     */
      +    setCalculatedSize: function()
      +    {
      +        var host = this,
      +            graphic = this.get("graphic"),
      +            style = host.get("styles"),
      +            label = style.label,
      +            tickOffset = host.get("leftTickOffset"),
      +            max = host._maxLabelSize,
      +            totalTitleSize = this._totalTitleSize,
      +            ttl = Math.round(totalTitleSize + tickOffset + max + label.margin.right);
      +        if(this._explicitWidth)
      +        {
      +            ttl = this._explicitWidth;
      +        }
      +        this.set("calculatedWidth", ttl);
      +        graphic.set("x", ttl - tickOffset);
      +    }
      +};
      +
      +Y.LeftAxisLayout = LeftAxisLayout;
      diff --git a/tests/input/charts/LineSeries.js b/tests/input/charts/LineSeries.js
      new file mode 100644
      index 00000000..6a3e48f6
      --- /dev/null
      +++ b/tests/input/charts/LineSeries.js
      @@ -0,0 +1,94 @@
      +/**
      + * The LineSeries class renders quantitative data on a graph by connecting relevant data points.
      + *
      + * @module charts
      + * @class LineSeries
      + * @extends CartesianSeries
      + * @uses Lines
      + * @constructor
      + */
      +Y.LineSeries = Y.Base.create("lineSeries", Y.CartesianSeries, [Y.Lines], {
      +    /**
      +     * @protected
      +     *
      +     * @method drawSeries
      +     */
      +    drawSeries: function()
      +    {
      +        this.drawLines();
      +    },
      +
      +    /**
      +     * @protected
      +     *
      +     * Method used by `styles` setter. Overrides base implementation.
      +     *
      +     * @method _setStyles
      +     * @param {Object} newStyles Hash of properties to update.
      +     * @return Object
      +     */
      +    _setStyles: function(val)
      +    {
      +        if(!val.line)
      +        {
      +            val = {line:val};
      +        }
      +        return Y.LineSeries.superclass._setStyles.apply(this, [val]);
      +    },
      +
      +    /**
      +     * @protected
      +     *
      +     * Gets the default value for the `styles` attribute. Overrides
      +     * base implementation.
      +     *
      +     * @method _getDefaultStyles
      +     * @return Object
      +     */
      +    _getDefaultStyles: function()
      +    {
      +        var styles = this._mergeStyles({line:this._getLineDefaults()}, Y.LineSeries.superclass._getDefaultStyles());
      +        return styles;
      +    }
      +},
      +{
      +    ATTRS: {
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @default line
      +         */
      +        type: {
      +            value:"line"
      +        }
      +
      +        /**
      +         * Style properties used for drawing lines. This attribute is inherited from `Renderer`. Below are the default values:
      +         *  <dl>
      +         *      <dt>color</dt><dd>The color of the line. The default value is determined by the order of the series on the graph. The color will be
      +         *      retrieved from the following array: 
      +         *      `["#426ab3", "#d09b2c", "#000000", "#b82837", "#b384b5", "#ff7200", "#779de3", "#cbc8ba", "#7ed7a6", "#007a6c"]`
      +         *      <dt>weight</dt><dd>Number that indicates the width of the line. The default value is 6.</dd>
      +         *      <dt>alpha</dt><dd>Number between 0 and 1 that indicates the opacity of the line. The default value is 1.</dd>
      +         *      <dt>lineType</dt><dd>Indicates whether the line is solid or dashed. The default value is solid.</dd> 
      +         *      <dt>dashLength</dt><dd>When the `lineType` is dashed, indicates the length of the dash. The default value is 10.</dd>
      +         *      <dt>gapSpace</dt><dd>When the `lineType` is dashed, indicates the distance between dashes. The default value is 10.</dd>
      +         *      <dt>connectDiscontinuousPoints</dt><dd>Indicates whether or not to connect lines when there is a missing or null value between points. The default value is true.</dd> 
      +         *      <dt>discontinuousType</dt><dd>Indicates whether the line between discontinuous points is solid or dashed. The default value is solid.</dd>
      +         *      <dt>discontinuousDashLength</dt><dd>When the `discontinuousType` is dashed, indicates the length of the dash. The default value is 10.</dd>
      +         *      <dt>discontinuousGapSpace</dt><dd>When the `discontinuousType` is dashed, indicates the distance between dashes. The default value is 10.</dd>
      +         *  </dl>
      +         *
      +         * @attribute styles
      +         * @type Object
      +         */
      +    }
      +});
      +
      +
      +
      +		
      +
      +		
      diff --git a/tests/input/charts/Lines.js b/tests/input/charts/Lines.js
      new file mode 100644
      index 00000000..dbd36db8
      --- /dev/null
      +++ b/tests/input/charts/Lines.js
      @@ -0,0 +1,264 @@
      +/**
      + * Utility class used for drawing lines.
      + *
      + * @module charts
      + * @class Lines
      + * @constructor
      + */
      +function Lines(){}
      +
      +Lines.prototype = {
      +    /**
      +     * @property _lineDefaults
      +     * @type Object
      +     * @private
      +     */
      +    _lineDefaults: null,
      +    
      +    /**
      +     * Creates a graphic in which to draw a series.
      +     *
      +     * @method _getGraphic
      +     * @return Graphic
      +     * @private
      +     */
      +    _getGraphic: function()
      +    {
      +        var graphic = this.get("graphic") || this.get("graph").get("graphic");
      +        if(!this._lineGraphic)
      +        {
      +            this._lineGraphic = graphic.addShape({type: "path"});
      +        }
      +        this._lineGraphic.clear();
      +        return this._lineGraphic;
      +    },
      +    
      +    /**
      +     * Toggles visibility
      +     *
      +     * @method _toggleVisible
      +     * @param {Boolean} visible indicates visibilitye
      +     * @private
      +     */
      +    _toggleVisible: function(visible)
      +    {
      +        if(this._lineGraphic)
      +        {
      +            this._lineGraphic.set("visible", visible);
      +        }
      +    },
      +
      +    /**
      +     * Draws lines for the series.
      +     *
      +     * @method drawLines
      +     * @protected
      +     */
      +    drawLines: function()
      +    {
      +        if(this.get("xcoords").length < 1) 
      +        {
      +            return;
      +        }
      +        var isNumber = Y_Lang.isNumber,
      +            xcoords = this.get("xcoords").concat(),
      +            ycoords = this.get("ycoords").concat(),
      +            direction = this.get("direction"),
      +            len = direction === "vertical" ? ycoords.length : xcoords.length,
      +            lastPointValid,
      +            pointValid,
      +            noPointsRendered = true,
      +            lastValidX,
      +            lastValidY,
      +            nextX,
      +            nextY,
      +            i,
      +            styles = this.get("styles").line,
      +            lineType = styles.lineType,
      +            lc = styles.color || this._getDefaultColor(this.get("graphOrder"), "line"),
      +            lineAlpha = styles.alpha,
      +            dashLength = styles.dashLength,
      +            gapSpace = styles.gapSpace,
      +            connectDiscontinuousPoints = styles.connectDiscontinuousPoints,
      +            discontinuousType = styles.discontinuousType,
      +            discontinuousDashLength = styles.discontinuousDashLength,
      +            discontinuousGapSpace = styles.discontinuousGapSpace,
      +            path = this._getGraphic();
      +        path.set("stroke", {
      +            weight: styles.weight, 
      +            color: lc, 
      +            opacity: lineAlpha
      +        });
      +        for(i = 0; i < len; i = ++i)
      +        {
      +            nextX = xcoords[i];
      +            nextY = ycoords[i];
      +            pointValid = isNumber(nextX) && isNumber(nextY); 
      +            if(!pointValid)
      +            {
      +                lastPointValid = pointValid;
      +                continue;
      +            }
      +            if(noPointsRendered)
      +            {
      +                noPointsRendered = false;
      +                path.moveTo(nextX, nextY);
      +            }
      +            else if(lastPointValid)
      +            {
      +                if(lineType != "dashed")
      +                {
      +                    path.lineTo(nextX, nextY);
      +                }
      +                else
      +                {
      +                    this.drawDashedLine(path, lastValidX, lastValidY, nextX, nextY, 
      +                                                dashLength, 
      +                                                gapSpace);
      +                }
      +            }
      +            else if(!connectDiscontinuousPoints)
      +            {
      +                path.moveTo(nextX, nextY);
      +            }
      +            else
      +            {
      +                if(discontinuousType != "solid")
      +                {
      +                    this.drawDashedLine(path, lastValidX, lastValidY, nextX, nextY, 
      +                                                discontinuousDashLength, 
      +                                                discontinuousGapSpace);
      +                }
      +                else
      +                {
      +                    path.lineTo(nextX, nextY);
      +                }
      +            }
      +            lastValidX = nextX;
      +            lastValidY = nextY;
      +            lastPointValid = true;
      +        }
      +        path.end();
      +    },
      +    
      +    /**
      +     * Connects data points with a consistent curve for a series.
      +     * 
      +     * @method drawSpline
      +     * @protected
      +     */
      +    drawSpline: function()
      +    {
      +        if(this.get("xcoords").length < 1) 
      +        {
      +            return;
      +        }
      +        var xcoords = this.get("xcoords"),
      +            ycoords = this.get("ycoords"),
      +            curvecoords = this.getCurveControlPoints(xcoords, ycoords),
      +            len = curvecoords.length,
      +            cx1,
      +            cx2,
      +            cy1,
      +            cy2,
      +            x,
      +            y,
      +            i = 0,
      +            styles = this.get("styles").line,
      +            path = this._getGraphic(),
      +            lineAlpha = styles.alpha,
      +            color = styles.color || this._getDefaultColor(this.get("graphOrder"), "line");
      +        path.set("stroke", { 
      +            weight: styles.weight, 
      +            color: color, 
      +            opacity: lineAlpha
      +        });
      +        path.moveTo(xcoords[0], ycoords[0]);
      +        for(; i < len; i = ++i)
      +        {
      +            x = curvecoords[i].endx;
      +            y = curvecoords[i].endy;
      +            cx1 = curvecoords[i].ctrlx1;
      +            cx2 = curvecoords[i].ctrlx2;
      +            cy1 = curvecoords[i].ctrly1;
      +            cy2 = curvecoords[i].ctrly2;
      +            path.curveTo(cx1, cy1, cx2, cy2, x, y);
      +        }
      +        path.end();
      +    },
      +
      +    /**
      +     * Draws a dashed line between two points.
      +     * 
      +     * @method drawDashedLine
      +     * @param {Number} xStart	The x position of the start of the line
      +     * @param {Number} yStart	The y position of the start of the line
      +     * @param {Number} xEnd		The x position of the end of the line
      +     * @param {Number} yEnd		The y position of the end of the line
      +     * @param {Number} dashSize	the size of dashes, in pixels
      +     * @param {Number} gapSize	the size of gaps between dashes, in pixels
      +     * @private
      +     */
      +    drawDashedLine: function(path, xStart, yStart, xEnd, yEnd, dashSize, gapSize)
      +    {
      +        dashSize = dashSize || 10;
      +        gapSize = gapSize || 10;
      +        var segmentLength = dashSize + gapSize,
      +            xDelta = xEnd - xStart,
      +            yDelta = yEnd - yStart,
      +            delta = Math.sqrt(Math.pow(xDelta, 2) + Math.pow(yDelta, 2)),
      +            segmentCount = Math.floor(Math.abs(delta / segmentLength)),
      +            radians = Math.atan2(yDelta, xDelta),
      +            xCurrent = xStart,
      +            yCurrent = yStart,
      +            i;
      +        xDelta = Math.cos(radians) * segmentLength;
      +        yDelta = Math.sin(radians) * segmentLength;
      +        
      +        for(i = 0; i < segmentCount; ++i)
      +        {
      +            path.moveTo(xCurrent, yCurrent);
      +            path.lineTo(xCurrent + Math.cos(radians) * dashSize, yCurrent + Math.sin(radians) * dashSize);
      +            xCurrent += xDelta;
      +            yCurrent += yDelta;
      +        }
      +        
      +        path.moveTo(xCurrent, yCurrent);
      +        delta = Math.sqrt((xEnd - xCurrent) * (xEnd - xCurrent) + (yEnd - yCurrent) * (yEnd - yCurrent));
      +        
      +        if(delta > dashSize)
      +        {
      +            path.lineTo(xCurrent + Math.cos(radians) * dashSize, yCurrent + Math.sin(radians) * dashSize);
      +        }
      +        else if(delta > 0)
      +        {
      +            path.lineTo(xCurrent + Math.cos(radians) * delta, yCurrent + Math.sin(radians) * delta);
      +        }
      +        
      +        path.moveTo(xEnd, yEnd);
      +    },
      +
      +    /**
      +     * Default values for `styles` attribute.
      +     *
      +     * @method _getLineDefaults
      +     * @return Object
      +     * @protected
      +     */
      +    _getLineDefaults: function()
      +    {
      +        return {
      +            alpha: 1,
      +            weight: 6,
      +            lineType:"solid", 
      +            dashLength:10, 
      +            gapSpace:10, 
      +            connectDiscontinuousPoints:true, 
      +            discontinuousType:"solid", 
      +            discontinuousDashLength:10, 
      +            discontinuousGapSpace:10
      +        };
      +    }
      +};
      +Y.augment(Lines, Y.Attribute);
      +Y.Lines = Lines;
      diff --git a/tests/input/charts/MarkerSeries.js b/tests/input/charts/MarkerSeries.js
      new file mode 100644
      index 00000000..646ddc20
      --- /dev/null
      +++ b/tests/input/charts/MarkerSeries.js
      @@ -0,0 +1,103 @@
      +/**
      + * The MarkerSeries class renders quantitative data by plotting relevant data points 
      + * on a graph.
      + *
      + * @module charts
      + * @class MarkerSeries
      + * @extends CartesianSeries
      + * @uses Plots
      + * @constructor
      + */
      +Y.MarkerSeries = Y.Base.create("markerSeries", Y.CartesianSeries, [Y.Plots], {
      +    /**
      +     * @protected
      +     *
      +     * Draws the series.
      +     *
      +     * @method drawSeries
      +     */
      +    drawSeries: function()
      +    {
      +        this.drawPlots();
      +    },
      +    
      +    /**
      +     * @protected
      +     *
      +     * Method used by `styles` setter. Overrides base implementation.
      +     *
      +     * @method _setStyles
      +     * @param {Object} newStyles Hash of properties to update.
      +     * @return Object
      +     */
      +    _setStyles: function(val)
      +    {
      +        if(!val.marker)
      +        {
      +            val = {marker:val};
      +        }
      +        val = this._parseMarkerStyles(val);
      +        return Y.MarkerSeries.superclass._mergeStyles.apply(this, [val, this._getDefaultStyles()]);
      +    },
      +    
      +    /**
      +     * @protected
      +     *
      +     * Gets the default value for the `styles` attribute. Overrides
      +     * base implementation.
      +     *
      +     * @method _getDefaultStyles
      +     * @return Object
      +     */
      +    _getDefaultStyles: function()
      +    {
      +        var styles = this._mergeStyles({marker:this._getPlotDefaults()}, Y.MarkerSeries.superclass._getDefaultStyles());
      +        return styles;
      +    }
      +},{
      +    ATTRS : {
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @default marker
      +         */
      +        type: {
      +            value:"marker"
      +        }
      +        
      +        /**
      +         * Style properties used for drawing markers. This attribute is inherited from `Renderer`. Below are the default values:
      +         *  <dl>
      +         *      <dt>fill</dt><dd>A hash containing the following values:
      +         *          <dl>
      +         *              <dt>color</dt><dd>Color of the fill. The default value is determined by the order of the series on the graph. The color
      +         *              will be retrieved from the below array:<br/>
      +         *              `["#6084d0", "#eeb647", "#6c6b5f", "#d6484f", "#ce9ed1", "#ff9f3b", "#93b7ff", "#e0ddd0", "#94ecba", "#309687"]`
      +         *              </dd>
      +         *              <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the marker fill. The default value is 1.</dd>
      +         *          </dl>
      +         *      </dd>
      +         *      <dt>border</dt><dd>A hash containing the following values:
      +         *          <dl>
      +         *              <dt>color</dt><dd>Color of the border. The default value is determined by the order of the series on the graph. The color
      +         *              will be retrieved from the below array:<br/>
      +         *              `["#205096", "#b38206", "#000000", "#94001e", "#9d6fa0", "#e55b00", "#5e85c9", "#adab9e", "#6ac291", "#006457"]`
      +         *              <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the marker border. The default value is 1.</dd>
      +         *              <dt>weight</dt><dd>Number indicating the width of the border. The default value is 1.</dd>
      +         *          </dl>
      +         *      </dd>
      +         *      <dt>width</dt><dd>indicates the width of the marker. The default value is 10.</dd>
      +         *      <dt>height</dt><dd>indicates the height of the marker The default value is 10.</dd>
      +         *      <dt>over</dt><dd>hash containing styles for markers when highlighted by a `mouseover` event. The default 
      +         *      values for each style is null. When an over style is not set, the non-over value will be used. For example,
      +         *      the default value for `marker.over.fill.color` is equivalent to `marker.fill.color`.</dd>
      +         *  </dl>
      +         *
      +         * @attribute styles
      +         * @type Object
      +         */
      +    }
      +});
      +
      diff --git a/tests/input/charts/NumericAxis.js b/tests/input/charts/NumericAxis.js
      new file mode 100644
      index 00000000..bf836360
      --- /dev/null
      +++ b/tests/input/charts/NumericAxis.js
      @@ -0,0 +1,681 @@
      +/**
      + * NumericAxis manages numeric data on an axis.
      + *
      + * @module charts
      + * @class NumericAxis
      + * @constructor
      + * @param {Object} config (optional) Configuration parameters for the Chart.
      + * @extends AxisType
      + */
      +function NumericAxis(config)
      +{
      +	NumericAxis.superclass.constructor.apply(this, arguments);
      +}
      +
      +NumericAxis.NAME = "numericAxis";
      +
      +NumericAxis.ATTRS = {
      +    /**
      +     * Indicates whether 0 should always be displayed.
      +     *
      +     * @attribute alwaysShowZero
      +     * @type Boolean
      +     */
      +	alwaysShowZero: {
      +	    value: true	
      +	},
      +    
      +    /**
      +     * Method used for formatting a label. This attribute allows for the default label formatting method to overridden. The method use would need
      +     * to implement the arguments below and return a `String` or an `HTMLElement`. The default implementation of the method returns a `String`. The output of this method
      +     * will be rendered to the DOM using `appendChild`. If you override the `labelFunction` method and return an html string, you will also need to override the Axis' 
      +     * `appendLabelFunction` to accept html as a `String`.
      +     * <dl>
      +     *      <dt>val</dt><dd>Label to be formatted. (`String`)</dd>
      +     *      <dt>format</dt><dd>Object containing properties used to format the label. (optional)</dd>
      +     * </dl>
      +     *
      +     * @attribute labelFunction
      +     * @type Function
      +     */
      +    labelFunction: { 
      +        value: function(val, format)
      +        {
      +            if(format)
      +            {
      +                return Y.DataType.Number.format(val, format);
      +            }
      +            return val;
      +        }
      +    },
      +
      +    /**
      +     * Object containing properties used by the `labelFunction` to format a
      +     * label.
      +     *
      +     * @attribute labelFormat
      +     * @type Object
      +     */
      +    labelFormat: {
      +        value: {
      +            prefix: "",
      +            thousandsSeparator: "",
      +            decimalSeparator: "",
      +            decimalPlaces: "0",
      +            suffix: ""
      +        }
      +    }
      +};
      +
      +Y.extend(NumericAxis, Y.AxisType,
      +{
      +    /**
      +     * Formats a label based on the axis type and optionally specified format.
      +     *
      +     * @method formatLabel
      +     * @param {Object} value
      +     * @param {Object} format Pattern used to format the value.
      +     * @return String
      +     */
      +    formatLabel: function(val, format)
      +    {
      +        if(format)
      +        {
      +            return Y.DataType.Number.format(val, format);
      +        }
      +        return val;
      +    },
      +
      +    /**
      +     * Returns the sum of all values per key.
      +     *
      +     * @method getTotalByKey
      +     * @param {String} key The identifier for the array whose values will be calculated.
      +     * @return Number
      +     */
      +    getTotalByKey: function(key)
      +    {
      +        var total = 0,
      +            values = this.getDataByKey(key),
      +            i = 0,
      +            val,
      +            len = values ? values.length : 0;
      +        for(; i < len; ++i)
      +        {
      +           val = parseFloat(values[i]);
      +           if(!isNaN(val))
      +           {
      +                total += val;
      +           }
      +        }
      +        return total;
      +    },
      +
      +    /**
      +     * Type of data used in `Axis`.
      +     *
      +     * @property _type
      +     * @readOnly
      +     * @private
      +     */
      +    _type: "numeric",
      +
      +    /**
      +     * Helper method for getting a `roundingUnit` when calculating the minimum and maximum values.
      +     *
      +     * @method _getMinimumUnit
      +     * @param {Number} max Maximum number
      +     * @param {Number} min Minimum number
      +     * @param {Number} units Number of units on the axis
      +     * @return Number
      +     * @private
      +     */
      +    _getMinimumUnit:function(max, min, units)
      +    {
      +        return this._getNiceNumber(Math.ceil((max - min)/units));
      +    },
      +
      +    /**
      +     * Calculates a nice rounding unit based on the range.
      +     *
      +     * @method _getNiceNumber
      +     * @param {Number} roundingUnit The calculated rounding unit.
      +     * @return Number
      +     * @private
      +     */
      +    _getNiceNumber: function(roundingUnit)
      +    {
      +        var tempMajorUnit = roundingUnit,
      +            order = Math.ceil(Math.log(tempMajorUnit) * 0.4342944819032518),
      +            roundedMajorUnit = Math.pow(10, order),
      +            roundedDiff;
      +
      +        if (roundedMajorUnit / 2 >= tempMajorUnit) 
      +        {
      +            roundedDiff = Math.floor((roundedMajorUnit / 2 - tempMajorUnit) / (Math.pow(10,order-1)/2));
      +            tempMajorUnit = roundedMajorUnit/2 - roundedDiff*Math.pow(10,order-1)/2;
      +        }
      +        else 
      +        {
      +            tempMajorUnit = roundedMajorUnit;
      +        }
      +        if(!isNaN(tempMajorUnit))
      +        {
      +            return tempMajorUnit;
      +        }
      +        return roundingUnit;
      +
      +    },
      +
      +    /**
      +     * Calculates the maximum and minimum values for the `Axis`.
      +     *
      +     * @method _updateMinAndMax
      +     * @private 
      +     */
      +    _updateMinAndMax: function()
      +    {
      +        var data = this.get("data"),
      +            max, 
      +            min,
      +            len,
      +            num,
      +            i = 0,
      +            key,
      +            setMax = this.get("setMax"),
      +            setMin = this.get("setMin");
      +        if(!setMax || !setMin)
      +        {
      +            if(data && data.length && data.length > 0)
      +            {
      +                len = data.length;
      +                for(; i < len; i++)
      +                {	
      +                    num = data[i];
      +                    if(isNaN(num))
      +                    {
      +                        if(Y_Lang.isObject(num))
      +                        {
      +                            min = max = 0;
      +                            //hloc values
      +                            for(key in num)
      +                            {
      +                               if(num.hasOwnProperty(key))
      +                               {
      +                                    max = Math.max(num[key], max);
      +                                    min = Math.min(num[key], min);
      +                               }
      +                            }
      +                        }
      +                        max = setMax ? this._setMaximum : max;
      +                        min = setMin ? this._setMinimum : min;
      +                        continue;
      +                    }
      +                    
      +                    if(setMin)
      +                    {
      +                        min = this._setMinimum;
      +                    }
      +                    else if(min === undefined)
      +                    {
      +                        min = num;
      +                    }
      +                    else
      +                    {
      +                        min = Math.min(num, min); 
      +                    }
      +                    if(setMax)
      +                    {
      +                        max = this._setMaximum;
      +                    }
      +                    else if(max === undefined)
      +                    {
      +                        max = num;
      +                    }
      +                    else
      +                    {
      +                        max = Math.max(num, max);
      +                    }
      +                    
      +                    this._actualMaximum = max;
      +                    this._actualMinimum = min;
      +                }
      +            }
      +            this._roundMinAndMax(min, max, setMin, setMax);
      +        }
      +    },
      +
      +    /**
      +     * Rounds the mimimum and maximum values based on the `roundingUnit` attribute.
      +     *
      +     * @method _roundMinAndMax
      +     * @param {Number} min Minimum value
      +     * @param {Number} max Maximum value
      +     * @private
      +     */
      +    _roundMinAndMax: function(min, max, setMin, setMax)
      +    {
      +        var roundingUnit,
      +            minimumRange,
      +            minGreaterThanZero = min >= 0,
      +            maxGreaterThanZero = max > 0,
      +            dataRangeGreater,
      +            maxRound,
      +            minRound,
      +            topTicks,
      +            botTicks,
      +            tempMax,
      +            tempMin,
      +            units = this.getTotalMajorUnits() - 1,
      +            alwaysShowZero = this.get("alwaysShowZero"),
      +            roundingMethod = this.get("roundingMethod"),
      +            useIntegers = (max - min)/units >= 1;
      +        if(roundingMethod)
      +        {
      +            if(roundingMethod == "niceNumber")
      +            {
      +                roundingUnit = this._getMinimumUnit(max, min, units);
      +                if(minGreaterThanZero && maxGreaterThanZero)
      +                {
      +                    if((alwaysShowZero || min < roundingUnit) && !setMin)
      +                    {
      +                        min = 0;
      +                        roundingUnit = this._getMinimumUnit(max, min, units);
      +                    }
      +                    else
      +                    {
      +                       min = this._roundDownToNearest(min, roundingUnit);
      +                    }
      +                    if(setMax)
      +                    {
      +                        if(!alwaysShowZero)
      +                        {
      +                            min = max - (roundingUnit * units);
      +                        }
      +                    }
      +                    else if(setMin)
      +                    {
      +                        max = min + (roundingUnit * units);
      +                    }
      +                    else
      +                    {
      +                        max = this._roundUpToNearest(max, roundingUnit);
      +                    }
      +                }
      +                else if(maxGreaterThanZero && !minGreaterThanZero)
      +                {
      +                    if(alwaysShowZero)
      +                    {
      +                        topTicks = Math.round(units/((-1 * min)/max + 1));
      +                        topTicks = Math.max(Math.min(topTicks, units - 1), 1);
      +                        botTicks = units - topTicks;
      +                        tempMax = Math.ceil( max/topTicks );
      +                        tempMin = Math.floor( min/botTicks ) * -1;
      +                        
      +                        if(setMin)
      +                        {
      +                            while(tempMin < tempMax && botTicks >= 0)
      +                            {
      +                                botTicks--;
      +                                topTicks++;
      +                                tempMax = Math.ceil( max/topTicks );
      +                                tempMin = Math.floor( min/botTicks ) * -1;
      +                            }
      +                            //if there are any bottom ticks left calcualate the maximum by multiplying by the tempMin value
      +                            //if not, it's impossible to ensure that a zero is shown. skip it
      +                            if(botTicks > 0)
      +                            {
      +                                max = tempMin * topTicks;
      +                            }
      +                            else
      +                            {
      +                                max = min + (roundingUnit * units);
      +                            }
      +                        }
      +                        else if(setMax)
      +                        {
      +                            while(tempMax < tempMin && topTicks >= 0)
      +                            {
      +                                botTicks++;
      +                                topTicks--;
      +                                tempMin = Math.floor( min/botTicks ) * -1;
      +                                tempMax = Math.ceil( max/topTicks );
      +                            }
      +                            //if there are any top ticks left calcualate the minimum by multiplying by the tempMax value
      +                            //if not, it's impossible to ensure that a zero is shown. skip it
      +                            if(topTicks > 0)
      +                            {
      +                                min = tempMax * botTicks * -1;
      +                            }
      +                            else
      +                            {
      +                                min = max - (roundingUnit * units);
      +                            }
      +                        }
      +                        else
      +                        {
      +                            roundingUnit = Math.max(tempMax, tempMin);
      +                            roundingUnit = this._getNiceNumber(roundingUnit);  
      +                            max = roundingUnit * topTicks;
      +                            min = roundingUnit * botTicks * -1;
      +                        }
      +                    }
      +                    else 
      +                    {
      +                        if(setMax)
      +                        {
      +                            min = max - (roundingUnit * units);
      +                        }
      +                        else if(setMin)
      +                        {
      +                            max = min + (roundingUnit * units);
      +                        }
      +                        else
      +                        {
      +                            min = this._roundDownToNearest(min, roundingUnit);
      +                            max = this._roundUpToNearest(max, roundingUnit);
      +                        }
      +                    }
      +                }
      +                else
      +                {
      +                    if(setMin)
      +                    {
      +                        if(alwaysShowZero)
      +                        {
      +                            max = 0;
      +                        }
      +                        else
      +                        {
      +                            max = min + (roundingUnit * units);
      +                        }
      +                    }
      +                    else if(!setMax)
      +                    {
      +                        if(alwaysShowZero || max === 0 || max + roundingUnit > 0)
      +                        {
      +                            max = 0;
      +                            roundingUnit = this._getMinimumUnit(max, min, units);
      +                        }
      +                        else
      +                        {
      +                            max = this._roundUpToNearest(max, roundingUnit);
      +                        }
      +                        min = max - (roundingUnit * units);
      +                    }
      +                    else
      +                    {
      +                        min = max - (roundingUnit * units);
      +                    }
      +                }
      +            }
      +            else if(roundingMethod == "auto") 
      +            {
      +                if(minGreaterThanZero && maxGreaterThanZero)
      +                {
      +                    if((alwaysShowZero || min < (max-min)/units) && !setMin)
      +                    {
      +                        min = 0;
      +                    }
      +                
      +                    roundingUnit = (max - min)/units;
      +                    if(useIntegers)
      +                    {
      +                        roundingUnit = Math.ceil(roundingUnit);
      +                    }
      +                    max = min + (roundingUnit * units);
      +                }
      +                else if(maxGreaterThanZero && !minGreaterThanZero)
      +                {
      +                    if(alwaysShowZero)
      +                    {
      +                        topTicks = Math.round( units / ( (-1 * min) /max + 1) );
      +                        topTicks = Math.max(Math.min(topTicks, units - 1), 1);
      +                        botTicks = units - topTicks;
      +
      +                        if(useIntegers)
      +                        {
      +                            tempMax = Math.ceil( max/topTicks );
      +                            tempMin = Math.floor( min/botTicks ) * -1;
      +                        }
      +                        else
      +                        {
      +                            tempMax = max/topTicks;
      +                            tempMin = min/botTicks * -1;
      +                        }
      +                        roundingUnit = Math.max(tempMax, tempMin);
      +                        max = roundingUnit * topTicks;
      +                        min = roundingUnit * botTicks * -1;
      +                    }
      +                    else
      +                    {
      +                        roundingUnit = (max - min)/units;
      +                        if(useIntegers)
      +                        {
      +                            roundingUnit = Math.ceil(roundingUnit);
      +                        }
      +                        min = this._roundDownToNearest(min, roundingUnit);
      +                        max = this._roundUpToNearest(max, roundingUnit);
      +                    }
      +                }
      +                else
      +                {
      +                    roundingUnit = (max - min)/units;
      +                    if(useIntegers)
      +                    {   
      +                        roundingUnit = Math.ceil(roundingUnit);
      +                    }
      +                    if(alwaysShowZero || max === 0 || max + roundingUnit > 0)
      +                    {
      +                        max = 0;
      +                        roundingUnit = (max - min)/units;
      +                        if(useIntegers)
      +                        {
      +                            Math.ceil(roundingUnit);
      +                        }
      +                    }
      +                    else
      +                    {
      +                        max = this._roundUpToNearest(max, roundingUnit);
      +                    }
      +                    min = max - (roundingUnit * units);
      +
      +                }
      +            }
      +            else if(!isNaN(roundingMethod) && isFinite(roundingMethod))
      +            {
      +                roundingUnit = roundingMethod;
      +                minimumRange = roundingUnit * units;
      +                dataRangeGreater = (max - min) > minimumRange;
      +                minRound = this._roundDownToNearest(min, roundingUnit);
      +                maxRound = this._roundUpToNearest(max, roundingUnit);
      +                if(setMax)
      +                {
      +                    min = max - minimumRange;
      +                }
      +                else if(setMin)
      +                {
      +                    max = min + minimumRange;
      +                }
      +                else if(minGreaterThanZero && maxGreaterThanZero)
      +                {
      +                    if(alwaysShowZero || minRound <= 0)
      +                    {
      +                        min = 0;
      +                    }
      +                    else
      +                    {
      +                        min = minRound;
      +                    }
      +                    max = min + minimumRange;
      +                }
      +                else if(maxGreaterThanZero && !minGreaterThanZero)
      +                {
      +                    min = minRound;
      +                    max = min + minimumRange;
      +                }
      +                else
      +                {
      +                    if(alwaysShowZero || maxRound >= 0)
      +                    {
      +                        max = 0;
      +                    }
      +                    else
      +                    {
      +                        max = maxRound;
      +                    }
      +                    min = max - minimumRange;
      +                }
      +            }
      +        }
      +        this._dataMaximum = max;
      +        this._dataMinimum = min;
      +    },
      +
      +    /**
      +     * Calculates and returns a value based on the number of labels and the index of
      +     * the current label.
      +     *
      +     * @method getLabelByIndex
      +     * @param {Number} i Index of the label.
      +     * @param {Number} l Total number of labels.
      +     * @return String
      +     */
      +    getLabelByIndex: function(i, l)
      +    {
      +        var min = this.get("minimum"),
      +            max = this.get("maximum"),
      +            increm = (max - min)/(l-1),
      +            label,
      +            roundingMethod = this.get("roundingMethod");
      +            l -= 1;
      +        //respect the min and max. calculate all other labels.
      +        if(i === 0)
      +        {
      +            label = min;
      +        }
      +        else if(i === l)
      +        {
      +            label = max;
      +        }
      +        else
      +        {
      +            label = (i * increm);
      +            if(roundingMethod == "niceNumber")
      +            {
      +                label = this._roundToNearest(label, increm);
      +            }
      +            label += min;
      +        }
      +        return parseFloat(label);
      +    },
      +
      +    /**
      +     * Rounds a Number to the nearest multiple of an input. For example, by rounding
      +     * 16 to the nearest 10, you will receive 20. Similar to the built-in function Math.round().
      +     *
      +     * @method _roundToNearest
      +     * @param {Number} number Number to round
      +     * @param {Number} nearest Multiple to round towards.
      +     * @return Number
      +     * @private
      +     */
      +    _roundToNearest: function(number, nearest)
      +    {
      +        nearest = nearest || 1;
      +        if(nearest === 0)
      +        {
      +            return number;
      +        }
      +        var roundedNumber = Math.round(this._roundToPrecision(number / nearest, 10)) * nearest;
      +        return this._roundToPrecision(roundedNumber, 10);
      +    },
      +	
      +    /**
      +     * Rounds a Number up to the nearest multiple of an input. For example, by rounding
      +     * 16 up to the nearest 10, you will receive 20. Similar to the built-in function Math.ceil().
      +     *
      +     * @method _roundUpToNearest
      +     * @param {Number} number Number to round
      +     * @param {Number} nearest Multiple to round towards.
      +     * @return Number
      +     * @private
      +     */
      +    _roundUpToNearest: function(number, nearest)
      +    {
      +        nearest = nearest || 1;
      +        if(nearest === 0)
      +        {
      +            return number;
      +        }
      +        return Math.ceil(this._roundToPrecision(number / nearest, 10)) * nearest;
      +    },
      +	
      +    /**
      +     * Rounds a Number down to the nearest multiple of an input. For example, by rounding
      +     * 16 down to the nearest 10, you will receive 10. Similar to the built-in function Math.floor().
      +     *
      +     * @method _roundDownToNearest
      +     * @param {Number} number Number to round
      +     * @param {Number} nearest Multiple to round towards.
      +     * @return Number
      +     * @private
      +     */
      +    _roundDownToNearest: function(number, nearest)
      +    {
      +        nearest = nearest || 1;
      +        if(nearest === 0)
      +        {
      +            return number;
      +        }
      +        return Math.floor(this._roundToPrecision(number / nearest, 10)) * nearest;
      +    },
      +
      +    /**
      +     * Rounds a number to a certain level of precision. Useful for limiting the number of
      +     * decimal places on a fractional number.
      +     *
      +     * @method _roundToPrecision
      +     * @param {Number} number Number to round
      +     * @param {Number} precision Multiple to round towards.
      +     * @return Number
      +     * @private
      +     */
      +    _roundToPrecision: function(number, precision)
      +    {
      +        precision = precision || 0;
      +        var decimalPlaces = Math.pow(10, precision);
      +        return Math.round(decimalPlaces * number) / decimalPlaces;
      +    },
      +    
      +    /**
      +     * Checks to see if data extends beyond the range of the axis. If so,
      +     * that data will need to be hidden. This method is internal, temporary and subject
      +     * to removal in the future.
      +     *
      +     * @method _hasDataOverflow
      +     * @protected
      +     * @return Boolean
      +     */
      +    _hasDataOverflow: function()
      +    {
      +        var roundingMethod,
      +            min,
      +            max;
      +        if(this.get("setMin") || this.get("setMax"))
      +        {
      +            return true;
      +        }
      +        roundingMethod = this.get("roundingMethod");
      +        min = this._actualMinimum;
      +        max = this._actualMaximum;
      +        if(Y_Lang.isNumber(roundingMethod) && ((Y_Lang.isNumber(max) && max > this._dataMaximum) || (Y_Lang.isNumber(min) && min < this._dataMinimum)))
      +        {
      +            return true;
      +        }
      +        return false;
      +    }
      +});
      +
      +Y.NumericAxis = NumericAxis;
      +		
      diff --git a/tests/input/charts/PieChart.js b/tests/input/charts/PieChart.js
      new file mode 100644
      index 00000000..8803d9e7
      --- /dev/null
      +++ b/tests/input/charts/PieChart.js
      @@ -0,0 +1,465 @@
      +/**
      + * The PieChart class creates a pie chart
      + *
      + * @module charts
      + * @class PieChart
      + * @extends ChartBase
      + * @constructor
      + */
      +Y.PieChart = Y.Base.create("pieChart", Y.Widget, [Y.ChartBase], {
      +    /**
      +     * Calculates and returns a `seriesCollection`.
      +     *
      +     * @method _getSeriesCollection
      +     * @return Array
      +     * @private
      +     */
      +    _getSeriesCollection: function()
      +    {
      +        if(this._seriesCollection)
      +        {
      +            return this._seriesCollection;
      +        }
      +        var axes = this.get("axes"),
      +            sc = [], 
      +            seriesKeys,
      +            i = 0,
      +            l,
      +            type = this.get("type"),
      +            key,
      +            catAxis = "categoryAxis",
      +            catKey = "categoryKey",
      +            valAxis = "valueAxis",
      +            seriesKey = "valueKey";
      +        if(axes)
      +        {
      +            seriesKeys = axes.values.get("keyCollection");
      +            key = axes.category.get("keyCollection")[0];
      +            l = seriesKeys.length;
      +            for(; i < l; ++i)
      +            {
      +                sc[i] = {type:type};
      +                sc[i][catAxis] = "category";
      +                sc[i][valAxis] = "values";
      +                sc[i][catKey] = key;
      +                sc[i][seriesKey] = seriesKeys[i];
      +            }
      +        }
      +        this._seriesCollection = sc;
      +        return sc;
      +    },
      +
      +    /**
      +     * Creates `Axis` instances.
      +     *
      +     * @method _parseAxes
      +     * @param {Object} val Object containing `Axis` instances or objects in which to construct `Axis` instances.
      +     * @return Object
      +     * @private
      +     */
      +    _parseAxes: function(hash)
      +    {
      +        if(!this._axes)
      +        {
      +            this._axes = {};
      +        }
      +        var i, pos, axis, dh, config, axisClass,
      +            type = this.get("type"),
      +            w = this.get("width"),
      +            h = this.get("height"),
      +            node = Y.Node.one(this._parentNode);
      +        if(!w)
      +        {
      +            this.set("width", node.get("offsetWidth"));
      +            w = this.get("width");
      +        }
      +        if(!h)
      +        {
      +            this.set("height", node.get("offsetHeight"));
      +            h = this.get("height");
      +        }
      +        for(i in hash)
      +        {
      +            if(hash.hasOwnProperty(i))
      +            {
      +                dh = hash[i];
      +                pos = type == "pie" ? "none" : dh.position;
      +                axisClass = this._getAxisClass(dh.type);
      +                config = {dataProvider:this.get("dataProvider")};
      +                if(dh.hasOwnProperty("roundingUnit"))
      +                {
      +                    config.roundingUnit = dh.roundingUnit;
      +                }
      +                config.keys = dh.keys;
      +                config.width = w;
      +                config.height = h;
      +                config.position = pos;
      +                config.styles = dh.styles;
      +                axis = new axisClass(config);
      +                axis.on("axisRendered", Y.bind(this._itemRendered, this));
      +                this._axes[i] = axis;
      +            }
      +        }
      +    },
      +
      +    /**
      +     * Adds axes to the chart.
      +     *
      +     * @method _addAxes
      +     * @private
      +     */
      +    _addAxes: function()
      +    {
      +        var axes = this.get("axes"),
      +            i, 
      +            axis, 
      +            p;
      +        if(!axes)
      +        {
      +            this.set("axes", this._getDefaultAxes());
      +            axes = this.get("axes");
      +        }
      +        if(!this._axesCollection)
      +        {   
      +            this._axesCollection = [];
      +        }
      +        for(i in axes)
      +        {
      +            if(axes.hasOwnProperty(i))
      +            {
      +                axis = axes[i];
      +                p = axis.get("position");
      +                if(!this.get(p + "AxesCollection"))
      +                {
      +                    this.set(p + "AxesCollection", [axis]);
      +                }
      +                else
      +                {
      +                    this.get(p + "AxesCollection").push(axis);
      +                }
      +                this._axesCollection.push(axis);
      +            }
      +        }
      +    },
      +
      +    /**
      +     * Renders the Graph.
      +     *
      +     * @method _addSeries
      +     * @private
      +     */
      +    _addSeries: function()
      +    {
      +        var graph = this.get("graph"),
      +            seriesCollection = this.get("seriesCollection");
      +        this._parseSeriesAxes(seriesCollection);
      +        graph.set("showBackground", false);
      +        graph.set("width", this.get("width"));
      +        graph.set("height", this.get("height"));
      +        graph.set("seriesCollection", seriesCollection);
      +        this._seriesCollection = graph.get("seriesCollection");
      +        graph.render(this.get("contentBox"));
      +    },
      +
      +    /**
      +     * Parse and sets the axes for the chart.
      +     *
      +     * @method _parseSeriesAxes
      +     * @param {Array} c A collection `PieSeries` instance.
      +     * @private
      +     */
      +    _parseSeriesAxes: function(c)
      +    {
      +        var i = 0, 
      +            len = c.length, 
      +            s,
      +            axes = this.get("axes"),
      +            axis;
      +        for(; i < len; ++i)
      +        {
      +            s = c[i];
      +            if(s)
      +            {
      +                //If series is an actual series instance, 
      +                //replace axes attribute string ids with axes
      +                if(s instanceof Y.PieSeries)
      +                {
      +                    axis = s.get("categoryAxis");
      +                    if(axis && !(axis instanceof Y.Axis))
      +                    {
      +                        s.set("categoryAxis", axes[axis]);
      +                    }
      +                    axis = s.get("valueAxis");
      +                    if(axis && !(axis instanceof Y.Axis))
      +                    {
      +                        s.set("valueAxis", axes[axis]);
      +                    }
      +                    continue;
      +                }
      +                s.categoryAxis = axes.category;
      +                s.valueAxis = axes.values;
      +                if(!s.type)
      +                {
      +                    s.type = this.get("type");
      +                }
      +            }
      +        }
      +    },
      +
      +    /**
      +     * Generates and returns a key-indexed object containing `Axis` instances or objects used to create `Axis` instances.
      +     *
      +     * @method _getDefaultAxes
      +     * @return Object
      +     * @private
      +     */
      +    _getDefaultAxes: function()
      +    {
      +        var catKey = this.get("categoryKey"),
      +            seriesKeys = this.get("seriesKeys") || [], 
      +            seriesAxis = "numeric",
      +            i, 
      +            dv = this.get("dataProvider")[0];
      +        if(seriesKeys.length < 1)
      +        {
      +            for(i in dv)
      +            {
      +                if(i != catKey)
      +                {
      +                    seriesKeys.push(i);
      +                }
      +            }
      +            if(seriesKeys.length > 0)
      +            {
      +                this.set("seriesKeys", seriesKeys);
      +            }
      +        }
      +        return {
      +            values:{
      +                keys:seriesKeys,
      +                type:seriesAxis
      +            },
      +            category:{
      +                keys:[catKey],
      +                type:this.get("categoryType")
      +            }
      +        };
      +    },
      +        
      +    /**
      +     * Returns an object literal containing a categoryItem and a valueItem for a given series index.
      +     *
      +     * @method getSeriesItem
      +     * @param series Reference to a series.
      +     * @param index Index of the specified item within a series.
      +     * @return Object
      +     */
      +    getSeriesItems: function(series, index)
      +    {
      +        var categoryItem = {
      +                axis: series.get("categoryAxis"),
      +                key: series.get("categoryKey"),
      +                displayName: series.get("categoryDisplayName")
      +            },
      +            valueItem = {
      +                axis: series.get("valueAxis"),
      +                key: series.get("valueKey"),
      +                displayName: series.get("valueDisplayName")
      +            };
      +        categoryItem.value = categoryItem.axis.getKeyValueAt(categoryItem.key, index);
      +        valueItem.value = valueItem.axis.getKeyValueAt(valueItem.key, index);
      +        return {category:categoryItem, value:valueItem};
      +    },
      +
      +    /**
      +     * Handler for sizeChanged event.
      +     *
      +     * @method _sizeChanged
      +     * @param {Object} e Event object.
      +     * @private
      +     */
      +    _sizeChanged: function(e)
      +    {
      +        this._redraw();
      +    },
      +
      +    /**
      +     * Redraws the chart instance.
      +     *
      +     * @method _redraw
      +     * @private
      +     */
      +    _redraw: function()
      +    {
      +        var graph = this.get("graph"),
      +            w = this.get("width"),
      +            h = this.get("height"),
      +            dimension;
      +        if(graph)
      +        {
      +            dimension = Math.min(w, h);
      +            graph.set("width", dimension);
      +            graph.set("height", dimension);
      +        }
      +    },
      +    
      +    /**
      +     * Formats tooltip text for a pie chart.
      +     *
      +     * @method _tooltipLabelFunction
      +     * @param {Object} categoryItem An object containing the following:
      +     *  <dl>
      +     *      <dt>axis</dt><dd>The axis to which the category is bound.</dd>
      +     *      <dt>displayName</dt><dd>The display name set to the category (defaults to key if not provided)</dd>
      +     *      <dt>key</dt><dd>The key of the category.</dd>
      +     *      <dt>value</dt><dd>The value of the category</dd>
      +     *  </dl>
      +     * @param {Object} valueItem An object containing the following:
      +     *  <dl>
      +     *      <dt>axis</dt><dd>The axis to which the item's series is bound.</dd>
      +     *      <dt>displayName</dt><dd>The display name of the series. (defaults to key if not provided)</dd>
      +     *      <dt>key</dt><dd>The key for the series.</dd>
      +     *      <dt>value</dt><dd>The value for the series item.</dd> 
      +     *  </dl>
      +     * @param {Number} itemIndex The index of the item within the series.
      +     * @param {CartesianSeries} series The `PieSeries` instance of the item.
      +     * @param {Number} seriesIndex The index of the series in the `seriesCollection`.
      +     * @return {HTML}
      +     * @private
      +     */
      +    _tooltipLabelFunction: function(categoryItem, valueItem, itemIndex, series, seriesIndex)
      +    {
      +        var msg = DOCUMENT.createElement("div"),
      +            total = series.getTotalValues(),
      +            pct = Math.round((valueItem.value / total) * 10000)/100;
      +        msg.appendChild(DOCUMENT.createTextNode(categoryItem.displayName +
      +        ": " + categoryItem.axis.get("labelFunction").apply(this, [categoryItem.value, categoryItem.axis.get("labelFormat")]))); 
      +        msg.appendChild(DOCUMENT.createElement("br"));
      +        msg.appendChild(DOCUMENT.createTextNode(valueItem.displayName + 
      +        ": " + valueItem.axis.get("labelFunction").apply(this, [valueItem.value, valueItem.axis.get("labelFormat")])));
      +        msg.appendChild(DOCUMENT.createElement("br"));
      +        msg.appendChild(DOCUMENT.createTextNode(pct + "%")); 
      +        return msg; 
      +    },
      +
      +    /**
      +     * Returns the appropriate message based on the key press.
      +     *
      +     * @method _getAriaMessage
      +     * @param {Number} key The keycode that was pressed.
      +     * @return String
      +     */
      +    _getAriaMessage: function(key)
      +    {
      +        var msg = "",
      +            categoryItem,
      +            items,
      +            series,
      +            valueItem,
      +            seriesIndex = 0,
      +            itemIndex = this._itemIndex,
      +            seriesCollection = this.get("seriesCollection"),
      +            len,
      +            total,
      +            pct,
      +            markers;
      +        series = this.getSeries(parseInt(seriesIndex, 10));
      +        markers = series.get("markers");
      +        len = markers && markers.length ? markers.length : 0;
      +        if(key === 37)
      +        {
      +            itemIndex = itemIndex > 0 ? itemIndex - 1 : len - 1;
      +        }
      +        else if(key === 39)
      +        {
      +            itemIndex = itemIndex >= len - 1 ? 0 : itemIndex + 1;
      +        }
      +        this._itemIndex = itemIndex;
      +        items = this.getSeriesItems(series, itemIndex);
      +        categoryItem = items.category;
      +        valueItem = items.value;
      +        total = series.getTotalValues();
      +        pct = Math.round((valueItem.value / total) * 10000)/100;
      +        if(categoryItem && valueItem)
      +        {
      +            msg += categoryItem.displayName + ": " + categoryItem.axis.formatLabel.apply(this, [categoryItem.value, categoryItem.axis.get("labelFormat")]) + ", ";
      +            msg += valueItem.displayName + ": " + valueItem.axis.formatLabel.apply(this, [valueItem.value, valueItem.axis.get("labelFormat")]) + ", "; 
      +            msg += "Percent of total " + valueItem.displayName + ": " + pct + "%,"; 
      +        }
      +        else
      +        {
      +            msg += "No data available,";
      +        }
      +        msg += (itemIndex + 1) + " of " + len + ". ";
      +        return msg;
      +    }
      +}, {
      +    ATTRS: {
      +        /**
      +         * Sets the aria description for the chart.
      +         *
      +         * @attribute ariaDescription
      +         * @type String
      +         */
      +        ariaDescription: {
      +            value: "Use the left and right keys to navigate through items.",
      +
      +            setter: function(val)
      +            {
      +                if(this._description)
      +                {
      +                    this._description.setContent("");
      +                    this._description.appendChild(DOCUMENT.createTextNode(val));
      +                }
      +                return val;
      +            }
      +        },
      +        
      +        /**
      +         * Axes to appear in the chart. 
      +         *
      +         * @attribute axes
      +         * @type Object
      +         */
      +        axes: {
      +            getter: function()
      +            {
      +                return this._axes;
      +            },
      +
      +            setter: function(val)
      +            {
      +                this._parseAxes(val);
      +            }
      +        },
      +
      +        /**
      +         * Collection of series to appear on the chart. This can be an array of Series instances or object literals
      +         * used to describe a Series instance.
      +         *
      +         * @attribute seriesCollection
      +         * @type Array
      +         */
      +        seriesCollection: {
      +            getter: function()
      +            {
      +                return this._getSeriesCollection();
      +            },
      +            
      +            setter: function(val)
      +            {
      +                return this._setSeriesCollection(val);
      +            }
      +        },
      +        
      +        /**
      +         * Type of chart when there is no series collection specified.
      +         *
      +         * @attribute type
      +         * @type String 
      +         */
      +        type: {
      +            value: "pie"
      +        }
      +    }
      +});
      diff --git a/tests/input/charts/PieChartLegend.js b/tests/input/charts/PieChartLegend.js
      new file mode 100644
      index 00000000..86bf5184
      --- /dev/null
      +++ b/tests/input/charts/PieChartLegend.js
      @@ -0,0 +1,132 @@
      +var PieChartLegend = Y.Base.create("pieChartLegend", Y.PieChart, [], {
      +    /**
      +     * Redraws the chart instance.
      +     *
      +     * @method _redraw
      +     * @private
      +     */
      +    _redraw: function()
      +    {
      +        if(this._drawing)
      +        {
      +            this._callLater = true;
      +            return;
      +        }
      +        this._drawing = true;
      +        this._callLater = false;
      +        var graph = this.get("graph"),
      +            w = this.get("width"),
      +            h = this.get("height"),
      +            graphWidth,
      +            graphHeight,
      +            legend = this.get("legend"),
      +            x = 0,
      +            y = 0,
      +            legendX = 0,
      +            legendY = 0,
      +            legendWidth,
      +            legendHeight,
      +            dimension,
      +            gap,
      +            position,
      +            direction;
      +        if(graph)
      +        {
      +            if(legend)
      +            {
      +                position = legend.get("position");
      +                direction = legend.get("direction");
      +                graphWidth = graph.get("width");
      +                graphHeight = graph.get("height");
      +                legendWidth = legend.get("width");
      +                legendHeight = legend.get("height");
      +                gap = legend.get("styles").gap;
      +                
      +                if((direction == "vertical" && (graphWidth + legendWidth + gap !== w)) || (direction == "horizontal" &&  (graphHeight + legendHeight + gap !== h)))
      +                {
      +                    switch(legend.get("position"))
      +                    {
      +                        case LEFT :
      +                            dimension = Math.min(w - (legendWidth + gap), h);
      +                            legendHeight = h;
      +                            x = legendWidth + gap;
      +                            legend.set(HEIGHT, legendHeight);
      +                        break;
      +                        case TOP :
      +                            dimension = Math.min(h - (legendHeight + gap), w); 
      +                            legendWidth = w;
      +                            y = legendHeight + gap;
      +                            legend.set(WIDTH, legendWidth);
      +                        break;
      +                        case RIGHT :
      +                            dimension = Math.min(w - (legendWidth + gap), h);
      +                            legendHeight = h;
      +                            legendX = dimension + gap;
      +                            legend.set(HEIGHT, legendHeight);
      +                        break;
      +                        case BOTTOM :
      +                            dimension = Math.min(h - (legendHeight + gap), w); 
      +                            legendWidth = w;
      +                            legendY = dimension + gap; 
      +                            legend.set(WIDTH, legendWidth);
      +                        break;
      +                    }
      +                    graph.set(WIDTH, dimension);
      +                    graph.set(HEIGHT, dimension);
      +                }
      +                else
      +                {
      +                    switch(legend.get("position"))
      +                    {   
      +                        case LEFT :
      +                            x = legendWidth + gap;
      +                        break;
      +                        case TOP :
      +                            y = legendHeight + gap;
      +                        break;
      +                        case RIGHT :
      +                            legendX = graphWidth + gap;
      +                        break;
      +                        case BOTTOM :
      +                            legendY = graphHeight + gap; 
      +                        break;
      +                    }
      +                }
      +            }
      +            else
      +            {
      +                graph.set(_X, 0);
      +                graph.set(_Y, 0);
      +                graph.set(WIDTH, w);
      +                graph.set(HEIGHT, h);
      +            }
      +        }
      +        this._drawing = false;
      +        if(this._callLater)
      +        {
      +            this._redraw();
      +            return;
      +        }
      +        if(graph)
      +        {
      +            graph.set(_X, x);
      +            graph.set(_Y, y);
      +        }
      +        if(legend)
      +        {
      +            legend.set(_X, legendX);
      +            legend.set(_Y, legendY);
      +        }
      +    }
      +}, {
      +    ATTRS: {
      +        /**
      +         * The legend for the chart.
      +         *
      +         * @attribute
      +         * @type Legend
      +         */
      +        legend: LEGEND
      +    }
      +});
      +Y.PieChart = PieChartLegend;
      diff --git a/tests/input/charts/PieSeries.js b/tests/input/charts/PieSeries.js
      new file mode 100644
      index 00000000..afaaa3e7
      --- /dev/null
      +++ b/tests/input/charts/PieSeries.js
      @@ -0,0 +1,729 @@
      +/**
      + * PieSeries visualizes data as a circular chart divided into wedges which represent data as a 
      + * percentage of a whole.
      + *
      + * @module charts
      + * @class PieSeries
      + * @constructor
      + * @extends MarkerSeries
      + */
      +Y.PieSeries = Y.Base.create("pieSeries", Y.MarkerSeries, [], { 
      +    /**
      +     * Image map used for interactivity when rendered with canvas.
      +     *
      +     * @property _map
      +     * @type HTMLElement
      +     * @private
      +     */
      +    _map: null,
      +
      +    /**
      +     * Image used for image map when rendered with canvas.
      +     *
      +     * @property _image
      +     * @type HTMLElement
      +     * @private
      +     */
      +    _image: null,
      +
      +    /**
      +     * Creates or updates the image map when rendered with canvas.
      +     *
      +     * @method _setMap
      +     * @private
      +     */
      +    _setMap: function()
      +    {
      +        var id = "pieHotSpotMapi_" + Math.round(100000 * Math.random()),
      +            cb = this.get("graph").get("contentBox"),
      +            areaNode;
      +        if(this._image)
      +        {
      +            cb.removeChild(this._image);
      +            while(this._areaNodes && this._areaNodes.length > 0)
      +            {
      +                areaNode = this._areaNodes.shift();
      +                this._map.removeChild(areaNode);
      +            }
      +            cb.removeChild(this._map);
      +        }
      +        this._image = DOCUMENT.createElement("img"); 
      +        this._image.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==";
      +        cb.appendChild(this._image);
      +        this._image.setAttribute("usemap", "#" + id);
      +        this._image.style.zIndex = 3;
      +        this._image.style.opacity = 0;
      +        this._image.setAttribute("alt", "imagemap");
      +        this._map = DOCUMENT.createElement("map");
      +        this._map.style.zIndex = 5;
      +        cb.appendChild(this._map);
      +        this._map.setAttribute("name", id);
      +        this._map.setAttribute("id", id);
      +        this._areaNodes = [];
      +    },
      +
      +    /**
      +     * Storage for `categoryDisplayName` attribute.
      +     *
      +     * @property _categoryDisplayName
      +     * @private
      +     */
      +    _categoryDisplayName: null,
      +    
      +    /**
      +     * Storage for `valueDisplayName` attribute.
      +     *
      +     * @property _valueDisplayName
      +     * @private
      +     */
      +    _valueDisplayName: null,
      +
      +    /**
      +     * Adds event listeners.
      +     *
      +     * @method addListeners
      +     * @private
      +     */
      +    addListeners: function()
      +    {
      +        var categoryAxis = this.get("categoryAxis"),
      +            valueAxis = this.get("valueAxis");
      +        if(categoryAxis)
      +        {
      +            categoryAxis.after("dataReady", Y.bind(this._categoryDataChangeHandler, this));
      +            categoryAxis.after("dataUpdate", Y.bind(this._categoryDataChangeHandler, this));
      +        }
      +        if(valueAxis)
      +        {
      +            valueAxis.after("dataReady", Y.bind(this._valueDataChangeHandler, this));
      +            valueAxis.after("dataUpdate", Y.bind(this._valueDataChangeHandler, this));
      +        }
      +        this.after("categoryAxisChange", this.categoryAxisChangeHandler);
      +        this.after("valueAxisChange", this.valueAxisChangeHandler);
      +        this.after("stylesChange", this._updateHandler);
      +    },
      +    
      +    /**
      +     * Draws the series.
      +     *
      +     * @method validate
      +     * @private
      +     */
      +    validate: function()
      +    {
      +        this.draw();
      +        this._renderered = true;
      +    },
      +
      +    /**
      +     * Event handler for the categoryAxisChange event.
      +     *
      +     * @method _categoryAxisChangeHandler
      +     * @param {Object} e Event object.
      +     * @private
      +     */
      +    _categoryAxisChangeHandler: function(e)
      +    {
      +        var categoryAxis = this.get("categoryAxis");
      +        categoryAxis.after("dataReady", Y.bind(this._categoryDataChangeHandler, this));
      +        categoryAxis.after("dataUpdate", Y.bind(this._categoryDataChangeHandler, this));
      +    },
      +    
      +    /**
      +     * Event handler for the valueAxisChange event.
      +     *
      +     * @method _valueAxisChangeHandler
      +     * @param {Object} e Event object.
      +     * @private
      +     */
      +    _valueAxisChangeHandler: function(e)
      +    {
      +        var valueAxis = this.get("valueAxis");
      +        valueAxis.after("dataReady", Y.bind(this._valueDataChangeHandler, this));
      +        valueAxis.after("dataUpdate", Y.bind(this._valueDataChangeHandler, this));
      +    },
      +	
      +    /**
      +     * Constant used to generate unique id.
      +     *
      +     * @property GUID
      +     * @type String
      +     * @private
      +     */
      +    GUID: "pieseries",
      +	
      +    /**
      +     * Event handler for categoryDataChange event.
      +     *
      +     * @method _categoryDataChangeHandler
      +     * @param {Object} event Event object.
      +     * @private 
      +     */
      +    _categoryDataChangeHandler: function(event)
      +    {
      +       if(this._rendered && this.get("categoryKey") && this.get("valueKey"))
      +        {
      +            this.draw();
      +        }
      +    },
      +
      +    /**
      +     * Event handler for valueDataChange event.
      +     *
      +     * @method _valueDataChangeHandler
      +     * @param {Object} event Event object.
      +     * @private 
      +     */
      +    _valueDataChangeHandler: function(event)
      +    {
      +        if(this._rendered && this.get("categoryKey") && this.get("valueKey"))
      +        {
      +            this.draw();
      +        }
      +    },
      +   
      +    /**
      +     * Draws the series. Overrides the base implementation.
      +     *
      +     * @method draw
      +     * @protected
      +     */
      +    draw: function()
      +    {
      +        var graph = this.get("graph"),
      +            w = graph.get("width"),
      +            h = graph.get("height");
      +        if(isFinite(w) && isFinite(h) && w > 0 && h > 0)
      +        {   
      +            this._rendered = true;
      +            if(this._drawing)
      +            {
      +                this._callLater = true;
      +                return;
      +            }
      +            this._drawing = true;
      +            this._callLater = false;
      +            this.drawSeries();
      +            this._drawing = false;
      +            if(this._callLater)
      +            {
      +                this.draw();
      +            }
      +            else
      +            {
      +                this.fire("drawingComplete");
      +            }
      +        }
      +    },
      +
      +    /**
      +     * Draws the markers
      +     *
      +     * @method drawPlots
      +     * @protected
      +     */
      +    drawPlots: function()
      +    {
      +        var values = this.get("valueAxis").getDataByKey(this.get("valueKey")).concat(),
      +            catValues = this.get("categoryAxis").getDataByKey(this.get("categoryKey")).concat(),
      +            totalValue = 0,
      +            itemCount = values.length,
      +            styles = this.get("styles").marker,
      +            fillColors = styles.fill.colors,
      +            fillAlphas = styles.fill.alphas || ["1"],
      +            borderColors = styles.border.colors,
      +            borderWeights = [styles.border.weight],
      +            borderAlphas = [styles.border.alpha],
      +            tbw = borderWeights.concat(),
      +            tbc = borderColors.concat(),
      +            tba = borderAlphas.concat(),
      +            tfc,
      +            tfa,
      +            padding = styles.padding,
      +            graph = this.get("graph"),
      +            minDimension = Math.min(graph.get("width"), graph.get("height")),
      +            w = minDimension - (padding.left + padding.right),
      +            h = minDimension - (padding.top + padding.bottom),
      +            startAngle = -90,
      +            halfWidth = w / 2,
      +            halfHeight = h / 2,
      +            radius = Math.min(halfWidth, halfHeight),
      +            i = 0,
      +            value,
      +            angle = 0,
      +            lc,
      +            la,
      +            lw,
      +            wedgeStyle,
      +            marker,
      +            graphOrder = this.get("graphOrder"),
      +            isCanvas = Y.Graphic.NAME == "canvasGraphic";
      +        for(; i < itemCount; ++i)
      +        {
      +            value = parseFloat(values[i]);
      +            
      +            values.push(value);
      +            if(!isNaN(value))
      +            {
      +                totalValue += value;
      +            }
      +        }
      +        
      +        tfc = fillColors ? fillColors.concat() : null;
      +        tfa = fillAlphas ? fillAlphas.concat() : null;
      +        this._createMarkerCache();
      +        if(isCanvas)
      +        {
      +            this._setMap();
      +            this._image.width = w;
      +            this._image.height = h;
      +        }
      +        for(i = 0; i < itemCount; i++)
      +        {
      +            value = values[i];
      +            if(totalValue === 0)
      +            {
      +                angle = 360 / values.length;
      +            }
      +            else
      +            {
      +                angle = 360 * (value / totalValue);
      +            }
      +            angle = Math.round(angle);
      +            if(tfc && tfc.length < 1)
      +            {
      +                tfc = fillColors.concat();
      +            }
      +            if(tfa && tfa.length < 1)
      +            {
      +                tfa = fillAlphas.concat();
      +            }
      +            if(tbw && tbw.length < 1)
      +            {
      +                tbw = borderWeights.concat();
      +            }
      +            if(tbw && tbc.length < 1)
      +            {
      +                tbc = borderColors.concat();
      +            }
      +            if(tba && tba.length < 1)
      +            {
      +                tba = borderAlphas.concat();
      +            }
      +            lw = tbw ? tbw.shift() : null;
      +            lc = tbc ? tbc.shift() : null;
      +            la = tba ? tba.shift() : null;
      +            startAngle += angle;
      +            wedgeStyle = {
      +                border: {
      +                    color:lc,
      +                    weight:lw,
      +                    alpha:la
      +                },
      +                fill: {
      +                    color:tfc ? tfc.shift() : this._getDefaultColor(i, "slice"),
      +                    alpha:tfa ? tfa.shift() : null
      +                },
      +                type: "pieslice",
      +                arc: angle,
      +                radius: radius,
      +                startAngle: startAngle,
      +                cx: halfWidth,
      +                cy: halfHeight,
      +                width: w,
      +                height: h
      +            };
      +            marker = this.getMarker(wedgeStyle, graphOrder, i);
      +            if(isCanvas)
      +            {
      +                this._addHotspot(wedgeStyle, graphOrder, i);
      +            }
      +        }
      +        this._clearMarkerCache();
      +    },
      +
      +    /**
      +     *  Adds an interactive map when rendering in canvas.
      +     *
      +     *  @method _addHotspot
      +     *  @param {Object} cfg Object containing data used to draw the hotspot
      +     *  @param {Number} seriesIndex Index of series in the `seriesCollection`.
      +     *  @param {Number} index Index of the marker using the hotspot.
      +     *  @private
      +     */
      +    _addHotspot: function(cfg, seriesIndex, index)
      +    {
      +        var areaNode = DOCUMENT.createElement("area"),
      +            i = 1,
      +            x = cfg.cx,
      +            y = cfg.cy, 
      +            arc = cfg.arc,
      +            startAngle = cfg.startAngle - arc, 
      +            endAngle = cfg.startAngle,
      +            radius = cfg.radius, 
      +            ax = x + Math.cos(startAngle / 180 * Math.PI) * radius,
      +            ay = y + Math.sin(startAngle / 180 * Math.PI) * radius,
      +            bx = x + Math.cos(endAngle / 180 * Math.PI) * radius,
      +            by = y + Math.sin(endAngle / 180 * Math.PI) * radius,
      +            numPoints = Math.floor(arc/10) - 1,
      +            divAngle = (arc/(Math.floor(arc/10)) / 180) * Math.PI,
      +            angleCoord = Math.atan((ay - y)/(ax - x)),
      +            pts = x + ", " + y + ", " + ax + ", " + ay,
      +            cosAng,
      +            sinAng,
      +            multDivAng;
      +        for(i = 1; i <= numPoints; ++i)
      +        {
      +            multDivAng = divAngle * i;
      +            cosAng = Math.cos(angleCoord + multDivAng);
      +            sinAng = Math.sin(angleCoord + multDivAng);
      +            if(startAngle <= 90)
      +            {
      +                pts += ", " + (x + (radius * Math.cos(angleCoord + (divAngle * i))));
      +                pts += ", " + (y + (radius * Math.sin(angleCoord + (divAngle * i))));
      +            }
      +            else
      +            {
      +                pts += ", " + (x - (radius * Math.cos(angleCoord + (divAngle * i))));
      +                pts += ", " + (y - (radius * Math.sin(angleCoord + (divAngle * i))));
      +            }
      +        }
      +        pts += ", " + bx + ", " + by;
      +        pts += ", " + x + ", " + y;
      +        this._map.appendChild(areaNode);
      +        areaNode.setAttribute("class", SERIES_MARKER);
      +        areaNode.setAttribute("id", "hotSpot_" + seriesIndex + "_" + index);
      +        areaNode.setAttribute("shape", "polygon");
      +        areaNode.setAttribute("coords", pts);
      +        this._areaNodes.push(areaNode);
      +
      +    },
      +
      +    /**
      +     * Resizes and positions markers based on a mouse interaction.
      +     *
      +     * @method updateMarkerState
      +     * @param {String} type state of the marker
      +     * @param {Number} i index of the marker
      +     * @protected
      +     */
      +    updateMarkerState: function(type, i)
      +    {
      +        if(this._markers[i])
      +        {
      +            var state = this._getState(type),
      +                markerStyles,
      +                indexStyles,
      +                marker = this._markers[i],
      +                styles = this.get("styles").marker; 
      +            markerStyles = state == "off" || !styles[state] ? styles : styles[state]; 
      +            indexStyles = this._mergeStyles(markerStyles, {});
      +            indexStyles.fill.color = indexStyles.fill.colors[i % indexStyles.fill.colors.length];
      +            indexStyles.fill.alpha = indexStyles.fill.alphas[i % indexStyles.fill.alphas.length];
      +            marker.set(indexStyles);
      +        }
      +    },
      +    
      +    /**
      +     * Creates a shape to be used as a marker.
      +     *
      +     * @method _createMarker
      +     * @param {Object} styles Hash of style properties.
      +     * @param {Number} order Order of the series.
      +     * @param {Number} index Index within the series associated with the marker.
      +     * @return Shape
      +     * @private
      +     */
      +    _createMarker: function(styles, order, index)
      +    {
      +        var graphic = this.get("graphic"),
      +            marker,
      +            cfg = Y.clone(styles);
      +        graphic.set("autoDraw", false);
      +        marker = graphic.addShape(cfg); 
      +        marker.addClass(SERIES_MARKER);
      +        return marker;
      +    },
      +    
      +    /**
      +     * Creates a cache of markers for reuse.
      +     *
      +     * @method _createMarkerCache
      +     * @private
      +     */
      +    _clearMarkerCache: function()
      +    {
      +        var len = this._markerCache.length,
      +            i = 0,
      +            marker;
      +        for(; i < len; ++i)
      +        {
      +            marker = this._markerCache[i];
      +            if(marker)
      +            {
      +                marker.destroy();
      +            }
      +        }
      +        this._markerCache = [];
      +    },
      +
      +    /**
      +     * Gets the default style values for the markers.
      +     *
      +     * @method _getPlotDefaults
      +     * @return Object
      +     * @private
      +     */
      +    _getPlotDefaults: function()
      +    {
      +         var defs = {
      +            padding:{
      +                top: 0,
      +                left: 0,
      +                right: 0,
      +                bottom: 0
      +            },
      +            fill:{
      +                alphas:["1"]
      +            },
      +            border: {
      +                weight: 0,
      +                alpha: 1
      +            }
      +        };
      +        defs.fill.colors = this._defaultSliceColors;
      +        defs.border.colors = this._defaultBorderColors;
      +        return defs;
      +    },
      +
      +    /**
      +     * Collection of default colors used for lines in a series when not specified by user.
      +     *
      +     * @property _defaultLineColors
      +     * @type Array
      +     * @protected
      +     */
      +    _defaultLineColors:["#426ab3", "#d09b2c", "#000000", "#b82837", "#b384b5", "#ff7200", "#779de3", "#cbc8ba", "#7ed7a6", "#007a6c"],
      +
      +    /**
      +     * Collection of default colors used for marker fills in a series when not specified by user.
      +     *
      +     * @property _defaultFillColors
      +     * @type Array
      +     * @protected
      +     */
      +    _defaultFillColors:["#6084d0", "#eeb647", "#6c6b5f", "#d6484f", "#ce9ed1", "#ff9f3b", "#93b7ff", "#e0ddd0", "#94ecba", "#309687"],
      +    
      +    /**
      +     * Collection of default colors used for marker borders in a series when not specified by user.
      +     *
      +     * @property _defaultBorderColors
      +     * @type Array
      +     * @protected
      +     */
      +    _defaultBorderColors:["#205096", "#b38206", "#000000", "#94001e", "#9d6fa0", "#e55b00", "#5e85c9", "#adab9e", "#6ac291", "#006457"],
      +    
      +    /**
      +     * Collection of default colors used for area fills, histogram fills and pie fills in a series when not specified by user.
      +     *
      +     * @property _defaultSliceColors
      +     * @type Array
      +     * @protected
      +     */
      +    _defaultSliceColors: ["#66007f", "#a86f41", "#295454", "#996ab2", "#e8cdb7", "#90bdbd","#000000","#c3b8ca", "#968373", "#678585"],
      +
      +    /**
      +     * Colors used if style colors are not specified
      +     *
      +     * @method _getDefaultColor
      +     * @param {Number} index Index indicating the series order.
      +     * @param {String} type Indicates which type of object needs the color.
      +     * @return String
      +     * @protected
      +     */
      +    _getDefaultColor: function(index, type)
      +    {
      +        var colors = {
      +                line: this._defaultLineColors,
      +                fill: this._defaultFillColors,
      +                border: this._defaultBorderColors,
      +                slice: this._defaultSliceColors
      +            },
      +            col = colors[type],
      +            l = col.length;
      +        index = index || 0;
      +        if(index >= l)
      +        {
      +            index = index % l;
      +        }
      +        type = type || "fill";
      +        return colors[type][index];
      +    }
      +}, {
      +    ATTRS: {
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @default pie
      +         */
      +        type: {		
      +            value: "pie"
      +        },
      +        
      +        /**
      +         * Order of this instance of this `type`.
      +         *
      +         * @attribute order
      +         * @type Number
      +         */
      +        order: {},
      +
      +        /**
      +         * Reference to the `Graph` in which the series is drawn into.
      +         *
      +         * @attribute graph
      +         * @type Graph
      +         */
      +        graph: {},
      +        
      +        /**
      +         * Reference to the `Axis` instance used for assigning 
      +         * category values to the graph.
      +         *
      +         * @attribute categoryAxis
      +         * @type Axis
      +         */
      +        categoryAxis: {
      +            value: null,
      +
      +            validator: function(value)
      +            {
      +                return value !== this.get("categoryAxis");
      +            }
      +        },
      +        
      +        /**
      +         * Reference to the `Axis` instance used for assigning 
      +         * series values to the graph.
      +         *
      +         * @attribute categoryAxis
      +         * @type Axis
      +         */
      +        valueAxis: {
      +            value: null,
      +
      +            validator: function(value)
      +            {
      +                return value !== this.get("valueAxis");
      +            }
      +        },
      +
      +        /**
      +         * Indicates which array to from the hash of value arrays in 
      +         * the category `Axis` instance.
      +         *
      +         * @attribute categoryKey
      +         * @type String
      +         */
      +        categoryKey: {
      +            value: null,
      +
      +            validator: function(value)
      +            {
      +                return value !== this.get("categoryKey");
      +            }
      +        },
      +        /**
      +         * Indicates which array to from the hash of value arrays in 
      +         * the value `Axis` instance.
      +         *
      +         * @attribute valueKey
      +         * @type String
      +         */
      +        valueKey: {
      +            value: null,
      +
      +            validator: function(value)
      +            {
      +                return value !== this.get("valueKey");
      +            }
      +        },
      +
      +        /**
      +         * Name used for for displaying category data
      +         *
      +         * @attribute categoryDisplayName
      +         * @type String
      +         */
      +        categoryDisplayName: {
      +            setter: function(val)
      +            {
      +                this._categoryDisplayName = val;
      +                return val;
      +            },
      +
      +            getter: function()
      +            {
      +                return this._categoryDisplayName || this.get("categoryKey");
      +            }
      +        },
      +
      +        /**
      +         * Name used for for displaying value data
      +         *
      +         * @attribute valueDisplayName
      +         * @type String
      +         */
      +        valueDisplayName: {
      +            setter: function(val)
      +            {
      +                this._valueDisplayName = val;
      +                return val;
      +            },
      +
      +            getter: function()
      +            {
      +                return this._valueDisplayName || this.get("valueKey");
      +            }
      +        },
      +        
      +        /**
      +         * @attribute slices
      +         * @type Array
      +         * @private
      +         */
      +        slices: null
      +        
      +        /**
      +         * Style properties used for drawing markers. This attribute is inherited from `MarkerSeries`. Below are the default values:
      +         *  <dl>
      +         *      <dt>fill</dt><dd>A hash containing the following values:
      +         *          <dl>
      +         *              <dt>colors</dt><dd>An array of colors to be used for the marker fills. The color for each marker is retrieved from the 
      +         *              array below:<br/>
      +         *              `["#66007f", "#a86f41", "#295454", "#996ab2", "#e8cdb7", "#90bdbd","#000000","#c3b8ca", "#968373", "#678585"]`
      +         *              </dd>
      +         *              <dt>alphas</dt><dd>An array of alpha references (Number from 0 to 1) indicating the opacity of each marker fill. The default value is [1].</dd>
      +         *          </dl>
      +         *      </dd>
      +         *      <dt>border</dt><dd>A hash containing the following values:
      +         *          <dl>
      +         *              <dt>color</dt><dd>An array of colors to be used for the marker borders. The color for each marker is retrieved from the
      +         *              array below:<br/>
      +         *              `["#205096", "#b38206", "#000000", "#94001e", "#9d6fa0", "#e55b00", "#5e85c9", "#adab9e", "#6ac291", "#006457"]`
      +         *              <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the marker border. The default value is 1.</dd>
      +         *              <dt>weight</dt><dd>Number indicating the width of the border. The default value is 1.</dd>
      +         *          </dl>
      +         *      </dd>
      +         *      <dt>over</dt><dd>hash containing styles for markers when highlighted by a `mouseover` event. The default 
      +         *      values for each style is null. When an over style is not set, the non-over value will be used. For example,
      +         *      the default value for `marker.over.fill.color` is equivalent to `marker.fill.color`.</dd>
      +         *  </dl>
      +         *
      +         * @attribute styles
      +         * @type Object
      +         */
      +    }
      +});
      diff --git a/tests/input/charts/Plots.js b/tests/input/charts/Plots.js
      new file mode 100644
      index 00000000..c480a8ed
      --- /dev/null
      +++ b/tests/input/charts/Plots.js
      @@ -0,0 +1,513 @@
      +/**
      + * Utility class used for drawing markers.
      + *
      + * @module charts
      + * @class Plots
      + * @constructor
      + */
      +function Plots(cfg)
      +{
      +    var attrs = { 
      +        markers: {
      +            getter: function()
      +            {
      +                return this._markers;
      +            }
      +        }
      +    };
      +    this.addAttrs(attrs, cfg);
      +}
      +
      +Plots.prototype = {
      +    /**
      +     * Storage for default marker styles.
      +     *
      +     * @property _plotDefaults
      +     * @type Object
      +     * @private
      +     */
      +    _plotDefaults: null,
      +
      +    /**
      +     * Draws the markers
      +     *
      +     * @method drawPlots
      +     * @protected
      +     */
      +    drawPlots: function()
      +    {
      +        if(!this.get("xcoords") || this.get("xcoords").length < 1) 
      +		{
      +			return;
      +		}
      +        var isNumber = Y_Lang.isNumber,
      +            style = Y.clone(this.get("styles").marker),
      +            w = style.width,
      +            h = style.height,
      +            xcoords = this.get("xcoords"),
      +            ycoords = this.get("ycoords"),
      +            i = 0,
      +            len = xcoords.length,
      +            top = ycoords[0],
      +            left,
      +            marker,
      +            offsetWidth = w/2,
      +            offsetHeight = h/2,
      +            xvalues,
      +            yvalues,
      +            fillColors = null,
      +            borderColors = null,
      +            graphOrder = this.get("graphOrder"),
      +            groupMarkers = this.get("groupMarkers");
      +        if(groupMarkers)
      +        {
      +            xvalues = [];
      +            yvalues = [];
      +            for(; i < len; ++i)
      +            {
      +                xvalues.push(parseFloat(xcoords[i] - offsetWidth));
      +                yvalues.push(parseFloat(ycoords[i] - offsetHeight));
      +            }
      +            this._createGroupMarker({
      +                xvalues: xvalues,
      +                yvalues: yvalues,
      +                fill: style.fill,
      +                border: style.border,
      +                dimensions: {
      +                    width: w,
      +                    height: h
      +                },
      +                graphOrder: graphOrder,
      +                shape: style.shape
      +            });
      +            return;
      +        }
      +        if(Y_Lang.isArray(style.fill.color))
      +        {
      +            fillColors = style.fill.color.concat(); 
      +        }
      +        if(Y_Lang.isArray(style.border.color))
      +        {
      +            borderColors = style.border.color.concat();
      +        }
      +        this._createMarkerCache();
      +        for(; i < len; ++i)
      +        {
      +            top = parseFloat(ycoords[i] - offsetHeight);
      +            left = parseFloat(xcoords[i] - offsetWidth);            
      +            if(!isNumber(left) || !isNumber(top))
      +            {
      +                this._markers.push(null);
      +                continue;
      +            }
      +            if(fillColors)
      +            {
      +                style.fill.color = fillColors[i % fillColors.length];
      +            }
      +            if(borderColors)
      +            {
      +                style.border.color = borderColors[i % borderColors.length];
      +            }
      +
      +            style.x = left;
      +            style.y = top;
      +            marker = this.getMarker(style, graphOrder, i);
      +        }
      +        this._clearMarkerCache();
      +    },
      +
      +    /**
      +     * Pre-defined group shapes.
      +     *
      +     * @property _groupShapes
      +     * @private
      +     */
      +    _groupShapes: {
      +        circle: Y.CircleGroup,
      +        rect: Y.RectGroup,
      +        ellipse: Y.EllipseGroup,
      +        diamond: Y.DiamondGroup
      +    },
      +
      +    /**
      +     * Returns the correct group shape class.
      +     *
      +     * @method _getGroupShape
      +     * @param {Shape | String} shape Indicates which shape class. 
      +     * @return Function
      +     * @protected
      +     */
      +    _getGroupShape: function(shape)
      +    {
      +        if(Y_Lang.isString(shape))
      +        {
      +            shape = this._groupShapes[shape];
      +        }
      +        return shape;
      +    },
      +
      +    /**
      +     * Gets the default values for series that use the utility. This method is used by
      +     * the class' `styles` attribute's getter to get build default values.
      +     *
      +     * @method _getPlotDefaults
      +     * @return Object
      +     * @protected
      +     */
      +    _getPlotDefaults: function()
      +    {
      +        var defs = {
      +            fill:{
      +                type: "solid",
      +                alpha: 1,
      +                colors:null,
      +                alphas: null,
      +                ratios: null
      +            },
      +            border:{
      +                weight: 1,
      +                alpha: 1
      +            },
      +            width: 10,
      +            height: 10,
      +            shape: "circle"
      +        };
      +        defs.fill.color = this._getDefaultColor(this.get("graphOrder"), "fill");
      +        defs.border.color = this._getDefaultColor(this.get("graphOrder"), "border");
      +        return defs;
      +    },
      +
      +    /**
      +     * Collection of markers to be used in the series.
      +     *
      +     * @property _markers
      +     * @type Array
      +     * @private
      +     */
      +    _markers: null,
      +
      +    /**
      +     * Collection of markers to be re-used on a series redraw.
      +     *
      +     * @property _markerCache
      +     * @type Array
      +     * @private
      +     */
      +    _markerCache: null,
      +   
      +    /**
      +     * Gets and styles a marker. If there is a marker in cache, it will use it. Otherwise
      +     * it will create one.
      +     *
      +     * @method getMarker
      +     * @param {Object} styles Hash of style properties.
      +     * @param {Number} order Order of the series.
      +     * @param {Number} index Index within the series associated with the marker.
      +     * @return Shape
      +     * @protected
      +     */
      +    getMarker: function(styles, order, index)
      +    {
      +        var marker,
      +            border = styles.border;
      +        styles.id = this.get("chart").get("id") + "_" + order + "_" + index;
      +        //fix name differences between graphic layer
      +        border.opacity = border.alpha;
      +        styles.stroke = border;
      +        styles.fill.opacity = styles.fill.alpha;
      +        if(this._markerCache.length > 0)
      +        {
      +            while(!marker)
      +            {
      +                if(this._markerCache.length < 1)
      +                {
      +                    marker = this._createMarker(styles, order, index);
      +                    break;
      +                }
      +                marker = this._markerCache.shift();
      +
      +            }
      +            marker.set(styles);
      +        }
      +        else
      +        {
      +            marker = this._createMarker(styles, order, index);
      +        }
      +        this._markers.push(marker);
      +        return marker;
      +    },
      +    
      +    /**
      +     * Creates a shape to be used as a marker.
      +     *
      +     * @method _createMarker
      +     * @param {Object} styles Hash of style properties.
      +     * @param {Number} order Order of the series.
      +     * @param {Number} index Index within the series associated with the marker.
      +     * @return Shape
      +     * @private
      +     */
      +    _createMarker: function(styles, order, index)
      +    {
      +        var graphic = this.get("graphic"),
      +            marker,
      +            cfg = Y.clone(styles);
      +        graphic.set("autoDraw", false);
      +        cfg.type = cfg.shape;
      +        marker = graphic.addShape(cfg); 
      +        marker.addClass(SERIES_MARKER);
      +        return marker;
      +    },
      +    
      +    /**
      +     * Creates a cache of markers for reuse.
      +     *
      +     * @method _createMarkerCache
      +     * @private
      +     */
      +    _createMarkerCache: function()
      +    {
      +        if(this._groupMarker)
      +        {
      +            this._groupMarker.destroy();
      +            this._groupMarker = null;
      +        }
      +        if(this._markers && this._markers.length > 0)
      +        {
      +            this._markerCache = this._markers.concat();
      +        }
      +        else
      +        {
      +            this._markerCache = [];
      +        }
      +        this._markers = [];
      +    },
      +  
      +    /**
      +     * Draws a series of markers in a single shape instance.
      +     *
      +     * @method _createGroupMarkers
      +     * @param {Object} styles Set of configuration properties used to create the markers.
      +     * @protected
      +     */
      +    _createGroupMarker: function(styles)
      +    {
      +        var marker,
      +            markers = this.get("markers"),
      +            border = styles.border,
      +            graphic,
      +            cfg,
      +            shape;
      +        if(markers && markers.length > 0)
      +        {
      +            while(markers.length > 0)
      +            {
      +                marker = markers.shift();
      +                marker.destroy();
      +            }
      +            this.set("markers", []);
      +        }
      +        //fix name differences between graphic layer
      +        border.opacity = border.alpha;
      +        cfg = {
      +            id: this.get("chart").get("id") + "_" + styles.graphOrder,
      +            stroke: border,
      +            fill: styles.fill,
      +            dimensions: styles.dimensions,
      +            xvalues: styles.xvalues,
      +            yvalues: styles.yvalues
      +        };
      +        cfg.fill.opacity = styles.fill.alpha;
      +        shape = this._getGroupShape(styles.shape);
      +        if(shape)
      +        {
      +            cfg.type = shape;
      +        }
      +        if(styles.hasOwnProperty("radius") && !isNaN(styles.radius))
      +        {
      +            cfg.dimensions.radius = styles.radius;
      +        }
      +        if(this._groupMarker)
      +        {
      +            this._groupMarker.destroy();
      +        }
      +        graphic = this.get("graphic");
      +        graphic.set("autoDraw", true);
      +        this._groupMarker = graphic.addShape(cfg);
      +    },
      +
      +    /**
      +     * Toggles visibility
      +     *
      +     * @method _toggleVisible
      +     * @param {Boolean} visible indicates visibilitye
      +     * @private
      +     */
      +    _toggleVisible: function(visible)
      +    {
      +        var marker,
      +            markers = this.get("markers"),
      +            i = 0,
      +            len;
      +        if(markers)
      +        {
      +            len = markers.length;
      +            for(; i < len; ++i)
      +            {
      +                marker = markers[i];
      +                if(marker)
      +                {
      +                    marker.set("visible", visible);
      +                }
      +            }
      +        }
      +    },
      +
      +    /**
      +     * Removes unused markers from the marker cache
      +     *
      +     * @method _clearMarkerCache
      +     * @private
      +     */
      +    _clearMarkerCache: function()
      +    {
      +        var marker;
      +        while(this._markerCache.length > 0)
      +        {
      +            marker = this._markerCache.shift();
      +            if(marker)
      +            {
      +                marker.destroy();
      +            }
      +        }
      +    },
      +
      +    /**
      +     * Resizes and positions markers based on a mouse interaction.
      +     *
      +     * @method updateMarkerState
      +     * @param {String} type state of the marker
      +     * @param {Number} i index of the marker
      +     * @protected
      +     */
      +    updateMarkerState: function(type, i)
      +    {
      +        if(this._markers && this._markers[i])
      +        {
      +            var w,
      +                h,
      +                styles = Y.clone(this.get("styles").marker),
      +                state = this._getState(type),
      +                xcoords = this.get("xcoords"),
      +                ycoords = this.get("ycoords"),
      +                marker = this._markers[i],
      +                markerStyles = state == "off" || !styles[state] ? styles : styles[state]; 
      +                markerStyles.fill.color = this._getItemColor(markerStyles.fill.color, i);
      +                markerStyles.border.color = this._getItemColor(markerStyles.border.color, i);
      +                markerStyles.stroke = markerStyles.border;
      +                marker.set(markerStyles);
      +                w = markerStyles.width;
      +                h = markerStyles.height;
      +                marker.set("x", (xcoords[i] - w/2));
      +                marker.set("y",  (ycoords[i] - h/2));
      +                marker.set("visible", this.get("visible"));
      +        }
      +    },
      +
      +    /**
      +     * Parses a color from an array.
      +     *
      +     * @method _getItemColor
      +     * @param {Array} val collection of colors
      +     * @param {Number} i index of the item
      +     * @return String
      +     * @protected
      +     */
      +    _getItemColor: function(val, i)
      +    {
      +        if(Y_Lang.isArray(val))
      +        {
      +            return val[i % val.length];
      +        }
      +        return val;
      +    },
      +
      +    /**
      +     * Method used by `styles` setter. Overrides base implementation.
      +     *
      +     * @method _setStyles
      +     * @param {Object} newStyles Hash of properties to update.
      +     * @return Object
      +     * @protected
      +     */
      +    _setStyles: function(val)
      +    {
      +        val = this._parseMarkerStyles(val);
      +        return Y.Renderer.prototype._setStyles.apply(this, [val]);
      +    },
      +
      +    /**
      +     * Combines new styles with existing styles.
      +     *
      +     * @method _parseMarkerStyles
      +     * @param {Object} Object containing style properties for the marker.
      +     * @return Object
      +     * @private
      +     */
      +    _parseMarkerStyles: function(val)
      +    {
      +        if(val.marker)
      +        {
      +            var defs = this._getPlotDefaults();
      +            val.marker = this._mergeStyles(val.marker, defs);
      +            if(val.marker.over)
      +            {
      +                val.marker.over = this._mergeStyles(val.marker.over, val.marker);
      +            }
      +            if(val.marker.down)
      +            {
      +                val.marker.down = this._mergeStyles(val.marker.down, val.marker);
      +            }
      +        }
      +        return val;
      +    },
      +
      +    /**
      +     * Returns marker state based on event type
      +     *
      +     * @method _getState
      +     * @param {String} type event type
      +     * @return String
      +     * @protected
      +     */
      +    _getState: function(type)
      +    {
      +        var state;
      +        switch(type)
      +        {
      +            case "mouseout" :
      +                state = "off";
      +            break;
      +            case "mouseover" :
      +                state = "over";
      +            break;
      +            case "mouseup" :
      +                state = "over";
      +            break;
      +            case "mousedown" :
      +                state = "down";
      +            break;
      +        }
      +        return state;
      +    },
      +    
      +    /**
      +     * @property _statSyles
      +     * @type Object
      +     * @private
      +     */
      +    _stateSyles: null
      +};
      +
      +Y.augment(Plots, Y.Attribute);
      +Y.Plots = Plots;
      diff --git a/tests/input/charts/RectGroup.js b/tests/input/charts/RectGroup.js
      new file mode 100755
      index 00000000..ddd1082a
      --- /dev/null
      +++ b/tests/input/charts/RectGroup.js
      @@ -0,0 +1,29 @@
      +/**
      + * Abstract class for creating groups of rects with the same styles and dimensions.
      + *
      + * @module graphics
      + * @class GroupRect
      + * @constructor
      + */
      + RectGroup = function(cfg)
      + {
      +    RectGroup.superclass.constructor.apply(this, arguments);
      + };
      +    
      + RectGroup.NAME = "rectGroup";
      +
      + Y.extend(RectGroup, Y.ShapeGroup, {    
      +    /**
      +     * Updates the rect.
      +     *
      +     * @method _draw
      +     * @private
      +     */
      +    drawShape: function(cfg)
      +    {
      +        this.drawRect(cfg.x, cfg.y, cfg.width, cfg.height);
      +    }
      + });
      +    
      +RectGroup.ATTRS = Y.ShapeGroup.ATTRS;
      +Y.RectGroup = RectGroup;
      diff --git a/tests/input/charts/Renderer.js b/tests/input/charts/Renderer.js
      new file mode 100644
      index 00000000..9ccac214
      --- /dev/null
      +++ b/tests/input/charts/Renderer.js
      @@ -0,0 +1,117 @@
      +/**
      + * The Renderer class is a base class for chart components that use the `styles`
      + * attribute.
      + *
      + * @module charts
      + * @class Renderer
      + * @constructor
      + */
      +function Renderer(){}
      +
      +Renderer.ATTRS = {
      +        /**
      +         * Style properties for class
      +         * 
      +         * @attribute styles
      +         * @type Object
      +         */
      +        styles:
      +        {
      +            getter: function()
      +            {
      +                this._styles = this._styles || this._getDefaultStyles();
      +                return this._styles;
      +            },
      +
      +            setter: function(val)
      +            {
      +                this._styles = this._setStyles(val);
      +            }
      +        },
      +        
      +        /**
      +         * The graphic in which drawings will be rendered.
      +         *
      +         * @attribute graphic
      +         * @type Graphic
      +         */
      +        graphic: {}
      +};
      +Renderer.NAME = "renderer";
      +
      +Renderer.prototype = {
      +    /**
      +     * Storage for `styles` attribute.
      +     *
      +     * @property _styles
      +     * @type Object
      +     * @private
      +     */
      +	_styles: null,
      +	
      +    /**
      +     * Method used by `styles` setter.
      +     *
      +     * @method _setStyles
      +     * @param {Object} newStyles Hash of properties to update.
      +     * @return Object
      +     * @protected
      +     */
      +	_setStyles: function(newstyles)
      +	{
      +		var styles = this.get("styles");
      +        return this._mergeStyles(newstyles, styles);
      +	},
      +    
      +    /**
      +     * Merges to object literals so that only specified properties are 
      +     * overwritten.
      +     *
      +     * @method _mergeStyles
      +     * @param {Object} a Hash of new styles
      +     * @param {Object} b Hash of original styles
      +     * @return Object
      +     * @protected
      +     */
      +    _mergeStyles: function(a, b)
      +    {
      +        if(!b)
      +        {
      +            b = {};
      +        }
      +        var newstyles = Y.merge(b, {});
      +        Y.Object.each(a, function(value, key, a)
      +        {
      +            if(b.hasOwnProperty(key) && Y_Lang.isObject(value) && !Y_Lang.isFunction(value) && !Y_Lang.isArray(value))
      +            {
      +                newstyles[key] = this._mergeStyles(value, b[key]);
      +            }
      +            else
      +            {
      +                newstyles[key] = value;
      +            }
      +        }, this);
      +        return newstyles;
      +    },
      +
      +    /**
      +     * Gets the default value for the `styles` attribute. 
      +     *
      +     * @method _getDefaultStyles
      +     * @return Object
      +     * @protected
      +     */
      +    _getDefaultStyles: function()
      +    {
      +        return {padding:{
      +            top:0,
      +            right: 0,
      +            bottom: 0,
      +            left: 0
      +        }};
      +    }
      +};
      +
      +Y.augment(Renderer, Y.Attribute);
      +Y.Renderer = Renderer;
      +
      diff --git a/tests/input/charts/RightAxisLayout.js b/tests/input/charts/RightAxisLayout.js
      new file mode 100644
      index 00000000..88f487e7
      --- /dev/null
      +++ b/tests/input/charts/RightAxisLayout.js
      @@ -0,0 +1,366 @@
      +/**
      + * RightAxisLayout contains algorithms for rendering a right axis.
      + *
      + * @module charts
      + * @class RightAxisLayout
      + * @constructor
      + */
      +RightAxisLayout = function(){};
      +
      +RightAxisLayout.prototype = {
      +    /**
      +     *  Default margins for text fields.
      +     *
      +     *  @private
      +     *  @method _getDefaultMargins
      +     *  @return Object
      +     */
      +    _getDefaultMargins: function() 
      +    {
      +        return {
      +            top: 0,
      +            left: 4,
      +            right: 0,
      +            bottom: 0
      +        };
      +    },
      +
      +    /**
      +     * Sets the length of the tick on either side of the axis line.
      +     *
      +     * @method setTickOffset
      +     * @protected
      +     */
      +    setTickOffsets: function()
      +    {
      +        var host = this,
      +            majorTicks = host.get("styles").majorTicks,
      +            tickLength = majorTicks.length,
      +            halfTick = tickLength * 0.5,
      +            display = majorTicks.display;
      +        host.set("topTickOffset",  0);
      +        host.set("bottomTickOffset",  0);
      +        
      +        switch(display)
      +        {
      +            case "inside" :
      +                host.set("leftTickOffset", tickLength);
      +                host.set("rightTickOffset", 0);
      +            break;
      +            case "outside" : 
      +                host.set("leftTickOffset", 0);
      +                host.set("rightTickOffset", tickLength);
      +            break;
      +            case "cross" :
      +                host.set("rightTickOffset", halfTick);
      +                host.set("leftTickOffset", halfTick);
      +            break;
      +            default:
      +                host.set("leftTickOffset", 0);
      +                host.set("rightTickOffset", 0);
      +            break;
      +        }
      +    },
      +
      +    /**
      +     * Draws a tick
      +     *
      +     * @method drawTick
      +     * @param {Path} path reference to the path `Path` element in which to draw the tick.
      +     * @param {Object} pt Point on the axis in which the tick will intersect.
      +     * @param {Object) tickStyle Hash of properties to apply to the tick.
      +     * @protected
      +     */
      +    drawTick: function(path, pt, tickStyles)
      +    {
      +        var host = this,
      +            style = host.get("styles"),
      +            padding = style.padding,
      +            tickLength = tickStyles.length,
      +            start = {x:padding.left, y:pt.y},
      +            end = {x:padding.left + tickLength, y:pt.y};
      +        host.drawLine(path, start, end);
      +    },
      +    
      +    /**
      +     * Calculates the coordinates for the first point on an axis.
      +     *
      +     * @method getLineStart
      +     * @return {Object}
      +     * @protected
      +     */
      +    getLineStart: function()
      +    {
      +        var host = this,
      +            style = host.get("styles"),
      +            padding = style.padding,
      +            majorTicks = style.majorTicks,
      +            tickLength = majorTicks.length,
      +            display = majorTicks.display,
      +            pt = {x:padding.left, y:padding.top};
      +        if(display === "inside")
      +        {
      +            pt.x += tickLength;
      +        }
      +        else if(display === "cross")
      +        {
      +            pt.x += tickLength/2;
      +        }
      +        return pt;
      +    },
      +    
      +    /**
      +     * Calculates the point for a label.
      +     *
      +     * @method getLabelPoint
      +     * @param {Object} point Point on the axis in which the tick will intersect.
      +     * @return {Object} 
      +     * @protected
      +     */
      +    getLabelPoint: function(point)
      +    {
      +        return {x:point.x + this.get("rightTickOffset"), y:point.y};
      +    },
      +    
      +    /**
      +     * Updates the value for the `maxLabelSize` for use in calculating total size.
      +     *
      +     * @method updateMaxLabelSize
      +     * @param {HTMLElement} label to measure
      +     * @protected
      +     */
      +    updateMaxLabelSize: function(labelWidth, labelHeight)
      +    {
      +        var host = this,
      +            props = this._labelRotationProps,
      +            rot = props.rot,
      +            absRot = props.absRot,
      +            sinRadians = props.sinRadians,
      +            cosRadians = props.cosRadians,
      +            max;
      +        if(rot === 0)
      +        {
      +            max = labelWidth;
      +        }
      +        else if(absRot === 90)
      +        {
      +            max = labelHeight;
      +        }
      +        else
      +        {
      +            max = (cosRadians * labelWidth) + (sinRadians * labelHeight);
      +        }
      +        host._maxLabelSize = Math.max(host._maxLabelSize, max);
      +    },
      +    
      +    /**
      +     * Determines the available label width when the axis width has been explicitly set.
      +     *
      +     * @method getExplicitlySized
      +     * @return Boolean
      +     * @protected
      +     */
      +    getExplicitlySized: function(styles)
      +    {
      +        if(this._explicitWidth)
      +        {
      +            var host = this,
      +                w = host._explicitWidth,
      +                totalTitleSize = this._totalTitleSize,
      +                rightTickOffset = host.get("rightTickOffset"),
      +                margin = styles.label.margin.right;
      +            host._maxLabelSize =  w - (rightTickOffset + margin + totalTitleSize);
      +            return true;
      +        }
      +        return false;
      +    },
      +
      +    /**
      +     * Rotate and position title.
      +     *
      +     * @method positionTitle
      +     * @param {HTMLElement} label to rotate position
      +     * @protected
      +     */
      +    positionTitle: function(label)
      +    {
      +        var host = this,
      +            bounds = host._titleBounds,
      +            margin = host.get("styles").title.margin,
      +            props = host._titleRotationProps,
      +            labelWidth = label.offsetWidth,
      +            labelHeight = label.offsetHeight,
      +            w = bounds.right - bounds.left,
      +            x = this.get("width") - (labelWidth * 0.5) - (w * 0.5),
      +            y = (host.get("height") * 0.5) - (labelHeight * 0.5);
      +        props.labelWidth = labelWidth;
      +        props.labelHeight = labelHeight;
      +        if(margin && margin.right)
      +        {
      +            x -= margin.left;
      +        }
      +        props.x = x;
      +        props.y = y;
      +        props.transformOrigin = [0.5, 0.5];
      +        host._rotate(label, props);
      +    },
      +
      +    /**
      +     * Rotate and position labels.
      +     *
      +     * @method positionLabel
      +     * @param {HTMLElement} label to rotate position
      +     * @param {Object} pt hash containing the x and y coordinates in which the label will be positioned
      +     * against.
      +     * @protected
      +     */
      +    positionLabel: function(label, pt, styles, i)
      +    {
      +        var host = this,
      +            tickOffset = host.get("rightTickOffset"),
      +            labelStyles = styles.label,
      +            margin = 0,
      +            leftOffset = pt.x,
      +            topOffset = pt.y,
      +            props = this._labelRotationProps,
      +            rot = props.rot,
      +            absRot = props.absRot,
      +            labelWidth = this._labelWidths[i],
      +            labelHeight = this._labelHeights[i];
      +        if(labelStyles.margin && labelStyles.margin.left)
      +        {
      +            margin = labelStyles.margin.left;
      +        }
      +        if(rot === 0)
      +        {
      +            topOffset -= labelHeight * 0.5;
      +        }
      +        else if(rot === 90)
      +        {
      +            leftOffset -= labelWidth * 0.5;
      +            topOffset -= labelHeight;
      +        }
      +        else if(rot === -90)
      +        {
      +            leftOffset -= labelWidth * 0.5;
      +        }
      +        else
      +        {
      +            topOffset -= labelHeight * 0.5;
      +            leftOffset += labelHeight/2 * absRot/90;
      +        }
      +        leftOffset += margin;
      +        leftOffset += tickOffset;
      +        props.labelWidth = labelWidth;
      +        props.labelHeight = labelHeight;
      +        props.x = Math.round(leftOffset);
      +        props.y = Math.round(topOffset);
      +        this._rotate(label, props);
      +    },
      + 
      +    /**
      +     * Adjusts the coordinates of an axis label based on the rotation.
      +     *
      +     * @method _setRotationCoords
      +     * @param {Object} props Coordinates, dimension and rotation properties of the label.
      +     * @protected
      +     */
      +    _setRotationCoords: function(props)
      +    {
      +        var rot = props.rot,
      +            absRot = props.absRot,
      +            leftOffset = 0,
      +            topOffset = 0,
      +            labelWidth = props.labelWidth,
      +            labelHeight = props.labelHeight;
      +        if(rot === 0)
      +        {
      +            topOffset = labelHeight * 0.5;
      +        }
      +        else if(rot === 90)
      +        {
      +            leftOffset = labelWidth * 0.5;
      +            topOffset = labelHeight;
      +        }
      +        else if(rot === -90)
      +        {
      +            leftOffset = labelWidth * 0.5;
      +        }
      +        else
      +        {
      +            topOffset = labelHeight * 0.5;
      +            leftOffset = labelHeight/2 * absRot/90;
      +        }
      +        props.x -= leftOffset;
      +        props.y -= topOffset;
      +    },
      +   
      +    /**
      +     * Returns the transformOrigin to use for an axis label based on the position of the axis 
      +     * and the rotation of the label.
      +     *
      +     * @method _getTransformOrigin
      +     * @param {Number} rot The rotation (in degrees) of the label.
      +     * @return Array
      +     * @protected
      +     */
      +    _getTransformOrigin: function(rot)
      +    {
      +        var transformOrigin;
      +        if(rot === 0)
      +        {
      +            transformOrigin = [0, 0];
      +        }
      +        else if(rot === 90)
      +        {
      +            transformOrigin = [0.5, 1];
      +        }
      +        else if(rot === -90)
      +        {
      +            transformOrigin = [0.5, 0];
      +        }
      +        else
      +        {
      +            transformOrigin = [0, 0.5];
      +        }
      +        return transformOrigin;
      +    },
      +
      +    /**
      +     * Adjusts position for inner ticks.
      +     *
      +     * @method offsetNodeForTick
      +     * @param {Node} cb contentBox of the axis
      +     * @protected
      +     */
      +    offsetNodeForTick: function(cb)
      +    {
      +        var host = this,
      +            tickOffset = host.get("leftTickOffset"),
      +            offset = 0 - tickOffset;
      +        cb.setStyle("left", offset);
      +    },
      +
      +    /**
      +     * Assigns a height based on the size of the contents.
      +     *
      +     * @method setCalculatedSize
      +     * @protected
      +     */
      +    setCalculatedSize: function()
      +    {
      +        var host = this,
      +            styles = host.get("styles"),
      +            labelStyle = styles.label,
      +            totalTitleSize = this._totalTitleSize,
      +            ttl = Math.round(host.get("rightTickOffset") + host._maxLabelSize + totalTitleSize + labelStyle.margin.left);
      +        if(this._explicitWidth)
      +        {
      +            ttl = this._explicitWidth;
      +        }
      +        host.set("calculatedWidth", ttl);
      +        host.get("contentBox").setStyle("width", ttl);
      +    }
      +};
      +
      +Y.RightAxisLayout = RightAxisLayout;
      diff --git a/tests/input/charts/ShapeGroup.js b/tests/input/charts/ShapeGroup.js
      new file mode 100755
      index 00000000..ec85b66a
      --- /dev/null
      +++ b/tests/input/charts/ShapeGroup.js
      @@ -0,0 +1,178 @@
      +/**
      + * The Charts widget provides an api for displaying data
      + * graphically.
      + *
      + * @module charts
      + * @main charts
      + */
      +var CONFIG = Y.config,
      +    WINDOW = CONFIG.win,
      +    DOCUMENT = CONFIG.doc,
      +    Y_Lang = Y.Lang,
      +    IS_STRING = Y_Lang.isString,
      +    LeftAxisLayout,
      +    RightAxisLayout,
      +    BottomAxisLayout,
      +    TopAxisLayout,
      +    _getClassName = Y.ClassNameManager.getClassName,
      +    SERIES_MARKER = _getClassName("seriesmarker"),
      +    ShapeGroup,
      +    CircleGroup,
      +    RectGroup,
      +    EllipseGroup,
      +    DiamondGroup;
      +
      +/**
      + * Abstract class for creating groups of shapes with the same styles and dimensions.
      + *
      + * @module graphics
      + * @class ShapeGroup
      + * @constructor
      + */
      + ShapeGroup = function(cfg)
      + {
      +    ShapeGroup.superclass.constructor.apply(this, arguments);
      + };
      +    
      + ShapeGroup.NAME = "shapeGroup";
      +
      + Y.extend(ShapeGroup, Y.Path, {    
      +    /**
      +     * Updates the shape.
      +     *
      +     * @method _draw
      +     * @private
      +     */
      +    _draw: function()
      +    {
      +        var xvalues = this.get("xvalues"),
      +            yvalues = this.get("yvalues"),
      +            x,
      +            y,
      +            xRad,
      +            yRad,
      +            i = 0,
      +            len,
      +            attrs = [],
      +            dimensions = this.get("dimensions"),
      +            width = dimensions.width,
      +            height = dimensions.height,
      +            radius = dimensions.radius,
      +            yRadius = dimensions.yRadius,
      +            id = this.get("id"),
      +            className = this.node.className,
      +            widthIsArray = Y_Lang.isArray(width),
      +            heightIsArray = Y_Lang.isArray(height),
      +            radiusIsArray = Y_Lang.isArray(radius),
      +            yRadiusIsArray = Y_Lang.isArray(yRadius);
      +        if(xvalues && yvalues && xvalues.length > 0)
      +        {
      +            this.clear();
      +
      +            len = xvalues.length;
      +            for(; i < len; ++i)
      +            {
      +                x = xvalues[i];
      +                y = yvalues[i];
      +                xRad = radiusIsArray ? radius[i] : radius;
      +                yRad = yRadiusIsArray ? yRadius[i] : yRadius;
      +                if(!isNaN(x) && !isNaN(y) && !isNaN(xRad))
      +                {
      +                    this.drawShape({
      +                        x: x,
      +                        y: y,
      +                        width: widthIsArray ? width[i] : width,
      +                        height: heightIsArray ? height[i] : height,
      +                        radius: xRad,
      +                        yRadius: yRad 
      +                    });
      +                    this.closePath();
      +                    attrs[i] = {
      +                        id: id + "_" + i,
      +                        className: className,
      +                        coords: (x - this._left) + ", " + (y - this._top)  + ", " + radius,
      +                        shape: "circle"
      +                    };
      +                }
      +            }
      +            this._closePath();
      +        }
      +    },
      +
      +    /**
      +     * Parses and array of lengths into radii
      +     *
      +     * @method _getRadiusCollection
      +     * @param {Array} val Array of lengths
      +     * @return Array
      +     * @private
      +     */
      +    _getRadiusCollection: function(val)
      +    {
      +        var i = 0,
      +            len = val.length,
      +            radii = [];
      +        for(; i < len; ++i)
      +        {   
      +            radii[i] = val[i] * 0.5;
      +        }
      +        return radii;
      +    }
      + });
      +    
      +ShapeGroup.ATTRS = Y.merge(Y.Path.ATTRS, {
      +    dimensions: {
      +        getter: function()
      +        {
      +            var dimensions = this._dimensions,
      +                radius,
      +                yRadius,
      +                width,
      +                height;
      +            if(dimensions.hasOwnProperty("radius"))
      +            {
      +                return dimensions;
      +            }
      +            else
      +            {
      +                width = dimensions.width;
      +                height = dimensions.height;
      +                radius = Y_Lang.isArray(width) ? this._getRadiusCollection(width) : (width * 0.5);
      +                yRadius = Y_Lang.isArray(height) ? this._getRadiusCollection(height) : (height * 0.5);
      +                return {
      +                    width: width,
      +                    height: height,
      +                    radius: radius,
      +                    yRadius: yRadius
      +                };
      +            }
      +        },
      +
      +        setter: function(val)
      +        {
      +            this._dimensions = val;
      +            return val;
      +        }
      +    },
      +    xvalues: {
      +        getter: function()
      +        {
      +            return this._xvalues;
      +        },
      +        setter: function(val)
      +        {
      +            this._xvalues = val;
      +        }
      +    },
      +    yvalues: {
      +        getter: function()
      +        {
      +            return this._yvalues;
      +        },
      +        setter: function(val)
      +        {
      +            this._yvalues = val;
      +        }
      +    }
      +});
      +Y.ShapeGroup = ShapeGroup;
      diff --git a/tests/input/charts/SplineSeries.js b/tests/input/charts/SplineSeries.js
      new file mode 100644
      index 00000000..4b7c7bde
      --- /dev/null
      +++ b/tests/input/charts/SplineSeries.js
      @@ -0,0 +1,63 @@
      +/**
      + * SplineSeries renders a graph with data points connected by a curve.
      + *
      + * @module charts
      + * @class SplineSeries
      + * @constructor
      + * @extends CartesianSeries
      + * @uses CurveUtil
      + * @uses Lines
      + */
      +Y.SplineSeries = Y.Base.create("splineSeries",  Y.LineSeries, [Y.CurveUtil, Y.Lines], {
      +    /**
      +     * @protected
      +     *
      +     * Draws the series.
      +     *
      +     * @method drawSeries
      +     */
      +    drawSeries: function()
      +    {
      +        this.drawSpline();
      +    }
      +}, {
      +	ATTRS : {
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @default spline
      +         */
      +        type : {
      +            value:"spline"
      +        }
      +
      +        /**
      +         * Style properties used for drawing lines. This attribute is inherited from `Renderer`. Below are the default values:
      +         *  <dl>
      +         *      <dt>color</dt><dd>The color of the line. The default value is determined by the order of the series on the graph. The color will be
      +         *      retrieved from the following array: 
      +         *      `["#426ab3", "#d09b2c", "#000000", "#b82837", "#b384b5", "#ff7200", "#779de3", "#cbc8ba", "#7ed7a6", "#007a6c"]`
      +         *      <dt>weight</dt><dd>Number that indicates the width of the line. The default value is 6.</dd>
      +         *      <dt>alpha</dt><dd>Number between 0 and 1 that indicates the opacity of the line. The default value is 1.</dd>
      +         *      <dt>lineType</dt><dd>Indicates whether the line is solid or dashed. The default value is solid.</dd> 
      +         *      <dt>dashLength</dt><dd>When the `lineType` is dashed, indicates the length of the dash. The default value is 10.</dd>
      +         *      <dt>gapSpace</dt><dd>When the `lineType` is dashed, indicates the distance between dashes. The default value is 10.</dd>
      +         *      <dt>connectDiscontinuousPoints</dt><dd>Indicates whether or not to connect lines when there is a missing or null value between points. The default value is true.</dd> 
      +         *      <dt>discontinuousType</dt><dd>Indicates whether the line between discontinuous points is solid or dashed. The default value is solid.</dd>
      +         *      <dt>discontinuousDashLength</dt><dd>When the `discontinuousType` is dashed, indicates the length of the dash. The default value is 10.</dd>
      +         *      <dt>discontinuousGapSpace</dt><dd>When the `discontinuousType` is dashed, indicates the distance between dashes. The default value is 10.</dd>
      +         *  </dl>
      +         *
      +         * @attribute styles
      +         * @type Object
      +         */
      +    }
      +});
      +
      +
      +
      +		
      +
      +		
      diff --git a/tests/input/charts/StackedAreaSeries.js b/tests/input/charts/StackedAreaSeries.js
      new file mode 100644
      index 00000000..8a1ac117
      --- /dev/null
      +++ b/tests/input/charts/StackedAreaSeries.js
      @@ -0,0 +1,49 @@
      +/**
      + * StackedAreaSeries area fills to display data showing its contribution to a whole.
      + *
      + * @module charts
      + * @class StackedAreaSeries
      + * @constructor
      + * @param {Object} config (optional) Configuration parameters for the Chart.
      + * @extends AreaSeries
      + * @uses StackingUtil
      + */
      +Y.StackedAreaSeries = Y.Base.create("stackedAreaSeries", Y.AreaSeries, [Y.StackingUtil], {
      +    /**
      +     * @protected
      +     *
      +     * Calculates the coordinates for the series. Overrides base implementation.
      +     *
      +     * @method setAreaData
      +     */
      +    setAreaData: function()
      +    {   
      +        Y.StackedAreaSeries.superclass.setAreaData.apply(this);
      +        this._stackCoordinates.apply(this);
      +    },
      +
      +    /**
      +     * @protected
      +     *
      +     * Draws the series
      +     *
      +     * @method drawSeries
      +     */
      +	drawSeries: function()
      +    {
      +        this.drawFill.apply(this, this._getStackedClosingPoints());
      +    }
      +}, {
      +    ATTRS: {
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @default stackedArea
      +         */
      +        type: {
      +            value:"stackedArea"
      +        }
      +    }
      +});
      diff --git a/tests/input/charts/StackedAreaSplineSeries.js b/tests/input/charts/StackedAreaSplineSeries.js
      new file mode 100644
      index 00000000..4e9d1634
      --- /dev/null
      +++ b/tests/input/charts/StackedAreaSplineSeries.js
      @@ -0,0 +1,38 @@
      +/**
      + * StackedAreaSplineSeries creates a stacked area chart with points data points connected by a curve.
      + *
      + * @module charts
      + * @class StackedAreaSplineSeries
      + * @constructor
      + * @extends AreaSeries
      + * @uses CurveUtil
      + * @uses StackingUtil
      + */
      +Y.StackedAreaSplineSeries = Y.Base.create("stackedAreaSplineSeries", Y.AreaSeries, [Y.CurveUtil, Y.StackingUtil], {
      +    /**
      +     * @protected
      +     *
      +     * Draws the series.
      +     *
      +     * @method drawSeries
      +     */
      +    drawSeries: function()
      +    {
      +        this._stackCoordinates();
      +        this.drawStackedAreaSpline();
      +    }
      +}, {
      +    ATTRS : {
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @default stackedAreaSpline
      +         */
      +        type: {
      +            value:"stackedAreaSpline"
      +        }
      +    }
      +});
      +
      diff --git a/tests/input/charts/StackedAxis.js b/tests/input/charts/StackedAxis.js
      new file mode 100644
      index 00000000..cc200a26
      --- /dev/null
      +++ b/tests/input/charts/StackedAxis.js
      @@ -0,0 +1,102 @@
      +/**
      + * StackedAxis manages stacked numeric data on an axis.
      + *
      + * @module charts
      + * @class StackedAxis
      + * @constructor
      + * @param {Object} config (optional) Configuration parameters for the Chart.
      + * @extends NumericAxis
      + */
      +function StackedAxis(config)
      +{
      +	StackedAxis.superclass.constructor.apply(this, arguments);
      +}
      +
      +StackedAxis.NAME = "stackedAxis";
      +
      +
      +Y.extend(StackedAxis, Y.NumericAxis,
      +{
      +    /**
      +     * Calculates the maximum and minimum values for the `Axis`.
      +     *
      +     * @method _updateMinAndMax
      +     * @private 
      +     */
      +    _updateMinAndMax: function()
      +    {
      +        var max = 0,
      +            min = 0,
      +            pos = 0,
      +            neg = 0,
      +            len = 0,
      +            i = 0,
      +            key,
      +            num,
      +            keys = this.get("keys"),
      +            setMin = this.get("setMin"),
      +            setMax = this.get("setMax");
      +
      +        for(key in keys)
      +        {
      +            if(keys.hasOwnProperty(key))
      +            {
      +                len = Math.max(len, keys[key].length);
      +            }
      +        }
      +        for(; i < len; ++i)
      +        {
      +            pos = 0;
      +            neg = 0;
      +            for(key in keys)
      +            {
      +                if(keys.hasOwnProperty(key))
      +                {
      +                    num = keys[key][i];
      +                    if(isNaN(num))
      +                    {
      +                        continue;
      +                    }
      +                    if(num >= 0)
      +                    {
      +                        pos += num;
      +                    }
      +                    else
      +                    {
      +                        neg += num;
      +                    }
      +                }
      +            }
      +            if(pos > 0)
      +            {
      +                max = Math.max(max, pos);
      +            }
      +            else 
      +            {
      +                max = Math.max(max, neg);
      +            }
      +            if(neg < 0)
      +            {
      +                min = Math.min(min, neg);
      +            }
      +            else
      +            {
      +                min = Math.min(min, pos);
      +            }
      +        }
      +        this._actualMaximum = max;
      +        this._actualMinimum = min;
      +        if(setMax)
      +        {
      +            max = this._setMaximum;
      +        }
      +        if(setMin)
      +        {
      +            min = this._setMinimum;
      +        }
      +        this._roundMinAndMax(min, max, setMin, setMax);
      +    }
      +});
      +
      +Y.StackedAxis = StackedAxis;
      +		
      diff --git a/tests/input/charts/StackedBarSeries.js b/tests/input/charts/StackedBarSeries.js
      new file mode 100644
      index 00000000..bc800b77
      --- /dev/null
      +++ b/tests/input/charts/StackedBarSeries.js
      @@ -0,0 +1,352 @@
      +/**
      + * The StackedBarSeries renders bar chart in which series are stacked horizontally to show
      + * their contribution to the cumulative total.
      + *
      + * @module charts
      + * @class StackedBarSeries
      + * @extends BarSeries
      + * @uses StackingUtil
      + * @constructor
      + */
      +Y.StackedBarSeries = Y.Base.create("stackedBarSeries", Y.BarSeries, [Y.StackingUtil], {
      +    /**
      +     * @protected
      +     *
      +     * Draws the series.
      +     *
      +     * @method drawSeries
      +     */
      +    drawSeries: function()
      +	{
      +        if(this.get("xcoords").length < 1) 
      +        {
      +            return;
      +        }
      +
      +        var isNumber = Y_Lang.isNumber,
      +            style = Y.clone(this.get("styles").marker),
      +            w = style.width,
      +            h = style.height,
      +            xcoords = this.get("xcoords"),
      +            ycoords = this.get("ycoords"),
      +            i = 0,
      +            len = xcoords.length,
      +            top = ycoords[0],
      +            type = this.get("type"),
      +            graph = this.get("graph"),
      +            seriesCollection = graph.seriesTypes[type],
      +            ratio,
      +            order = this.get("order"),
      +            graphOrder = this.get("graphOrder"),
      +            left,
      +            marker,
      +            lastCollection,
      +            negativeBaseValues,
      +            positiveBaseValues,
      +            fillColors,
      +            borderColors,
      +            useOrigin = order === 0,
      +            totalHeight = len * h,
      +            dimensions = {
      +                width: [],
      +                height: []
      +            },
      +            xvalues = [],
      +            yvalues = [],
      +            groupMarkers = this.get("groupMarkers");
      +        if(Y_Lang.isArray(style.fill.color))
      +        {
      +            fillColors = style.fill.color.concat(); 
      +        }
      +        if(Y_Lang.isArray(style.border.color))
      +        {
      +            borderColors = style.border.color.concat();
      +        }
      +        this._createMarkerCache();
      +        if(totalHeight > this.get("height"))
      +        {
      +            ratio = this.height/totalHeight;
      +            h *= ratio;
      +            h = Math.max(h, 1);
      +        }
      +        if(!useOrigin)
      +        {
      +            lastCollection = seriesCollection[order - 1];
      +            negativeBaseValues = lastCollection.get("negativeBaseValues");
      +            positiveBaseValues = lastCollection.get("positiveBaseValues");
      +            if(!negativeBaseValues || !positiveBaseValues)
      +            {
      +                useOrigin = true;
      +                positiveBaseValues = [];
      +                negativeBaseValues = [];
      +            }
      +        }
      +        else
      +        {
      +            negativeBaseValues = [];
      +            positiveBaseValues = [];
      +        }
      +        this.set("negativeBaseValues", negativeBaseValues);
      +        this.set("positiveBaseValues", positiveBaseValues);
      +        for(i = 0; i < len; ++i)
      +        {
      +            top = ycoords[i];
      +            left = xcoords[i];
      +            if(!isNumber(top) || !isNumber(left))
      +            {
      +                if(useOrigin)
      +                {
      +                    positiveBaseValues[i] = this._leftOrigin;
      +                    negativeBaseValues[i] = this._leftOrigin;
      +                }
      +                this._markers.push(null);
      +                continue;
      +            }
      +            if(useOrigin)
      +            {
      +                w = Math.abs(left - this._leftOrigin);
      +                if(left > this._leftOrigin)
      +                {
      +                    positiveBaseValues[i] = left;
      +                    negativeBaseValues[i] = this._leftOrigin;
      +                    left -= w;
      +                }
      +                else if(left < this._leftOrigin)
      +                {   
      +                    positiveBaseValues[i] = this._leftOrigin;
      +                    negativeBaseValues[i] = left;
      +                }
      +                else
      +                {
      +                    positiveBaseValues[i] = left;
      +                    negativeBaseValues[i] = this._leftOrigin;
      +                }
      +            }
      +            else
      +            {
      +                if(left < this._leftOrigin)
      +                {
      +                    left = negativeBaseValues[i] - (this._leftOrigin - xcoords[i]);
      +                    w = negativeBaseValues[i] - left;
      +                    negativeBaseValues[i] = left;
      +                }
      +                else if(left >= this._leftOrigin)
      +                {
      +                    left += (positiveBaseValues[i] - this._leftOrigin);
      +                    w = left - positiveBaseValues[i];
      +                    positiveBaseValues[i] = left;
      +                    left -= w;
      +                }
      +            }
      +            if(!isNaN(w) && w > 0)
      +            {
      +                top -= h/2;
      +                if(groupMarkers)
      +                {
      +                    dimensions.width[i] = w;
      +                    dimensions.height[i] = h;
      +                    xvalues.push(left);
      +                    yvalues.push(top);
      +                }
      +                else
      +                {
      +                    style.width = w;
      +                    style.height = h;
      +                    style.x = left;
      +                    style.y = top;
      +                    if(fillColors)
      +                    {
      +                        style.fill.color = fillColors[i % fillColors.length];
      +                    }
      +                    if(borderColors)
      +                    {
      +                        style.border.color = borderColors[i % borderColors.length];
      +                    }
      +                    marker = this.getMarker(style, graphOrder, i);
      +                }
      +            }
      +            else if(!groupMarkers)
      +            {
      +                this._markers.push(null);
      +            }
      +        }
      +        if(groupMarkers)
      +        {
      +            this._createGroupMarker({
      +                fill: style.fill,
      +                border: style.border,
      +                dimensions: dimensions,
      +                xvalues: xvalues,
      +                yvalues: yvalues,
      +                shape: style.shape
      +            });
      +        }
      +        else
      +        {
      +            this._clearMarkerCache();
      +        }
      +    },
      +
      +    /**
      +     * @protected
      +     *
      +     * Resizes and positions markers based on a mouse interaction.
      +     *
      +     * @method updateMarkerState
      +     * @param {String} type state of the marker
      +     * @param {Number} i index of the marker
      +     */
      +    updateMarkerState: function(type, i)
      +    {
      +        if(this._markers[i])
      +        {
      +            var state = this._getState(type),
      +                ycoords = this.get("ycoords"),
      +                marker = this._markers[i],
      +                styles = this.get("styles").marker,
      +                h = styles.height,
      +                markerStyles = state == "off" || !styles[state] ? Y.clone(styles) : Y.clone(styles[state]), 
      +                fillColor,
      +                borderColor;        
      +            markerStyles.y = (ycoords[i] - h/2);
      +            markerStyles.x = marker.get("x");
      +            markerStyles.width = marker.get("width");
      +            markerStyles.id = marker.get("id");
      +            fillColor = markerStyles.fill.color; 
      +            borderColor = markerStyles.border.color;
      +            if(Y_Lang.isArray(fillColor))
      +            {
      +                markerStyles.fill.color = fillColor[i % fillColor.length];
      +            }
      +            else
      +            {
      +                markerStyles.fill.color = this._getItemColor(markerStyles.fill.color, i);
      +            }
      +            if(Y_Lang.isArray(borderColor))
      +            {
      +                markerStyles.border.color = borderColor[i % borderColor.length];
      +            }
      +            else
      +            {
      +                markerStyles.border.color = this._getItemColor(markerStyles.border.color, i);
      +            }
      +            marker.set(markerStyles);
      +        }
      +    },
      +	
      +    /**
      +     * @protected
      +     *
      +     * Returns default values for the `styles` attribute.
      +     * 
      +     * @method _getPlotDefaults
      +     * @return Object
      +     */
      +    _getPlotDefaults: function()
      +    {
      +        var defs = {
      +            fill:{
      +                type: "solid",
      +                alpha: 1,
      +                colors:null,
      +                alphas: null,
      +                ratios: null
      +            },
      +            border:{
      +                weight: 0,
      +                alpha: 1
      +            },
      +            width: 24,
      +            height: 24,
      +            shape: "rect",
      +
      +            padding:{
      +                top: 0,
      +                left: 0,
      +                right: 0,
      +                bottom: 0
      +            }
      +        };
      +        defs.fill.color = this._getDefaultColor(this.get("graphOrder"), "fill");
      +        defs.border.color = this._getDefaultColor(this.get("graphOrder"), "border");
      +        return defs;
      +    }
      +}, {
      +    ATTRS: {
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @default stackedBar
      +         */
      +        type: {
      +            value: "stackedBar"
      +        },
      +
      +        /**
      +         * Direction of the series
      +         *
      +         * @attribute direction
      +         * @type String
      +         * @default vertical
      +         */
      +        direction: {
      +            value: "vertical"
      +        },
      +
      +        /**
      +         * @private
      +         *
      +         * @attribute negativeBaseValues
      +         * @type Array
      +         * @default null
      +         */
      +        negativeBaseValues: {
      +            value: null
      +        },
      +
      +        /**
      +         * @private
      +         *
      +         * @attribute positiveBaseValues
      +         * @type Array
      +         * @default null
      +         */
      +        positiveBaseValues: {
      +            value: null
      +        }
      +        
      +        /**
      +         * Style properties used for drawing markers. This attribute is inherited from `BarSeries`. Below are the default values:
      +         *  <dl>
      +         *      <dt>fill</dt><dd>A hash containing the following values:
      +         *          <dl>
      +         *              <dt>color</dt><dd>Color of the fill. The default value is determined by the order of the series on the graph. The color
      +         *              will be retrieved from the below array:<br/>
      +         *              `["#66007f", "#a86f41", "#295454", "#996ab2", "#e8cdb7", "#90bdbd","#000000","#c3b8ca", "#968373", "#678585"]`
      +         *              </dd>
      +         *              <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the marker fill. The default value is 1.</dd>
      +         *          </dl>
      +         *      </dd>
      +         *      <dt>border</dt><dd>A hash containing the following values:
      +         *          <dl>
      +         *              <dt>color</dt><dd>Color of the border. The default value is determined by the order of the series on the graph. The color
      +         *              will be retrieved from the below array:<br/>
      +         *              `["#205096", "#b38206", "#000000", "#94001e", "#9d6fa0", "#e55b00", "#5e85c9", "#adab9e", "#6ac291", "#006457"]`
      +         *              <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the marker border. The default value is 1.</dd>
      +         *              <dt>weight</dt><dd>Number indicating the width of the border. The default value is 1.</dd>
      +         *          </dl>
      +         *      </dd>
      +         *      <dt>height</dt><dd>indicates the width of the marker. The default value is 24.</dd>
      +         *      <dt>over</dt><dd>hash containing styles for markers when highlighted by a `mouseover` event. The default 
      +         *      values for each style is null. When an over style is not set, the non-over value will be used. For example,
      +         *      the default value for `marker.over.fill.color` is equivalent to `marker.fill.color`.</dd>
      +         *  </dl>
      +         *
      +         * @attribute styles
      +         * @type Object
      +         */
      +    }
      +});
      +
      diff --git a/tests/input/charts/StackedColumnSeries.js b/tests/input/charts/StackedColumnSeries.js
      new file mode 100644
      index 00000000..53333b32
      --- /dev/null
      +++ b/tests/input/charts/StackedColumnSeries.js
      @@ -0,0 +1,339 @@
      +/**
      + * The StackedColumnSeries renders column chart in which series are stacked vertically to show
      + * their contribution to the cumulative total.
      + *
      + * @module charts
      + * @class StackedColumnSeries
      + * @extends ColumnSeries
      + * @uses StackingUtil
      + * @constructor
      + */
      +Y.StackedColumnSeries = Y.Base.create("stackedColumnSeries", Y.ColumnSeries, [Y.StackingUtil], {
      +    /**
      +     * Draws the series.
      +     *
      +     * @method drawSeries
      +	 * @protected
      +	 */
      +	drawSeries: function()
      +	{
      +        if(this.get("xcoords").length < 1) 
      +        {
      +            return;
      +        }
      +        var isNumber = Y_Lang.isNumber,
      +            style = Y.clone(this.get("styles").marker), 
      +            w = style.width,
      +            h = style.height,
      +            xcoords = this.get("xcoords"),
      +            ycoords = this.get("ycoords"),
      +            i = 0,
      +            len = xcoords.length,
      +            top = ycoords[0],
      +            type = this.get("type"),
      +            graph = this.get("graph"),
      +            seriesCollection = graph.seriesTypes[type],
      +            ratio,
      +            order = this.get("order"),
      +            graphOrder = this.get("graphOrder"),
      +            left,
      +            marker,
      +            fillColors,
      +            borderColors,
      +            lastCollection,
      +            negativeBaseValues,
      +            positiveBaseValues,
      +            useOrigin = order === 0,
      +            totalWidth = len * w,
      +            dimensions = {
      +                width: [],
      +                height: []
      +            },
      +            xvalues = [],
      +            yvalues = [],
      +            groupMarkers = this.get("groupMarkers");
      +        if(Y_Lang.isArray(style.fill.color))
      +        {
      +            fillColors = style.fill.color.concat(); 
      +        }
      +        if(Y_Lang.isArray(style.border.color))
      +        {
      +            borderColors = style.border.color.concat();
      +        }
      +        this._createMarkerCache();
      +        if(totalWidth > this.get("width"))
      +        {
      +            ratio = this.width/totalWidth;
      +            w *= ratio;
      +            w = Math.max(w, 1);
      +        }
      +        if(!useOrigin)
      +        {
      +            lastCollection = seriesCollection[order - 1];
      +            negativeBaseValues = lastCollection.get("negativeBaseValues");
      +            positiveBaseValues = lastCollection.get("positiveBaseValues");
      +            if(!negativeBaseValues || !positiveBaseValues)
      +            {
      +                useOrigin = true;
      +                positiveBaseValues = [];
      +                negativeBaseValues = [];
      +            }
      +        }
      +        else
      +        {
      +            negativeBaseValues = [];
      +            positiveBaseValues = [];
      +        }
      +        this.set("negativeBaseValues", negativeBaseValues);
      +        this.set("positiveBaseValues", positiveBaseValues);
      +        for(i = 0; i < len; ++i)
      +        {
      +            left = xcoords[i];
      +            top = ycoords[i];
      +            
      +            if(!isNumber(top) || !isNumber(left))
      +            {
      +                if(useOrigin)
      +                {
      +                    negativeBaseValues[i] = this._bottomOrigin;
      +                    positiveBaseValues[i] = this._bottomOrigin;
      +                }
      +                this._markers.push(null); 
      +                continue;
      +            }
      +            if(useOrigin)
      +            {
      +                h = Math.abs(this._bottomOrigin - top);
      +                if(top < this._bottomOrigin)
      +                {
      +                    positiveBaseValues[i] = top;
      +                    negativeBaseValues[i] = this._bottomOrigin;
      +                }
      +                else if(top > this._bottomOrigin)
      +                {
      +                    positiveBaseValues[i] = this._bottomOrigin;
      +                    negativeBaseValues[i] = top;
      +                    top -= h;
      +                }
      +                else
      +                {
      +                    positiveBaseValues[i] = top;
      +                    negativeBaseValues[i] = top;
      +                }
      +            }
      +            else 
      +            {
      +                if(top > this._bottomOrigin)
      +                {
      +                    top += (negativeBaseValues[i] - this._bottomOrigin);
      +                    h = top - negativeBaseValues[i];
      +                    negativeBaseValues[i] = top;
      +                    top -= h;
      +                }
      +                else if(top <= this._bottomOrigin)
      +                {
      +                    top = positiveBaseValues[i] - (this._bottomOrigin - top);
      +                    h = positiveBaseValues[i] - top;
      +                    positiveBaseValues[i] = top;
      +                }
      +            }
      +            if(!isNaN(h) && h > 0)
      +            {
      +                left -= w/2;
      +                if(groupMarkers)
      +                {
      +                    dimensions.width[i] = w;
      +                    dimensions.height[i] = h;
      +                    xvalues.push(left);
      +                    yvalues.push(top);
      +                }
      +                else
      +                {
      +                    style.width = w;
      +                    style.height = h;
      +                    style.x = left;
      +                    style.y = top;
      +                    if(fillColors)
      +                    {
      +                        style.fill.color = fillColors[i % fillColors.length];
      +                    }
      +                    if(borderColors)
      +                    {
      +                        style.border.color = borderColors[i % borderColors.length];
      +                    }
      +                    marker = this.getMarker(style, graphOrder, i);
      +                }
      +            }
      +            else if(!groupMarkers)
      +            {
      +               this._markers.push(null);
      +            }
      +        }
      +        if(groupMarkers)
      +        {
      +            this._createGroupMarker({
      +                fill: style.fill,
      +                border: style.border,
      +                dimensions: dimensions,
      +                xvalues: xvalues,
      +                yvalues: yvalues,
      +                shape: style.shape
      +            });
      +        }
      +        else
      +        {
      +            this._clearMarkerCache();
      +        }
      +    },
      +
      +    /**
      +     * Resizes and positions markers based on a mouse interaction.
      +     *
      +     * @method updateMarkerState
      +     * @param {String} type state of the marker
      +     * @param {Number} i index of the marker
      +     * @protected
      +     */
      +    updateMarkerState: function(type, i)
      +    {
      +        if(this._markers && this._markers[i])
      +        {
      +            var styles,
      +                markerStyles,
      +                state = this._getState(type),
      +                xcoords = this.get("xcoords"),
      +                marker = this._markers[i],
      +                offset = 0,
      +                fillColor,
      +                borderColor;        
      +            styles = this.get("styles").marker;
      +            offset = styles.width * 0.5;
      +            markerStyles = state == "off" || !styles[state] ? Y.clone(styles) : Y.clone(styles[state]); 
      +            markerStyles.height = marker.get("height");
      +            markerStyles.x = (xcoords[i] - offset);
      +            markerStyles.y = marker.get("y");
      +            markerStyles.id = marker.get("id");
      +            fillColor = markerStyles.fill.color; 
      +            borderColor = markerStyles.border.color;
      +            if(Y_Lang.isArray(fillColor))
      +            {
      +                markerStyles.fill.color = fillColor[i % fillColor.length];
      +            }
      +            else
      +            {
      +                markerStyles.fill.color = this._getItemColor(markerStyles.fill.color, i);
      +            }
      +            if(Y_Lang.isArray(borderColor))
      +            {
      +                markerStyles.border.color = borderColor[i % borderColor.length];
      +            }
      +            else
      +            {
      +                markerStyles.border.color = this._getItemColor(markerStyles.border.color, i);
      +            }
      +            marker.set(markerStyles);
      +        }
      +    },
      +	
      +    /**
      +     * Gets the default values for the markers. 
      +     *
      +     * @method _getPlotDefaults
      +     * @return Object
      +     * @protected
      +     */
      +    _getPlotDefaults: function()
      +    {
      +        var defs = {
      +            fill:{
      +                type: "solid",
      +                alpha: 1,
      +                colors:null,
      +                alphas: null,
      +                ratios: null
      +            },
      +            border:{
      +                weight: 0,
      +                alpha: 1
      +            },
      +            width: 24,
      +            height: 24,
      +            shape: "rect",
      +
      +            padding:{
      +                top: 0,
      +                left: 0,
      +                right: 0,
      +                bottom: 0
      +            }
      +        };
      +        defs.fill.color = this._getDefaultColor(this.get("graphOrder"), "fill");
      +        defs.border.color = this._getDefaultColor(this.get("graphOrder"), "border");
      +        return defs;
      +    }
      +}, {
      +    ATTRS: {
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @default stackedColumn
      +         */
      +        type: {
      +            value: "stackedColumn"
      +        },
      +
      +        /**
      +         * @attribute negativeBaseValues
      +         * @type Array
      +         * @default null
      +         * @private
      +         */
      +        negativeBaseValues: {
      +            value: null
      +        },
      +
      +        /**
      +         * @attribute positiveBaseValues
      +         * @type Array
      +         * @default null
      +         * @private
      +         */
      +        positiveBaseValues: {
      +            value: null
      +        }
      +        
      +        /**
      +         * Style properties used for drawing markers. This attribute is inherited from `ColumnSeries`. Below are the default values:
      +         *  <dl>
      +         *      <dt>fill</dt><dd>A hash containing the following values:
      +         *          <dl>
      +         *              <dt>color</dt><dd>Color of the fill. The default value is determined by the order of the series on the graph. The color
      +         *              will be retrieved from the below array:<br/>
      +         *              `["#66007f", "#a86f41", "#295454", "#996ab2", "#e8cdb7", "#90bdbd","#000000","#c3b8ca", "#968373", "#678585"]`
      +         *              </dd>
      +         *              <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the marker fill. The default value is 1.</dd>
      +         *          </dl>
      +         *      </dd>
      +         *      <dt>border</dt><dd>A hash containing the following values:
      +         *          <dl>
      +         *              <dt>color</dt><dd>Color of the border. The default value is determined by the order of the series on the graph. The color
      +         *              will be retrieved from the below array:<br/>
      +         *              `["#205096", "#b38206", "#000000", "#94001e", "#9d6fa0", "#e55b00", "#5e85c9", "#adab9e", "#6ac291", "#006457"]`
      +         *              <dt>alpha</dt><dd>Number from 0 to 1 indicating the opacity of the marker border. The default value is 1.</dd>
      +         *              <dt>weight</dt><dd>Number indicating the width of the border. The default value is 1.</dd>
      +         *          </dl>
      +         *      </dd>
      +         *      <dt>width</dt><dd>indicates the width of the marker. The default value is 24.</dd>
      +         *      <dt>over</dt><dd>hash containing styles for markers when highlighted by a `mouseover` event. The default 
      +         *      values for each style is null. When an over style is not set, the non-over value will be used. For example,
      +         *      the default value for `marker.over.fill.color` is equivalent to `marker.fill.color`.</dd>
      +         *  </dl>
      +         *
      +         * @attribute styles
      +         * @type Object
      +         */
      +    }
      +});
      +
      diff --git a/tests/input/charts/StackedComboSeries.js b/tests/input/charts/StackedComboSeries.js
      new file mode 100644
      index 00000000..df8e3c05
      --- /dev/null
      +++ b/tests/input/charts/StackedComboSeries.js
      @@ -0,0 +1,74 @@
      +/**
      + * The StackedComboSeries class renders a combination of lines, plots and area fills in a single series. Series
      + * are stacked along the value axis to indicate each series contribution to a cumulative total. Each
      + * series type has a corresponding boolean attribute indicating if it is rendered. By default, all three types are
      + * rendered.  
      + *
      + * @module charts
      + * @class StackedComboSeries
      + * @extends ComboSeries
      + * @uses StackingUtil
      + * @constructor
      + */
      +Y.StackedComboSeries = Y.Base.create("stackedComboSeries", Y.ComboSeries, [Y.StackingUtil], {
      +    /**
      +     * @protected
      +     *
      +     * Calculates the coordinates for the series. Overrides base implementation.
      +     *
      +     * @method setAreaData
      +     */
      +    setAreaData: function()
      +    {   
      +        Y.StackedComboSeries.superclass.setAreaData.apply(this);
      +        this._stackCoordinates.apply(this);
      +    },
      +	
      +    /**
      +     * @protected
      +     *
      +     * Draws the series.
      +     *
      +     * @method drawSeries
      +     */
      +    drawSeries: function()
      +    {
      +        if(this.get("showAreaFill"))
      +        {
      +            this.drawFill.apply(this, this._getStackedClosingPoints());
      +        }
      +        if(this.get("showLines")) 
      +        {
      +            this.drawLines();
      +        }
      +        if(this.get("showMarkers"))
      +        {
      +            this.drawPlots();
      +        }   
      +    }
      +    
      +}, {
      +    ATTRS : {
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @default stackedCombo
      +         */
      +        type: {
      +            value: "stackedCombo"
      +        },
      +
      +        /**
      +         * Indicates whether a fill is displayed.
      +         *
      +         * @attribute showAreaFill
      +         * @type Boolean
      +         * @default true
      +         */
      +        showAreaFill: {
      +            value: true
      +        }
      +    }
      +});
      diff --git a/tests/input/charts/StackedComboSplineSeries.js b/tests/input/charts/StackedComboSplineSeries.js
      new file mode 100644
      index 00000000..102e72fa
      --- /dev/null
      +++ b/tests/input/charts/StackedComboSplineSeries.js
      @@ -0,0 +1,60 @@
      +/**
      + * The StackedComboSplineSeries class renders a combination of splines, plots and areaspline fills in a single series. Series
      + * are stacked along the value axis to indicate each series contribution to a cumulative total. Each
      + * series type has a corresponding boolean attribute indicating if it is rendered. By default, all three types are
      + * rendered.  
      + *
      + * @module charts
      + * @class StackedComboSplineSeries
      + * @extends StackedComboSeries
      + * @uses CurveUtil
      + * @constructor
      + */
      +Y.StackedComboSplineSeries = Y.Base.create("stackedComboSplineSeries", Y.StackedComboSeries, [Y.CurveUtil], {
      +    /**
      +	 * @protected
      +     *
      +     * Draws the series.
      +     *
      +     * @method drawSeries
      +	 */
      +	drawSeries: function()
      +    {
      +        if(this.get("showAreaFill"))
      +        {
      +            this.drawStackedAreaSpline();
      +        }
      +        if(this.get("showLines")) 
      +        {
      +            this.drawSpline();
      +        }
      +        if(this.get("showMarkers"))
      +        {
      +            this.drawPlots();
      +        }   
      +    }
      +}, {
      +    ATTRS: {
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @default stackedComboSpline
      +         */
      +        type : {
      +            value : "stackedComboSpline"
      +        },
      +
      +        /**
      +         * Indicates whether a fill is displayed.
      +         *
      +         * @attribute showAreaFill
      +         * @type Boolean
      +         * @default true
      +         */
      +        showAreaFill: {
      +            value: true
      +        }
      +    }
      +});
      diff --git a/tests/input/charts/StackedLineSeries.js b/tests/input/charts/StackedLineSeries.js
      new file mode 100644
      index 00000000..a2deb491
      --- /dev/null
      +++ b/tests/input/charts/StackedLineSeries.js
      @@ -0,0 +1,37 @@
      +/**
      + * StackedLineSeries creates line graphs in which the different series are stacked along a value axis
      + * to indicate their contribution to a cumulative total.
      + *
      + * @module charts
      + * @class StackedLineSeries
      + * @constructor
      + * @extends  LineSeries
      + * @uses StackingUtil
      + */
      +Y.StackedLineSeries = Y.Base.create("stackedLineSeries", Y.LineSeries, [Y.StackingUtil], {
      +    /**
      +     * @protected
      +     *
      +     * Calculates the coordinates for the series. Overrides base implementation.
      +     *
      +     * @method setAreaData
      +     */
      +    setAreaData: function()
      +    {   
      +        Y.StackedLineSeries.superclass.setAreaData.apply(this);
      +        this._stackCoordinates.apply(this);
      +    }
      +}, {
      +    ATTRS: {
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @default stackedLine
      +         */
      +        type: {
      +            value:"stackedLine"
      +        }
      +    }
      +});
      diff --git a/tests/input/charts/StackedMarkerSeries.js b/tests/input/charts/StackedMarkerSeries.js
      new file mode 100644
      index 00000000..52e1dc4e
      --- /dev/null
      +++ b/tests/input/charts/StackedMarkerSeries.js
      @@ -0,0 +1,38 @@
      +/**
      + * StackedMarkerSeries plots markers with different series stacked along the value axis to indicate each
      + * series' contribution to a cumulative total.
      + *
      + * @module charts
      + * @class StackedMarkerSeries
      + * @constructor
      + * @extends MarkerSeries
      + * @extends StackingUtil
      + */
      +Y.StackedMarkerSeries = Y.Base.create("stackedMarkerSeries", Y.MarkerSeries, [Y.StackingUtil], {
      +    /**
      +     * @protected
      +     *
      +     * Calculates the coordinates for the series. Overrides base implementation.
      +     *
      +     * @method setAreaData
      +     */
      +    setAreaData: function()
      +    {   
      +        Y.StackedMarkerSeries.superclass.setAreaData.apply(this);
      +        this._stackCoordinates.apply(this);
      +    }
      +}, {
      +    ATTRS: {
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @default stackedMarker
      +         */
      +        type: {
      +            value:"stackedMarker"
      +        }
      +    }
      +});
      +
      diff --git a/tests/input/charts/StackedSplineSeries.js b/tests/input/charts/StackedSplineSeries.js
      new file mode 100644
      index 00000000..ec3ef333
      --- /dev/null
      +++ b/tests/input/charts/StackedSplineSeries.js
      @@ -0,0 +1,38 @@
      +/**
      + * StackedSplineSeries creates spline graphs in which the different series are stacked along a value axis
      + * to indicate their contribution to a cumulative total.
      + *
      + * @module charts
      + * @class StackedSplineSeries
      + * @constructor
      + * @extends SplineSeries
      + * @extends StackingUtil
      + */
      +Y.StackedSplineSeries = Y.Base.create("stackedSplineSeries", Y.SplineSeries, [Y.StackingUtil], {
      +    /**
      +     * @protected
      +     *
      +     * Calculates the coordinates for the series. Overrides base implementation.
      +     *
      +     * @method setAreaData
      +     */
      +    setAreaData: function()
      +    {   
      +        Y.StackedSplineSeries.superclass.setAreaData.apply(this);
      +        this._stackCoordinates.apply(this);
      +    }
      +}, {
      +    ATTRS: {
      +        /**
      +         * Read-only attribute indicating the type of series.
      +         *
      +         * @attribute type
      +         * @type String
      +         * @default stackedSpline
      +         */
      +        type: {
      +            value:"stackedSpline"
      +        }
      +    }
      +});
      +
      diff --git a/tests/input/charts/StackingUtil.js b/tests/input/charts/StackingUtil.js
      new file mode 100644
      index 00000000..409ba93c
      --- /dev/null
      +++ b/tests/input/charts/StackingUtil.js
      @@ -0,0 +1,62 @@
      +/**
      + * Utility class used for creating stacked series.
      + *
      + * @module charts
      + * @class StackingUtil
      + * @constructor
      + */
      +function StackingUtil(){}
      +
      +StackingUtil.prototype = {
      +    /**
      +     * @protected
      +     *
      +     * Adjusts coordinate values for stacked series.
      +     *
      +     * @method _stackCoordinates
      +     */
      +    _stackCoordinates: function() 
      +    {
      +        var direction = this.get("direction"),
      +            order = this.get("order"),
      +            type = this.get("type"),
      +            graph = this.get("graph"),
      +            h = graph.get("height"), 
      +            seriesCollection = graph.seriesTypes[type],
      +            i = 0,
      +            len,
      +            xcoords = this.get("xcoords"),
      +            ycoords = this.get("ycoords"),
      +            prevXCoords,
      +            prevYCoords;
      +        if(order === 0)
      +        {
      +            return;
      +        }
      +        prevXCoords = seriesCollection[order - 1].get("xcoords").concat();
      +        prevYCoords = seriesCollection[order - 1].get("ycoords").concat();
      +        if(direction === "vertical")
      +        {
      +            len = prevXCoords.length;
      +            for(; i < len; ++i)
      +            {
      +                if(!isNaN(prevXCoords[i]) && !isNaN(xcoords[i]))
      +                {
      +                    xcoords[i] += prevXCoords[i];
      +                }
      +            }
      +        }
      +        else
      +        {
      +            len = prevYCoords.length;
      +            for(; i < len; ++i)
      +            {
      +                if(!isNaN(prevYCoords[i]) && !isNaN(ycoords[i]))
      +                {
      +                    ycoords[i] = prevYCoords[i] - (h - ycoords[i]);
      +                }
      +            }
      +        }
      +    }
      +};
      +Y.StackingUtil = StackingUtil;
      diff --git a/tests/input/charts/TimeAxis.js b/tests/input/charts/TimeAxis.js
      new file mode 100644
      index 00000000..47405fe2
      --- /dev/null
      +++ b/tests/input/charts/TimeAxis.js
      @@ -0,0 +1,338 @@
      +/**
      + * TimeAxis manages time data on an axis.
      + *
      + * @module charts
      + * @class TimeAxis
      + * @constructor
      + * @param {Object} config (optional) Configuration parameters for the Chart.
      + * @extends AxisType
      + */
      +function TimeAxis(config)
      +{
      +	TimeAxis.superclass.constructor.apply(this, arguments);
      +}
      +
      +TimeAxis.NAME = "timeAxis";
      +
      +TimeAxis.ATTRS = 
      +{
      +    /**
      +     * Indicates whether the maximum is calculated or explicitly set. 
      +     *
      +     * @attribute setMax
      +     * @readOnly
      +     * @type Boolean
      +     * @private
      +     */
      +    setMax: {
      +        readOnly: true,
      +
      +        getter: function()
      +        {
      +            var max = this._getNumber(this._setMaximum);
      +            return (Y_Lang.isNumber(max));
      +        }
      +    },
      +
      +    /**
      +     * Indicates whether the minimum is calculated or explicitly set. 
      +     *
      +     * @attribute setMin
      +     * @readOnly
      +     * @type Boolean
      +     * @private
      +     */
      +    setMin: {
      +        readOnly: true,
      +
      +        getter: function()
      +        {
      +            var min = this._getNumber(this._setMinimum);
      +            return (Y_Lang.isNumber(min));
      +        }
      +    },
      +
      +    /**
      +     * The maximum value that will appear on an axis. Unless explicitly set, this value is calculated by the `Axis`.
      +     *
      +     * @attribute maximum
      +     * @type Number
      +     */
      +    maximum: {
      +        getter: function ()
      +        {
      +            var max = this._getNumber(this._setMaximum);
      +            if(!Y_Lang.isNumber(max))
      +            {
      +                max = this._getNumber(this.get("dataMaximum"));
      +            }
      +            return parseFloat(max);
      +        },
      +        setter: function (value)
      +        {
      +            this._setMaximum = this._getNumber(value);
      +            return value;
      +        }
      +    },
      +
      +    /**
      +     * The minimum value that will appear on an axis. Unless explicitly set, this value is calculated by the `Axis`.
      +     *
      +     * @attribute minimum
      +     * @type Number
      +     */
      +    minimum: {
      +        getter: function ()
      +        {
      +            var min = this._getNumber(this._setMinimum);
      +            if(!Y_Lang.isNumber(min)) 
      +            {
      +                min = this._getNumber(this.get("dataMinimum"));
      +            }
      +            return parseFloat(min);
      +        },
      +        setter: function (value)
      +        {
      +            this._setMinimum = this._getNumber(value);
      +            return value;
      +        }
      +    },
      +
      +    /**
      +     * Method used for formatting a label. This attribute allows for the default label formatting method to overridden. The method use would need
      +     * to implement the arguments below and return a `String` or an `HTMLElement`. The default implementation of the method returns a `String`. The output of this method
      +     * will be rendered to the DOM using `appendChild`. If you override the `labelFunction` method and return an html string, you will also need to override the Axis' 
      +     * `appendLabelFunction` to accept html as a `String`.
      +     * <dl>
      +     *      <dt>val</dt><dd>Label to be formatted. (`String`)</dd>
      +     *      <dt>format</dt><dd>STRFTime string used to format the label. (optional)</dd>
      +     * </dl>
      +     *
      +     * @attribute labelFunction
      +     * @type Function
      +     */
      +    labelFunction: {
      +        value: function(val, format)
      +        {
      +            val = Y.DataType.Date.parse(val);
      +            if(format)
      +            {
      +                return Y.DataType.Date.format(val, {format:format});
      +            }
      +            return val;
      +        }
      +    },
      +
      +    /**
      +     * Pattern used by the `labelFunction` to format a label.
      +     *
      +     * @attribute labelFormat
      +     * @type String
      +     */
      +    labelFormat: {
      +        value: "%b %d, %y"
      +    }
      +};
      +
      +Y.extend(TimeAxis, Y.AxisType, {
      +    /**
      +     * Formats a label based on the axis type and optionally specified format.
      +     *
      +     * @method formatLabel
      +     * @param {Object} value
      +     * @param {Object} format Pattern used to format the value.
      +     * @return String
      +     */
      +    formatLabel: function(val, format)
      +    {
      +        val = Y.DataType.Date.parse(val);
      +        if(format)
      +        {
      +            return Y.DataType.Date.format(val, {format:format});
      +        }
      +        return val;
      +    },
      +
      +    /**
      +     * Constant used to generate unique id.
      +     *
      +     * @property GUID
      +     * @type String
      +     * @private
      +     */
      +    GUID: "yuitimeaxis",
      +	
      +    /**
      +     * Type of data used in `Axis`.
      +     *
      +     * @property _dataType
      +     * @readOnly
      +     * @private
      +     */
      +    _dataType: "time",
      +	
      +    /**
      +     * Calculates and returns a value based on the number of labels and the index of
      +     * the current label.
      +     *
      +     * @method getLabelByIndex
      +     * @param {Number} i Index of the label.
      +     * @param {Number} l Total number of labels.
      +     * @return String
      +     */
      +    getLabelByIndex: function(i, l)
      +    {
      +        var min = this.get("minimum"),
      +            max = this.get("maximum"),
      +            position = this.get("position"),
      +            increm,
      +            label;
      +            l -= 1;
      +        increm = ((max - min)/l) * i;
      +        if(position == "bottom" || position == "top")
      +        {
      +            label = min + increm;
      +        }
      +        else
      +        {
      +            label = max - increm;
      +        }
      +        return label;
      +    },
      +
      +    /**
      +     * Gets an array of values based on a key.
      +     *
      +     * @method _getKeyArray
      +     * @param {String} key Value key associated with the data array.
      +     * @param {Array} data Array in which the data resides.
      +     * @return Array
      +     * @private
      +     */
      +    _getKeyArray: function(key, data)
      +    {
      +        var obj,
      +            keyArray = [],
      +            i = 0,
      +            val,
      +            len = data.length;
      +        for(; i < len; ++i)
      +        {
      +            obj = data[i][key];
      +            if(Y_Lang.isDate(obj))
      +            {   
      +                val = obj.valueOf();
      +            }
      +            else
      +            {
      +                val = new Date(obj);
      +                if(Y_Lang.isDate(val))
      +                {
      +                    val = val.valueOf();
      +                }
      +                else if(!Y_Lang.isNumber(obj))
      +                {
      +                    if(Y_Lang.isNumber(parseFloat(obj)))
      +                    {
      +                        val = parseFloat(obj);
      +                    }
      +                    else
      +                    {
      +                        if(typeof obj != "string")
      +                        {
      +                            obj = obj;
      +                        }
      +                        val = new Date(obj).valueOf();
      +                    }
      +                }
      +                else
      +                {
      +                    val = obj;
      +                }
      +            }
      +            keyArray[i] = val;
      +        }
      +        return keyArray;
      +    },
      +
      +    /**
      +     * Sets data by key
      +     *
      +     * @method _setDataByKey
      +     * @param {String} key Key value to use.
      +     * @param {Array} data Array to use.
      +     * @private 
      +     */
      +    _setDataByKey: function(key, data)
      +    {
      +        var obj, 
      +            arr = [], 
      +            dv = this._dataClone.concat(), 
      +            i, 
      +            val,
      +            len = dv.length;
      +        for(i = 0; i < len; ++i)
      +        {
      +            obj = dv[i][key];
      +            if(Y_Lang.isDate(obj))
      +            {   
      +                val = obj.valueOf();
      +            }
      +            else
      +            {
      +                val = new Date(obj);
      +                if(Y_Lang.isDate(val))
      +                {
      +                    val = val.valueOf();
      +                }
      +                else if(!Y_Lang.isNumber(obj))
      +                {
      +                    if(Y_Lang.isNumber(parseFloat(obj)))
      +                    {
      +                        val = parseFloat(obj);
      +                    }
      +                    else
      +                    {
      +                        if(typeof obj != "string")
      +                        {
      +                            obj = obj.toString();
      +                        }
      +                        val = new Date(obj).valueOf();
      +                    }
      +                }
      +                else
      +                {
      +                    val = obj;
      +                }
      +            }
      +            arr[i] = val;
      +        }
      +        this.get("keys")[key] = arr;
      +        this._updateTotalDataFlag = true;
      +    },
      +
      +    /**
      +     * Parses value into a number.
      +     *
      +     * @method _getNumber
      +     * @param val {Object} Value to parse into a number
      +     * @return Number
      +     * @private
      +     */
      +    _getNumber: function(val)
      +    {
      +        if(Y_Lang.isDate(val))
      +        {
      +            val = val.valueOf();
      +        }
      +        else if(!Y_Lang.isNumber(val) && val)
      +        {
      +            val = new Date(val).valueOf();
      +        }
      +
      +        return val;
      +    }
      +});
      +
      +Y.TimeAxis = TimeAxis;
      +		
      diff --git a/tests/input/charts/TopAxisLayout.js b/tests/input/charts/TopAxisLayout.js
      new file mode 100644
      index 00000000..2284bf84
      --- /dev/null
      +++ b/tests/input/charts/TopAxisLayout.js
      @@ -0,0 +1,379 @@
      +/**
      + * Contains algorithms for rendering a top axis.
      + *
      + * @module charts
      + * @class TopAxisLayout
      + * @constructor
      + */
      +TopAxisLayout = function(){};
      +
      +TopAxisLayout.prototype = {
      +    /**
      +     *  Default margins for text fields.
      +     *
      +     *  @private
      +     *  @method _getDefaultMargins
      +     *  @return Object
      +     */
      +    _getDefaultMargins: function() 
      +    {
      +        return {
      +            top: 0,
      +            left: 0,
      +            right: 0,
      +            bottom: 4
      +        };
      +    },
      +    
      +    /**
      +     * Sets the length of the tick on either side of the axis line.
      +     *
      +     * @method setTickOffsets
      +     * @protected
      +     */
      +    setTickOffsets: function()
      +    {
      +        var host = this,
      +            majorTicks = host.get("styles").majorTicks,
      +            tickLength = majorTicks.length,
      +            halfTick = tickLength * 0.5,
      +            display = majorTicks.display;
      +        host.set("leftTickOffset",  0);
      +        host.set("rightTickOffset",  0);
      +        switch(display)
      +        {
      +            case "inside" :
      +                host.set("bottomTickOffset", tickLength);
      +                host.set("topTickOffset", 0);
      +            break;
      +            case "outside" : 
      +                host.set("bottomTickOffset", 0);
      +                host.set("topTickOffset",  tickLength);
      +            break;
      +            case "cross" :
      +                host.set("topTickOffset", halfTick);
      +                host.set("bottomTickOffset", halfTick);
      +            break;
      +            default:
      +                host.set("topTickOffset", 0);
      +                host.set("bottomTickOffset", 0);
      +            break;
      +        }
      +    },
      +
      +    /**
      +     * Calculates the coordinates for the first point on an axis.
      +     *
      +     * @method getLineStart
      +     * @protected
      +     */
      +    getLineStart: function()
      +    {
      +        var host = this,
      +            style = host.get("styles"),
      +            padding = style.padding,
      +            majorTicks = style.majorTicks,
      +            tickLength = majorTicks.length,
      +            display = majorTicks.display,
      +            pt = {x:0, y:padding.top};
      +        if(display === "outside")
      +        {
      +            pt.y += tickLength;
      +        }
      +        else if(display === "cross")
      +        {
      +            pt.y += tickLength/2;
      +        }
      +        return pt; 
      +    },
      +    
      +    /**
      +     * Draws a tick
      +     *
      +     * @method drawTick
      +     * @param {Path} path reference to the path `Path` element in which to draw the tick.
      +     * @param {Object} pt hash containing x and y coordinates
      +     * @param {Object} tickStyles hash of properties used to draw the tick
      +     * @protected
      +     */
      +    drawTick: function(path, pt, tickStyles)
      +    {
      +        var host = this,
      +            style = host.get("styles"),
      +            padding = style.padding,
      +            tickLength = tickStyles.length,
      +            start = {x:pt.x, y:padding.top},
      +            end = {x:pt.x, y:tickLength + padding.top};
      +        host.drawLine(path, start, end);
      +    },
      +    
      +    /**
      +     * Calculates the point for a label.
      +     *
      +     * @method getLabelPoint
      +     * @param {Object} pt hash containing x and y coordinates
      +     * @return Object
      +     * @protected
      +     */
      +    getLabelPoint: function(pt)
      +    {
      +        return {x:pt.x, y:pt.y - this.get("topTickOffset")};
      +    },
      +    
      +    /**
      +     * Updates the value for the `maxLabelSize` for use in calculating total size.
      +     *
      +     * @method updateMaxLabelSize
      +     * @param {HTMLElement} label to measure
      +     * @protected
      +     */
      +    updateMaxLabelSize: function(labelWidth, labelHeight)
      +    {
      +        var host = this,
      +            props = this._labelRotationProps,
      +            rot = props.rot,
      +            absRot = props.absRot,
      +            sinRadians = props.sinRadians,
      +            cosRadians = props.cosRadians,
      +            max;
      +        if(rot === 0)
      +        {
      +            max = labelHeight;
      +        }
      +        else if(absRot === 90)
      +        {
      +            max = labelWidth;
      +        }
      +        else
      +        {
      +            max = (sinRadians * labelWidth) + (cosRadians * labelHeight); 
      +        }
      +        host._maxLabelSize = Math.max(host._maxLabelSize, max);
      +    },
      +
      +    /**
      +     * Determines the available label height when the axis width has been explicitly set.
      +     *
      +     * @method getExplicitlySized
      +     * @return Boolean
      +     * @protected
      +     */
      +    getExplicitlySized: function(styles)
      +    {
      +        if(this._explicitHeight)
      +        {
      +            var host = this,
      +                h = host._explicitHeight,
      +                totalTitleSize = host._totalTitleSize,
      +                topTickOffset = host.get("topTickOffset"),
      +                margin = styles.label.margin.right;
      +            host._maxLabelSize =  h - (topTickOffset + margin + totalTitleSize);
      +            return true;
      +        }
      +        return false;
      +    },
      +
      +    /**
      +     * Rotate and position title.
      +     *
      +     * @method positionTitle
      +     * @param {HTMLElement} label to rotate position
      +     * @protected
      +     */
      +    positionTitle: function(label)
      +    {
      +        var host = this,
      +            bounds = host._titleBounds,
      +            margin = host.get("styles").title.margin,
      +            props = host._titleRotationProps,
      +            labelWidth = label.offsetWidth,
      +            labelHeight = label.offsetHeight,
      +            h = bounds.bottom - bounds.top,
      +            x = (host.get("width") * 0.5) - (labelWidth * 0.5),
      +            y = h/2 - labelHeight/2;
      +        props.labelWidth = labelWidth;
      +        props.labelHeight = labelHeight;
      +        if(margin && margin.top)
      +        {
      +            y += margin.top;
      +        }
      +        props.x = x;
      +        props.y = y;
      +        props.transformOrigin = [0.5, 0.5];
      +        host._rotate(label, props);
      +    },
      +
      +    /**
      +     * Rotate and position labels.
      +     *
      +     * @method positionLabel
      +     * @param {HTMLElement} label to rotate position
      +     * @param {Object} pt hash containing the x and y coordinates in which the label will be positioned
      +     * against.
      +     * @protected
      +     */
      +    positionLabel: function(label, pt, styles, i)
      +    {
      +        var host = this,
      +            totalTitleSize = this._totalTitleSize,
      +            maxLabelSize = host._maxLabelSize,
      +            leftOffset = pt.x,
      +            topOffset = pt.y + totalTitleSize + maxLabelSize,
      +            props = this._labelRotationProps,
      +            rot = props.rot,
      +            absRot = props.absRot,
      +            labelWidth = this._labelWidths[i],
      +            labelHeight = this._labelHeights[i];
      +        if(rot === 0)
      +        {
      +            leftOffset -= labelWidth * 0.5;
      +            topOffset -= labelHeight;
      +        }
      +        else
      +        {
      +            if(rot === 90)
      +            {
      +                leftOffset -= labelWidth;
      +                topOffset -= (labelHeight * 0.5);
      +            }
      +            else if (rot === -90)
      +            {
      +                topOffset -= (labelHeight * 0.5);
      +            }    
      +            else if(rot > 0)
      +            {
      +                leftOffset -= labelWidth;
      +                topOffset -= labelHeight - (labelHeight * rot/180);
      +            }
      +            else
      +            {
      +                topOffset -= labelHeight - (labelHeight * absRot/180);
      +            }
      +        }
      +        props.x = Math.round(leftOffset);
      +        props.y = Math.round(topOffset);
      +        props.labelWidth = labelWidth;
      +        props.labelHeight = labelHeight;
      +        this._rotate(label, props);
      +    },
      +
      +    /**
      +     * Adjusts the coordinates of an axis label based on the rotation.
      +     *
      +     * @method _setRotationCoords
      +     * @param {Object} props Coordinates, dimension and rotation properties of the label.
      +     * @protected
      +     */
      +    _setRotationCoords: function(props)
      +    {
      +        var rot = props.rot,
      +            absRot = props.absRot,
      +            labelWidth = props.labelWidth,
      +            labelHeight = props.labelHeight,
      +            leftOffset,
      +            topOffset;
      +        if(rot === 0)
      +        {
      +            leftOffset = labelWidth * 0.5;
      +            topOffset = labelHeight;
      +        }
      +        else
      +        {
      +            if(rot === 90)
      +            {
      +                leftOffset = labelWidth;
      +                topOffset = (labelHeight * 0.5);
      +            }
      +            else if (rot === -90)
      +            {
      +                topOffset = (labelHeight * 0.5);
      +            }    
      +            else if(rot > 0)
      +            {
      +                leftOffset = labelWidth;
      +                topOffset = labelHeight - (labelHeight * rot/180);
      +            }
      +            else
      +            {
      +                topOffset = labelHeight - (labelHeight * absRot/180);
      +            }
      +        }
      +        props.x -= leftOffset;
      +        props.y -= topOffset;
      +    },
      +
      +    /**
      +     * Returns the transformOrigin to use for an axis label based on the position of the axis 
      +     * and the rotation of the label.
      +     *
      +     * @method _getTransformOrigin
      +     * @param {Number} rot The rotation (in degrees) of the label.
      +     * @return Array
      +     * @protected
      +     */
      +    _getTransformOrigin: function(rot)
      +    {
      +        var transformOrigin;
      +        if(rot === 0)
      +        {
      +            transformOrigin = [0, 0];
      +        }
      +        else
      +        {
      +            if(rot === 90)
      +            {
      +                transformOrigin = [1, 0.5];
      +            }
      +            else if (rot === -90)
      +            {
      +                transformOrigin = [0, 0.5];
      +            }    
      +            else if(rot > 0)
      +            {
      +                transformOrigin = [1, 0.5];
      +            }
      +            else
      +            {
      +                transformOrigin = [0, 0.5];
      +            }
      +        }
      +        return transformOrigin;
      +    },
      +
      +    /**
      +     * Adjusts position for inner ticks.
      +     *
      +     * @method offsetNodeForTick
      +     * @param {Node} cb contentBox of the axis
      +     * @protected
      +     */
      +    offsetNodeForTick: function(cb)
      +    {
      +    },
      +
      +    /**
      +     * Assigns a height based on the size of the contents.
      +     *
      +     * @method setCalculatedSize
      +     * @protected
      +     */
      +    setCalculatedSize: function()
      +    {
      +        var host = this,
      +            graphic = host.get("graphic"),
      +            styles = host.get("styles"),
      +            labelMargin = styles.label.margin,
      +            totalLabelSize = labelMargin.bottom + host._maxLabelSize,
      +            totalTitleSize = host._totalTitleSize,
      +            topTickOffset = this.get("topTickOffset"),
      +            ttl = Math.round(topTickOffset + totalLabelSize + totalTitleSize);
      +        if(this._explicitHeight)
      +        {
      +           ttl = this._explicitWidth; 
      +        }
      +        host.set("calculatedHeight", ttl);
      +        graphic.set("y", ttl - topTickOffset);
      +    }
      +};
      +Y.TopAxisLayout = TopAxisLayout;
      +
      diff --git a/tests/input/coffee1/test.coffee b/tests/input/coffee1/test.coffee
      new file mode 100644
      index 00000000..7e948d82
      --- /dev/null
      +++ b/tests/input/coffee1/test.coffee
      @@ -0,0 +1,12 @@
      +
      +###*
      +# The test project
      +# @project tester
      +# @title The Tester
      +# @icon http://a.img
      +# @url http://one.url
      +# @url http://two.url
      +# @author admo
      +# @contributor davglass
      +# @contributor entropy
      +###
      diff --git a/tests/input/coffee2/test.coffee b/tests/input/coffee2/test.coffee
      new file mode 100644
      index 00000000..41021393
      --- /dev/null
      +++ b/tests/input/coffee2/test.coffee
      @@ -0,0 +1,12 @@
      +
      +###*
      + * The test project
      + * @project tester
      + * @title The Tester
      + * @icon http://a.img
      + * @url http://one.url
      + * @url http://two.url
      + * @author admo
      + * @contributor davglass
      + * @contributor entropy
      +###
      diff --git a/tests/input/folders1/one/two/yuidoc.json b/tests/input/folders1/one/two/yuidoc.json
      new file mode 100644
      index 00000000..f0582708
      --- /dev/null
      +++ b/tests/input/folders1/one/two/yuidoc.json
      @@ -0,0 +1,3 @@
      +{
      +  "name": "yuidoc-two"
      +}
      diff --git a/tests/input/folders1/yuidoc.json b/tests/input/folders1/yuidoc.json
      new file mode 100644
      index 00000000..58e86832
      --- /dev/null
      +++ b/tests/input/folders1/yuidoc.json
      @@ -0,0 +1,3 @@
      +{
      +  "name": "yuidoc-root"
      +}
      diff --git a/tests/input/folders2/one/two/yuidoc.json b/tests/input/folders2/one/two/yuidoc.json
      new file mode 100644
      index 00000000..f0582708
      --- /dev/null
      +++ b/tests/input/folders2/one/two/yuidoc.json
      @@ -0,0 +1,3 @@
      +{
      +  "name": "yuidoc-two"
      +}
      diff --git a/tests/input/folders2/package.json b/tests/input/folders2/package.json
      new file mode 100644
      index 00000000..30a2ff79
      --- /dev/null
      +++ b/tests/input/folders2/package.json
      @@ -0,0 +1,3 @@
      +{
      +  "description": "package-root"
      +}
      diff --git a/tests/input/folders3/one/package.json b/tests/input/folders3/one/package.json
      new file mode 100644
      index 00000000..6efca4a5
      --- /dev/null
      +++ b/tests/input/folders3/one/package.json
      @@ -0,0 +1,3 @@
      +{
      +  "description": "package-one"
      +}
      diff --git a/tests/input/folders3/one/two/yuidoc.json b/tests/input/folders3/one/two/yuidoc.json
      new file mode 100644
      index 00000000..f0582708
      --- /dev/null
      +++ b/tests/input/folders3/one/two/yuidoc.json
      @@ -0,0 +1,3 @@
      +{
      +  "name": "yuidoc-two"
      +}
      diff --git a/tests/input/folders3/package.json b/tests/input/folders3/package.json
      new file mode 100644
      index 00000000..30a2ff79
      --- /dev/null
      +++ b/tests/input/folders3/package.json
      @@ -0,0 +1,3 @@
      +{
      +  "description": "package-root"
      +}
      diff --git a/tests/input/folders3/yuidoc.json b/tests/input/folders3/yuidoc.json
      new file mode 100644
      index 00000000..58e86832
      --- /dev/null
      +++ b/tests/input/folders3/yuidoc.json
      @@ -0,0 +1,3 @@
      +{
      +  "name": "yuidoc-root"
      +}
      diff --git a/tests/input/folders4/one/two/package.json b/tests/input/folders4/one/two/package.json
      new file mode 100644
      index 00000000..3894ba6e
      --- /dev/null
      +++ b/tests/input/folders4/one/two/package.json
      @@ -0,0 +1,3 @@
      +{
      +  "description": "package-two"
      +}
      diff --git a/tests/input/folders4/one/two/yuidoc.json b/tests/input/folders4/one/two/yuidoc.json
      new file mode 100644
      index 00000000..f0582708
      --- /dev/null
      +++ b/tests/input/folders4/one/two/yuidoc.json
      @@ -0,0 +1,3 @@
      +{
      +  "name": "yuidoc-two"
      +}
      diff --git a/tests/input/folders4/one/yuidoc.json b/tests/input/folders4/one/yuidoc.json
      new file mode 100644
      index 00000000..6bbb48e7
      --- /dev/null
      +++ b/tests/input/folders4/one/yuidoc.json
      @@ -0,0 +1,3 @@
      +{
      +  "name": "yuidoc-one"
      +}
      diff --git a/tests/input/folders5/one/three/yuidoc.json b/tests/input/folders5/one/three/yuidoc.json
      new file mode 100644
      index 00000000..49ae83a0
      --- /dev/null
      +++ b/tests/input/folders5/one/three/yuidoc.json
      @@ -0,0 +1,3 @@
      +{
      +  "name": "yuidoc-three"
      +}
      diff --git a/tests/input/folders5/two/package.json b/tests/input/folders5/two/package.json
      new file mode 100644
      index 00000000..3894ba6e
      --- /dev/null
      +++ b/tests/input/folders5/two/package.json
      @@ -0,0 +1,3 @@
      +{
      +  "description": "package-two"
      +}
      diff --git a/tests/input/folders5/two/yuidoc.json b/tests/input/folders5/two/yuidoc.json
      new file mode 100644
      index 00000000..f0582708
      --- /dev/null
      +++ b/tests/input/folders5/two/yuidoc.json
      @@ -0,0 +1,3 @@
      +{
      +  "name": "yuidoc-two"
      +}
      diff --git a/tests/input/globbing/deep/deep/sub/yui/src/example/example.js b/tests/input/globbing/deep/deep/sub/yui/src/example/example.js
      new file mode 100644
      index 00000000..02c95047
      --- /dev/null
      +++ b/tests/input/globbing/deep/deep/sub/yui/src/example/example.js
      @@ -0,0 +1 @@
      +// Sample content
      diff --git a/tests/input/globbing/deep/shallow/yui/src/example/example.js b/tests/input/globbing/deep/shallow/yui/src/example/example.js
      new file mode 100644
      index 00000000..02c95047
      --- /dev/null
      +++ b/tests/input/globbing/deep/shallow/yui/src/example/example.js
      @@ -0,0 +1 @@
      +// Sample content
      diff --git a/tests/input/globbing/shallow/yui/src/example/example.js b/tests/input/globbing/shallow/yui/src/example/example.js
      new file mode 100644
      index 00000000..02c95047
      --- /dev/null
      +++ b/tests/input/globbing/shallow/yui/src/example/example.js
      @@ -0,0 +1 @@
      +// Sample content
      diff --git a/tests/input/inherit/examplemodule.js b/tests/input/inherit/examplemodule.js
      new file mode 100644
      index 00000000..8cf4ec3c
      --- /dev/null
      +++ b/tests/input/inherit/examplemodule.js
      @@ -0,0 +1,121 @@
      +/**
      + * This is my example module
      + * @module ExampleModule
      + * @example
      + *
      + *     var bar;
      + *
      + */
      +
      +YUI.add('examplemodule', function (Y) {
      +        Y.namespace('mywidget');
      +        
      +        /**
      +         * <b>Superclass</b> description.<br>This is a second line too.
      +         * 
      +         * @constructor
      +         * @class SuperWidget
      +         * @extends Widget
      +         * @namespace mywidget
      +         * @example
      +         *
      +         *     var bar;
      +         *
      +         */
      +        Y.mywidget.superwidget = Y.Base.create("mysuperwidget", Y.Widget, [], {
      +                
      +                /**
      +                 * <b>Supermethod</b> description.<br>This is a second line.
      +                 * 
      +                 * @method myMethod
      +                 * @async
      +                 */
      +                myMethod: function () {}
      +                
      +                /**
      +                * Overwritten method see {{#crossLink "mywidget.SuperWidget"}}{{/crossLink}}
      +                * also see {{#crossLink "mywidget.SuperWidget/myMethod"}}{{/crossLink}}
      +                * This is also a test {{#davglass "Foo"}}{{/davglass}}
      +                * @method getTargets2
      +                * @example
      +                *
      +                *     var bar;
      +                *
      +                */
      +
      +                /**
      +                * Overwritten method see {{#crossLink "mywidget.SuperWidget"}}{{/crossLink}}
      +                * also see {{#crossLink "mywidget.SuperWidget/myMethod"}}{{/crossLink}}
      +                * This is also a test {{#davglass "Foo"}}{{/davglass}}
      +                *
      +                * ```javascript
      +                *
      +                * var test = "hello from a code block!";
      +                *
      +                * ```
      +                *
      +                * @method getTargets3
      +                * @example
      +                *
      +                *     var bar;
      +                *
      +                */
      +
      +                /**
      +                * Override Attribute
      +                * @attribute focused2
      +                * @optional
      +                */
      +
      +                /**
      +                * Override Attribute
      +                * @attribute focused3
      +                * @required
      +                */
      +
      +                /**
      +                * Override Property
      +                * @property name2
      +                * @type String
      +                */
      +
      +                /**
      +                * Override Event
      +                * @event init2
      +                */
      +                 
      +        }, {
      +        
      +        });
      +        
      +        /**
      +         * Subclass description.
      +         * 
      +         * @constructor
      +         * @namespace mywidget
      +         * @class SubWidget
      +         * @extends mywidget.SuperWidget
      +         */
      +        Y.mywidget.superwidget = Y.Base.create("mysuperwidget", Y.mywidget.superwidget, [], {
      +                
      +                /**
      +                 * Submethod description.
      +                 * 
      +                 * @method myMethod
      +                 * @param {boolean} d Foo
      +                 */
      +                myMethod: function () {}
      +                 
      +        }, {
      +        
      +        });
      +
      +        /**
      +         * Subclass description.
      +         * 
      +         * @constructor
      +         * @namespace mywidget
      +         * @class SubWidget2
      +         * @extends Accordion
      +         */
      +});
      diff --git a/tests/input/json/parse.js b/tests/input/json/parse.js
      new file mode 100644
      index 00000000..55fa7399
      --- /dev/null
      +++ b/tests/input/json/parse.js
      @@ -0,0 +1,225 @@
      +/**
      + * <p>The JSON module adds support for serializing JavaScript objects into
      + * JSON strings and parsing JavaScript objects from strings in JSON format.</p>
      + *
      + * <p>The JSON namespace is added to your YUI instance including static methods
      + * Y.JSON.parse(..) and Y.JSON.stringify(..).</p>
      + *
      + * <p>The functionality and method signatures follow the ECMAScript 5
      + * specification.  In browsers with native JSON support, the native
      + * implementation is used.</p>
      + *
      + * <p>The <code>json</code> module is a rollup of <code>json-parse</code> and
      + * <code>json-stringify</code>.</p>
      + * 
      + * <p>As their names suggest, <code>json-parse</code> adds support for parsing
      + * JSON data (Y.JSON.parse) and <code>json-stringify</code> for serializing
      + * JavaScript data into JSON strings (Y.JSON.stringify).  You may choose to
      + * include either of the submodules individually if you don't need the
      + * complementary functionality, or include the rollup for both.</p>
      + *
      + * @module json
      + * @main json
      + * @class JSON
      + * @static
      + */
      +
      +/**
      + * Provides Y.JSON.parse method to accept JSON strings and return native
      + * JavaScript objects.
      + *
      + * @module json
      + * @submodule json-parse
      + * @for JSON
      + * @static
      + */
      +
      +
      +// All internals kept private for security reasons
      +function fromGlobal(ref) {
      +    return (Y.config.win || this || {})[ref];
      +}
      +
      +
      +    /**
      +     * Alias to native browser implementation of the JSON object if available.
      +     *
      +     * @property Native
      +     * @type {Object}
      +     * @private
      +     */
      +var _JSON  = fromGlobal('JSON'),
      +
      +    Native = (Object.prototype.toString.call(_JSON) === '[object JSON]' && _JSON),
      +    useNative = !!Native,
      +
      +    /**
      +     * Replace certain Unicode characters that JavaScript may handle incorrectly
      +     * during eval--either by deleting them or treating them as line
      +     * endings--with escape sequences.
      +     * IMPORTANT NOTE: This regex will be used to modify the input if a match is
      +     * found.
      +     *
      +     * @property _UNICODE_EXCEPTIONS
      +     * @type {RegExp}
      +     * @private
      +     */
      +    _UNICODE_EXCEPTIONS = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
      +
      +
      +    /**
      +     * First step in the safety evaluation.  Regex used to replace all escape
      +     * sequences (i.e. "\\", etc) with '@' characters (a non-JSON character).
      +     *
      +     * @property _ESCAPES
      +     * @type {RegExp}
      +     * @private
      +     */
      +    _ESCAPES = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
      +
      +    /**
      +     * Second step in the safety evaluation.  Regex used to replace all simple
      +     * values with ']' characters.
      +     *
      +     * @property _VALUES
      +     * @type {RegExp}
      +     * @private
      +     */
      +    _VALUES  = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
      +
      +    /**
      +     * Third step in the safety evaluation.  Regex used to remove all open
      +     * square brackets following a colon, comma, or at the beginning of the
      +     * string.
      +     *
      +     * @property _BRACKETS
      +     * @type {RegExp}
      +     * @private
      +     */
      +    _BRACKETS = /(?:^|:|,)(?:\s*\[)+/g,
      +
      +    /**
      +     * Final step in the safety evaluation.  Regex used to test the string left
      +     * after all previous replacements for invalid characters.
      +     *
      +     * @property _UNSAFE
      +     * @type {RegExp}
      +     * @private
      +     */
      +    _UNSAFE = /[^\],:{}\s]/,
      +    
      +    /**
      +     * Replaces specific unicode characters with their appropriate \unnnn
      +     * format. Some browsers ignore certain characters during eval.
      +     *
      +     * @method escapeException
      +     * @param c {String} Unicode character
      +     * @return {String} the \unnnn escapement of the character
      +     * @private
      +     */
      +    _escapeException = function (c) {
      +        return '\\u'+('0000'+(+(c.charCodeAt(0))).toString(16)).slice(-4);
      +    },
      +
      +    /**
      +     * Traverses nested objects, applying a reviver function to each (key,value)
      +     * from the scope if the key:value's containing object.  The value returned
      +     * from the function will replace the original value in the key:value pair.
      +     * If the value returned is undefined, the key will be omitted from the
      +     * returned object.
      +     *
      +     * @method _revive
      +     * @param data {MIXED} Any JavaScript data
      +     * @param reviver {Function} filter or mutation function
      +     * @return {MIXED} The results of the filtered data
      +     * @private
      +     */
      +    _revive = function (data, reviver) {
      +        var walk = function (o,key) {
      +            var k,v,value = o[key];
      +            if (value && typeof value === 'object') {
      +                for (k in value) {
      +                    if (value.hasOwnProperty(k)) {
      +                        v = walk(value, k);
      +                        if (v === undefined) {
      +                            delete value[k];
      +                        } else {
      +                            value[k] = v;
      +                        }
      +                    }
      +                }
      +            }
      +            return reviver.call(o,key,value);
      +        };
      +
      +        return typeof reviver === 'function' ? walk({'':data},'') : data;
      +    },
      +
      +    /**
      +     * Parse a JSON string, returning the native JavaScript representation.
      +     *
      +     * @param s {string} JSON string data
      +     * @param reviver {function} (optional) function(k,v) passed each key value
      +     *          pair of object literals, allowing pruning or altering values
      +     * @return {MIXED} the native JavaScript representation of the JSON string
      +     * @throws SyntaxError
      +     * @method parse
      +     * @static
      +     */
      +    // JavaScript implementation in lieu of native browser support.  Based on
      +    // the json2.js library from http://json.org
      +    _parse = function (s,reviver) {
      +        // Replace certain Unicode characters that are otherwise handled
      +        // incorrectly by some browser implementations.
      +        // NOTE: This modifies the input if such characters are found!
      +        s = s.replace(_UNICODE_EXCEPTIONS, _escapeException);
      +        
      +        // Test for any remaining invalid characters
      +        if (!_UNSAFE.test(s.replace(_ESCAPES,'@').
      +                            replace(_VALUES,']').
      +                            replace(_BRACKETS,''))) {
      +
      +            // Eval the text into a JavaScript data structure, apply any
      +            // reviver function, and return
      +            return _revive( EVAL_TOKEN('(' + s + ')'), reviver );
      +        }
      +
      +        throw new SyntaxError('JSON.parse');
      +    };
      +    
      +Y.namespace('JSON').parse = function (s,reviver) {
      +        if (typeof s !== 'string') {
      +            s += '';
      +        }
      +
      +        return Native && Y.JSON.useNativeParse ?
      +            Native.parse(s,reviver) : _parse(s,reviver);
      +};
      +
      +function workingNative( k, v ) {
      +    return k === "ok" ? true : v;
      +}
      +
      +// Double check basic functionality.  This is mainly to catch early broken
      +// implementations of the JSON API in Firefox 3.1 beta1 and beta2
      +if ( Native ) {
      +    try {
      +        useNative = ( Native.parse( '{"ok":false}', workingNative ) ).ok;
      +    }
      +    catch ( e ) {
      +        useNative = false;
      +    }
      +}
      +
      +/**
      + * Leverage native JSON parse if the browser has a native implementation.
      + * In general, this is a good idea.  See the Known Issues section in the
      + * JSON user guide for caveats.  The default value is true for browsers with
      + * native JSON support.
      + *
      + * @property useNativeParse
      + * @type Boolean
      + * @default true
      + * @static
      + */
      +Y.JSON.useNativeParse = useNative;
      diff --git a/tests/input/json/stringify.js b/tests/input/json/stringify.js
      new file mode 100644
      index 00000000..4ec36644
      --- /dev/null
      +++ b/tests/input/json/stringify.js
      @@ -0,0 +1,343 @@
      +/**
      + * Provides Y.JSON.stringify method for converting objects to JSON strings.
      + *
      + * @module json
      + * @submodule json-stringify
      + * @for JSON
      + * @static
      + */
      +var _JSON     = (Y.config.win || {}).JSON,
      +    Lang      = Y.Lang,
      +    isFunction= Lang.isFunction,
      +    isObject  = Lang.isObject,
      +    isArray   = Lang.isArray,
      +    _toStr    = Object.prototype.toString,
      +    Native    = (_toStr.call(_JSON) === '[object JSON]' && _JSON),
      +    useNative = !!Native,
      +    UNDEFINED = 'undefined',
      +    OBJECT    = 'object',
      +    NULL      = 'null',
      +    STRING    = 'string',
      +    NUMBER    = 'number',
      +    BOOLEAN   = 'boolean',
      +    DATE      = 'date',
      +    _allowable= {
      +        'undefined'        : UNDEFINED,
      +        'string'           : STRING,
      +        '[object String]'  : STRING,
      +        'number'           : NUMBER,
      +        '[object Number]'  : NUMBER,
      +        'boolean'          : BOOLEAN,
      +        '[object Boolean]' : BOOLEAN,
      +        '[object Date]'    : DATE,
      +        '[object RegExp]'  : OBJECT
      +    },
      +    EMPTY     = '',
      +    OPEN_O    = '{',
      +    CLOSE_O   = '}',
      +    OPEN_A    = '[',
      +    CLOSE_A   = ']',
      +    COMMA     = ',',
      +    COMMA_CR  = ",\n",
      +    CR        = "\n",
      +    COLON     = ':',
      +    COLON_SP  = ': ',
      +    QUOTE     = '"',
      +
      +    // Regex used to capture characters that need escaping before enclosing
      +    // their containing string in quotes.
      +    _SPECIAL = /[\x00-\x07\x0b\x0e-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
      +
      +    // Character substitution map for common escapes and special characters.
      +    _COMMON = [
      +        [/\\/g, '\\\\'],
      +        [/\"/g, '\\"'],
      +        [/\x08/g, '\\b'],
      +        [/\x09/g, '\\t'],
      +        [/\x0a/g, '\\n'],
      +        [/\x0c/g, '\\f'],
      +        [/\x0d/g, '\\r']
      +    ],
      +    _COMMON_LENGTH = _COMMON.length,
      +
      +    // In-process optimization for special character escapes that haven't yet
      +    // been promoted to _COMMON
      +    _CHAR = {},
      +
      +    // Per-char counter to determine if it's worth fast tracking a special
      +    // character escape sequence.
      +    _CHAR_COUNT, _CACHE_THRESHOLD;
      +
      +// Utility function used to determine how to serialize a variable.
      +function _type(o) {
      +    var t = typeof o;
      +    return  _allowable[t] ||              // number, string, boolean, undefined
      +            _allowable[_toStr.call(o)] || // Number, String, Boolean, Date
      +            (t === OBJECT ?
      +                (o ? OBJECT : NULL) :     // object, array, null, misc natives
      +                UNDEFINED);               // function, unknown
      +}
      +
      +// Escapes a special character to a safe Unicode representation
      +function _char(c) {
      +    if (!_CHAR[c]) {
      +        _CHAR[c] = '\\u'+('0000'+(+(c.charCodeAt(0))).toString(16)).slice(-4);
      +        _CHAR_COUNT[c] = 0;
      +    }
      +
      +    // === to avoid this conditional for the remainder of the current operation
      +    if (++_CHAR_COUNT[c] === _CACHE_THRESHOLD) {
      +        _COMMON.push([new RegExp(c, 'g'), _CHAR[c]]);
      +        _COMMON_LENGTH = _COMMON.length;
      +    }
      +
      +    return _CHAR[c];
      +}
      +
      +// Enclose escaped strings in quotes
      +function _string(s) {
      +    var i, chr;
      +
      +    // Preprocess the string against common characters to avoid function
      +    // overhead associated with replacement via function.
      +    for (i = 0; i < _COMMON_LENGTH; i++) {
      +        chr = _COMMON[i];
      +        s = s.replace(chr[0], chr[1]);
      +    }
      +    
      +    // original function replace for the not-as-common set of chars
      +    return QUOTE + s.replace(_SPECIAL, _char) + QUOTE;
      +}
      +
      +// Adds the provided space to the beginning of every line in the input string
      +function _indent(s,space) {
      +    return s.replace(/^/gm, space);
      +}
      +
      +// JavaScript implementation of stringify (see API declaration of stringify)
      +function _stringify(o,w,space) {
      +    if (o === undefined) {
      +        return undefined;
      +    }
      +
      +    var replacer = isFunction(w) ? w : null,
      +        format   = _toStr.call(space).match(/String|Number/) || [],
      +        _date    = Y.JSON.dateToString,
      +        stack    = [],
      +        tmp,i,len;
      +
      +    _CHAR_COUNT      = {};
      +    _CACHE_THRESHOLD = Y.JSON.charCacheThreshold;
      +
      +    if (replacer || !isArray(w)) {
      +        w = undefined;
      +    }
      +
      +    // Ensure whitelist keys are unique (bug 2110391)
      +    if (w) {
      +        tmp = {};
      +        for (i = 0, len = w.length; i < len; ++i) {
      +            tmp[w[i]] = true;
      +        }
      +        w = tmp;
      +    }
      +
      +    // Per the spec, strings are truncated to 10 characters and numbers
      +    // are converted to that number of spaces (max 10)
      +    space = format[0] === 'Number' ?
      +                new Array(Math.min(Math.max(0,space),10)+1).join(" ") :
      +                (space || EMPTY).slice(0,10);
      +
      +    function _serialize(h,key) {
      +        var value = h[key],
      +            t     = _type(value),
      +            a     = [],
      +            colon = space ? COLON_SP : COLON,
      +            arr, i, keys, k, v;
      +
      +        // Per the ECMA 5 spec, toJSON is applied before the replacer is
      +        // called.  Also per the spec, Date.prototype.toJSON has been added, so
      +        // Date instances should be serialized prior to exposure to the
      +        // replacer.  I disagree with this decision, but the spec is the spec.
      +        if (isObject(value) && isFunction(value.toJSON)) {
      +            value = value.toJSON(key);
      +        } else if (t === DATE) {
      +            value = _date(value);
      +        }
      +
      +        if (isFunction(replacer)) {
      +            value = replacer.call(h,key,value);
      +        }
      +
      +        if (value !== h[key]) {
      +            t = _type(value);
      +        }
      +
      +        switch (t) {
      +            case DATE    : // intentional fallthrough.  Pre-replacer Dates are
      +                           // serialized in the toJSON stage.  Dates here would
      +                           // have been produced by the replacer.
      +            case OBJECT  : break;
      +            case STRING  : return _string(value);
      +            case NUMBER  : return isFinite(value) ? value+EMPTY : NULL;
      +            case BOOLEAN : return value+EMPTY;
      +            case NULL    : return NULL;
      +            default      : return undefined;
      +        }
      +
      +        // Check for cyclical references in nested objects
      +        for (i = stack.length - 1; i >= 0; --i) {
      +            if (stack[i] === value) {
      +                throw new Error("JSON.stringify. Cyclical reference");
      +            }
      +        }
      +
      +        arr = isArray(value);
      +
      +        // Add the object to the processing stack
      +        stack.push(value);
      +
      +        if (arr) { // Array
      +            for (i = value.length - 1; i >= 0; --i) {
      +                a[i] = _serialize(value, i) || NULL;
      +            }
      +        } else {   // Object
      +            // If whitelist provided, take only those keys
      +            keys = w || value;
      +            i = 0;
      +
      +            for (k in keys) {
      +                if (keys.hasOwnProperty(k)) {
      +                    v = _serialize(value, k);
      +                    if (v) {
      +                        a[i++] = _string(k) + colon + v;
      +                    }
      +                }
      +            }
      +        }
      +
      +        // remove the array from the stack
      +        stack.pop();
      +
      +        if (space && a.length) {
      +            return arr ?
      +                OPEN_A + CR + _indent(a.join(COMMA_CR), space) + CR + CLOSE_A :
      +                OPEN_O + CR + _indent(a.join(COMMA_CR), space) + CR + CLOSE_O;
      +        } else {
      +            return arr ?
      +                OPEN_A + a.join(COMMA) + CLOSE_A :
      +                OPEN_O + a.join(COMMA) + CLOSE_O;
      +        }
      +    }
      +
      +    // process the input
      +    return _serialize({'':o},'');
      +}
      +
      +// Double check basic native functionality.  This is primarily to catch broken
      +// early JSON API implementations in Firefox 3.1 beta1 and beta2.
      +if ( Native ) {
      +    try {
      +        useNative = ( '0' === Native.stringify(0) );
      +    } catch ( e ) {
      +        useNative = false;
      +    }
      +}
      +
      +Y.mix(Y.namespace('JSON'),{
      +    /**
      +     * Leverage native JSON stringify if the browser has a native
      +     * implementation.  In general, this is a good idea.  See the Known Issues
      +     * section in the JSON user guide for caveats.  The default value is true
      +     * for browsers with native JSON support.
      +     *
      +     * @property useNativeStringify
      +     * @type Boolean
      +     * @default true
      +     * @static
      +     */
      +    useNativeStringify : useNative,
      +
      +    /**
      +     * Serializes a Date instance as a UTC date string.  Used internally by
      +     * stringify.  Override this method if you need Dates serialized in a
      +     * different format.
      +     *
      +     * @method dateToString
      +     * @param d {Date} The Date to serialize
      +     * @return {String} stringified Date in UTC format YYYY-MM-DDTHH:mm:SSZ
      +     * @deprecated Use a replacer function
      +     * @static
      +     */
      +    dateToString : function (d) {
      +        function _zeroPad(v) {
      +            return v < 10 ? '0' + v : v;
      +        }
      +
      +        return d.getUTCFullYear()           + '-' +
      +              _zeroPad(d.getUTCMonth() + 1) + '-' +
      +              _zeroPad(d.getUTCDate())      + 'T' +
      +              _zeroPad(d.getUTCHours())     + COLON +
      +              _zeroPad(d.getUTCMinutes())   + COLON +
      +              _zeroPad(d.getUTCSeconds())   + 'Z';
      +    },
      +
      +    /**
      +     * <p>Converts an arbitrary value to a JSON string representation.</p>
      +     *
      +     * <p>Objects with cyclical references will trigger an exception.</p>
      +     *
      +     * <p>If a whitelist is provided, only matching object keys will be
      +     * included.  Alternately, a replacer function may be passed as the
      +     * second parameter.  This function is executed on every value in the
      +     * input, and its return value will be used in place of the original value.
      +     * This is useful to serialize specialized objects or class instances.</p>
      +     *
      +     * <p>If a positive integer or non-empty string is passed as the third
      +     * parameter, the output will be formatted with carriage returns and
      +     * indentation for readability.  If a String is passed (such as "\t") it
      +     * will be used once for each indentation level.  If a number is passed,
      +     * that number of spaces will be used.</p>
      +     *
      +     * @method stringify
      +     * @param o {MIXED} any arbitrary value to convert to JSON string
      +     * @param w {Array|Function} (optional) whitelist of acceptable object
      +     *                  keys to include, or a replacer function to modify the
      +     *                  raw value before serialization
      +     * @param ind {Number|String} (optional) indentation character or depth of
      +     *                  spaces to format the output.
      +     * @return {string} JSON string representation of the input
      +     * @static
      +     */
      +    stringify : function (o,w,ind) {
      +        return Native && Y.JSON.useNativeStringify ?
      +            Native.stringify(o,w,ind) : _stringify(o,w,ind);
      +    },
      +
      +    /**
      +     * <p>Number of occurrences of a special character within a single call to
      +     * stringify that should trigger promotion of that character to a dedicated
      +     * preprocess step for future calls.  This is only used in environments
      +     * that don't support native JSON, or when useNativeStringify is set to
      +     * false.</p>
      +     *
      +     * <p>So, if set to 50 and an object is passed to stringify that includes
      +     * strings containing the special character \x07 more than 50 times,
      +     * subsequent calls to stringify will process object strings through a
      +     * faster serialization path for \x07 before using the generic, slower,
      +     * replacement process for all special characters.</p>
      +     *
      +     * <p>To prime the preprocessor cache, set this value to 1, then call
      +     * <code>Y.JSON.stringify("<em>(all special characters to
      +     * cache)</em>");</code>, then return this setting to a more conservative
      +     * value.</p>
      +     *
      +     * <p>Special characters \ " \b \t \n \f \r are already cached.</p>
      +     *
      +     * @property charCacheThreshold
      +     * @static
      +     * @default 100
      +     * @type {Number}
      +     */
      +    charCacheThreshold: 100
      +});
      diff --git a/tests/input/namespace/ns.js b/tests/input/namespace/ns.js
      new file mode 100644
      index 00000000..72f59fe1
      --- /dev/null
      +++ b/tests/input/namespace/ns.js
      @@ -0,0 +1,13 @@
      +/**
      +Test Class
      +@class Bar
      +@namespace Foo
      +@module foobar
      +@main foobar
      +*/
      +
      +/**
      +Test Method
      +@method Baz
      +@namespace Foo.Bar
      +*/
      diff --git a/tests/input/preprocessor/preprocessortest.js b/tests/input/preprocessor/preprocessortest.js
      new file mode 100644
      index 00000000..314fec3c
      --- /dev/null
      +++ b/tests/input/preprocessor/preprocessortest.js
      @@ -0,0 +1,5 @@
      +/**
      + * This class is for testing the preprocessor option.
      + * @class TestPreprocessor
      + * @customtag hello
      + */
      diff --git a/tests/input/test/anim.js b/tests/input/test/anim.js
      new file mode 100644
      index 00000000..e5cc3af3
      --- /dev/null
      +++ b/tests/input/test/anim.js
      @@ -0,0 +1,35 @@
      +/**
      + * This is the Anim MODULE description
      + * @main anim
      + * @module anim
      + */
      +
      +/**
      + * This is the Anim Class description
      + * @class Anim
      + */
      +
      +/**
      + * The easing module provides methods for customizing
      + * how an animation behaves during each run.
      + * @class Easing
      + * @submodule anim-easing
      + */
      +
      +/**
      + * This is the foo element description
      + * @element x-foo
      + */
      +
      +/**
      + * This is the bar element description
      + * @element x-bar
      + */
      +
      +/**
      + * FOO FOO FOO FOO FOO The easing module provides methods for customizing
      + * @class EasingFoo
      + * @submodule anim-easing-foo
      + */
      +
      +
      diff --git a/tests/input/test/test.js b/tests/input/test/test.js
      new file mode 100644
      index 00000000..1fcaa4e0
      --- /dev/null
      +++ b/tests/input/test/test.js
      @@ -0,0 +1,277 @@
      +
      +/**
      + * The test project
      + * @project tester
      + * @title The Tester
      + * @icon http://a.img
      + * @url http://one.url
      + * @url http://two.url
      + * @author admo
      + * @contributor davglass
      + * @contributor entropy
      + */
      +
      +/**
      + * The module
      + * @module mymodule
      + * @category one,two
      + * @category three
      + * @requires one
      + * @requires two
      + * @uses three
      + * @uses four
      + */
      +
      +/**
      + * The submodule
      + * @submodule mysubmodule
      + * @category three,four
      + */
      +
      +
      +/**
      + * The class def
      + * @class myclass
      + * @constructor
      + */
      +
      +/**
      + * test optional
      + * @method testoptional
      + * @param notype my desc
      + * @param {int} namesecond my desc
      + * @param namefirst {string} my desc
      + * @param [optionalvar] {bool} my desc
      + * @param {string} [optionalDefault1="defaultVal"] my desc
      + * @param {string} [optionalDefault2="defaultVal1 defaultVal2"] my desc
      + * @evil
      + * @injects {HTML} uses a string parameter to populate innerHTML
      + * @returns something without a type
      + * @throws throw error without a type
      + * @example
      + *      This is code
      + * @example
      + *      var = 'This is more code';
      + *      document.title = 'Test This';
      + */
      +
      +/**
      + * test object param
      + * @method testobjectparam
      + * @param {object} anobject the object
      + * @param {string} anobject.prop1 prop1
      + * @param {bool} anobject.prop2 prop2
      + * @return {string} something with a type
      + * @throws {error} error with a type
      + */
      +
      +/**
      + * test 0..n param
      + * @method test0ton
      + * @param {string} [optionalandmultiple]* my desc
      + * @returns something without a type
      + * @throws throw error without a type
      + */
      +
      +/**
      + * test 1..n param
      + * @method test1ton
      + * @param {string} multiple* my desc
      + * @returns something without a type
      + * @throws throw error without a type
      + */
      +
      +/**
      +test alternative 1..n param with ...args
      +
      +@method testrestparam1n
      +@param {String} ...multiple my desc
      +@returns something without a type
      +@throws throw error without a type
      +**/
      +
      +/**
      +test alternative 0..n param with ...args
      +
      +@method testrestparam0n
      +@param {String} [...multiple] my desc
      +@returns something without a type
      +@throws throw error without a type
      +**/
      +
      +/**
      +Test newlines before descriptions.
      +
      +@method testNewlineBeforeDescription
      +
      +@param {String} foo
      +    This parameter is foo.
      +
      +@param {String} bar
      +    This parameter is bar.
      +
      +    It does useful things.
      +
      +@return {Boolean}
      +    Sometimes true, sometimes false.
      +
      +    Nobody knows!
      +
      +@throws {Error}
      +    Throws an error.
      +
      +    Catch me.
      +**/
      +
      +    /**
      +     * Testing really long param description paring
      +     * @method reallyLongParamDesc
      +     * @param {Object} config Object with configuration property name/value pairs. The object can be
      +     * used to provide default values for the objects published attributes.
      +     *
      +     * <p>
      +     * The config object can also contain the following non-attribute properties, providing a convenient
      +     * way to configure events listeners and plugins for the instance, as part of the constructor call:
      +     * </p>
      +     *
      +     * <dl>
      +     *     <dt>on</dt>
      +     *     <dd>An event name to listener function map, to register event listeners for the "on" moment of the event. A constructor convenience property for the <a href="Base.html#method_on">on</a> method.</dd>
      +     *     <dt>after</dt>
      +     *     <dd>An event name to listener function map, to register event listeners for the "after" moment of the event. A constructor convenience property for the <a href="Base.html#method_after">after</a> method.</dd>
      +     *     <dt>bubbleTargets</dt>
      +     *     <dd>An object, or array of objects, to register as bubble targets for bubbled events fired by this instance. A constructor convenience property for the <a href="EventTarget.html#method_addTarget">addTarget</a> method.</dd>
      +     *     <dt>plugins</dt>
      +     *     <dd>A plugin, or array of plugins to be plugged into the instance (see PluginHost's plug method for signature details). A constructor convenience property for the <a href="Plugin.Host.html#method_plug">plug</a> method.</dd>
      +     * </dl>
      +     *
      +    */
      +
      +
      +/**
      +This is the description
      +
      +@method foo
      +@example
      +
      +        var email = "lsmith@foo-truncated-here.com"
      +
      +**/
      +
      +/**
      +@method foo2
      +@example
      +    @media screen and (max-width: 767px) {
      +    }
      +*/
      +
      +/**
      +Other Class
      +@class OtherClass
      +@extensionfor myclass
      +*/
      +
      +/**
      +Other Class 2
      +@class OtherClass2
      +@extension_for myclass
      +*/
      +
      +/**
      +Default options to use for all transactions.
      +@static
      +@protected
      +@property {Object} options
      +@property {Object} [options.attributes] HTML attribute name/value pairs that
      +    should be added to inserted nodes.
      +@property {Boolean} [options.autopurge=false] Whether or not to automatically
      +    purge inserted nodes after the purge threshold is reached.
      +@property {Document} [options.doc] Document into which nodes should be inserted.
      +@property {Number} [options.pollInterval=50] Polling interval (in milliseconds)
      +    for detecting CSS load completion in browsers that don't support the `load`
      +    event on `<link>` nodes.
      +**/
      +
      +
      +/**
      +This is a test of CASE TaGs
      +@MeThod testMethod
      +@ParaM {String} foo Foo description
      +*/
      +
      +/**
      +This is an optional attribute
      +@attribute optionalAttr
      +@optional
      +*/
      +
      +/**
      +This is a required attribute
      +@attribute requiredAttr
      +@required
      +*/
      +
      +/**
      +crash test method
      +@method crashTest
      +@params {String} foo The string to crash the parser
      +*/
      +
      +/**
      +* @event changeWithOptional
      +* @param ev {EventFacade} containing:
      +* @param [ev.name] {String} Name of the field changed
      +*/
      +
      +
      +
      +/**
      +This method fires {{#crossLink "OtherClass2/changeWithOptional:event"}}{{/crossLink}}
      +@method crossedEvent
      +*/
      +
      +/**
      +This method has attr {{#crossLink "OtherClass2/requiredAttr:attribute"}}{{/crossLink}}
      +@method crossedAttr
      +*/
      +
      +/**
      +This method has attr {{#crossLink "OtherClass2/optionalAttr:attr"}}{{/crossLink}}
      +@method crossOptAttr
      +*/
      +
      +/**
      +Test `\{{foobar\}}` `\{{barfoo\}}`
      +@method hbHelper1
      +*/
      +
      +/**
      +Test `\{{foobar2\}}` `\{{barfoo2\}}`
      +@method hbHelper2
      +*/
      +
      +/**
      +Test `\{{foobar3\}}` `\{{barfoo3\}}`
      +@method hbHelper3
      +*/
      +
      +/**
      + * Element 3
      + *
      + * @element x-baz
      + * @parents <body>, <x-foo>
      + * @contents <x-bar>
      + * @interface XBazElement
      + *
      + * @attribute first     first attribute test
      + * @attribute second    second attribute
      + *                      test
      + */
      +
      +/**
      + * third
      + * attribute
      + * test
      + *
      + * @attribute third
      + */
      diff --git a/tests/input/test2/dump/dump.js b/tests/input/test2/dump/dump.js
      new file mode 100644
      index 00000000..54992bfc
      --- /dev/null
      +++ b/tests/input/test2/dump/dump.js
      @@ -0,0 +1,108 @@
      +/**
      + * Returns a simple string representation of the object or array.
      + * Other types of objects will be returned unprocessed.  Arrays
      + * are expected to be indexed.  Use object notation for
      + * associative arrays.
      + *
      + * If included, the dump method is added to the YUI instance.
      + *
      + * @module dump
      + */
      +
      +    var L = Y.Lang,
      +        OBJ = '{...}',
      +        FUN = 'f(){...}',
      +        COMMA = ', ',
      +        ARROW = ' => ',
      +
      +    /**
      +     * The following methods are added to the YUI instance
      +     * @class YUI~dump
      +     */
      +
      +    /**
      +     * Returns a simple string representation of the object or array.
      +     * Other types of objects will be returned unprocessed.  Arrays
      +     * are expected to be indexed.  Use object notation for
      +     * associative arrays.
      +     *
      +     * This method is in the 'dump' module, which is not bundled with
      +     * the core YUI object
      +     *
      +     * @method dump
      +     * @param {object} o The object to dump.
      +     * @param {int} d How deep to recurse child objects, default 3.
      +     * @return {string} the dump result.
      +     */
      +    dump = function(o, d) {
      +        var i, len, s = [], type = L.type(o);
      +
      +        // Cast non-objects to string
      +        // Skip dates because the std toString is what we want
      +        // Skip HTMLElement-like objects because trying to dump
      +        // an element will cause an unhandled exception in FF 2.x
      +        if (!L.isObject(o)) {
      +            return o + '';
      +        } else if (type == 'date') {
      +            return o;
      +        } else if (o.nodeType && o.tagName) {
      +            return o.tagName + '#' + o.id;
      +        } else if (o.document && o.navigator) {
      +            return 'window';
      +        } else if (o.location && o.body) {
      +            return 'document';
      +        } else if (type == 'function') {
      +            return FUN;
      +        }
      +
      +        // dig into child objects the depth specifed. Default 3
      +        d = (L.isNumber(d)) ? d : 3;
      +
      +        // arrays [1, 2, 3]
      +        if (type == 'array') {
      +            s.push('[');
      +            for (i = 0, len = o.length; i < len; i = i + 1) {
      +                if (L.isObject(o[i])) {
      +                    s.push((d > 0) ? L.dump(o[i], d - 1) : OBJ);
      +                } else {
      +                    s.push(o[i]);
      +                }
      +                s.push(COMMA);
      +            }
      +            if (s.length > 1) {
      +                s.pop();
      +            }
      +            s.push(']');
      +        // regexp /foo/
      +        } else if (type == 'regexp') {
      +            s.push(o.toString());
      +        // objects {k1 => v1, k2 => v2}
      +        } else {
      +            s.push('{');
      +            for (i in o) {
      +                if (o.hasOwnProperty(i)) {
      +                    try {
      +                        s.push(i + ARROW);
      +                        if (L.isObject(o[i])) {
      +                            s.push((d > 0) ? L.dump(o[i], d - 1) : OBJ);
      +                        } else {
      +                            s.push(o[i]);
      +                        }
      +                        s.push(COMMA);
      +                    } catch (e) {
      +                        s.push('Error: ' + e.message);
      +                    }
      +                }
      +            }
      +            if (s.length > 1) {
      +                s.pop();
      +            }
      +            s.push('}');
      +        }
      +
      +        return s.join('');
      +    };
      +
      +    Y.dump = dump;
      +    L.dump = dump;
      +
      diff --git a/tests/input/test2/namespace.js b/tests/input/test2/namespace.js
      new file mode 100644
      index 00000000..c427ac04
      --- /dev/null
      +++ b/tests/input/test2/namespace.js
      @@ -0,0 +1,29 @@
      +/**
      + * @module P.storage
      + */
      +
      +/**
      + * @class Store
      + * @constructor
      + * @namespace P.storage
      + */
      +// definition of Store and Store.prototype
      +
      +/**
      + * @class LocalStore
      + * @constructor
      + * @extends P.storage.Store
      + * @namespace P.storage
      + */
      +// definition of LocalStore and LocalStore.prototype
      +
      +/**
      + * @class storage
      + * @namespace P
      + */
      +
      +/**
      + * @private
      + * @property {Array} _storageMechanisms
      + * @static
      + */
      diff --git a/tests/input/test2/oop/oop.js b/tests/input/test2/oop/oop.js
      new file mode 100644
      index 00000000..60dcef25
      --- /dev/null
      +++ b/tests/input/test2/oop/oop.js
      @@ -0,0 +1,368 @@
      +/**
      + * Supplies object inheritance and manipulation utilities.  This adds
      + * additional functionaity to what is provided in yui-base, and the
      + * methods are applied directly to the YUI instance.  This module
      + * is required for most YUI components.
      + * @module oop
      + */
      +
      +/**
      + * The following methods are added to the YUI instance
      + * @class YUI~oop
      + */
      +
      +    var L = Y.Lang,
      +        A = Y.Array,
      +        OP = Object.prototype,
      +        CLONE_MARKER = '_~yuim~_',
      +        EACH = 'each',
      +        SOME = 'some',
      +
      +        dispatch = function(o, f, c, proto, action) {
      +            if (o && o[action] && o !== Y) {
      +                return o[action].call(o, f, c);
      +            } else {
      +                switch (A.test(o)) {
      +                    case 1:
      +                        return A[action](o, f, c);
      +                    case 2:
      +                        return A[action](Y.Array(o, 0, true), f, c);
      +                    default:
      +                        return Y.Object[action](o, f, c, proto);
      +                }
      +            }
      +        };
      +
      +
      +    /**
      +     * Applies prototype properties from the supplier to the receiver.
      +     * The receiver can be a constructor or an instance.
      +     * @method augment
      +     * @param {function} r  the object to receive the augmentation.
      +     * @param {function} s  the object that supplies the properties to augment.
      +     * @param {boolean} ov if true, properties already on the receiver
      +     * will be overwritten if found on the supplier.
      +     * @param {string[]} wl  a whitelist.  If supplied, only properties in
      +     * this list will be applied to the receiver.
      +     * @param {Array | Any} args arg or arguments to apply to the supplier
      +     * constructor when initializing.
      +     * @return {object} the augmented object.
      +     *
      +     * @todo constructor optional?
      +     * @todo understanding what an instance is augmented with
      +     * @todo best practices for overriding sequestered methods.
      +     */
      +    Y.augment = function(r, s, ov, wl, args) {
      +        var sProto = s.prototype,
      +            newProto = null,
      +            construct = s,
      +            a = (args) ? Y.Array(args) : [],
      +            rProto = r.prototype,
      +            target = rProto || r,
      +            applyConstructor = false,
      +            sequestered, replacements;
      +
      +        // working on a class, so apply constructor infrastructure
      +        if (rProto && construct) {
      +            sequestered = {};
      +            replacements = {};
      +            newProto = {};
      +
      +            // sequester all of the functions in the supplier and replace with
      +            // one that will restore all of them.
      +            Y.Object.each(sProto, function(v, k) {
      +                replacements[k] = function() {
      +
      +            // Y.log('sequestered function "' + k +
      +            // '" executed.  Initializing EventTarget');
      +            // overwrite the prototype with all of the sequestered functions,
      +            // but only if it hasn't been overridden
      +                        for (var i in sequestered) {
      +                        if (sequestered.hasOwnProperty(i) &&
      +                                (this[i] === replacements[i])) {
      +                            // Y.log('... restoring ' + k);
      +                            this[i] = sequestered[i];
      +                        }
      +                    }
      +
      +                    // apply the constructor
      +                    construct.apply(this, a);
      +
      +                    // apply the original sequestered function
      +                    return sequestered[k].apply(this, arguments);
      +                };
      +
      +                if ((!wl || (k in wl)) && (ov || !(k in this))) {
      +                    // Y.log('augment: ' + k);
      +                    if (L.isFunction(v)) {
      +                        // sequester the function
      +                        sequestered[k] = v;
      +
      +// replace the sequestered function with a function that will
      +// restore all sequestered functions and exectue the constructor.
      +                        this[k] = replacements[k];
      +                    } else {
      +                        // Y.log('augment() applying non-function: ' + k);
      +                        this[k] = v;
      +                    }
      +                }
      +
      +            }, newProto, true);
      +
      +        // augmenting an instance, so apply the constructor immediately
      +        } else {
      +            applyConstructor = true;
      +        }
      +
      +        Y.mix(target, newProto || sProto, ov, wl);
      +
      +        if (applyConstructor) {
      +            s.apply(target, a);
      +        }
      +
      +        return r;
      +    };
      +
      +    /**
      +     * Applies object properties from the supplier to the receiver.  If
      +     * the target has the property, and the property is an object, the target
      +     * object will be augmented with the supplier's value.  If the property
      +     * is an array, the suppliers value will be appended to the target.
      +     * @method aggregate
      +     * @param {function} r  the object to receive the augmentation.
      +     * @param {function} s  the object that supplies the properties to augment.
      +     * @param {boolean} ov if true, properties already on the receiver
      +     * will be overwritten if found on the supplier.
      +     * @param {string[]} wl a whitelist.  If supplied, only properties in
      +     * this list will be applied to the receiver.
      +     * @return {object} the extended object.
      +     */
      +    Y.aggregate = function(r, s, ov, wl) {
      +        return Y.mix(r, s, ov, wl, 0, true);
      +    };
      +
      +    /**
      +     * Utility to set up the prototype, constructor and superclass properties to
      +     * support an inheritance strategy that can chain constructors and methods.
      +     * Static members will not be inherited.
      +     *
      +     * @method extend
      +     * @param {function} r   the object to modify.
      +     * @param {function} s the object to inherit.
      +     * @param {object} px prototype properties to add/override.
      +     * @param {object} sx static properties to add/override.
      +     * @return {object} the extended object.
      +     */
      +    Y.extend = function(r, s, px, sx) {
      +        if (!s || !r) {
      +            Y.error('extend failed, verify dependencies');
      +        }
      +
      +        var sp = s.prototype, rp = Y.Object(sp);
      +        r.prototype = rp;
      +
      +        rp.constructor = r;
      +        r.superclass = sp;
      +
      +        // assign constructor property
      +        if (s != Object && sp.constructor == OP.constructor) {
      +            sp.constructor = s;
      +        }
      +
      +        // add prototype overrides
      +        if (px) {
      +            Y.mix(rp, px, true);
      +        }
      +
      +        // add object overrides
      +        if (sx) {
      +            Y.mix(r, sx, true);
      +        }
      +
      +        return r;
      +    };
      +
      +    /**
      +     * Executes the supplied function for each item in
      +     * a collection.  Supports arrays, objects, and
      +     * Y.NodeLists
      +     * @method each
      +     * @param {object} o the object to iterate.
      +     * @param {function} f the function to execute.  This function
      +     * receives the value, key, and object as parameters.
      +     * @param {object} c the execution context for the function.
      +     * @param {boolean} proto if true, prototype properties are
      +     * iterated on objects.
      +     * @return {YUI} the YUI instance.
      +     */
      +    Y.each = function(o, f, c, proto) {
      +        return dispatch(o, f, c, proto, EACH);
      +    };
      +
      +    /**
      +     * Executes the supplied function for each item in
      +     * a collection.  The operation stops if the function
      +     * returns true. Supports arrays, objects, and
      +     * Y.NodeLists.
      +     * @method some
      +     * @param {object} o the object to iterate.
      +     * @param {function} f the function to execute.  This function
      +     * receives the value, key, and object as parameters.
      +     * @param {object} c the execution context for the function.
      +     * @param {boolean} proto if true, prototype properties are
      +     * iterated on objects.
      +     * @return {boolean} true if the function ever returns true,
      +     * false otherwise.
      +     */
      +    Y.some = function(o, f, c, proto) {
      +        return dispatch(o, f, c, proto, SOME);
      +    };
      +
      +    /**
      +     * Deep obj/array copy.  Function clones are actually
      +     * wrappers around the original function.
      +     * Array-like objects are treated as arrays.
      +     * Primitives are returned untouched.  Optionally, a
      +     * function can be provided to handle other data types,
      +     * filter keys, validate values, etc.
      +     *
      +     * @method clone
      +     * @param {object} o what to clone.
      +     * @param {boolean} safe if true, objects will not have prototype
      +     * items from the source.  If false, they will.  In this case, the
      +     * original is initially protected, but the clone is not completely
      +     * immune from changes to the source object prototype.  Also, cloned
      +     * prototype items that are deleted from the clone will result
      +     * in the value of the source prototype being exposed.  If operating
      +     * on a non-safe clone, items should be nulled out rather than deleted.
      +     * @param {function} f optional function to apply to each item in a
      +     * collection; it will be executed prior to applying the value to
      +     * the new object.  Return false to prevent the copy.
      +     * @param {object} c optional execution context for f.
      +     * @param {object} owner Owner object passed when clone is iterating
      +     * an object.  Used to set up context for cloned functions.
      +     * @param {object} cloned hash of previously cloned objects to avoid
      +     * multiple clones.
      +     * @return {Array|Object} the cloned object.
      +     */
      +    Y.clone = function(o, safe, f, c, owner, cloned) {
      +
      +        if (!L.isObject(o)) {
      +            return o;
      +        }
      +
      +        // @todo cloning YUI instances doesn't currently work
      +        if (Y.instanceOf(o, YUI)) {
      +            return o;
      +        }
      +
      +        var o2, marked = cloned || {}, stamp,
      +            yeach = Y.each;
      +
      +        switch (L.type(o)) {
      +            case 'date':
      +                return new Date(o);
      +            case 'regexp':
      +                // if we do this we need to set the flags too
      +                // return new RegExp(o.source);
      +                return o;
      +            case 'function':
      +                // o2 = Y.bind(o, owner);
      +                // break;
      +                return o;
      +            case 'array':
      +                o2 = [];
      +                break;
      +            default:
      +
      +                // #2528250 only one clone of a given object should be created.
      +                if (o[CLONE_MARKER]) {
      +                    return marked[o[CLONE_MARKER]];
      +                }
      +
      +                stamp = Y.guid();
      +
      +                o2 = (safe) ? {} : Y.Object(o);
      +
      +                o[CLONE_MARKER] = stamp;
      +                marked[stamp] = o;
      +        }
      +
      +        // #2528250 don't try to clone element properties
      +        if (!o.addEventListener && !o.attachEvent) {
      +            yeach(o, function(v, k) {
      +if ((k || k === 0) && (!f || (f.call(c || this, v, k, this, o) !== false))) {
      +                    if (k !== CLONE_MARKER) {
      +                        if (k == 'prototype') {
      +                            // skip the prototype
      +                        // } else if (o[k] === o) {
      +                        //     this[k] = this;
      +                        } else {
      +                            this[k] =
      +                                Y.clone(v, safe, f, c, owner || o, marked);
      +                        }
      +                    }
      +                }
      +            }, o2);
      +        }
      +
      +        if (!cloned) {
      +            Y.Object.each(marked, function(v, k) {
      +                delete v[CLONE_MARKER];
      +            });
      +            marked = null;
      +        }
      +
      +        return o2;
      +    };
      +
      +
      +    /**
      +     * Returns a function that will execute the supplied function in the
      +     * supplied object's context, optionally adding any additional
      +     * supplied parameters to the beginning of the arguments collection the
      +     * supplied to the function.
      +     *
      +     * @method bind
      +     * @param {Function|String} f the function to bind, or a function name
      +     * to execute on the context object.
      +     * @param {object} c the execution context.
      +     * @param {any} args* 0..n arguments to include before the arguments the
      +     * function is executed with.
      +     * @return {function} the wrapped function.
      +     */
      +    Y.bind = function(f, c) {
      +        var xargs = arguments.length > 2 ?
      +                Y.Array(arguments, 2, true) : null;
      +        return function() {
      +            var fn = L.isString(f) ? c[f] : f,
      +                args = (xargs) ?
      +                    xargs.concat(Y.Array(arguments, 0, true)) : arguments;
      +            return fn.apply(c || fn, args);
      +        };
      +    };
      +
      +    /**
      +     * Returns a function that will execute the supplied function in the
      +     * supplied object's context, optionally adding any additional
      +     * supplied parameters to the end of the arguments the function
      +     * is executed with.
      +     *
      +     * @method rbind
      +     * @param {Function|String} f the function to bind, or a function name
      +     * to execute on the context object.
      +     * @param {object} c the execution context.
      +     * @param {any} args* 0..n arguments to append to the end of
      +     * arguments collection supplied to the function.
      +     * @return {function} the wrapped function.
      +     */
      +    Y.rbind = function(f, c) {
      +        var xargs = arguments.length > 2 ? Y.Array(arguments, 2, true) : null;
      +        return function() {
      +            var fn = L.isString(f) ? c[f] : f,
      +                args = (xargs) ?
      +                    Y.Array(arguments, 0, true).concat(xargs) : arguments;
      +            return fn.apply(c || fn, args);
      +        };
      +    };
      +
      diff --git a/tests/input/test2/slashes.js b/tests/input/test2/slashes.js
      new file mode 100644
      index 00000000..20bdd494
      --- /dev/null
      +++ b/tests/input/test2/slashes.js
      @@ -0,0 +1,16 @@
      +/**
      +* This is a module with slashes in the name
      +* @module myapp/views/index
      +*/
      +
      +/**
      +* This is the main class
      +* @class Main
      +* @constructor
      +*/
      +
      +/**
      +* Static Property
      +* @property STATIC
      +* @static
      +*/
      diff --git a/tests/input/with-symlink/a/.gitignore b/tests/input/with-symlink/a/.gitignore
      new file mode 100644
      index 00000000..e69de29b
      diff --git a/tests/input/with-symlink/a/b b/tests/input/with-symlink/a/b
      new file mode 120000
      index 00000000..82f488f2
      --- /dev/null
      +++ b/tests/input/with-symlink/a/b
      @@ -0,0 +1 @@
      +../a
      \ No newline at end of file
      diff --git a/tests/input/with-symlink/a/d/.gitignore b/tests/input/with-symlink/a/d/.gitignore
      new file mode 100644
      index 00000000..e69de29b
      diff --git a/tests/input/with-symlink/a/some-file b/tests/input/with-symlink/a/some-file
      new file mode 100644
      index 00000000..e69de29b
      diff --git a/tests/input/with-symlink/c/.gitignore b/tests/input/with-symlink/c/.gitignore
      new file mode 100644
      index 00000000..e69de29b
      diff --git a/tests/input/with-symlink/some-file b/tests/input/with-symlink/some-file
      new file mode 100644
      index 00000000..e69de29b
      diff --git a/tests/lib/davglass.js b/tests/lib/davglass.js
      new file mode 100644
      index 00000000..5a48ffd3
      --- /dev/null
      +++ b/tests/lib/davglass.js
      @@ -0,0 +1,5 @@
      +module.exports = {
      +    davglass: function(str) {
      +        return 'DAVGLASS_WAS_HERE::' + str;
      +    }
      +}
      diff --git a/tests/lib/testpreprocessor.js b/tests/lib/testpreprocessor.js
      new file mode 100644
      index 00000000..09bbf011
      --- /dev/null
      +++ b/tests/lib/testpreprocessor.js
      @@ -0,0 +1,14 @@
      +module.exports=function(data, options) {
      +	var star="*";
      +
      +	if (options.star)
      +		star=options.star;
      +
      +	global.testPreprocessorCallCount++;
      +
      +	for (className in data.classes) {
      +		classData=data.classes[className];
      +
      +		classData.customtagPlusStar=classData.customtag+star;
      +	}
      +}
      diff --git a/tests/lib/testpreprocessormodule/package.json b/tests/lib/testpreprocessormodule/package.json
      new file mode 100644
      index 00000000..e00fa501
      --- /dev/null
      +++ b/tests/lib/testpreprocessormodule/package.json
      @@ -0,0 +1,3 @@
      +{
      +	"main": "./testpreprocessormodule.js"
      +}
      diff --git a/tests/lib/testpreprocessormodule/testpreprocessormodule.js b/tests/lib/testpreprocessormodule/testpreprocessormodule.js
      new file mode 100644
      index 00000000..001e814c
      --- /dev/null
      +++ b/tests/lib/testpreprocessormodule/testpreprocessormodule.js
      @@ -0,0 +1,3 @@
      +module.exports=function(data) {
      +	data.testModuleWasHere=true;
      +}
      diff --git a/tests/options.js b/tests/options.js
      new file mode 100644
      index 00000000..99ee1306
      --- /dev/null
      +++ b/tests/options.js
      @@ -0,0 +1,360 @@
      +'use strict';
      +
      +var YUITest = require('yuitest');
      +var Assert = YUITest.Assert;
      +var path = require('path');
      +var Y = require(path.join(__dirname, '../', 'lib', 'index'));
      +
      +//Move to the test dir before running the tests.
      +process.chdir(__dirname);
      +
      +var suite = new YUITest.TestSuite('Options Test Suite');
      +
      +suite.add(new YUITest.TestCase({
      +    name: 'Server Options',
      +    'test: server': function () {
      +        var options = Y.Options([
      +            '--server'
      +        ]);
      +
      +        Assert.isTrue(options.server, 'Failed to set server option');
      +        Assert.areSame(3000, options.port, 'Failed to set default port');
      +    },
      +    'test: server with port': function () {
      +        var options = Y.Options([
      +            '--server',
      +            '5000'
      +        ]);
      +
      +        Assert.isTrue(options.server, 'Failed to set server option');
      +        Assert.areSame(5000, options.port, 'Failed to set port');
      +    },
      +    'test: server with default port and following argument': function () {
      +        var options = Y.Options([
      +            '--server',
      +            './foo'
      +        ]);
      +
      +        Assert.isTrue(options.server, 'Failed to set server option');
      +        Assert.areSame(3000, options.port, 'Failed to set default port');
      +        Assert.isArray(options.paths, 'Failed to set path');
      +        Assert.areSame('./foo', options.paths[0], 'Failed to set path after empty --server');
      +    },
      +    'test: tab-to-space': function () {
      +        var options, value;
      +
      +        // Test that --tab-to-space gives the correct number.
      +        // It uses parseInt so check numbers which look like octals too.
      +
      +        value = 12;
      +        options = Y.Options([
      +            '--tab-to-space',
      +            '0' + value
      +        ]);
      +        Assert.areSame(value, options.tabtospace);
      +        Assert.areSame(value, options.tabspace.length);
      +
      +        options = Y.Options([
      +            '--tab-to-space',
      +            '' + value
      +        ]);
      +        Assert.areSame(value, options.tabtospace);
      +        Assert.areSame(value, options.tabspace.length);
      +
      +        options = Y.Options([
      +            '--tab-to-space',
      +            value
      +        ]);
      +        Assert.areSame(value, options.tabtospace);
      +        Assert.areSame(value, options.tabspace.length);
      +
      +        value = 10;
      +        options = Y.Options([
      +            '--tab-to-space',
      +            '0' + value
      +        ]);
      +        Assert.areSame(value, options.tabtospace);
      +        Assert.areSame(value, options.tabspace.length);
      +
      +        options = Y.Options([
      +            '--tab-to-space',
      +            '' + value
      +        ]);
      +        Assert.areSame(value, options.tabtospace);
      +        Assert.areSame(value, options.tabspace.length);
      +
      +        options = Y.Options([
      +            '--tab-to-space',
      +            value
      +        ]);
      +        Assert.areSame(value, options.tabtospace);
      +        Assert.areSame(value, options.tabspace.length);
      +
      +    }
      +}));
      +
      +suite.add(new YUITest.TestCase({
      +    name: 'Various Options',
      +    'test: long quiet option': function () {
      +        var options = Y.Options([
      +            '--quiet'
      +        ]);
      +        Assert.isTrue(options.quiet, 'Failed to set long quiet');
      +    },
      +    'test: short quiet option': function () {
      +        var options = Y.Options([
      +            '-q'
      +        ]);
      +        Assert.isTrue(options.quiet, 'Failed to set short quiet');
      +    },
      +    'test: short config': function () {
      +        var options = Y.Options([
      +            '-c',
      +            './foo.json'
      +        ]);
      +        Assert.areSame('./foo.json', options.configfile, 'Failed to set config');
      +    },
      +    'test: --config': function () {
      +        var options = Y.Options([
      +            '--config',
      +            './foo.json'
      +        ]);
      +        Assert.areSame('./foo.json', options.configfile, 'Failed to set config');
      +    },
      +    'test: --configfile': function () {
      +        var options = Y.Options([
      +            '--configfile',
      +            './foo.json'
      +        ]);
      +        Assert.areSame('./foo.json', options.configfile, 'Failed to set config');
      +    },
      +    'test: -e': function () {
      +        var options = Y.Options([
      +            '-e',
      +            '.foo'
      +        ]);
      +        Assert.areSame('.foo', options.extension, 'Failed to set extension');
      +    },
      +    'test: --extension': function () {
      +        var options = Y.Options([
      +            '--extension',
      +            '.foo'
      +        ]);
      +        Assert.areSame('.foo', options.extension, 'Failed to set extension');
      +    },
      +    'test: -x': function () {
      +        var options = Y.Options([
      +            '-x',
      +            'foo,bar,baz'
      +        ]);
      +        Assert.areSame('foo,bar,baz', options.exclude, 'Failed to set exclude');
      +    },
      +    'test: --exclude': function () {
      +        var options = Y.Options([
      +            '--exclude',
      +            'foo,bar,baz'
      +        ]);
      +        Assert.areSame('foo,bar,baz', options.exclude, 'Failed to set exclude');
      +    },
      +    'test: --project-version': function () {
      +        var options = Y.Options([
      +            '--project-version',
      +            '6.6.6'
      +        ]);
      +        Assert.areSame('6.6.6', options.version, 'Failed to set version');
      +    },
      +    'test: --no-color': function () {
      +        var options = Y.Options([
      +            '--no-color'
      +        ]);
      +        Assert.isTrue(options.nocolor, 'Failed to set nocolor');
      +        Assert.isFalse(Y.config.useColor, 'Failed to set Y.config.useColor');
      +    },
      +    'test: -N': function () {
      +        var options = Y.Options([
      +            '-N'
      +        ]);
      +        Assert.isTrue(options.nocolor, 'Failed to set nocolor');
      +        Assert.isFalse(Y.config.useColor, 'Failed to set Y.config.useColor');
      +    },
      +    'test: --no-code': function () {
      +        var options = Y.Options([
      +            '--no-code'
      +        ]);
      +        Assert.isTrue(options.nocode, 'Failed to set nocode');
      +    },
      +    'test: -C': function () {
      +        var options = Y.Options([
      +            '-C'
      +        ]);
      +        Assert.isTrue(options.nocode, 'Failed to set nocode');
      +    },
      +    'test: --norecurse': function () {
      +        var options = Y.Options([
      +            '--norecurse'
      +        ]);
      +        Assert.isTrue(options.norecurse, 'Failed to set norecurse');
      +    },
      +    'test: -n': function () {
      +        var options = Y.Options([
      +            '-n'
      +        ]);
      +        Assert.isTrue(options.norecurse, 'Failed to set norecurse');
      +    },
      +    'test: --no-sort': function () {
      +        var options = Y.Options([
      +            '--no-sort'
      +        ]);
      +        Assert.isTrue(options.dontsortfields, 'Failed to set dontsortfields');
      +    },
      +    'test: --selleck': function () {
      +        var options = Y.Options([
      +            '--selleck'
      +        ]);
      +        Assert.isTrue(options.selleck, 'Failed to set selleck');
      +    },
      +    'test: -S': function () {
      +        var options = Y.Options([
      +            '-S'
      +        ]);
      +        Assert.isTrue(options.selleck, 'Failed to set selleck');
      +    },
      +    'test: -T simple': function () {
      +        var options = Y.Options([
      +            '-T',
      +            'simple'
      +        ]);
      +        Assert.areEqual(path.join(__dirname, '../themes/simple'), options.themedir);
      +    },
      +    'test: --theme simple': function () {
      +        var options = Y.Options([
      +            '--theme',
      +            'simple'
      +        ]);
      +        Assert.areEqual(path.join(__dirname, '../themes/simple'), options.themedir);
      +    },
      +    'test: --theme foobar': function () {
      +        var options = Y.Options([
      +            '--theme',
      +            'foobar'
      +        ]);
      +        Assert.areEqual(path.join(__dirname, '../themes/foobar'), options.themedir);
      +    },
      +    'test: -t ./foobar': function () {
      +        var options = Y.Options([
      +            '-t',
      +            './foobar'
      +        ]);
      +        Assert.areEqual('./foobar', options.themedir);
      +    },
      +    'test: --themedir ./foobar': function () {
      +        var options = Y.Options([
      +            '--themedir',
      +            './foobar'
      +        ]);
      +        Assert.areEqual('./foobar', options.themedir);
      +    },
      +    'test: --syntaxtype coffee': function () {
      +        var options = Y.Options([
      +            '--syntaxtype',
      +            'coffee'
      +        ]);
      +        Assert.areEqual('coffee', options.syntaxtype);
      +    },
      +    'test: --view': function () {
      +        var options = Y.Options([
      +            '--view'
      +        ]);
      +        Assert.isTrue(options.dumpview);
      +    },
      +    'test: -V': function () {
      +        var options = Y.Options([
      +            '-V'
      +        ]);
      +        Assert.isTrue(options.dumpview);
      +    },
      +    'test: -p': function () {
      +        var options = Y.Options([
      +            '-p'
      +        ]);
      +        Assert.isTrue(options.parseOnly);
      +    },
      +    'test: --parse-only': function () {
      +        var options = Y.Options([
      +            '--parse-only'
      +        ]);
      +        Assert.isTrue(options.parseOnly);
      +    },
      +    'test: -o <path>': function () {
      +        var options = Y.Options([
      +            '-o',
      +            '/foo/bar'
      +        ]);
      +        Assert.areEqual('/foo/bar', options.outdir);
      +    },
      +    'test: --outdir <path>': function () {
      +        var options = Y.Options([
      +            '--outdir',
      +            '/foo/bar'
      +        ]);
      +        Assert.areEqual('/foo/bar', options.outdir);
      +    },
      +    'test: -D': function () {
      +        var options = Y.Options([
      +            '-D'
      +        ]);
      +        Assert.isTrue(options.nodeleteout);
      +    },
      +    'test: --no-delete-out': function () {
      +        var options = Y.Options([
      +            '--no-delete-out'
      +        ]);
      +        Assert.isTrue(options.nodeleteout);
      +    },
      +    'test: --lint': function () {
      +        var options = Y.Options([
      +            '--lint'
      +        ]);
      +        Assert.isTrue(options.lint);
      +        Assert.isTrue(options.parseOnly);
      +        Assert.isTrue(options.quiet);
      +        Assert.isFalse(options.writeJSON);
      +    },
      +    'test --debug': function () {
      +        Assert.isFalse(Y.config.debug);
      +        Y.Options([
      +            '--debug'
      +        ]);
      +        Assert.isTrue(Y.config.debug);
      +        Assert.areEqual('debug', Y.config.filter);
      +        Y.applyConfig({
      +            debug: false
      +        });
      +    },
      +    'test: --charset': function () {
      +        Y.Options([
      +            '--charset'
      +        ]);
      +        Assert.areEqual('utf8', Y.charset);
      +
      +    },
      +    'test: --charset foo': function () {
      +        Y.Options([
      +            '--charset',
      +            'foo'
      +        ]);
      +        Assert.areEqual('foo', Y.charset);
      +        Y.charset = 'utf8';
      +    },
      +    'test: --tab-to-space 8': function () {
      +        var options = Y.Options([
      +            '--tab-to-space',
      +            '8'
      +        ]);
      +        Assert.areEqual(8, options.tabtospace);
      +        Assert.areEqual('        ', options.tabspace);
      +    }
      +}));
      +
      +
      +YUITest.TestRunner.add(suite);
      diff --git a/tests/parser.js b/tests/parser.js
      new file mode 100644
      index 00000000..ce46601f
      --- /dev/null
      +++ b/tests/parser.js
      @@ -0,0 +1,496 @@
      +'use strict';
      +
      +var YUITest = require('yuitest');
      +var Assert = YUITest.Assert;
      +var ArrayAssert = YUITest.ArrayAssert;
      +var path = require('path');
      +var fs = require('fs');
      +var Y = require(path.join(__dirname, '../', 'lib', 'index'));
      +
      +//Move to the test dir before running the tests.
      +process.chdir(__dirname);
      +
      +var existsSync = fs.existsSync || path.existsSync;
      +
      +var suite = new YUITest.TestSuite({
      +    name: 'Parser Test Suite',
      +    setUp: function () {
      +        process.chdir(__dirname);
      +        var json = (new Y.YUIDoc({
      +            quiet: true,
      +            paths: [
      +                'input/charts',
      +                'input/inherit',
      +                'input/namespace',
      +                'input/test',
      +                'input/test2'
      +            ],
      +            outdir: './out'
      +        })).run();
      +
      +        this.project = json.project;
      +        this.data = json;
      +    }
      +});
      +
      +suite.add(new YUITest.TestCase({
      +    name: 'Project Data',
      +    setUp: function () {
      +        this.project = suite.project;
      +        this.data = suite.data;
      +    },
      +    findByName: function (name, cl) {
      +        var items = this.data.classitems,
      +            ret;
      +
      +        items.forEach(function (i) {
      +            if (i.name === name && i.class === cl) {
      +                ret = i;
      +            }
      +        });
      +
      +        return ret;
      +    },
      +    'test: out directory': function () {
      +        Assert.isTrue(existsSync(path.join(__dirname, 'out')), 'Out directory was not created');
      +    },
      +    'test: data.json creation': function () {
      +        Assert.isTrue(existsSync(path.join(__dirname, 'out', 'data.json')), 'data.json file was not created');
      +    },
      +    'test: parser': function () {
      +        var keys = Object.keys(this.data);
      +        Assert.areEqual(7, keys.length, 'Failed to populate all fields');
      +        ArrayAssert.itemsAreSame(['project', 'files', 'modules', 'classes', 'elements', 'classitems', 'warnings'], keys, 'Object keys are wrong');
      +    },
      +    'test: project data': function () {
      +        Assert.areSame(path.normalize('input/test/test.js'), this.project.file, 'Project data loaded from wrong file');
      +        Assert.areSame(2, this.project.line, 'Line number is off');
      +        Assert.areSame('The test project', this.project.description, 'Description not set properly');
      +        Assert.areSame('The Tester', this.project.title, 'Title not set');
      +        Assert.areSame('admo', this.project.author, 'Author not set');
      +        Assert.areSame('entropy', this.project.contributor, 'Contributor not set');
      +        Assert.areSame('http://a.img', this.project.icon[0], 'Icon not set');
      +        Assert.areSame(1, this.project.icon.length, 'Found wring number of icons');
      +        Assert.areSame(2, this.project.url.length, 'Found wrong number of urls');
      +        Assert.areSame('http://one.url', this.project.url[0], 'URL #1 is wrong');
      +        Assert.areSame('http://two.url', this.project.url[1], 'URL #2 is wrong');
      +    },
      +    'test: files parsing': function () {
      +        var files = this.data.files,
      +            one, two, three, four;
      +
      +        // 1 module, 3 classes
      +        one = files[path.normalize('input/test/anim.js')];
      +        Assert.isObject(one, 'Failed to parse input/test/anim.js');
      +        Assert.areSame(1, Object.keys(one.modules).length, '1 module should be found');
      +        Assert.areSame(3, Object.keys(one.classes).length, '3 classes should be found');
      +
      +        // 2 modules, 3 classes
      +        two = files[path.normalize('input/test/test.js')];
      +        Assert.isObject(two, 'Failed to parse input/test/test.js');
      +        Assert.areSame(2, Object.keys(two.modules).length, '2 modules should be found');
      +        Assert.areSame(3, Object.keys(two.classes).length, '3 classes should be found');
      +
      +        //Module -> class association
      +        three = files[path.normalize('input/test2/dump/dump.js')];
      +        Assert.isObject(three, 'Failed to parse input/test2/dump/dump.js');
      +        Assert.areSame(1, three.modules.dump, 'dump module not found');
      +        Assert.areSame(1, three.classes['YUI~dump'], 'YUI~dump class not found');
      +
      +        //Module -> class association
      +        four = files[path.normalize('input/test2/oop/oop.js')];
      +        Assert.isObject(four, 'Failed to parse input/test2/oop/oop.js');
      +        Assert.areSame(1, four.modules.oop, 'oop module not found');
      +        Assert.areSame(1, four.classes['YUI~oop'], 'YUI~oop class not found');
      +
      +    },
      +    'test: namespace parsing': function () {
      +        var item = this.data.files[path.normalize('input/test2/namespace.js')];
      +        Assert.isObject(item, 'Failed to parse input/test2/namespace.js');
      +        Assert.areSame(3, Object.keys(item.classes).length, 'Failed to parse all classes');
      +
      +        ArrayAssert.itemsAreSame(['P.storage', 'P'], Object.keys(item.namespaces), 'Namespace failed to parse');
      +        ArrayAssert.itemsAreSame(['P.storage.Store', 'P.storage.LocalStore', 'P.storage'], Object.keys(item.classes), 'Classes failed to parse');
      +    },
      +    'test: module parsing': function () {
      +        var mods = this.data.modules;
      +
      +        //anim Module
      +        Assert.isObject(mods.anim, 'Failed to parse Anim module');
      +        Assert.areSame(2, Object.keys(mods.anim.submodules).length, 'Should have 2 submodules');
      +        Assert.areSame(3, Object.keys(mods.anim.classes).length, 'Should have 3 classes');
      +        Assert.areSame('This is the Anim MODULE description', mods.anim.description, 'Description parse');
      +        Assert.areSame('main', mods.anim.itemtype, 'Failed to parse @main itemtype');
      +        Assert.areSame('module', mods.anim.tag, 'Tag parse failed');
      +    },
      +    'test: main module association': function () {
      +        var mod = this.data.modules.charts,
      +            d = 'The Charts widget provides an api for displaying data\ngraphically.';
      +
      +        Assert.isObject(mod, 'Failed to parse charts module');
      +        Assert.areSame(d, mod.description, 'Incorrect description for charts module');
      +        Assert.areSame('main', mod.tag, 'Tagname is not main');
      +        Assert.areSame('main', mod.itemtype, 'ItemType should be main');
      +    },
      +    'test: submodule parsing': function () {
      +        var mods = this.data.modules,
      +            m, desc;
      +
      +        //anim-easing submodule
      +        m = mods['anim-easing'];
      +        Assert.isObject(m, 'Failed to parse anim-easing module');
      +        desc = 'The easing module provides methods for customizing\nhow an animation behaves during each run.';
      +        Assert.areSame(desc, m.description, 'Failed to parse submodule description');
      +        Assert.areSame(0, Object.keys(m.submodules).length, 'Should have 0 submodules');
      +        Assert.areSame(1, Object.keys(m.classes).length, 'Should have 1 class');
      +        Assert.areSame(1, m.is_submodule, 'Submodule association failed');
      +        Assert.areSame('anim', m.module, 'Failed to associate module');
      +
      +        //anim-easing-foo submodule
      +        m = mods['anim-easing-foo'];
      +        Assert.isObject(m, 'Failed to parse anim-easing-foo module');
      +        desc = 'FOO FOO FOO FOO FOO The easing module provides methods for customizing';
      +        Assert.areSame(desc, m.description, 'Failed to parse submodule description');
      +        Assert.areSame(0, Object.keys(m.submodules).length, 'Should have 0 submodules');
      +        Assert.areSame(1, Object.keys(m.classes).length, 'Should have 1 class');
      +        Assert.areSame(1, m.is_submodule, 'Submodule association failed');
      +        Assert.areSame('anim', m.module, 'Failed to associate module');
      +
      +    },
      +    'test: extra module data parsing': function () {
      +        var mods = this.data.modules,
      +            m;
      +
      +        m = mods.mymodule;
      +        Assert.isObject(m, 'Failed to parse mymodule module');
      +        Assert.areSame(1, Object.keys(m.submodules).length, 'Should have 1 submodules');
      +        Assert.areSame(3, Object.keys(m.classes).length, 'Should have 3 class');
      +        Assert.areSame('The module', m.description, 'Description parse failed');
      +        ArrayAssert.itemsAreSame(['one', 'two', 'three'], m.category, 'Category parsing failed');
      +        ArrayAssert.itemsAreSame(['one', 'two'], m.requires, 'Requires parsing failed');
      +        ArrayAssert.itemsAreSame(['three', 'four'], m.uses, 'Uses parsing failed');
      +
      +        m = mods.mysubmodule;
      +        Assert.isObject(m, 'Failed to parse mysubmodule module');
      +        Assert.areSame(0, Object.keys(m.submodules).length, 'Should have 0 submodules');
      +        Assert.areSame(3, Object.keys(m.classes).length, 'Should have 3 class');
      +        Assert.areSame(1, m.is_submodule, 'Submodule association failed');
      +        ArrayAssert.itemsAreSame(['three', 'four'], m.category, 'Category parsing failed');
      +
      +        //Testing modules with slashes in them
      +        m = mods['myapp/views/index'];
      +        Assert.isObject(m, 'Failed to parse myapp/views/index module');
      +        Assert.areSame(1, Object.keys(m.classes).length, 'Should have 1 class');
      +
      +        m = mods['P.storage'];
      +        Assert.isObject(m, 'Failed to parse P.storage module');
      +        ArrayAssert.itemsAreSame(['P.storage.Store', 'P.storage.LocalStore', 'P.storage'], Object.keys(m.classes), 'Failed to parse classes');
      +        ArrayAssert.itemsAreSame(['P.storage', 'P'], Object.keys(m.namespaces), 'Namespace failed to parse');
      +
      +    },
      +    'test: element parsing': function () {
      +        var els = this.data.elements,
      +            foo = els['x-foo'],
      +            bar = els['x-bar'];
      +
      +        Assert.isObject(foo, 'Failed to find <x-foo> element');
      +        Assert.areSame('x-foo', foo.name, 'Failed to set name');
      +        Assert.areSame('anim', foo.module, 'Failed to set module');
      +
      +        Assert.isObject(bar, 'Failed to find <x-bar> element');
      +        Assert.areSame('x-bar', bar.name, 'Failed to set name');
      +        Assert.areSame('anim', bar.module, 'Failed to set module');
      +    },
      +    'test: element details parsing': function () {
      +        var baz = this.data.elements['x-baz'];
      +
      +        Assert.isObject(baz, 'Failed to find <x-baz> element');
      +        Assert.areSame('x-baz', baz.name, 'Failed to set name');
      +        Assert.areSame('Element 3', baz.description, 'Failed to set description');
      +        Assert.areSame('<body>, <x-foo>', baz.parents, 'Failed to set parents');
      +        Assert.areSame('<x-bar>', baz.contents, 'Failed to set contents');
      +        Assert.areSame('XBazElement', baz.interface, 'Failed to set interface');
      +    },
      +    'test: element attributes parsing': function () {
      +        var baz = this.data.elements['x-baz'];
      +
      +        Assert.isObject(baz, 'Failed to find <x-baz> element');
      +        Assert.areSame(3, baz.attributes.length, 'Failed to parse all the attributes');
      +
      +        Assert.areSame('first', baz.attributes[0].name, 'Failed to set first attribute name');
      +        Assert.areSame('first attribute test', baz.attributes[0].description, 'Failed to set first attribute description');
      +
      +        Assert.areSame('second', baz.attributes[1].name, 'Failed to set second attribute name');
      +        Assert.areSame('second attribute test', baz.attributes[1].description.replace(/\s+/g, ' '), 'Failed to set second attribute description');
      +
      +        Assert.areSame('third', baz.attributes[2].name, 'Failed to set third attribute name');
      +        Assert.areSame('third attribute test', baz.attributes[2].description.replace(/\s+/g, ' '), 'Failed to set third attribute description');
      +    },
      +    'test: class parsing': function () {
      +        var cl = this.data.classes,
      +            anim, easing, my, other, m;
      +
      +        anim = cl.Anim;
      +        Assert.isObject(anim, 'Failed to find Anim class');
      +        Assert.areSame('Anim', anim.name, 'Failed to set name');
      +        Assert.areSame('Anim', anim.shortname, 'Failed to set shortname');
      +        Assert.areSame('anim', anim.module, 'Failed to test module.');
      +
      +        easing = cl.Easing;
      +        Assert.isObject(easing, 'Failed to find Easing class');
      +        Assert.areSame('Easing', easing.name, 'Failed to set name');
      +        Assert.areSame('Easing', easing.shortname, 'Failed to set shortname');
      +        Assert.areSame('anim', easing.module, 'Failed to test module.');
      +        Assert.areSame('anim-easing', easing.submodule, 'Failed to test submodule.');
      +
      +        my = cl.myclass;
      +        Assert.isObject(my, 'Failed to find myclass class');
      +        Assert.areSame('myclass', my.name, 'Failed to set name');
      +        Assert.areSame('myclass', my.shortname, 'Failed to set shortname');
      +        Assert.areSame('mymodule', my.module, 'Failed to test module.');
      +        Assert.areSame('mysubmodule', my.submodule, 'Failed to test submodule.');
      +        Assert.areSame(1, my.is_constructor, 'Failed to register constructor.');
      +
      +        other = cl.OtherClass;
      +        Assert.isObject(other, 'Failed to find myclass class');
      +        Assert.areSame('OtherClass', other.name, 'Failed to set name');
      +        Assert.areSame('OtherClass', other.shortname, 'Failed to set shortname');
      +        Assert.areSame('mymodule', other.module, 'Failed to test module.');
      +        Assert.areSame('mysubmodule', other.submodule, 'Failed to test submodule.');
      +        Assert.areSame(1, Object.keys(other.extension_for).length, 'Failed to assign extension_for');
      +        Assert.areSame('myclass', other.extension_for[0], 'Failed to assign extension_for');
      +
      +        m = cl['P.storage.P.storage'];
      +        Assert.isUndefined(m, 'Should not have double namespaces');
      +
      +        Assert.isNotUndefined(cl['P.storage'], 'Should not have double namespaces');
      +        Assert.isNotUndefined(cl['P.storage.Store'], 'Should not have double namespaces');
      +        Assert.isNotUndefined(cl['P.storage.LocalStore'], 'Should not have double namespaces');
      +    },
      +    'test: classitems parsing': function () {
      +        Assert.isArray(this.data.classitems, 'Failed to populate classitems array');
      +        var keys, item, item2;
      +
      +        item = this.findByName('testoptional', 'myclass');
      +        Assert.areSame('testoptional', item.name, 'Failed to find item: testoptional');
      +        Assert.areSame('myclass', item.class, 'Failed to find class: testoptional');
      +        Assert.areSame('mymodule', item.module, 'Failed to find module: testoptional');
      +        Assert.areSame('mysubmodule', item.submodule, 'Failed to find submodule: testoptional');
      +        Assert.areSame('method', item.itemtype, 'Should be a method');
      +
      +        keys = [
      +            'file',
      +            'line',
      +            'description',
      +            'itemtype',
      +            'name',
      +            'params',
      +            'evil',
      +            'injects',
      +            'return',
      +            'throws',
      +            'example',
      +            'class',
      +            'module',
      +            'submodule'
      +        ];
      +
      +        ArrayAssert.itemsAreSame(keys, Object.keys(item), 'Item missing from output');
      +
      +        Assert.areSame('', item.evil, 'Single tag not found');
      +        Assert.areSame('HTML', item.injects.type, 'Injection type not found');
      +
      +        Assert.isUndefined(item.return.type, 'Type should be missing');
      +        Assert.isUndefined(item.throws.type, 'Type should be missing');
      +        Assert.areSame(2, item.example.length, 'Should have 2 example snippets');
      +
      +        item2 = this.findByName('testobjectparam', 'myclass');
      +        Assert.areSame('String', item2.return.type, 'Type should not be missing');
      +        Assert.areSame('Error', item2.throws.type, 'Type should not be missing');
      +    },
      +    'test: parameter parsing': function () {
      +        var item, item2, item3, item4;
      +        item = this.findByName('testoptional', 'myclass');
      +        Assert.isArray(item.params, 'Params should be an array');
      +        Assert.areSame(6, item.params.length, 'Failed to parse all 6 parameters');
      +
      +        Assert.areSame('notype', item.params[0].name, 'Name missing');
      +        Assert.isUndefined(item.params[0].type, 'Type should be missing');
      +
      +        Assert.areSame('namesecond', item.params[1].name, 'Name missing');
      +        Assert.areSame('Int', item.params[1].type, 'Type should be Int');
      +
      +        Assert.areSame('optionalvar', item.params[3].name, 'Name missing');
      +        Assert.isTrue(item.params[3].optional, 'Parameter should be optional');
      +        Assert.isUndefined(item.params[3].optdefault, 'Optional Default value should be undefined');
      +
      +        Assert.areSame('optionalDefault1', item.params[4].name, 'Name missing');
      +        Assert.isTrue(item.params[4].optional, 'Parameter should be optional');
      +        Assert.areSame('"defaultVal"', item.params[4].optdefault, 'Optional Default value is incorrect');
      +
      +        Assert.areSame('optionalDefault2', item.params[5].name, 'Name missing');
      +        Assert.isTrue(item.params[5].optional, 'Parameter should be optional');
      +        Assert.areSame('"defaultVal1 defaultVal2"', item.params[5].optdefault, 'Optional Default value is incorrect');
      +
      +        item2 = this.findByName('test0ton', 'myclass');
      +        Assert.isArray(item2.params, 'Params should be an array');
      +        Assert.areSame(1, item2.params.length, 'Failed to parse all 5 parameters');
      +        Assert.isTrue(item2.params[0].optional, 'Optional not set');
      +        Assert.isTrue(item2.params[0].multiple, 'Multiple not set');
      +        Assert.isUndefined(item2.return.type, 'Type should be missing');
      +        Assert.isUndefined(item2.throws.type, 'Type should be missing');
      +
      +        item2 = this.findByName('test1ton', 'myclass');
      +        Assert.isArray(item2.params, 'Params should be an array');
      +        Assert.areSame(1, item2.params.length, 'Failed to parse all 5 parameters');
      +        Assert.isUndefined(item2.params[0].optional, 'Optional should not be set');
      +        Assert.isTrue(item2.params[0].multiple, 'Multiple not set');
      +        Assert.isUndefined(item2.return.type, 'Type should be missing');
      +        Assert.isUndefined(item2.throws.type, 'Type should be missing');
      +
      +        item3 = this.findByName('testrestparam0n', 'myclass');
      +        Assert.isArray(item3.params, 'Params should be an array');
      +        Assert.areSame(1, item3.params.length, 'Failed to parse all 5 parameters');
      +        Assert.isTrue(item3.params[0].optional, 'Optional not set');
      +        Assert.isTrue(item3.params[0].multiple, 'Multiple not set');
      +        Assert.isUndefined(item3.return.type, 'Type should be missing');
      +        Assert.isUndefined(item3.throws.type, 'Type should be missing');
      +
      +        item4 = this.findByName('testrestparam1n', 'myclass');
      +        Assert.isArray(item4.params, 'Params should be an array');
      +        Assert.areSame(1, item4.params.length, 'Failed to parse all 5 parameters');
      +        Assert.isUndefined(item4.params[0].optional, 'Optional should not be set');
      +        Assert.isTrue(item4.params[0].multiple, 'Multiple not set');
      +        Assert.isUndefined(item4.return.type, 'Type should be missing');
      +        Assert.isUndefined(item4.throws.type, 'Type should be missing');
      +
      +        item = this.findByName('testNewlineBeforeDescription', 'myclass');
      +        Assert.isArray(item.params, 'Params should be an array.');
      +        Assert.areSame(2, item.params.length, 'Should parse two params.');
      +        Assert.areSame('foo', item.params[0].name, 'Param 0 should have the correct name.');
      +        Assert.areSame('bar', item.params[1].name, 'Param 1 should have the correct name.');
      +
      +        Assert.areSame(
      +            'This parameter is foo.',
      +            item.params[0].description,
      +            'Param 0 should have the correct description.'
      +        );
      +
      +        Assert.areSame(
      +            'This parameter is bar.\n\n    It does useful things.',
      +            item.params[1].description,
      +            'Param 1 should have the correct description.'
      +        );
      +    },
      +    'test: indented description': function () {
      +        var item = this.findByName('testNewlineBeforeDescription', 'myclass');
      +
      +        Assert.areSame('Boolean', item.return.type, 'Type should be correct.');
      +        Assert.areSame(
      +            'Sometimes true, sometimes false.\nNobody knows!',
      +            item.return.description,
      +            'Description indentation should be normalized to the first line.'
      +        );
      +        Assert.areSame('Error', item.throws.type, 'Type should be correct.');
      +        Assert.areSame(
      +            'Throws an error.\nCatch me.',
      +            item.throws.description,
      +            'Description indentation should be normalized to the first line.'
      +        );
      +    },
      +    'test: object parameters': function () {
      +        var item, props;
      +
      +        item = this.findByName('testobjectparam', 'myclass');
      +        Assert.areSame('testobjectparam', item.name, 'Failed to find item: testobjectparam');
      +        Assert.areSame('myclass', item.class, 'Failed to find class: testobjectparam');
      +        Assert.areSame('mymodule', item.module, 'Failed to find module: testobjectparam');
      +        Assert.areSame('mysubmodule', item.submodule, 'Failed to find submodule: testobjectparam');
      +        Assert.areSame('method', item.itemtype, 'Should be a method');
      +        Assert.areSame(1, item.params.length, 'More than one param found');
      +
      +        props = item.params[0].props;
      +        Assert.areSame(2, props.length, 'First param should have props');
      +        Assert.areSame('prop1', props[0].name, 'Invalid item');
      +        Assert.areSame('prop1', props[0].description, 'Invalid item');
      +        Assert.areSame('String', props[0].type, 'Invalid item');
      +
      +        Assert.areSame('prop2', props[1].name, 'Invalid item');
      +        Assert.areSame('prop2', props[1].description, 'Invalid item');
      +        Assert.areSame('Bool', props[1].type, 'Invalid item');
      +    },
      +    'test: tag fixing': function () {
      +        var item = this.findByName('testoptional', 'myclass');
      +
      +        Assert.isObject(item, 'failed to find item');
      +        Assert.isNotUndefined(item.return, 'Failed to replace returns with return');
      +
      +        item = this.findByName('_positionChangeHandler', 'Axis');
      +        Assert.isObject(item, 'failed to find item');
      +        Assert.areEqual(1, item.params.length, 'Failed to replace parma with param');
      +
      +        item = this.findByName('crashTest', 'OtherClass2');
      +        Assert.isObject(item, 'failed to find item');
      +        Assert.areEqual(1, item.params.length, 'Failed to replace params with param');
      +    },
      +    'test: double namespaces': function () {
      +        var cls = this.data.classes,
      +            mod_bad = cls['Foo.Bar.Foo.Bar'],
      +            mod_good = cls['Foo.Bar'];
      +        Assert.isUndefined(mod_bad, 'Found class Foo.Bar.Foo.Bar');
      +        Assert.isObject(mod_good, 'Failed to parse Foo.Bar namespace');
      +    },
      +    'test: inherited methods': function () {
      +        var item = this.findByName('myMethod', 'mywidget.SubWidget');
      +        Assert.isObject(item, 'Failed to parse second method');
      +    },
      +    'test: case tags': function () {
      +        var item = this.findByName('testMethod', 'OtherClass2');
      +        Assert.isObject(item, 'Failed to parse second method');
      +        Assert.areSame('method', item.itemtype, 'Failed to parse Cased Method tag');
      +        Assert.isArray(item.params, 'Failed to parse Cased Params');
      +        Assert.areSame(1, item.params.length, 'Failed to parse number of cased params');
      +    },
      +    'test: required attribute': function () {
      +        var item = this.findByName('requiredAttr', 'OtherClass2');
      +        Assert.isObject(item, 'Failed to parse attribute');
      +        Assert.areSame('attribute', item.itemtype, 'Failed to parse itemtype');
      +        Assert.areSame(1, item.required, 'Failed to find required short tag');
      +    },
      +    'test: optional attribute': function () {
      +        var item = this.findByName('optionalAttr', 'OtherClass2');
      +        Assert.isObject(item, 'Failed to parse attribute');
      +        Assert.areSame('attribute', item.itemtype, 'Failed to parse itemtype');
      +        Assert.areSame(1, item.optional, 'Failed to find optional short tag');
      +    },
      +    'test: module with example meta': function () {
      +        var item = this.data.modules.ExampleModule;
      +        Assert.isObject(item, 'Failed to parse module');
      +        Assert.isArray(item.example, 'Failed to parse module example data');
      +    },
      +    'test: class with example meta': function () {
      +        var item = this.data.classes['mywidget.SuperWidget'];
      +        Assert.isObject(item, 'Failed to parse class');
      +        Assert.isArray(item.example, 'Failed to parse class example data');
      +    },
      +    'test: event with optional items': function () {
      +        var item = this.findByName('changeWithOptional', 'OtherClass2');
      +        Assert.isObject(item, 'Failed to locate event object');
      +
      +        Assert.isArray(item.params);
      +
      +        Assert.areSame(item.params[0].name, 'ev');
      +        Assert.areSame(item.params[0].type, 'EventFacade');
      +
      +        Assert.isArray(item.params[0].props);
      +        Assert.areSame(item.params[0].props[0].name, 'name');
      +        Assert.isTrue(item.params[0].props[0].optional);
      +
      +    },
      +    'test: markdown example': function () {
      +        var item = this.findByName('foo2', 'myclass');
      +        Assert.areSame(item.example[0], '\n    @media screen and (max-width: 767px) {\n    }');
      +    }
      +}));
      +
      +YUITest.TestRunner.add(suite);
      diff --git a/tests/parser_coffee.js b/tests/parser_coffee.js
      new file mode 100644
      index 00000000..d95f2011
      --- /dev/null
      +++ b/tests/parser_coffee.js
      @@ -0,0 +1,73 @@
      +'use strict';
      +
      +var YUITest = require('yuitest');
      +var Assert = YUITest.Assert;
      +var path = require('path');
      +var Y = require(path.join(__dirname, '../', 'lib', 'index'));
      +
      +//Move to the test dir before running the tests.
      +process.chdir(__dirname);
      +
      +var suite = new YUITest.TestSuite({
      +    name: 'CoffeeScript Parser Test Suite'
      +});
      +
      +suite.add(new YUITest.TestCase({
      +    name: 'CoffeeScript Parser Test 1',
      +    setUp: function () {
      +        var json = (new Y.YUIDoc({
      +            quiet: true,
      +            paths: ['input/coffee1'],
      +            outdir: './out',
      +            extension: '.coffee',
      +            syntaxtype: 'coffee'
      +        })).run();
      +
      +        this.project = json.project;
      +    },
      +    'test: CoffeeScript Project Data 1': function () {
      +        Assert.areSame(path.normalize('input/coffee1/test.coffee'),
      +            this.project.file, 'Project data loaded from wrong file');
      +        Assert.areSame(2, this.project.line, 'Line number is off');
      +        Assert.areSame('The test project', this.project.description, 'Description not set properly');
      +        Assert.areSame('The Tester', this.project.title, 'Title not set');
      +        Assert.areSame('admo', this.project.author, 'Author not set');
      +        Assert.areSame('entropy', this.project.contributor, 'Contributor not set');
      +        Assert.areSame('http://a.img', this.project.icon[0], 'Icon not set');
      +        Assert.areSame(1, this.project.icon.length, 'Found wring number of icons');
      +        Assert.areSame(2, this.project.url.length, 'Found wrong number of urls');
      +        Assert.areSame('http://one.url', this.project.url[0], 'URL #1 is wrong');
      +        Assert.areSame('http://two.url', this.project.url[1], 'URL #2 is wrong');
      +    }
      +}));
      +
      +suite.add(new YUITest.TestCase({
      +    name: 'CoffeeScript Parser Test 2',
      +    setUp: function () {
      +        var json = (new Y.YUIDoc({
      +            quiet: true,
      +            paths: ['input/coffee2'],
      +            outdir: './out',
      +            extension: '.coffee',
      +            syntaxtype: 'coffee'
      +        })).run();
      +
      +        this.project = json.project;
      +    },
      +    'test: CoffeeScript Project Data 2': function () {
      +        Assert.areSame(path.normalize('input/coffee2/test.coffee'),
      +            this.project.file, 'Project data loaded from wrong file');
      +        Assert.areSame(2, this.project.line, 'Line number is off');
      +        Assert.areSame('The test project', this.project.description, 'Description not set properly');
      +        Assert.areSame('The Tester', this.project.title, 'Title not set');
      +        Assert.areSame('admo', this.project.author, 'Author not set');
      +        Assert.areSame('entropy', this.project.contributor, 'Contributor not set');
      +        Assert.areSame('http://a.img', this.project.icon[0], 'Icon not set');
      +        Assert.areSame(1, this.project.icon.length, 'Found wring number of icons');
      +        Assert.areSame(2, this.project.url.length, 'Found wrong number of urls');
      +        Assert.areSame('http://one.url', this.project.url[0], 'URL #1 is wrong');
      +        Assert.areSame('http://two.url', this.project.url[1], 'URL #2 is wrong');
      +    }
      +}));
      +
      +YUITest.TestRunner.add(suite);
      diff --git a/tests/preprocessor.js b/tests/preprocessor.js
      new file mode 100644
      index 00000000..d6fd3ca8
      --- /dev/null
      +++ b/tests/preprocessor.js
      @@ -0,0 +1,102 @@
      +'use strict';
      +
      +var YUITest = require('yuitest');
      +var Assert = YUITest.Assert;
      +var path = require('path');
      +var fs = require('fs');
      +var Y = require(path.join(__dirname, '../', 'lib', 'index'));
      +
      +//Move to the test dir before running the tests.
      +process.chdir(__dirname);
      +
      +var suite = new YUITest.TestSuite({
      +    name: 'Preprocessor Test Suite',
      +    setUp: function () {
      +        process.chdir(__dirname);
      +    }
      +});
      +
      +suite.add(new YUITest.TestCase({
      +    name: 'Preprocessor',
      +    'test: single preprocessor': function () {
      +        global.testPreprocessorCallCount = 0;
      +
      +        var json = (new Y.YUIDoc({
      +            quiet: true,
      +            paths: ['input/preprocessor'],
      +            outdir: './out',
      +            preprocessor: 'lib/testpreprocessor.js'
      +        })).run();
      +
      +        Assert.isObject(json);
      +        Assert.areSame(global.testPreprocessorCallCount, 1, 'the preprocessor was not called');
      +    },
      +    'test: single preprocessor with absolute path': function () {
      +        global.testPreprocessorCallCount = 0;
      +
      +        var json = (new Y.YUIDoc({
      +            quiet: true,
      +            paths: ['input/preprocessor'],
      +            outdir: './out',
      +            preprocessor: path.join(process.cwd(), '/lib/testpreprocessor.js')
      +        })).run();
      +
      +        Assert.isObject(json);
      +        Assert.areSame(global.testPreprocessorCallCount, 1, 'the preprocessor was not called when an absolute path was used');
      +    },
      +    'test: several preprocessors': function () {
      +        global.testPreprocessorCallCount = 0;
      +
      +        var json = (new Y.YUIDoc({
      +            quiet: true,
      +            paths: ['input/preprocessor'],
      +            outdir: './out',
      +            preprocessor: ['lib/testpreprocessor.js', './lib/testpreprocessor']
      +        })).run();
      +
      +       Assert.isObject(json);
      +       Assert.areSame(global.testPreprocessorCallCount, 2, 'the preprocessor was not called twice');
      +    },
      +    'test: the test preprocessor does its job': function () {
      +        var json = (new Y.YUIDoc({
      +            quiet: true,
      +            paths: ['input/preprocessor'],
      +            outdir: './out',
      +            preprocessor: 'lib/testpreprocessor.js',
      +            star: '#'
      +        })).run();
      +
      +        Assert.isObject(json);
      +        Assert.areSame(json.classes.TestPreprocessor.customtagPlusStar, 'hello#', 'the preprocessor did not modify the data');
      +    },
      +    'test: load preprocessor as a npm module': function () {
      +        // We are testing if it works to load the preprocessor from node_modules,
      +        // so first we need to copy it in place.
      +        if (!fs.existsSync('../node_modules/testpreprocessormodule')) {
      +            fs.mkdirSync('../node_modules/testpreprocessormodule');
      +        }
      +
      +        fs.writeFileSync('../node_modules/testpreprocessormodule/package.json',
      +            fs.readFileSync('lib/testpreprocessormodule/package.json'));
      +
      +        fs.writeFileSync('../node_modules/testpreprocessormodule/testpreprocessormodule.js',
      +            fs.readFileSync('lib/testpreprocessormodule/testpreprocessormodule.js'));
      +
      +        var json = (new Y.YUIDoc({
      +            quiet: true,
      +            paths: ['input/preprocessor'],
      +            outdir: './out',
      +            preprocessor: 'testpreprocessormodule'
      +        })).run();
      +
      +        Assert.isObject(json);
      +        Assert.isTrue(json.testModuleWasHere, 'the preprocesor module was not run');
      +
      +        // Clean up things when we are done.
      +        fs.unlinkSync('../node_modules/testpreprocessormodule/package.json');
      +        fs.unlinkSync('../node_modules/testpreprocessormodule/testpreprocessormodule.js');
      +        fs.rmdirSync('../node_modules/testpreprocessormodule');
      +    }
      +}));
      +
      +YUITest.TestRunner.add(suite);
      diff --git a/tests/utils.js b/tests/utils.js
      new file mode 100644
      index 00000000..af1f1cc7
      --- /dev/null
      +++ b/tests/utils.js
      @@ -0,0 +1,158 @@
      +'use strict';
      +
      +var YUITest = require('yuitest');
      +var Assert = YUITest.Assert;
      +var path = require('path');
      +var Y = require(path.join(__dirname, '../', 'lib', 'index'));
      +
      +var suite = new YUITest.TestSuite({
      +    name: 'Utils Test Suite',
      +    setUp: function () {
      +        process.chdir(__dirname);
      +    },
      +    tearDown: function () {
      +        process.chdir(__dirname);
      +    }
      +});
      +
      +suite.add(new YUITest.TestCase({
      +    name: 'getProjectData Folder Priority',
      +    'test: Nearest Folder Priority': function () {
      +        var d = Y.getProjectData('input/folders1');
      +        Assert.areEqual('yuidoc-root', d.name, 'must use nearest yuidoc.json first');
      +    },
      +    'test: Finds package.json': function () {
      +        var d = Y.getProjectData('input/folders2');
      +        Assert.areEqual('yuidoc-two', d.name, 'used deep yuidoc.json');
      +        Assert.areEqual('package-root', d.description, 'used shallow package.json');
      +    },
      +    'test: Finds package.json in same folder as yuidoc.json': function () {
      +        var d = Y.getProjectData('input/folders3');
      +        Assert.areEqual('yuidoc-root', d.name, 'used deep yuidoc.json');
      +        Assert.areEqual('package-root', d.description, 'used deep package.json');
      +    },
      +    'test: Ignores package.json in deeper folder than yuidoc.json': function () {
      +        var d = Y.getProjectData('input/folders4');
      +        Assert.areEqual('yuidoc-one', d.name, 'used deep yuidoc.json');
      +        Assert.isUndefined(d.description, 'used deep package.json');
      +    },
      +    'test: Must be breadth-first': function () {
      +        var d = Y.getProjectData('input/folders5');
      +        Assert.areEqual('yuidoc-two', d.name, 'used wrong yuidoc.json');
      +        Assert.areEqual('package-two', d.description, 'used wrong package.json');
      +    }
      +}));
      +
      +suite.add(new YUITest.TestCase({
      +    name: 'validatePaths',
      +    'test: path globs': function () {
      +        var options;
      +
      +        process.chdir(path.join(__dirname, 'input/globbing'));
      +
      +        // Simulate a path provided by a configuration...
      +        // first with a String path
      +        options = {
      +            paths: '**/yui/src/*'
      +        };
      +        options = Y.Project.init(options);
      +
      +        Assert.isArray(options.paths, 'Failed to set path');
      +        Assert.areSame(3, options.paths.length, 'Failed to retrieve all path options');
      +
      +        // then with an Array of path
      +        options = {
      +            paths: [
      +                '**/yui/src/*'
      +            ]
      +        };
      +        options = Y.Project.init(options);
      +
      +        Assert.isArray(options.paths, 'Failed to set path');
      +        Assert.areSame(3, options.paths.length, 'Failed to retrieve all path options');
      +
      +
      +        // Test with a path as passed to Y.Options
      +        options = Y.Options([
      +            '**/yui/src/*'
      +        ]);
      +        options = Y.Project.init(options);
      +
      +        Assert.isArray(options.paths, 'Failed to set path');
      +        Assert.areSame(3, options.paths.length, 'Failed to retrieve all path options');
      +    },
      +    'test: ignore paths': function () {
      +        var options;
      +
      +        process.chdir(path.join(__dirname, 'input/with-symlink'));
      +
      +        // Simulate a path provided by a configuration
      +        options = {
      +            paths: 'a',
      +            ignorePaths: [
      +              'a/d',
      +              'c'
      +            ]
      +        };
      +        options = Y.Project.init(options);
      +
      +        Assert.isArray(options.paths, 'paths are present');
      +        Assert.areSame(1, options.paths.length, 'one path present');
      +        Assert.areSame('a', options.paths[0], 'path a is in paths');
      +    }
      +}));
      +
      +suite.add(new YUITest.TestCase({
      +    name: 'produce valid web urls',
      +    'test: Adds paths onto end in sequence': function() {
      +        var url = Y.webpath('foo', 'bar', 'baz');
      +        Assert.areEqual('foo/bar/baz', url, 'parts should be added in sequence');
      +    },
      +    'test: normalises windows paths into web happy urls': function() {
      +        var url = Y.webpath('foo\\bar', 'baz');
      +        Assert.areEqual('foo/bar/baz', url, '\\ should be normalised to /');
      +    },
      +    'test: joins relative paths': function() {
      +        var url = Y.webpath('./foo/bar', './baz/');
      +        Assert.areEqual('foo/bar/baz/', url, 'should join relative paths');
      +    }
      +}));
      +
      +suite.add(new YUITest.TestCase({
      +    name: 'getDirs',
      +    setUp: function () {
      +        process.chdir(__dirname);
      +    },
      +    'test: gets paths as array': function() {
      +        process.chdir(__dirname);
      +        var pathPrefix = __dirname + '/input/folders1';
      +        var dirs = Y.getDirs(pathPrefix, []);
      +        Assert.isArray(dirs);
      +        Assert.areSame(2, dirs.length);
      +        Assert.areNotSame(-1, dirs.indexOf(pathPrefix + '/one'), 'contains path /one');
      +        Assert.areNotSame(-1, dirs.indexOf(pathPrefix + '/one/two'), 'contains path /one/two');
      +    },
      +    'test: gets paths from . as array': function() {
      +        var pathPrefix = __dirname + '/input/folders1';
      +        process.chdir(pathPrefix);
      +        var dirs = Y.getDirs('.', []);
      +        Assert.isArray(dirs);
      +        Assert.areSame(2, dirs.length);
      +        Assert.areNotSame(-1, dirs.indexOf('one'), 'contains path /one');
      +        Assert.areNotSame(-1, dirs.indexOf('one/two'), 'contains path /one/two');
      +    },
      +    'test: ignores paths': function() {
      +        process.chdir(__dirname);
      +        var pathPrefix = __dirname + '/input/with-symlink';
      +        var dirs = Y.getDirs(pathPrefix, ['c']);
      +        Assert.isArray(dirs);
      +        Assert.areSame(2, dirs.length);
      +        Assert.areSame(-1, dirs.indexOf(pathPrefix + '.gitignore'), 'does not contain file some-file');
      +        Assert.areSame(-1, dirs.indexOf(pathPrefix + '/a/b'), 'does not contain symlink /a/b');
      +        Assert.areSame(-1, dirs.indexOf(pathPrefix + '/c'), 'does not contain path /c');
      +        Assert.areNotSame(-1, dirs.indexOf(pathPrefix + '/a'), 'contains path /a');
      +        Assert.areNotSame(-1, dirs.indexOf(pathPrefix + '/a/d'), 'contains path /a/d');
      +    }
      +}));
      +
      +YUITest.TestRunner.add(suite);
      diff --git a/themes/default/assets/css/external-small.png b/themes/default/assets/css/external-small.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..759a1cdcb5b1697e5be290d98b830e279cd71f3c
      GIT binary patch
      literal 491
      zcmV<H0Tlj;P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN;
      zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzjY&j7RCwBA{Qv(y10{fofkHsB0W2_v
      zUBVFtR#sLp=H=xBVFzYr=KaWuf!;khr%J>Ds{zR1^XE?tfB*h@ASKHAa7wwn{MEbP
      z7_^nS7{V*>+A}bS;P%45fB%Ai|Neasi2rl3{=EO;!w318%8Ovl7jArHc=P5Brfr~D
      z0AYimtss2w$hlYlfd>7*aO3TNzw875LBK0xAD9Np|A(oEVYnB*eE9~V6wP%78SXuL
      z&#-X)Er#`zY#Ce<cQE|@_n*NrZu>)^8hM<t@c%yx7=Qlqo#E+=&kU8xDhyfmhZ%Ci
      zB^dtyV`g~#;=9AYe+-T|4Pa;I2jl<${xZmkvoM^x_?{uwM}|RLMTp_`2UZ3)Hogb%
      z@2x(7(}2e(%NV%1Med)x^p}B+U4TJPLyAFJUXtPFBQCJ`lT(!p@9(X`oen;~J|q6|
      z@wSPb3!@4d7=I%C`v334k56{?0OcisymvtS3)uihSYBXcWaI%-d^i%^A0P&W@^_&6
      hzgP_zx|s<ezyP)2!%xqD#*+X5002ovPDHLkV1nUx>>B_8
      
      literal 0
      HcmV?d00001
      
      diff --git a/themes/default/assets/css/logo.png b/themes/default/assets/css/logo.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..c82444af95895d38bea6fe96cc5354a7419f770c
      GIT binary patch
      literal 7143
      zcmV<D8yMt?P)<h;3K|Lk000e1NJLTq008O$003wR0{{R3$TFO-0007@P)t-s&e7N@
      zH-gsK-M+%iNMNBuSD%THvDVn#HAarCvc0>%$*Zuu-rwWBz{*f-v)|z5tg^kZw!u0~
      zlO{BO($v~UUZfl-b-TdHt+Ku{LW;Gz#LLdsP-?Qy(b!LEv9Y$nGD3^4w7)Dldf3_D
      zJWrO?*4r&RfK6$yJ583Wu)WyY-%Vz%($w19+~LmA*u}}wPinH(*xkX!%}!~sxV^_q
      zWvjTn#y?b@($(9~(%4OAuF%ri)79J4)!T%UyUx+rOJu8sl)L}{0J*)#+1%l+v%b5(
      z$-2JCDmjHHHiIZNf+{$LyTHk>w7$2y#k#-9Co*bXWspKke-IjLOI3=tyTog8ndax{
      zfrq4ae4-vPgC91BB`tFuHGU*4aTX$Tqo}$!K#ZHAwT+d%kCd(;EO`|ra<jO@Av=s%
      zT#X$ne;+M?9xZ_$DR&tseJVte79)5XEPp6Lj^g9yt+Kr*HG-?Kyx`&Gu(rV@HH5FU
      zzalSz-rwW0x5Br(#>vdo#>&#g$k5T#*)~UzNMNGG$Iw7gk2OPn(9+pCNQ5#&jW0in
      z)z{oaS)e;kmr-i6&Cu6AQku`v*g;mFMOvZC%+$-y)y>b=P-?Qy(bvn()y&V<(bL+~
      z*4sy9r%`FK%+A(LW2@KM-r3sV)YjZXRg-CRr^Cn3%FWfv&D2I&m@7Jl*Vx`kU!g)*
      zpG8@r)79HZUZyxolQBJb%gxj~ONT>OpDsFeCOe8YNs=^0kJ8lIJ4}d3U!g`>nmJ6B
      zM`)`mIfm5N++Jv*SYn<+U!=do%sozut+B(jxy0Gq;43z8mYcpTHhw)#iiC@_qo>0{
      zR-Zgfh)PtJ+S}l{zQ`jmeR_efQE9Tcy~o<z;k>}gP*|BOIfd8Q-zz$WhK2J20000(
      zbW%=J`1|?v^!csy@b>TT^5*d9<Ll_|_Tkjm#l~gK(;MZmebTFrYn(xUmwx5Ftj*vt
      zpMNE3N<o$zTX9voJWC7{C<OqevyM>!02s4LL_t(|UewoRZyZ+?2H-YQt9;6b2BfI5
      zRW-F7#Snw6*j}%_&L5kZMP>#wGc$yl%iO=x_fm#-f~K51vOhn1&pG$*7dH;Dx*ctu
      zKYVxP`->O9Iej`9425R?`{&EEXD?j%x~93K-QLyG(|hCi>R_n7j<(h-b?3iIr4otg
      z&6~?x+kg`3^XD5+pZ<DJ%4M_J!NI{|qpha7y{oGCbEHDqSzC90X(^qK%oAu7P#2^W
      zx&i3QjQ6j?WR_S_rBW^)k2l&b6Y%Fl1+%rOdSGa13DSji9_iNB_BM&sx3WT@K)-TI
      zlEE4;6bi}4`VM>5=RkFIHdV(40HxB%Yi*=KpN~p6f?M0SU+ze#$s)4?o6B))A(>1z
      z)^v3BoMft__EIbcs5a6liPVKi0|6%8@FC%uyMt2_sf^w#uqfv_TQj&Pk?Lr@lm}Fe
      zR5PWn-Q6`VU2#DkTK**`$<!*E*lhJXozC*N&Gw!XMa6j5<@0%Mq!AwJGV0;OA8Dq5
      z2BOg|S1|O<DG92SF$`=xskN5N=juDUs!j;C8+mG=kfzh?bV>oe>GgVrbS02TkUMAd
      zH!8)+uz@uO%dJT##qOXQFWbA1o$9DP1E;xn>Eca{jj2*!G?l>h>I(fWXJk0lU{!1B
      zja3uu4y~&-?LEgyZEFHkFU4KTB8`qs3n_~f9gR?f!B;t1)>|{hw>2@xE-voWx3?S<
      zwXKdr4T~4hXmo#{OV^0h=Z!F_YjeB+D6>+p@z#m!H?bNluzh_tWP9XP2NJc4G_gOY
      zlLpooXwuk8!ADuyY|R)3wqR);Jyj3wQBqZ?dGRJ9b2_Qdo2F8>lM1pTi;@J^@N_aS
      zr?RjDJL;^lcOMn?dTm}K)h}K^_0qul(gMkvJSIY84<toaD3&c@NO`bkE7SV5!BQ*g
      zYDddaP_MV1$y-fnVt$WH#YWmi+UufyL(g(>LaJzEl}!Vy3)XLHVp4Z(?Jb8*ZH<XY
      z_0ZRVrrqwnIkAz}NT&Nk<S{JTcN|h;RfLsG-_gW=y;Wet4INd7NOjcZO_7SbG~(7u
      zcadpe3DSjm9%^X$57|Sg{BZ1BHgTmUUKChZ!>5|B9TK&>Hg6GWDv@&cyZ82VbLvIn
      zqJ5WL+nX=59*;-ya4eVdlX?65zj6};J8QG|9s;$kT0qUuqjbMXIz2$7WG6*ws6S08
      z6R?tCwYg?!u)3$yyRE<q>ue+X_+Y8sO?jhqNi5!ZK;3SgG%z=y3pF_NY;|G+R$Z`)
      z@ro^44y?6xHr!lwkW|N|%2P@x_xnLLNQYuXs$Qux_Y}{BM_?6!wI0}#abPW)_|7cR
      zUcPo<)YghqnvT#&Rp~U7`qqe)>?HM~c{K&8LXKjT${CI|3~cFrn;6((oBcqjjwZ`U
      zQ#{f=?S1MUim~>Mya{!D)q_+O?i5Erp`?pxYKm9~t$x?}iM4EAPQ%1H+|b_h$<$UA
      ziqbwBSft{X5z_q_q<kkaY0&jph7+I0C;^$lM-G&z$w^$U_z)<VsCWU;IFtHe<-uBE
      zPoa-Lg^GP-Uc7q<j7;e*Ce>xS7yBK#Yuk5w^X@9Pk(#L3zWC^&ffh-TG(nA*;;fQM
      z(!jL*C}IRvYej`ozz(D8yFQ-ksJ4tW)o+r%!0JV&hW5pzf~uIO6iiYQDI`j)Y)<(~
      z0<{1l%2{@zfBhV~$ZE6?i9$-I6-BKW+K;0`YI&DNZdH)3EeR>!N&J}~ynQ#zg@UPC
      z`8t|HVMIxyw5XGJFQd|eR48%qVuF<v_Aqsh;2UY^`WR|wrMomjf5hC^NvC<HZb-GE
      zLP|o-YSW~{$<xFi{Nvb3Y8@1Fiefhnq_7Gqx00gHe^F2}=?M8oknD$2Yb_&9^h0X8
      zWzfB9`-+`}P;;7nq)@BG788qeHA}V;3QF3(v<MYW_2<nFj(7&cN{h5^STyewa#%Ik
      zKZx4fRPlL~0zpVknL=vVNeK1PYK0*caZVPClSLXQimxNyzDd2+xx)%lbT2X`6-MjM
      z(xRz885sfeXH-Lb?|V}nbyh!OqN#pE_l_Y`GN;D&U551bcurP(S7K0E!pDlNUPw!Y
      zIC_^+{eJ#LB31SiXqj6_!@z=y6CMfEn!O|Xm*vW>e>T{A-jCX8^$v_iF{Z{jh4jS`
      zPha=U4~Bw|SGiLv6&_>?lEj8}ir%Jt9~J$56LMb;g{?cBk-~mDs6g^5{hxBPe~Rk7
      z;&^`OOn-4EGky7~W5${2q?6hvX~t<ZM*BjI3mF&{(3LbInt+R0UUqPYaz)riSmoAI
      zENoXm$=%f@;ilb!sheyf4Ui3cjY8uUhr1R3m7eE3uY2!qY7aZ>O!&o5zUSrpoaYe}
      zH@l$4M{SdOB~2f-tt3G;l~N^?6%Y=IO^Q1%kGiAOPUW&f`d+c`z3>eqWj0@k+KpR6
      zjPb&OiyyAWNH>DdP11;NqM}n%k;19F#~(%s>PW;tH~26bRjZU0>4NT`yL)5GAjzvW
      z4c=Wk@8~9jP0(shprAZ7>!rQrQ8}qsQb~H1glozmsSs6;)QiniB6({&I$J(jAD4?l
      z2z0ygse{Lkp6>X15{lID9|{E8PZ&swtlT%GoqF=C8x;%5q_cde{dD^h5~8B`0aC+O
      zVKr?N!j?zfQBKnNOQcNyC9?Onht$=Rd>|^Do$<!E+uGV%zK)Or9R*D#>ty3Q-QC?C
      zi+X%G(sw7&(-T}ulW9tRq(Rbez6rky9G^Clx_01LPfx3_;BZnK!=jaHA*-z+?DMaD
      z3+k@YYce36=dJhZ=kF0x+Iv3+H;88*uTL6Uj`0&|wCQ(kZJjMAveVO0o*2{yPQ~<-
      z6g4>#&*t7b4XFRgLgKQ>vM^HcD?sftAb(G_18P^V!wc2ofn_Q~16V$Kyr{dpvy|rU
      z?EIIgDQ2%qdK*a<pM<2a<Mu5wQQ;FIsBM6XEtj9vhKaQ|Ici*>rn8E*he)Q=#`!l9
      z^_)Ph?A4T}RK%(k#jCqZq9UogN>L`EDFh|Gj-($lQiiIG)Gt=!tTF+WtBMYAY+Tux
      z8A8>OG*=Z+BSpv4Nr4JehM_*tkP=LiVUv!8V@4HJAa8%ci@M8Ir6?&*4j>iIK_$J8
      zq>9bwKIvlB66v>n)c0jkRgQ{h?{OEZ9*HIeDvZ*sWQ9m@RLeBO5|y@In>JqyO4P<O
      zWj{z8*23Yid-6Q>aw*e*gJYh9LdbcFn*P<@lW6)5&8$Ynp7%<cshTF1emDjp9AF95
      zbQ%cdF{VgWOP8o1DY_&Z{v?VjngS!2HH@^+?kz%nM&_>4c;{z71yY78NkP*=(6ns&
      zUOzX6h6tVRBvUm_4{73t5xy*r8jUP)RHT&07zh<rNnp!jjTiG*f^t<kE5xRqD(Wt#
      zkF-a4*Z=A4)zX>{U}d{({w4Y-tJ|NQCRT{{p-HCd<ams&Qs^=TJ`O`QLDdvRO{%OI
      zy45cdSVcvLMA{Jq2L)n@slvhuPuA*-{H`BTQNAYo<Z9{O``I-vs@LYv4CUjaVycWM
      znX1Vc1i_SN7n`HP@D!+G(*Pd~o1sou7)DX8T3DqOe3oiL&?4S2jct1b>YiuZRZ5ca
      zOHc3RTTm3$WAjne#Vkk)m~^x(FjaM`D2OS-DuJ3rL9zAH1=51WQEdekx-a%#?i&!(
      z!x`qPqOfAv{8E*ak^UJqg^-%!4*xcgN}r_Kd~grG)ifKPxEIrzs=Byk!ywkLl&T9{
      zO>qhrsE#R7*(|M~omU9!l~YFO**(HS5K<;7O~p&h_qyikAQUQu*XE;7^4*WcrZ9#v
      zbgpV#va-8kUaLl0LB-TXLDAB0m=aa08b(sgUJ+bX4vHVaNm!rX&5hw!F-xIJfplKh
      zshYim-(17=_1b(CwdaHm76AiW5LeX{c}pxViL5}KOq=H=Duxb%nufli8%|#dRGT$l
      z-gP1HTbVQ}Xb3(eUfK(&$XfK~a~7wJSJRJGQg=@p>K+&y5gP@l%(%f+HE7Z@e@lJ@
      zs<kj_a8#X8k{T5oL5@1*BoZNtx-X27LQVWqIX$dAp56_p$cl}Z{+%xtpHGqWE9gjr
      zS0$;}=Fjx37<{16Z5X1q5!46<1%;5PiKIX^P09#z>TDk<P@zBts%1%5<doSPE}6lC
      zl^@Nwa7kx|MDvv$2}y4g($Y2`P^*UaW#j5ViCT?JRov<Vr1bKdP&H}vQ&a+qq~^v3
      zv-FxsVA~d`3a4rYrI`3F3zcSYSbO?4v2gh@dzt<CvdCUeI)J1Dl9Zy#^hHq@b<|Qu
      zqLHea;E-}H#!+oOnP8|JCfnJ|aLS^plxo^?T1g6+0Pon_H$$xoRwR8i@2*oudf}Q&
      zRQc+Gi2Ar^)c{aDT}SB_EWuQ@DWHtWWGU2*jRo8Va?pgOjfw=8sGL)L98Zy|9SJbO
      zGg~{c14~xW=FyOvz3StY_pnesK8dC8OxM6vM9dRh;!fD8Do4#K20@@YrfzXm10mH=
      zP%RZzX01CUDC((ccETW+b}zVB-di3&s=Vy!y+}GoOnw=kgrc@SbRy9SQj-&WuW55t
      zxtI*JG-`rxjVut9gq@J6j>Aw33{}E9{1_wtfWWM^4O7R0KnH=SGPZtyR+6fkvh@9v
      zdmSo7^;P9{at51F?#`I1D-I9}W4nOgVU7v~dGiiIy}w~`Qb;&@bkTBewGz}}f!b9F
      z31=k3U8BICFq8Zq>$|U%zOyMcPl0sq^Kb7-k9(GKujl%wN7RzEmr>Ol4zql8W}+1e
      z`P(_Fm7NO!#898Z_hSjZAqzDg>cRgDDk_C@JkDOjE`*SH@4=r=;F;Bf3eLX_sqDVq
      zk$MqGtJYTD$mjEQy@g!gm3TG@UY(eO!Opg}%;jMNoB=olyg>sW1l6M*>_AkFRAg-s
      zfC8%_;(>^sfJzLJQ*qdjsEYvL9G0k#G(~DF(wq%FiK`6d()sz<%3M#qSUP*>2H!{2
      zayEZvf7kKfR_E)g>)<P2y}mD(IyXF#HjUaAkTtWa5hYC%zj2^wy^z0%3I!UfKSqJX
      zwiB(q?P%6qkf5Fj6`{&d@>QSAM#v?I>kZpBDybKBhllhtLOOWsc6m{ew5oNHh+3To
      zSO`Mg`=F4E)i;m~{s_y^gy5Hj;REdq)dI`cNKjjQdP6o12dzAax{SZ@A)W^n2(c#h
      z^hBI^v=P@EHeeN!dT-)>=$WVVA6Hxu-B<P`Bo(5rovg`2)G^pz8il4VK<#W<nH<R`
      zO%ofdVI_<Zii)V@(3zYIU`Zx4+fgDMs%<BtE;*VT)d3lk*=RgQHm$?up2TeDl6p~}
      zbIsFxkiGam{U7f1mHQ+l^>z6g*Yg<Fy?{zs*L&C3fAa=pa3{n{uBMR7rTY7B#-iD@
      z6NO5ps5m+f`$0Wmx}hnqPYWNeKSV?gtR9xAzFs35AC8TWP2)of<z1JTb?3KSI=VU%
      zXo{q_zCu#ZK1ueZ%GP_x$%W;*uIG+45Y$Y|N`G!&O-;>%*K79W`pzC~&oI<vBm$f5
      zzPqQ9btxHgY!Zot6?T9WMIDI@$EL>86m>ZU_j;pO%DpC*tgp&PwO-VhOVufm&b_bt
      zB(|_n(znXj^{yXEwVA<!u62yH=ImEg*36AFg;WZJP4zdQyww4u4Fq-Rd?5!h<_8Rj
      z_WP^3*ciNJ8XrkD9i*hkmp{OJ={U6z%flt#u#LE06aNfnX<5`?J?HVgBzy08dXgu7
      z*D4#U^MbW5FO#@%X0QcO8#+JqH#Igk9XW8fqX9KV)c#zKz@};`YoPUB{mI5NXHM47
      z9Sh=rc(lr1|Bo=#nEUyEi6s7k=K|f^fxn|n8Af_*kbru&`O@ZBb#=X6Ti4tSq#U+a
      zG^h1k(_>)8ByQ;5zrVZVXhSBG>COmLj8ydn07153aBc1F_Vxgx2P^qQaiMCg?|=S7
      ztnHhh;MvD7e)5r<l!@wHhsyL_3;Ju$o+YGpjI~;J;#|`JVa;@ASRm-pFDUAHs%oyk
      z`cx3=l}0OmWA?6I>35@+e>qKApW69^@0Pam$Do{)iR#^)F-Pd@>RMZCsyhp;AT0d2
      zI&pRG_lp^Tm9zlb{m|dRP&sSLUm4_#T;TipG4WI;UdvI-{Tmi!jc?oh#IMnId`~4U
      z64m{XkXP!v_nLuJ)fGJ=@5D8Qrlrn?7S7plwEO;vsUz>Owp3uOxev}PRs}h2Yakey
      zT}hq8=X=OXYxPlnTzO6GW&P3a|Lcw67F=yJ(mSI4N}Df5{Vy$N|Jqg+#&Q1v{b3+O
      zeEFeBDNN?uHf`rd>m|8U@7g$<u%=?l(ik(B(MT-UKw3kQvW>m@j{czj(qk1A6|@RE
      zBywpmBOOCaxQPFX&pCPS{oWi-2s7z(lRx0Y_xn8go|AJfiAtI-r7XAFDe74W8>R{0
      z-`V)>;%oC%TbHhHG<{KHRN?y}tav-Wd;1@PJb(V|n``x~_hC)oF!8&mUpjYosZNmc
      zW4`Ke*Z9;Oo*bPV2{lbzfT&1>5mBEf)Z${&W!AisHP6XuC17nkp1s}7wp!Wdc3gOl
      z6G0`;5O(vO#!j}i+iGt6tD7~!C#ShxQ<uK3+nc5fb}TH$QD0Ql=zXkdf);Oj%*RY3
      z`%2RFSheaBELgdsG0}27Res#I?RZpGPvLS2I^eWPJVJN`3RXh>$X_AMp7(X`KlXnQ
      zw2vs#btS4P=3^#h>XrnRPZiS%X@X-Sl_hJ&rV=44vqoUmmmZz9wn~z!3P~X>nzRq9
      zQQ46{6AAUNu@>`T-xs8PbIQNO3KKWNS_$I>6~q3eqq2$pkX2}~7*6!yNIZUZ5RUE;
      z6|jlk|1h$B$-g%jh*H4@tdJEZW@RNRu>zH4?ZZm6I7Q96qGQL84}N><VTfwldXV<b
      zWo8={*QJlDU=Sxm+G&HXKy?%=Ow0vXW`(dYF^?yl?-&I2fN3{BI+G;oT(Tlr(XZUF
      zNo3+~U8%&JLfsIK!=zwkNKIFRi4`bL?F@walyU3fXXGT=sl~;7g~|;J!%2^c(`_lN
      zLRH%krCs4LD}*)bsta5Dpfidwb_YbAFsxD$^QEY{+|v58TT$ggS41bIiKwtM)(>ey
      zO*cJ9md=WH)mbGcI`$w|FoU8#)+^@2zQs%-S>fV_4QN%nM%OxM*iNgaFK+vBuzH%X
      zqEEvfd>qqgP}C{9q}#{7gnF7$(Xaul!i0%2iM{eG=}xQ4IH6bp3)ZNvfMwRBhoI=-
      zsFMc!-oQ_)A}!|5kbh$g8>os%3=?A#&-k+?DeCV#z8$c_#JydNI8i%#Xt?)R4@X6%
      z>8r(jHIp(IVkcwF3KJtbMe=`=8`iT6uWl((J<A3w!bFeR1XfJlp&5AM0Yf6>1v!hF
      zDKug+2^#C}S5tIKQnh_=;gljhccbB0V1=&CtHXx6V(JbB6|h0f|Hd?v2z9PemaL(&
      zkk!?rQ`>Xm)iW=?T-s9hZF(G?h!wEivq^xJm3;)(9S$mBpL|G<`C(2f%35^G%qk1C
      z$ce$SZe}4>m|g$7)Y)-)tK}gQ_ZOCNk371U?}a!%aR8?tBBJJ$s5h5SmL;o#g|1zb
      zxS?3v3qO_Q+B_tkUNN(R)YpVP^5CAo?c?y+y?V@NQ8TmEvMR}{>8h=DoI(kkOKVvo
      z<>;h0tS+nQeD{w7boi*KsmZZ@TFmdDrt)QGWo5ytt#zzZ^WiR9z2PG|X~G&kd^g_r
      zv3IC2^61#U?&+(hQgyi;TV_@Q)nNl+N!1i}>HK^;z4b@aw|M`*4=dB|KlWcWXS32U
      z5C?I=Q(J@tp^bqOQ$)zA5JE(hN-FCIXuw0jn<7Y0UL-C>&<F75bNB|HMa)6zMMe5D
      z?v~VX{Wo}PwwovTF_~qCh3QOtS}IyyUJ^#dog}hSpG#2A0E_6P+{6hxy1RV5fBGEk
      z93%-Iu_pY)fE8yx+$?DuZB5`V=Az21bjZa?VOR!T{}lE(=7X1PIQ){)DM8mkVW+|l
      zH|*(-5Yc~mrBxq^`g)pjd6@jhy0XdnzbErjrgYeU3=4;rgbI0E^*1T1qAOr&Chld0
      zU5Bz(!ywXWbJUZlL{~<_L~+--rG^!-g0rL9ylTjCsA1_vJQ7vuI@GY+4RC6N>g1Tz
      zu*D^ozUx3(iMgfcXs!iN)vyqj8Wz1yUQTdq)v<kj_kmq-LfC@*kFJya{KfJ3CSGvt
      zc1P=d;2J0kh3!MwT-V<ZJ4xJgL)(wEUw!seP-<9|9nhk%Hykg3n0ljjea|AgG7e!2
      zx{hgu0&;8CX3Lv_=NJksOG$LfRW)5lGB%?bUTF6N+Y2qrHEOjA44YO=(=c4u5`cEl
      dE_aK*`wbys)<9*L9Wej^002ovPDHLkV1mbb3%&pV
      
      literal 0
      HcmV?d00001
      
      diff --git a/themes/default/assets/css/main.css b/themes/default/assets/css/main.css
      new file mode 100644
      index 00000000..cdfe209e
      --- /dev/null
      +++ b/themes/default/assets/css/main.css
      @@ -0,0 +1,783 @@
      +/*
      +Font sizes for all selectors other than the body are given in percentages,
      +with 100% equal to 13px. To calculate a font size percentage, multiply the
      +desired size in pixels by 7.6923076923.
      +
      +Here's a quick lookup table:
      +
      +10px - 76.923%
      +11px - 84.615%
      +12px - 92.308%
      +13px - 100%
      +14px - 107.692%
      +15px - 115.385%
      +16px - 123.077%
      +17px - 130.769%
      +18px - 138.462%
      +19px - 146.154%
      +20px - 153.846%
      +*/
      +
      +html {
      +    background: #fff;
      +    color: #333;
      +    overflow-y: scroll;
      +}
      +
      +body {
      +    /*font: 13px/1.4 'Lucida Grande', 'Lucida Sans Unicode', 'DejaVu Sans', 'Bitstream Vera Sans', 'Helvetica', 'Arial', sans-serif;*/
      +    font: 13px/1.4 'Helvetica', 'Arial', sans-serif;
      +    margin: 0;
      +    padding: 0;
      +}
      +
      +/* -- Links ----------------------------------------------------------------- */
      +a {
      +    color: #356de4;
      +    text-decoration: none;
      +}
      +
      +.hidden {
      +    display: none;
      +}
      +
      +a:hover { text-decoration: underline; }
      +
      +/* "Jump to Table of Contents" link is shown to assistive tools, but hidden from
      +   sight until it's focused. */
      +.jump {
      +    position: absolute;
      +    padding: 3px 6px;
      +    left: -99999px;
      +    top: 0;
      +}
      +
      +.jump:focus { left: 40%; }
      +
      +/* -- Paragraphs ------------------------------------------------------------ */
      +p { margin: 1.3em 0; }
      +dd p, td p { margin-bottom: 0; }
      +dd p:first-child, td p:first-child { margin-top: 0; }
      +
      +/* -- Headings -------------------------------------------------------------- */
      +h1, h2, h3, h4, h5, h6 {
      +    color: #D98527;/*was #f80*/
      +    font-family: 'Trebuchet MS', sans-serif;
      +    font-weight: bold;
      +    line-height: 1.1;
      +    margin: 1.1em 0 0.5em;
      +}
      +
      +h1 {
      +    font-size: 184.6%;
      +    color: #30418C;
      +    margin: 0.75em 0 0.5em;
      +}
      +
      +h2 {
      +    font-size: 153.846%;
      +    color: #E48A2B;
      +}
      +
      +h3 { font-size: 138.462%; }
      +
      +h4 {
      +    border-bottom: 1px solid #DBDFEA;
      +    color: #E48A2B;
      +    font-size: 115.385%;
      +    font-weight: normal;
      +    padding-bottom: 2px;
      +}
      +
      +h5, h6 { font-size: 107.692%; }
      +
      +/* -- Code and examples ----------------------------------------------------- */
      +code, kbd, pre, samp {
      +    font-family: Menlo, Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;
      +    font-size: 92.308%;
      +    line-height: 1.35;
      +}
      +
      +p code, p kbd, p samp, li code {
      +    background: #FCFBFA;
      +    border: 1px solid #EFEEED;
      +    padding: 0 3px;
      +}
      +
      +a code, a kbd, a samp,
      +pre code, pre kbd, pre samp,
      +table code, table kbd, table samp,
      +.intro code, .intro kbd, .intro samp,
      +.toc code, .toc kbd, .toc samp {
      +    background: none;
      +    border: none;
      +    padding: 0;
      +}
      +
      +pre.code, pre.terminal, pre.cmd {
      +    overflow-x: auto;
      +    *overflow-x: scroll;
      +    padding: 0.3em 0.6em;
      +}
      +
      +pre.code {
      +    background: #FCFBFA;
      +    border: 1px solid #EFEEED;
      +    border-left-width: 5px;
      +}
      +
      +pre.terminal, pre.cmd {
      +    background: #F0EFFC;
      +    border: 1px solid #D0CBFB;
      +    border-left: 5px solid #D0CBFB;
      +}
      +
      +/* Don't reduce the font size of <code>/<kbd>/<samp> elements inside <pre>
      +   blocks. */
      +pre code, pre kbd, pre samp { font-size: 100%; }
      +
      +/* Used to denote text that shouldn't be selectable, such as line numbers or
      +   shell prompts. Guess which browser this doesn't work in. */
      +.noselect {
      +    -moz-user-select: -moz-none;
      +    -khtml-user-select: none;
      +    -webkit-user-select: none;
      +    -o-user-select: none;
      +    user-select: none;
      +}
      +
      +/* -- Lists ----------------------------------------------------------------- */
      +dd { margin: 0.2em 0 0.7em 1em; }
      +dl { margin: 1em 0; }
      +dt { font-weight: bold; }
      +
      +/* -- Tables ---------------------------------------------------------------- */
      +caption, th { text-align: left; }
      +
      +table {
      +    border-collapse: collapse;
      +    width: 100%;
      +}
      +
      +td, th {
      +    border: 1px solid #fff;
      +    padding: 5px 12px;
      +    vertical-align: top;
      +}
      +
      +td { background: #E6E9F5; }
      +td dl { margin: 0; }
      +td dl dl { margin: 1em 0; }
      +td pre:first-child { margin-top: 0; }
      +
      +th {
      +    background: #D2D7E6;/*#97A0BF*/
      +    border-bottom: none;
      +    border-top: none;
      +    color: #000;/*#FFF1D5*/
      +    font-family: 'Trebuchet MS', sans-serif;
      +    font-weight: bold;
      +    line-height: 1.3;
      +    white-space: nowrap;
      +}
      +
      +
      +/* -- Layout and Content ---------------------------------------------------- */
      +#doc {
      +    margin: auto;
      +    min-width: 1024px;
      +}
      +
      +.content { padding: 0 20px 0 25px; }
      +
      +.sidebar {
      +    padding: 0 15px 0 10px;
      +}
      +#bd {
      +    padding: 7px 0 130px;
      +    position: relative;
      +    width: 99%;
      +}
      +
      +/* -- Table of Contents ----------------------------------------------------- */
      +
      +/* The #toc id refers to the single global table of contents, while the .toc
      +   class refers to generic TOC lists that could be used throughout the page. */
      +
      +.toc code, .toc kbd, .toc samp { font-size: 100%; }
      +.toc li { font-weight: bold; }
      +.toc li li { font-weight: normal; }
      +
      +/* -- Intro and Example Boxes ----------------------------------------------- */
      +/*
      +.intro, .example { margin-bottom: 2em; }
      +.example {
      +    -moz-border-radius: 4px;
      +    -webkit-border-radius: 4px;
      +    border-radius: 4px;
      +    -moz-box-shadow: 0 0 5px #bfbfbf;
      +    -webkit-box-shadow: 0 0 5px #bfbfbf;
      +    box-shadow: 0 0 5px #bfbfbf;
      +    padding: 1em;
      +}
      +.intro {
      +    background: none repeat scroll 0 0 #F0F1F8; border: 1px solid #D4D8EB; padding: 0 1em;
      +}
      +*/
      +
      +/* -- Other Styles ---------------------------------------------------------- */
      +
      +/* These are probably YUI-specific, and should be moved out of Selleck's default
      +   theme. */
      +
      +.button {
      +    border: 1px solid #dadada;
      +    -moz-border-radius: 3px;
      +    -webkit-border-radius: 3px;
      +    border-radius: 3px;
      +    color: #444;
      +    display: inline-block;
      +    font-family: Helvetica, Arial, sans-serif;
      +    font-size: 92.308%;
      +    font-weight: bold;
      +    padding: 4px 13px 3px;
      +    -moz-text-shadow: 1px 1px 0 #fff;
      +    -webkit-text-shadow: 1px 1px 0 #fff;
      +    text-shadow: 1px 1px 0 #fff;
      +    white-space: nowrap;
      +
      +    background: #EFEFEF; /* old browsers */
      +    background: -moz-linear-gradient(top, #f5f5f5 0%, #efefef 50%, #e5e5e5 51%, #dfdfdf 100%); /* firefox */
      +    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(50%,#efefef), color-stop(51%,#e5e5e5), color-stop(100%,#dfdfdf)); /* webkit */
      +    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#dfdfdf',GradientType=0 ); /* ie */
      +}
      +
      +.button:hover {
      +    border-color: #466899;
      +    color: #fff;
      +    text-decoration: none;
      +    -moz-text-shadow: 1px 1px 0 #222;
      +    -webkit-text-shadow: 1px 1px 0 #222;
      +    text-shadow: 1px 1px 0 #222;
      +
      +    background: #6396D8; /* old browsers */
      +    background: -moz-linear-gradient(top, #6396D8 0%, #5A83BC 50%, #547AB7 51%, #466899 100%); /* firefox */
      +    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#6396D8), color-stop(50%,#5A83BC), color-stop(51%,#547AB7), color-stop(100%,#466899)); /* webkit */
      +    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6396D8', endColorstr='#466899',GradientType=0 ); /* ie */
      +}
      +
      +.newwindow { text-align: center; }
      +
      +.header .version em {
      +    display: block;
      +    text-align: right;
      +}
      +
      +
      +#classdocs .item {
      +    border-bottom: 1px solid #466899;
      +    margin: 1em 0;
      +    padding: 1.5em;
      +}
      +
      +#classdocs .item .params p,
      +    #classdocs .item .returns p,{
      +    display: inline;
      +}
      +
      +#classdocs .item em code, #classdocs .item em.comment {
      +    color: green;
      +}
      +
      +#classdocs .item em.comment a {
      +    color: green;
      +    text-decoration: underline;
      +}
      +
      +#classdocs .foundat {
      +    font-size: 11px;
      +    font-style: normal;
      +}
      +
      +.attrs .emits {
      +    margin-left: 2em;
      +    padding: .5em;
      +    border-left: 1px dashed #ccc;
      +}
      +
      +abbr {
      +    border-bottom: 1px dashed #ccc;
      +    font-size: 80%;
      +    cursor: help;
      +}
      +
      +.prettyprint li.L0, 
      +.prettyprint li.L1, 
      +.prettyprint li.L2, 
      +.prettyprint li.L3, 
      +.prettyprint li.L5, 
      +.prettyprint li.L6, 
      +.prettyprint li.L7, 
      +.prettyprint li.L8 {
      +    list-style: decimal;
      +}
      +
      +ul li p {
      +    margin-top: 0;
      +}
      +
      +.method .name {
      +    font-size: 110%;
      +}
      +
      +.apidocs .methods .extends .method,
      +.apidocs .properties .extends .property,
      +.apidocs .attrs .extends .attr,
      +.apidocs .events .extends .event {
      +    font-weight: bold;
      +}
      +
      +.apidocs .methods .extends .inherited,
      +.apidocs .properties .extends .inherited,
      +.apidocs .attrs .extends .inherited,
      +.apidocs .events .extends .inherited {
      +    font-weight: normal;
      +}
      +
      +#hd {
      +    background: whiteSmoke;
      +    background: -moz-linear-gradient(top,#DCDBD9 0,#F6F5F3 100%);
      +    background: -webkit-gradient(linear,left top,left bottom,color-stop(0%,#DCDBD9),color-stop(100%,#F6F5F3));
      +    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dcdbd9',endColorstr='#F6F5F3',GradientType=0);
      +    border-bottom: 1px solid #DFDFDF;
      +    padding: 0 15px 1px 20px;
      +    margin-bottom: 15px;
      +}
      +
      +#hd img {
      +    margin-right: 10px;
      +    vertical-align: middle;
      +}
      +
      +
      +/* -- API Docs CSS ---------------------------------------------------------- */
      +
      +/*
      +This file is organized so that more generic styles are nearer the top, and more
      +specific styles are nearer the bottom of the file. This allows us to take full
      +advantage of the cascade to avoid redundant style rules. Please respect this
      +convention when making changes.
      +*/
      +
      +/* -- Generic TabView styles ------------------------------------------------ */
      +
      +/*
      +These styles apply to all API doc tabviews. To change styles only for a
      +specific tabview, see the other sections below.
      +*/
      +
      +.yui3-js-enabled .apidocs .tabview {
      +    visibility: hidden; /* Hide until the TabView finishes rendering. */
      +    _visibility: visible;
      +}
      +
      +.apidocs .tabview.yui3-tabview-content { visibility: visible; }
      +.apidocs .tabview .yui3-tabview-panel { background: #fff; }
      +
      +/* -- Generic Content Styles ------------------------------------------------ */
      +
      +/* Headings */
      +h2, h3, h4, h5, h6 {
      +    border: none;
      +    color: #30418C;
      +    font-weight: bold;
      +    text-decoration: none;
      +}
      +
      +.link-docs {
      +    float: right;
      +    font-size: 15px;
      +    margin: 4px 4px 6px;
      +    padding: 6px 30px 5px;
      +}
      +
      +.apidocs { zoom: 1; }
      +
      +/* Generic box styles. */
      +.apidocs .box {
      +    border: 1px solid;
      +    border-radius: 3px;
      +    margin: 1em 0;
      +    padding: 0 1em;
      +}
      +
      +/* A flag is a compact, capsule-like indicator of some kind. It's used to
      +   indicate private and protected items, item return types, etc. in an
      +   attractive and unobtrusive way. */
      +.apidocs .flag {
      +    background: #bababa;
      +    border-radius: 3px;
      +    color: #fff;
      +    font-size: 11px;
      +    margin: 0 0.5em;
      +    padding: 2px 4px 1px;
      +}
      +
      +/* Class/module metadata such as "Uses", "Extends", "Defined in", etc. */
      +.apidocs .meta {
      +    background: #f9f9f9;
      +    border-color: #efefef;
      +    color: #555;
      +    font-size: 11px;
      +    padding: 3px 6px;
      +}
      +
      +.apidocs .meta p { margin: 0; }
      +
      +/* Deprecation warning. */
      +.apidocs .box.deprecated,
      +.apidocs .flag.deprecated {
      +    background: #fdac9f;
      +    border: 1px solid #fd7775;
      +}
      +
      +.apidocs .box.deprecated p { margin: 0.5em 0; }
      +.apidocs .flag.deprecated { color: #333; }
      +
      +/* Module/Class intro description. */
      +.apidocs .intro {
      +    background: #f0f1f8;
      +    border-color: #d4d8eb;
      +}
      +
      +/* Loading spinners. */
      +#bd.loading .apidocs,
      +#api-list.loading .yui3-tabview-panel {
      +    background: #fff url(../img/spinner.gif) no-repeat center 70px;
      +    min-height: 150px;
      +}
      +
      +#bd.loading .apidocs .content,
      +#api-list.loading .yui3-tabview-panel .apis {
      +    display: none;
      +}
      +
      +.apidocs .no-visible-items { color: #666; }
      +
      +/* Generic inline list. */
      +.apidocs ul.inline {
      +    display: inline;
      +    list-style: none;
      +    margin: 0;
      +    padding: 0;
      +}
      +
      +.apidocs ul.inline li { display: inline; }
      +
      +/* Comma-separated list. */
      +.apidocs ul.commas li:after { content: ','; }
      +.apidocs ul.commas li:last-child:after { content: ''; }
      +
      +/* Keyboard shortcuts. */
      +kbd .cmd { font-family: Monaco, Helvetica; }
      +
      +/* -- Generic Access Level styles ------------------------------------------- */
      +.apidocs .item.protected,
      +.apidocs .item.private,
      +.apidocs .index-item.protected,
      +.apidocs .index-item.deprecated,
      +.apidocs .index-item.private {
      +    display: none;
      +}
      +
      +.show-deprecated .item.deprecated,
      +.show-deprecated .index-item.deprecated,
      +.show-protected .item.protected,
      +.show-protected .index-item.protected,
      +.show-private .item.private,
      +.show-private .index-item.private {
      +    display: block;
      +}
      +
      +.hide-inherited .item.inherited,
      +.hide-inherited .index-item.inherited {
      +    display: none;
      +}
      +
      +/* -- Generic Item Index styles --------------------------------------------- */
      +.apidocs .index { margin: 1.5em 0 3em; }
      +
      +.apidocs .index h3 {
      +    border-bottom: 1px solid #efefef;
      +    color: #333;
      +    font-size: 13px;
      +    margin: 2em 0 0.6em;
      +    padding-bottom: 2px;
      +}
      +
      +.apidocs .index .no-visible-items { margin-top: 2em; }
      +
      +.apidocs .index-list {
      +    border-color: #efefef;
      +    font-size: 12px;
      +    list-style: none;
      +    margin: 0;
      +    padding: 0;
      +    -moz-column-count: 4;
      +    -moz-column-gap: 10px;
      +    -moz-column-width: 170px;
      +    -ms-column-count: 4;
      +    -ms-column-gap: 10px;
      +    -ms-column-width: 170px;
      +    -o-column-count: 4;
      +    -o-column-gap: 10px;
      +    -o-column-width: 170px;
      +    -webkit-column-count: 4;
      +    -webkit-column-gap: 10px;
      +    -webkit-column-width: 170px;
      +    column-count: 4;
      +    column-gap: 10px;
      +    column-width: 170px;
      +}
      +
      +.apidocs .no-columns .index-list {
      +    -moz-column-count: 1;
      +    -ms-column-count: 1;
      +    -o-column-count: 1;
      +    -webkit-column-count: 1;
      +    column-count: 1;
      +}
      +
      +.apidocs .index-item { white-space: nowrap; }
      +
      +.apidocs .index-item .flag {
      +    background: none;
      +    border: none;
      +    color: #afafaf;
      +    display: inline;
      +    margin: 0 0 0 0.2em;
      +    padding: 0;
      +}
      +
      +/* -- Generic API item styles ----------------------------------------------- */
      +.apidocs .args {
      +    display: inline;
      +    margin: 0 0.5em;
      +}
      +
      +.apidocs .flag.chainable { background: #46ca3b; }
      +.apidocs .flag.protected { background: #9b86fc; }
      +.apidocs .flag.private { background: #fd6b1b; }
      +.apidocs .flag.async { background: #356de4; }
      +.apidocs .flag.required { background: #e60923; }
      +
      +.apidocs .item {
      +    border-bottom: 1px solid #efefef;
      +    margin: 1.5em 0 2em;
      +    padding-bottom: 2em;
      +}
      +
      +.apidocs .item h4,
      +.apidocs .item h5,
      +.apidocs .item h6 {
      +    color: #333;
      +    font-family: inherit;
      +    font-size: 100%;
      +}
      +
      +.apidocs .item .description p,
      +.apidocs .item pre.code {
      +    margin: 1em 0 0;
      +}
      +
      +.apidocs .item .meta {
      +    background: none;
      +    border: none;
      +    padding: 0;
      +}
      +
      +.apidocs .item .name {
      +    display: inline;
      +    font-size: 14px;
      +}
      +
      +.apidocs .item .type,
      +.apidocs .item .type a,
      +.apidocs .returns-inline {
      +    color: #555;
      +}
      +
      +.apidocs .item .type,
      +.apidocs .returns-inline {
      +    font-size: 11px;
      +    margin: 0 0 0 0;
      +}
      +
      +.apidocs .item .type a { border-bottom: 1px dotted #afafaf; }
      +.apidocs .item .type a:hover { border: none; }
      +
      +/* -- Item Parameter List --------------------------------------------------- */
      +.apidocs .params-list {
      +    list-style: square;
      +    margin: 1em 0 0 2em;
      +    padding: 0;
      +}
      +
      +.apidocs .param { margin-bottom: 1em; }
      +
      +.apidocs .param .type,
      +.apidocs .param .type a {
      +    color: #666;
      +}
      +
      +.apidocs .param .type {
      +    margin: 0 0 0 0.5em;
      +    *margin-left: 0.5em;
      +}
      +
      +.apidocs .param-name { font-weight: bold; }
      +
      +/* -- Item "Emits" block ---------------------------------------------------- */
      +.apidocs .item .emits {
      +    background: #f9f9f9;
      +    border-color: #eaeaea;
      +}
      +
      +/* -- Item "Returns" block -------------------------------------------------- */
      +.apidocs .item .returns .type,
      +.apidocs .item .returns .type a {
      +    font-size: 100%;
      +    margin: 0;
      +}
      +
      +/* -- Class Constructor block ----------------------------------------------- */
      +.apidocs .constructor .item {
      +    border: none;
      +    padding-bottom: 0;
      +}
      +
      +/* -- File Source View ------------------------------------------------------ */
      +.apidocs .file pre.code,
      +#doc .apidocs .file pre.prettyprint {
      +    background: inherit;
      +    border: none;
      +    overflow: visible;
      +    padding: 0;
      +}
      +
      +.apidocs .L0,
      +.apidocs .L1,
      +.apidocs .L2,
      +.apidocs .L3,
      +.apidocs .L4,
      +.apidocs .L5,
      +.apidocs .L6,
      +.apidocs .L7,
      +.apidocs .L8,
      +.apidocs .L9 {
      +    background: inherit;
      +}
      +
      +/* -- Submodule List -------------------------------------------------------- */
      +.apidocs .module-submodule-description {
      +    font-size: 12px;
      +    margin: 0.3em 0 1em;
      +}
      +
      +.apidocs .module-submodule-description p:first-child { margin-top: 0; }
      +
      +/* -- Sidebar TabView ------------------------------------------------------- */
      +#api-tabview { margin-top: 0.6em; }
      +
      +#api-tabview-filter,
      +#api-tabview-panel {
      +    border: 1px solid #dfdfdf;
      +}
      +
      +#api-tabview-filter {
      +    border-bottom: none;
      +    border-top: none;
      +    padding: 0.6em 10px 0 10px;
      +}
      +
      +#api-tabview-panel { border-top: none; }
      +#api-filter { width: 97%; }
      +
      +/* -- Content TabView ------------------------------------------------------- */
      +#classdocs .yui3-tabview-panel { border: none; }
      +
      +/* -- Source File Contents -------------------------------------------------- */
      +.prettyprint li.L0,
      +.prettyprint li.L1,
      +.prettyprint li.L2,
      +.prettyprint li.L3,
      +.prettyprint li.L5,
      +.prettyprint li.L6,
      +.prettyprint li.L7,
      +.prettyprint li.L8 {
      +    list-style: decimal;
      +}
      +
      +/* -- API options ----------------------------------------------------------- */
      +#api-options {
      +    font-size: 11px;
      +    margin-top: 2.2em;
      +    position: absolute;
      +    right: 1.5em;
      +}
      +
      +/*#api-options label { margin-right: 0.6em; }*/
      +
      +/* -- API list -------------------------------------------------------------- */
      +#api-list {
      +    margin-top: 1.5em;
      +    *zoom: 1;
      +}
      +
      +.apis {
      +    font-size: 12px;
      +    line-height: 1.4;
      +    list-style: none;
      +    margin: 0;
      +    padding: 0.5em 0 0.5em 0.4em;
      +}
      +
      +.apis a {
      +    border: 1px solid transparent;
      +    display: block;
      +    margin: 0 0 0 -4px;
      +    padding: 1px 4px 0;
      +    text-decoration: none;
      +    _border: none;
      +    _display: inline;
      +}
      +
      +.apis a:hover,
      +.apis a:focus {
      +    background: #E8EDFC;
      +    background: -moz-linear-gradient(top, #e8edfc 0%, #becef7 100%);
      +    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#E8EDFC), color-stop(100%,#BECEF7));
      +    border-color: #AAC0FA;
      +    border-radius: 3px;
      +    color: #333;
      +    outline: none;
      +}
      +
      +.api-list-item a:hover,
      +.api-list-item a:focus {
      +    font-weight: bold;
      +    text-shadow: 1px 1px 1px #fff;
      +}
      +
      +.apis .message { color: #888; }
      +.apis .result a { padding: 3px 5px 2px; }
      +
      +.apis .result .type {
      +    right: 4px;
      +    top: 7px;
      +}
      +
      +.api-list-item .yui3-highlight {
      +    font-weight: bold;
      +}
      +
      diff --git a/themes/default/assets/favicon.ico b/themes/default/assets/favicon.ico
      new file mode 100644
      index 0000000000000000000000000000000000000000..414ac4fb9e145171ae8f660e51879e18c401e653
      GIT binary patch
      literal 5430
      zcmdT|c~n&A6@SF^c=}JZwQU+rgHaP#WKr3f0cL=KVVglvkVQZiQDfDk(FA2t0)iWh
      zY=W#JA~S%vRZzjDF`C4MRAU4c7u+h2MgbA{^?q-_;)qB%w&!%tx#zw2&G&uxzWd$#
      zyTAK5PK$ew8$O()>u4_YeUAH#<G9hI)z8H=zKO;r&=}p)4D~o&IF80Oe*n1t<Z1K6
      zKRmqA_(^|rH2-`0;NGZn%A!TPmIm)%XRdcU$xV71U0qt5^ZI&jI#cUW7Akv~AvMGX
      z!4yR3kHKn#@hz%5O(Xl7uQ~Q@VS0>Wt}S-?OOYwFzy>RQteQ9yKUN)d(VW}sS?gZ?
      zPx|>Q!Vau3)9EakCq-qL90hZ1ks>ulgswI!)`q9{n*WN=S|2z6sbrBy(?+QgBE*JB
      zlnJnZksB2AoRK}#3JJogNS28kUOaCb+SeXkot@mC@Q@R^-quL*5MiyIF?RYpVBbPF
      z?DVronzI>VjK-tk)Cp_N^|bcAW9b_=#|x%(<@s2lFu)#3Gp(_~*#hPBT~HA!L*8sL
      z5-cX6B63B6=K7xxlrGM9x4<?xOKf#A!47{B3TTflZe)wQ6)G3Vu{+QS87^i>v^V+X
      z@!h76dhelXtk*db8Fs$J#|HUcwzQ80?IA{iKik6!8Kj%}a)*xu8-<f`EHf#(_j-2U
      z`sl%5j>j)QTIwf8F}-ijENc|feZIeh-y_r024x{G$d+3m-A#1A<x%qp%{@BW+lF2!
      zO5Ic*<bd6NcKq4pdyA1v_v~HLJZSH^4oDK~;&@i_Yc}-kcdzb@P0hN`zhyC0<RwC`
      zrwH4<Y<N31xeDq1gvgKy9;=#eecZD~^V<31#rusX4|yMpTXtL#=-8PfH={E&!3KLH
      zthF`7*MiB|8?}75=DNO~RgG7s{(MmJw_}M>#mc4rKV*4JZ^cW^A4gm2x16n1`1ZBt
      zO=A=*TCJ+)5vp5_WA9%1Y4U@{YvUl~xHfH$Q*}!uT_cBaTn!1wWT;vqhtL>_N{i-`
      zfQE5hjWeU^-jamj5&vVrqw#x_P5&?BEJq*RzBTINkt&-zmoH8FU)Zf`y7|$CeM+xA
      z(W}x^+#S9n9DFkWk3*qYvohtsrN85O+mNd#4m%%+URIj!DtH`gG9FO|pJ4UW(O5P4
      zV=U1gfmAQ~(RZ!C<9X}QhQpQqhr&a@FPv?KZLX$BC)`V-oY`Qlj~LU*h?w>%R!kU$
      zNMoJ*&mJ`of0s5qz27vdJlL^Q8R!6IkPDAj+X?^DoJ_IBb_Ui9bg|ZGBEogYVA<FY
      zP=D&A#k<tc_Bxrc;z-#%2UN^wnCnP*YJ+WZ0bheQiVP5Iu7ju<pJD0f5vWSp{N+2-
      z-v#c6!-wn(!aUDchB{#n;dNPvD_?tZW{HsQVvZz<ArdV0u+C%>R!$g+%(=6w-i7}9
      zGv5f)!~Cij>W#&6W2#YMu2gemybnsLeinM$A#0{3QXNgO*=9Q81XB??Z5*PFr>LIX
      zzxU_C+R*w~HLNN*HaX7TxO0uAF21swh9$;2*fv{4wOdX;U^d8j9+BrM=D9?2cPxHw
      zHko|zA<plwm^m2z&5c(klrEW5mnt(uvbzWyTm)DrF~KUK0V2gSNVf~sOc{R;%3xO%
      z`AV?egK8M%1B=CYp)SIw{1qiD7v~RF|Be8gmONh@WP3}9a}Ylu8`hEyD+LC~q%+^Y
      zkbFSzuZ~406!5iOsE$SPG{hKBK)l%KZj0*Cu))}HxmqzV-$#J_xsq-hM7#~r#C;;j
      z2c<zy*h_KH6N|-u4#*|DGF-c3(Mk_%rfQ?^V5R)m>hEZ8A5t0fRZ5n-33diaUb7+6
      z#t55SEV}ipZBPWMV=<e>B4GlH#pvl{v2#gq*{{)09Pl?4tC#GInl=Ur)_N!k6r*Tf
      z-!^1Z{_k6;)?X1SM@fJq)UimI;9yMos7v{v`|RP3>)Hdcp{uiltBw!PPb3bMOuRP1
      z+JLTx*cC!tXPzDJhb%rGM2IK;$YQcMK&tiwVG@rCzQoTc78y1t+8H96-lKL~@~XG$
      zC;oq7cg~l&Zsy1(PRRIXs*@Qu*~~zO+!Q6DcGwYUhdhdh9vkAE%(33l9Lf-9-Ub$n
      zrNl)UFV7+#wpD6E+*${zGi|T5x3=`jt$XYuo;t2P)VW1TamD<|aE0YmhN}e<B}T}e
      zW%0TVl$&v+f3r+Tama8<j&kDDj7PF}U~7}?4H0AbDe4YXc=YJ%>&iIc<$cAAl>WBF
      z$z7occH!}rohRdzDN<A9%od;|MC}Kb7t9X~A7aUd6zU@wCRBz|U(sEkvb*b30`*CG
      zL7pcWzw1kP?=iArp)!DMAfK{#DWN*k<BK%H`JCB8><YH!&qC9NH1Zeo0Xqlg!<Y4m
      zVlmEiBI^HfOw?P~o9?e3t@J4macn6MmUd$t`GS0!M?621e7${^5XC|2n9TDdKg_XH
      z`$1}sG{S(r>>NU5uhb{jD;6&f{QH}9YL4GIf68+I(%Fs506Vfl#`}WRT;>br*K7|<
      z6b0C*^P;y6j%G-u9*yA=j|nUm2@|$bKCvF`+L>?6HFdq|`IkF4v}<FRR4L|)DJEQA
      z@db;oY<Ei(_=^6Mo8*Ti77tRY8x#-h{B|=;pt+gUb8fWM!OqY9tGl|oUg=NYq@Rs<
      zv_Bv6<L<206~WTBvOq~MUpT4b!rdA<p45*~+_HWwYmVfl4Xht3p?qXL8_$)TO%YFh
      z=H=RIhyHZ-_1}X_=ZtFBEviva??^n1cz_&A%8{O2%l5EBuD9qVKJa-#@eoJ8$R)oN
      zF`htqv_-6k9Dld73}^e&)8AO<i}v^G4=I8UF86L=XHp*QL_IY5nBK7`N3tj`w$CA6
      zM*5fy3?Ep{+A6n1em75uH=l^p#d!<*)79U9ZK~$qUo6l2;^1<h28BQMzVtmp8SKpa
      zg5gCLVP_`ATn6Pr5}nU_!s-aBS#kEJ$Rr=6Iv63v$@~HJsH6JR^S1w<KT-Xzp}NAq
      zCT4Lh;l+zmKl-lXYllLLc^*3{=28hW5~)@)oMtwxww{5F4kp-SIR#Ybir=PVK>t%b
      zH#c0;xmcFBvNm?v(TW8#n|F9wBU@&QH2UU}BAJfOw$l+$H969H8dh59VYN`7xatI4
      z*sJgvkPga)fzEsO;O>V_XHSXilm*Lcw?yStd=Y%2FhF)K)6H77MPm3omN;rS^$N@M
      z#vn?d_vB{XIsJj|J=l5et<Qe@^k4TsXuffET+=_#PrrHYJChq{&zN5Q{<O)XJGTe)
      z?QF2R2e^)=Z3fziF4mB6RIZsss;?c~5U5D5^P)xfT6C|48v4w@ggz%kbc>Llh1W?`
      c9H-qz(m`J;Xu?oLlCTZhNI;9}q1!h68y;F)#sB~S
      
      literal 0
      HcmV?d00001
      
      diff --git a/themes/default/assets/img/spinner.gif b/themes/default/assets/img/spinner.gif
      new file mode 100644
      index 0000000000000000000000000000000000000000..44f96ba68c8910d19f49e8365bf589ee4e6991e4
      GIT binary patch
      literal 2685
      zcmeH{YfzJC8iv0w0RzSmAjy&hC;`H$F$shaAO<od`S>6#w1ZBuqOP1eV&xzQwK$cK
      zkb?<_1QC!z6+{~vj><7mpp+3&q{5Dt1$U9<3{C|V26e`6+}0U?@ONkSN8g|C`^+=f
      zec#XX!r`F-fpJ8D2y6j>udlD4pC5<AiH(gtdh}>oT3UK~dPYWuR4SFpWW~kBI-Ty)
      zrAvCf-e52^Ha2#4cJ}o23=R&CjEszqjy`(yXliO|W@ct?Ztm&Rr_Y~1-`w1M{ra`P
      zzkftTL}X-Se0+RDLPBO{W_EUVPEL+SqbVvXDlILot*vcoY3b|h8y+6Md-v|chYzQx
      zr)Otp7Z(>-R#u)pd$zv5zO}Wry}hkaD7w13`uqDQCnp;k8k(A#mX?;**48#QHr~8>
      zlai8BUtizc+}zvSJ3l}F;>C+2M~>XPckkuPmqw%U)vH&B4<82pkB{?j=qTvGeqqR`
      z5R2iB1Wl->t8k$(8WzAl-af1_0N4}u*W}bRgf#%9q-JH99w-MtKSV)|0SLen*ai3i
      zKwLs*dgT7l1Mh@}LqbZXsptdIrmkC${_G3<>BH|s@jv$AEj=<WF^LlY6(u4gE;BhL
      zIU|k|m2@KEc+%-OiszX#XBa2b;u4cnzer=GCS`d6&aceC-GC#o_Z{84e+e+JIOb85
      znEdS*?htuZec8qg-YSW`ovrgm>AulRJ-t~vQzbstTBdj1f9x+OI}c{HEGJTIo)-S3
      zvXu@V5Ze5s?o^rjP2oAJZBgJ43EeZab1q+7T3AZ*>`$M~Ip=VyAkWdBfV0!N;IWlu
      zD(gxt-qC?f-Y0OdwW^d52?XMe&uMsja#IsM*&(x|vpcV`xxBXSr!40`V8IVychwC@
      z(!=(Wi*J)OEFo9!i_1H9B3S81`;tp(L9|zFZVRfT#e-Mxsdc=o%{qm6GUnDq8#@+w
      z>zp9;^*C*b0a>)OpldGR<O6#t@SzyTT&f@J`!N<@1+g(M?%tt(-rlt_^?R|{y^T#m
      zpVn4=yQs6v*dy?3x!E@GeZv6k$6~TZMBelXX^$Ucg3kO|z?>YLW-}Rgrhi;mT3&%e
      zb^^cg9z2rK8N!u+qrAU$JXq=Q<ycwRWCj=&IyV}YijR`7H6{|}qP06Z-mjM;6Q&+u
      z-&%eqviCoO#ew#OuRwGz5=DaX3cFB$v)nxnust1TR|PrvqcJ6+<ir?|6cC_~BWj4X
      zVI&j)pbTUJU1JFIHyQ&3eHy|bJY;kn7Th8bV@T#ko#^|HB>$F%*?-T?FD#nCSJ%RJ
      zM8EzX-KiKhdEPdX+W9(2!>6Tj7tGHG(@GXIHcI#ZvuG)z`cvk-VdBK*c|$UxeEHgt
      zh|eHoo#Hc@pK-so^azG|S%hK;SFlf#7sO=2{OEwvn5bYJuJ)RU<z{B)uCE7aW=NzN
      zzEwnPZ^U&A4IRz>!t37+vAHhjqeCDD7^hxtbsYzs?)RgAac-&SQ9q*ejs5N9;>zmK
      zPUNUo2`H82%N0r`1gQ%0iFCS%U#Nn#S`7$YER~j(tMN9rtZI;7tOElDR#vuErF^v%
      z*JNdL`G(A{(F)h2u*1<?f6Rvh1C7H_2!~@e+C%49Sa9ryr4J`Lfzy>gkN>^r%0ek*
      zgATbqYlGa_bGv|KZA}7qZy-^>7P2IOH6RK_p0{{FP*Z?`0Sgup2zfAw7b+2os*;)q
      z+5#lPY#aSu@*Qn1b)Pw6htWZ`zgMBUpw<*<ObYlS1~W`6529Bx%kxE*bVhMC$hs=3
      zld+gV_3{$twK_fxi-m8Ni#o7g`Z{JWw!fMWcXTzCh`OaBcNa`qGamafS;?mYfFnkM
      z=U7^L-3LWZj{#RcnMPxQ*f|b*Qck9<Zn=db-N*;1*2?%pHLet%cKOuM4B!g0>kdk!
      zI2X()g6*)r9wu>OjUHjg4XG}it7AJ{SYC~${GkN#!S<pI62$L${8vd~QL$E6a<NoJ
      z5{8os#1NEELV=)prCMalNoH&MIl*u>q}P9oXlOJoAHCyhZJk<7)Dy2%T-Q`9NtoT?
      zY$ef_KCTe&F^x^D+|KF=eiSu@+>KzjBXCcw!o>=<#ex+Z!{Kbw1y5|(6?AL-F>Q@`
      zuo>r&XN^`QxOtZJWT7R`yM{vkjX0hzY5o_L9GG#?(B^5qQxb*`lhBZP;sO;+aia2c
      zCaZudbVWYTsS0qtA`?@uVQ$EHXcr9BK!#y*gOuzZfplYa;d_x0w1J4;p)O;uTj$;O
      zv99g_E?%o3GlPCna4l!>3Kn6$TmgB^SaLxzk9U(vpJzOlL7uAtVwlUNiF4YB+lX<^
      pE|2Kr%d?-r>ImN9F0EXz^8E;tU2&^Zb%igPc${)^%gY+r_aA#xUsC`8
      
      literal 0
      HcmV?d00001
      
      diff --git a/themes/default/assets/index.html b/themes/default/assets/index.html
      new file mode 100644
      index 00000000..487fe15b
      --- /dev/null
      +++ b/themes/default/assets/index.html
      @@ -0,0 +1,10 @@
      +<!doctype html>
      +<html>
      +    <head>
      +        <title>Redirector</title>
      +        <meta http-equiv="refresh" content="0;url=../">
      +    </head>
      +    <body>
      +        <a href="../">Click here to redirect</a>
      +    </body>
      +</html>
      diff --git a/themes/default/assets/js/api-filter.js b/themes/default/assets/js/api-filter.js
      new file mode 100644
      index 00000000..d442e543
      --- /dev/null
      +++ b/themes/default/assets/js/api-filter.js
      @@ -0,0 +1,56 @@
      +YUI.add('api-filter', function (Y) {
      +
      +Y.APIFilter = Y.Base.create('apiFilter', Y.Base, [Y.AutoCompleteBase], {
      +    // -- Initializer ----------------------------------------------------------
      +    initializer: function () {
      +        this._bindUIACBase();
      +        this._syncUIACBase();
      +    },
      +    getDisplayName: function(name) {
      +
      +        Y.each(Y.YUIDoc.meta.allModules, function(i) {
      +            if (i.name === name && i.displayName) {
      +                name = i.displayName;
      +            }
      +        });
      +
      +        if (this.get('queryType') === 'elements') {
      +            name = '&lt;' + name + '&gt;';
      +        }
      +
      +        return name;
      +    }
      +
      +}, {
      +    // -- Attributes -----------------------------------------------------------
      +    ATTRS: {
      +        resultHighlighter: {
      +            value: 'phraseMatch'
      +        },
      +
      +        // May be set to "classes", "elements" or "modules".
      +        queryType: {
      +            value: 'classes'
      +        },
      +
      +        source: {
      +            valueFn: function() {
      +                var self = this;
      +                return function(q) {
      +                    var data = Y.YUIDoc.meta[self.get('queryType')],
      +                        out = [];
      +                    Y.each(data, function(v) {
      +                        if (v.toLowerCase().indexOf(q.toLowerCase()) > -1) {
      +                            out.push(v);
      +                        }
      +                    });
      +                    return out;
      +                };
      +            }
      +        }
      +    }
      +});
      +
      +}, '3.4.0', {requires: [
      +    'autocomplete-base', 'autocomplete-highlighters', 'autocomplete-sources'
      +]});
      diff --git a/themes/default/assets/js/api-list.js b/themes/default/assets/js/api-list.js
      new file mode 100644
      index 00000000..e8f650d5
      --- /dev/null
      +++ b/themes/default/assets/js/api-list.js
      @@ -0,0 +1,255 @@
      +YUI.add('api-list', function (Y) {
      +
      +var Lang   = Y.Lang,
      +    YArray = Y.Array,
      +
      +    APIList = Y.namespace('APIList'),
      +
      +    classesNode    = Y.one('#api-classes'),
      +    elementsNode   = Y.one('#api-elements'),
      +    inputNode      = Y.one('#api-filter'),
      +    modulesNode    = Y.one('#api-modules'),
      +    tabviewNode    = Y.one('#api-tabview'),
      +
      +    tabs = APIList.tabs = {},
      +
      +    filter = APIList.filter = new Y.APIFilter({
      +        inputNode : inputNode,
      +        maxResults: 1000,
      +
      +        on: {
      +            results: onFilterResults
      +        }
      +    }),
      +
      +    search = APIList.search = new Y.APISearch({
      +        inputNode : inputNode,
      +        maxResults: 100,
      +
      +        on: {
      +            clear  : onSearchClear,
      +            results: onSearchResults
      +        }
      +    }),
      +
      +    tabview = APIList.tabview = new Y.TabView({
      +        srcNode  : tabviewNode,
      +        panelNode: '#api-tabview-panel',
      +        render   : true,
      +
      +        on: {
      +            selectionChange: onTabSelectionChange
      +        }
      +    }),
      +
      +    focusManager = APIList.focusManager = tabviewNode.plug(Y.Plugin.NodeFocusManager, {
      +        circular   : true,
      +        descendants: '#api-filter, .yui3-tab-panel-selected .api-list-item a, .yui3-tab-panel-selected .result a',
      +        keys       : {next: 'down:40', previous: 'down:38'}
      +    }).focusManager,
      +
      +    LIST_ITEM_TEMPLATE =
      +        '<li class="api-list-item {typeSingular}">' +
      +            '<a href="{rootPath}{typePlural}/{name}.html">{displayName}</a>' +
      +        '</li>';
      +
      +// -- Init ---------------------------------------------------------------------
      +
      +// Duckpunch FocusManager's key event handling to prevent it from handling key
      +// events when a modifier is pressed.
      +Y.before(function (e, activeDescendant) {
      +    if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {
      +        return new Y.Do.Prevent();
      +    }
      +}, focusManager, '_focusPrevious', focusManager);
      +
      +Y.before(function (e, activeDescendant) {
      +    if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {
      +        return new Y.Do.Prevent();
      +    }
      +}, focusManager, '_focusNext', focusManager);
      +
      +// Create a mapping of tabs in the tabview so we can refer to them easily later.
      +tabview.each(function (tab, index) {
      +    var name = tab.get('label').toLowerCase();
      +
      +    tabs[name] = {
      +        index: index,
      +        name : name,
      +        tab  : tab
      +    };
      +});
      +
      +// Switch tabs on Ctrl/Cmd-Left/Right arrows.
      +tabviewNode.on('key', onTabSwitchKey, 'down:37,39');
      +
      +// Focus the filter input when the `/` key is pressed.
      +Y.one(Y.config.doc).on('key', onSearchKey, 'down:83');
      +
      +// Keep the Focus Manager up to date.
      +inputNode.on('focus', function () {
      +    focusManager.set('activeDescendant', inputNode);
      +});
      +
      +// Update all tabview links to resolved URLs.
      +tabview.get('panelNode').all('a').each(function (link) {
      +    link.setAttribute('href', link.get('href'));
      +});
      +
      +// -- Private Functions --------------------------------------------------------
      +function getFilterResultNode() {
      +    var queryType = filter.get('queryType');
      +    return queryType === 'classes' ? classesNode
      +            : queryType === 'elements' ? elementsNode : modulesNode;
      +}
      +
      +// -- Event Handlers -----------------------------------------------------------
      +function onFilterResults(e) {
      +    var frag         = Y.one(Y.config.doc.createDocumentFragment()),
      +        resultNode   = getFilterResultNode(),
      +        typePlural   = filter.get('queryType'),
      +        typeSingular = typePlural === 'classes' ? 'class' : typePlural === 'elements' ? 'element' : 'module';
      +
      +    if (e.results.length) {
      +        YArray.each(e.results, function (result) {
      +            frag.append(Lang.sub(LIST_ITEM_TEMPLATE, {
      +                rootPath    : APIList.rootPath,
      +                displayName : filter.getDisplayName(result.highlighted),
      +                name        : result.text,
      +                typePlural  : typePlural,
      +                typeSingular: typeSingular
      +            }));
      +        });
      +    } else {
      +        frag.append(
      +            '<li class="message">' +
      +                'No ' + typePlural + ' found.' +
      +            '</li>'
      +        );
      +    }
      +
      +    resultNode.empty(true);
      +    resultNode.append(frag);
      +
      +    focusManager.refresh();
      +}
      +
      +function onSearchClear(e) {
      +
      +    focusManager.refresh();
      +}
      +
      +function onSearchKey(e) {
      +    var target = e.target;
      +
      +    if (target.test('input,select,textarea')
      +            || target.get('isContentEditable')) {
      +        return;
      +    }
      +
      +    e.preventDefault();
      +
      +    inputNode.focus();
      +    focusManager.refresh();
      +}
      +
      +function onSearchResults(e) {
      +    var frag = Y.one(Y.config.doc.createDocumentFragment());
      +
      +    if (e.results.length) {
      +        YArray.each(e.results, function (result) {
      +            frag.append(result.display);
      +        });
      +    } else {
      +        frag.append(
      +            '<li class="message">' +
      +                'No results found. Maybe you\'ll have better luck with a ' +
      +                'different query?' +
      +            '</li>'
      +        );
      +    }
      +
      +
      +    focusManager.refresh();
      +}
      +
      +function onTabSelectionChange(e) {
      +    var tab  = e.newVal,
      +        name = tab.get('label').toLowerCase();
      +
      +    tabs.selected = {
      +        index: tab.get('index'),
      +        name : name,
      +        tab  : tab
      +    };
      +
      +    switch (name) {
      +    case 'elements':// fallthru
      +    case 'classes': // fallthru
      +    case 'modules':
      +        filter.setAttrs({
      +            minQueryLength: 0,
      +            queryType     : name
      +        });
      +
      +        search.set('minQueryLength', -1);
      +
      +        // Only send a request if this isn't the initially-selected tab.
      +        if (e.prevVal) {
      +            filter.sendRequest(filter.get('value'));
      +        }
      +        break;
      +
      +    case 'everything':
      +        filter.set('minQueryLength', -1);
      +        search.set('minQueryLength', 1);
      +
      +        if (search.get('value')) {
      +            search.sendRequest(search.get('value'));
      +        } else {
      +            inputNode.focus();
      +        }
      +        break;
      +
      +    default:
      +        // WTF? We shouldn't be here!
      +        filter.set('minQueryLength', -1);
      +        search.set('minQueryLength', -1);
      +    }
      +
      +    if (focusManager) {
      +        setTimeout(function () {
      +            focusManager.refresh();
      +        }, 1);
      +    }
      +}
      +
      +function onTabSwitchKey(e) {
      +    var currentTabIndex = tabs.selected.index;
      +
      +    if (!(e.ctrlKey || e.metaKey)) {
      +        return;
      +    }
      +
      +    e.preventDefault();
      +
      +    switch (e.keyCode) {
      +    case 37: // left arrow
      +        if (currentTabIndex > 0) {
      +            tabview.selectChild(currentTabIndex - 1);
      +            inputNode.focus();
      +        }
      +        break;
      +
      +    case 39: // right arrow
      +        if (currentTabIndex < (Y.Object.size(tabs) - 2)) {
      +            tabview.selectChild(currentTabIndex + 1);
      +            inputNode.focus();
      +        }
      +        break;
      +    }
      +}
      +
      +}, '3.4.0', {requires: [
      +    'api-filter', 'api-search', 'event-key', 'node-focusmanager', 'tabview'
      +]});
      diff --git a/themes/default/assets/js/api-search.js b/themes/default/assets/js/api-search.js
      new file mode 100644
      index 00000000..175f6a61
      --- /dev/null
      +++ b/themes/default/assets/js/api-search.js
      @@ -0,0 +1,98 @@
      +YUI.add('api-search', function (Y) {
      +
      +var Lang   = Y.Lang,
      +    Node   = Y.Node,
      +    YArray = Y.Array;
      +
      +Y.APISearch = Y.Base.create('apiSearch', Y.Base, [Y.AutoCompleteBase], {
      +    // -- Public Properties ----------------------------------------------------
      +    RESULT_TEMPLATE:
      +        '<li class="result {resultType}">' +
      +            '<a href="{url}">' +
      +                '<h3 class="title">{name}</h3>' +
      +                '<span class="type">{resultType}</span>' +
      +                '<div class="description">{description}</div>' +
      +                '<span class="className">{class}</span>' +
      +            '</a>' +
      +        '</li>',
      +
      +    // -- Initializer ----------------------------------------------------------
      +    initializer: function () {
      +        this._bindUIACBase();
      +        this._syncUIACBase();
      +    },
      +
      +    // -- Protected Methods ----------------------------------------------------
      +    _apiResultFilter: function (query, results) {
      +        // Filter components out of the results.
      +        return YArray.filter(results, function (result) {
      +            return result.raw.resultType === 'component' ? false : result;
      +        });
      +    },
      +
      +    _apiResultFormatter: function (query, results) {
      +        return YArray.map(results, function (result) {
      +            var raw  = Y.merge(result.raw), // create a copy
      +                desc = raw.description || '';
      +
      +            // Convert description to text and truncate it if necessary.
      +            desc = Node.create('<div>' + desc + '</div>').get('text');
      +
      +            if (desc.length > 65) {
      +                desc = Y.Escape.html(desc.substr(0, 65)) + ' &hellip;';
      +            } else {
      +                desc = Y.Escape.html(desc);
      +            }
      +
      +            raw['class'] || (raw['class'] = '');
      +            raw.description = desc;
      +
      +            // Use the highlighted result name.
      +            raw.name = result.highlighted;
      +
      +            return Lang.sub(this.RESULT_TEMPLATE, raw);
      +        }, this);
      +    },
      +
      +    _apiTextLocator: function (result) {
      +        return result.displayName || result.name;
      +    }
      +}, {
      +    // -- Attributes -----------------------------------------------------------
      +    ATTRS: {
      +        resultFormatter: {
      +            valueFn: function () {
      +                return this._apiResultFormatter;
      +            }
      +        },
      +
      +        resultFilters: {
      +            valueFn: function () {
      +                return this._apiResultFilter;
      +            }
      +        },
      +
      +        resultHighlighter: {
      +            value: 'phraseMatch'
      +        },
      +
      +        resultListLocator: {
      +            value: 'data.results'
      +        },
      +
      +        resultTextLocator: {
      +            valueFn: function () {
      +                return this._apiTextLocator;
      +            }
      +        },
      +
      +        source: {
      +            value: '/api/v1/search?q={query}&count={maxResults}'
      +        }
      +    }
      +});
      +
      +}, '3.4.0', {requires: [
      +    'autocomplete-base', 'autocomplete-highlighters', 'autocomplete-sources',
      +    'escape'
      +]});
      diff --git a/themes/default/assets/js/apidocs.js b/themes/default/assets/js/apidocs.js
      new file mode 100644
      index 00000000..af9ac322
      --- /dev/null
      +++ b/themes/default/assets/js/apidocs.js
      @@ -0,0 +1,376 @@
      +YUI().use(
      +    'yuidoc-meta',
      +    'api-list', 'history-hash', 'node-screen', 'node-style', 'pjax',
      +function (Y) {
      +
      +var win          = Y.config.win,
      +    localStorage = win.localStorage,
      +
      +    bdNode = Y.one('#bd'),
      +
      +    pjax,
      +    defaultRoute,
      +
      +    classTabView,
      +    selectedTab;
      +
      +// Kill pjax functionality unless serving over HTTP.
      +if (!Y.getLocation().protocol.match(/^https?\:/)) {
      +    Y.Router.html5 = false;
      +}
      +
      +// Create the default route with middleware which enables syntax highlighting
      +// on the loaded content.
      +defaultRoute = Y.Pjax.defaultRoute.concat(function (req, res, next) {
      +    prettyPrint();
      +    bdNode.removeClass('loading');
      +
      +    next();
      +});
      +
      +pjax = new Y.Pjax({
      +    container      : '#docs-main',
      +    contentSelector: '#docs-main > .content',
      +    linkSelector   : '#bd a',
      +    titleSelector  : '#xhr-title',
      +
      +    navigateOnHash: true,
      +    root          : '/',
      +    routes        : [
      +        // -- / ----------------------------------------------------------------
      +        {
      +            path     : '/(index.html)?',
      +            callbacks: defaultRoute
      +        },
      +
      +        // -- /elements/* -------------------------------------------------------
      +        {
      +            path     : '/elements/:element.html*',
      +            callbacks: defaultRoute
      +        },
      +
      +        // -- /classes/* -------------------------------------------------------
      +        {
      +            path     : '/classes/:class.html*',
      +            callbacks: [defaultRoute, 'handleClasses']
      +        },
      +
      +        // -- /files/* ---------------------------------------------------------
      +        {
      +            path     : '/files/*file',
      +            callbacks: [defaultRoute, 'handleFiles']
      +        },
      +
      +        // -- /modules/* -------------------------------------------------------
      +        {
      +            path     : '/modules/:module.html*',
      +            callbacks: defaultRoute
      +        }
      +    ]
      +});
      +
      +// -- Utility Functions --------------------------------------------------------
      +
      +pjax.checkVisibility = function (tab) {
      +    tab || (tab = selectedTab);
      +
      +    if (!tab) { return; }
      +
      +    var panelNode = tab.get('panelNode'),
      +        visibleItems;
      +
      +    // If no items are visible in the tab panel due to the current visibility
      +    // settings, display a message to that effect.
      +    visibleItems = panelNode.all('.item,.index-item').some(function (itemNode) {
      +        if (itemNode.getComputedStyle('display') !== 'none') {
      +            return true;
      +        }
      +    });
      +
      +    panelNode.all('.no-visible-items').remove();
      +
      +    if (!visibleItems) {
      +        if (Y.one('#index .index-item')) {
      +            panelNode.append(
      +                '<div class="no-visible-items">' +
      +                    '<p>' +
      +                    'Some items are not shown due to the current visibility ' +
      +                    'settings. Use the checkboxes at the upper right of this ' +
      +                    'page to change the visibility settings.' +
      +                    '</p>' +
      +                '</div>'
      +            );
      +        } else {
      +            panelNode.append(
      +                '<div class="no-visible-items">' +
      +                    '<p>' +
      +                    'This class doesn\'t provide any methods, properties, ' +
      +                    'attributes, or events.' +
      +                    '</p>' +
      +                '</div>'
      +            );
      +        }
      +    }
      +
      +    // Hide index sections without any visible items.
      +    Y.all('.index-section').each(function (section) {
      +        var items        = 0,
      +            visibleItems = 0;
      +
      +        section.all('.index-item').each(function (itemNode) {
      +            items += 1;
      +
      +            if (itemNode.getComputedStyle('display') !== 'none') {
      +                visibleItems += 1;
      +            }
      +        });
      +
      +        section.toggleClass('hidden', !visibleItems);
      +        section.toggleClass('no-columns', visibleItems < 4);
      +    });
      +};
      +
      +pjax.initClassTabView = function () {
      +    if (!Y.all('#classdocs .api-class-tab').size()) {
      +        return;
      +    }
      +
      +    if (classTabView) {
      +        classTabView.destroy();
      +        selectedTab = null;
      +    }
      +
      +    classTabView = new Y.TabView({
      +        srcNode: '#classdocs',
      +
      +        on: {
      +            selectionChange: pjax.onTabSelectionChange
      +        }
      +    });
      +
      +    pjax.updateTabState();
      +    classTabView.render();
      +};
      +
      +pjax.initLineNumbers = function () {
      +    var hash      = win.location.hash.substring(1),
      +        container = pjax.get('container'),
      +        hasLines, node;
      +
      +    // Add ids for each line number in the file source view.
      +    container.all('.linenums>li').each(function (lineNode, index) {
      +        lineNode.set('id', 'l' + (index + 1));
      +        lineNode.addClass('file-line');
      +        hasLines = true;
      +    });
      +
      +    // Scroll to the desired line.
      +    if (hasLines && /^l\d+$/.test(hash)) {
      +        if ((node = container.getById(hash))) {
      +            win.scroll(0, node.getY());
      +        }
      +    }
      +};
      +
      +pjax.initRoot = function () {
      +    var terminators = /^(?:classes|files|elements|modules)$/,
      +        parts       = pjax._getPathRoot().split('/'),
      +        root        = [],
      +        i, len, part;
      +
      +    for (i = 0, len = parts.length; i < len; i += 1) {
      +        part = parts[i];
      +
      +        if (part.match(terminators)) {
      +            // Makes sure the path will end with a "/".
      +            root.push('');
      +            break;
      +        }
      +
      +        root.push(part);
      +    }
      +
      +    pjax.set('root', root.join('/'));
      +};
      +
      +pjax.updateTabState = function (src) {
      +    var hash = win.location.hash.substring(1),
      +        defaultTab, node, tab, tabPanel;
      +
      +    function scrollToNode() {
      +        if (node.hasClass('protected')) {
      +            Y.one('#api-show-protected').set('checked', true);
      +            pjax.updateVisibility();
      +        }
      +
      +        if (node.hasClass('private')) {
      +            Y.one('#api-show-private').set('checked', true);
      +            pjax.updateVisibility();
      +        }
      +
      +        setTimeout(function () {
      +            // For some reason, unless we re-get the node instance here,
      +            // getY() always returns 0.
      +            var node = Y.one('#classdocs').getById(hash);
      +            win.scrollTo(0, node.getY() - 70);
      +        }, 1);
      +    }
      +
      +    if (!classTabView) {
      +        return;
      +    }
      +
      +    if (src === 'hashchange' && !hash) {
      +        defaultTab = 'index';
      +    } else {
      +        if (localStorage) {
      +            defaultTab = localStorage.getItem('tab_' + pjax.getPath()) ||
      +                'index';
      +        } else {
      +            defaultTab = 'index';
      +        }
      +    }
      +
      +    if (hash && (node = Y.one('#classdocs').getById(hash))) {
      +        if ((tabPanel = node.ancestor('.api-class-tabpanel', true))) {
      +            if ((tab = Y.one('#classdocs .api-class-tab.' + tabPanel.get('id')))) {
      +                if (classTabView.get('rendered')) {
      +                    Y.Widget.getByNode(tab).set('selected', 1);
      +                } else {
      +                    tab.addClass('yui3-tab-selected');
      +                }
      +            }
      +        }
      +
      +        // Scroll to the desired element if this is a hash URL.
      +        if (node) {
      +            if (classTabView.get('rendered')) {
      +                scrollToNode();
      +            } else {
      +                classTabView.once('renderedChange', scrollToNode);
      +            }
      +        }
      +    } else {
      +        tab = Y.one('#classdocs .api-class-tab.' + defaultTab);
      +
      +        // When the `defaultTab` node isn't found, `localStorage` is stale.
      +        if (!tab && defaultTab !== 'index') {
      +            tab = Y.one('#classdocs .api-class-tab.index');
      +        }
      +
      +        if (classTabView.get('rendered')) {
      +            Y.Widget.getByNode(tab).set('selected', 1);
      +        } else {
      +            tab.addClass('yui3-tab-selected');
      +        }
      +    }
      +};
      +
      +pjax.updateVisibility = function () {
      +    var container = pjax.get('container');
      +
      +    container.toggleClass('hide-inherited',
      +            !Y.one('#api-show-inherited').get('checked'));
      +
      +    container.toggleClass('show-deprecated',
      +            Y.one('#api-show-deprecated').get('checked'));
      +
      +    container.toggleClass('show-protected',
      +            Y.one('#api-show-protected').get('checked'));
      +
      +    container.toggleClass('show-private',
      +            Y.one('#api-show-private').get('checked'));
      +
      +    pjax.checkVisibility();
      +};
      +
      +// -- Route Handlers -----------------------------------------------------------
      +
      +pjax.handleClasses = function (req, res, next) {
      +    var status = res.ioResponse.status;
      +
      +    // Handles success and local filesystem XHRs.
      +    if (res.ioResponse.readyState === 4 && (!status || (status >= 200 && status < 300))) {
      +        pjax.initClassTabView();
      +    }
      +
      +    next();
      +};
      +
      +pjax.handleFiles = function (req, res, next) {
      +    var status = res.ioResponse.status;
      +
      +    // Handles success and local filesystem XHRs.
      +    if (res.ioResponse.readyState === 4 && (!status || (status >= 200 && status < 300))) {
      +        pjax.initLineNumbers();
      +    }
      +
      +    next();
      +};
      +
      +// -- Event Handlers -----------------------------------------------------------
      +
      +pjax.onNavigate = function (e) {
      +    var hash         = e.hash,
      +        originTarget = e.originEvent && e.originEvent.target,
      +        tab;
      +
      +    if (hash) {
      +        tab = originTarget && originTarget.ancestor('.yui3-tab', true);
      +
      +        if (hash === win.location.hash) {
      +            pjax.updateTabState('hashchange');
      +        } else if (!tab) {
      +            win.location.hash = hash;
      +        }
      +
      +        e.preventDefault();
      +        return;
      +    }
      +
      +    // Only scroll to the top of the page when the URL doesn't have a hash.
      +    this.set('scrollToTop', !e.url.match(/#.+$/));
      +
      +    bdNode.addClass('loading');
      +};
      +
      +pjax.onOptionClick = function (e) {
      +    pjax.updateVisibility();
      +};
      +
      +pjax.onTabSelectionChange = function (e) {
      +    var tab   = e.newVal,
      +        tabId = tab.get('contentBox').getAttribute('href').substring(1);
      +
      +    selectedTab = tab;
      +
      +    // If switching from a previous tab (i.e., this is not the default tab),
      +    // replace the history entry with a hash URL that will cause this tab to
      +    // be selected if the user navigates away and then returns using the back
      +    // or forward buttons.
      +    if (e.prevVal && localStorage) {
      +        localStorage.setItem('tab_' + pjax.getPath(), tabId);
      +    }
      +
      +    pjax.checkVisibility(tab);
      +};
      +
      +// -- Init ---------------------------------------------------------------------
      +
      +pjax.on('navigate', pjax.onNavigate);
      +
      +pjax.initRoot();
      +pjax.upgrade();
      +pjax.initClassTabView();
      +pjax.initLineNumbers();
      +pjax.updateVisibility();
      +
      +Y.APIList.rootPath = pjax.get('root');
      +
      +Y.one('#api-options').delegate('click', pjax.onOptionClick, 'input');
      +
      +Y.on('hashchange', function (e) {
      +    pjax.updateTabState('hashchange');
      +}, win);
      +
      +});
      diff --git a/themes/default/assets/js/yui-prettify.js b/themes/default/assets/js/yui-prettify.js
      new file mode 100644
      index 00000000..18de8649
      --- /dev/null
      +++ b/themes/default/assets/js/yui-prettify.js
      @@ -0,0 +1,17 @@
      +YUI().use('node', function(Y) {
      +    var code = Y.all('.prettyprint.linenums');
      +    if (code.size()) {
      +        code.each(function(c) {
      +            var lis = c.all('ol li'),
      +                l = 1;
      +            lis.each(function(n) {
      +                n.prepend('<a name="LINENUM_' + l + '"></a>');
      +                l++;
      +            });
      +        });
      +        var h = location.hash;
      +        location.hash = '';
      +        h = h.replace('LINE_', 'LINENUM_');
      +        location.hash = h;
      +    }
      +});
      diff --git a/themes/default/assets/vendor/prettify/CHANGES.html b/themes/default/assets/vendor/prettify/CHANGES.html
      new file mode 100644
      index 00000000..b50b8414
      --- /dev/null
      +++ b/themes/default/assets/vendor/prettify/CHANGES.html
      @@ -0,0 +1,130 @@
      +<html>
      +  <head>
      +    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      +    <title>Change Log</title>
      +  </head>
      +  <body bgcolor="white">
      +    <a style="float:right" href="README.html">README</a>
      +
      +    <h1>Known Issues</h1>
      +    <ul>
      +      <li>Perl formatting is really crappy.  Partly because the author is lazy and
      +      partly because Perl is
      +      <a href="http://www.perlmonks.org/?node_id=663393">hard</a> to parse.
      +      <li>On some browsers, <code>&lt;code&gt;</code> elements with newlines in the text
      +      which use CSS to specify <code>white-space:pre</code> will have the newlines
      +      improperly stripped if the element is not attached to the document at the time
      +      the stripping is done.  Also, on IE 6, all newlines will be stripped from
      +      <code>&lt;code&gt;</code> elements because of the way IE6 produces
      +      <code>innerHTML</code>.  Workaround: use <code>&lt;pre&gt;</code> for code with
      +      newlines.
      +    </ul>
      +
      +    <h1>Change Log</h1>
      +    <h2>29 March 2007</h2>
      +    <ul>
      +      <li>Added <a href="tests/prettify_test.html#PHP">tests</a> for PHP support
      +        to address 
      +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=3"
      +       >issue 3</a>.
      +      <li>Fixed
      +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=6"
      +       >bug</a>: <code>prettyPrintOne</code> was not halting.  This was not
      +        reachable through the normal entry point.
      +      <li>Fixed
      +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=4"
      +       >bug</a>: recursing into a script block or PHP tag that was not properly
      +        closed would not silently drop the content.
      +        (<a href="tests/prettify_test.html#issue4">test</a>)
      +      <li>Fixed
      +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=8"
      +       >bug</a>: was eating tabs
      +        (<a href="tests/prettify_test.html#issue8">test</a>)
      +      <li>Fixed entity handling so that the caveat
      +        <blockquote>
      +          <p>Caveats: please properly escape less-thans.  <tt>x&amp;lt;y</tt>
      +          instead of <tt>x&lt;y</tt>, and use <tt>&quot;</tt> instead of 
      +          <tt>&amp;quot;</tt> for string delimiters.</p>
      +        </blockquote>
      +        is no longer applicable.
      +      <li>Added noisefree's C#
      +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=4"
      +       >patch</a>
      +      <li>Added a <a href="http://google-code-prettify.googlecode.com/files/prettify-small.zip">distribution</a> that has comments and
      +        whitespace removed to reduce download size from 45.5kB to 12.8kB.
      +    </ul>
      +    <h2>4 Jul 2008</h2>
      +    <ul>
      +      <li>Added <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=17">language specific formatters</a> that are triggered by the presence
      +      of a <code>lang-&lt;language-file-extension&gt;</code></li>
      +      <li>Fixed <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=29">bug</a>: python handling of <code>'''string'''</code>
      +      <li>Fixed bug: <code>/</code> in regex <code>[charsets] should not end regex</code>
      +    </ul>
      +    <h2>5 Jul 2008</h2>
      +    <ul>
      +      <li>Defined language extensions for Lisp and Lua</code>
      +    </ul>
      +    <h2>14 Jul 2008</h2>
      +    <ul>
      +      <li>Language handlers for F#, OCAML, SQL</code>
      +      <li>Support for <code>nocode</code> spans to allow embedding of line
      +      numbers and code annotations which should not be styled or otherwise
      +      affect the tokenization of prettified code.
      +      See the issue 22
      +      <a href="tests/prettify_test.html#issue22">testcase</a>.</code>
      +    </ul>
      +    <h2>6 Jan 2009</h2>
      +    <ul>
      +      <li>Language handlers for Visual Basic, Haskell, CSS, and WikiText</li>
      +      <li>Added <tt>.mxml</tt> extension to the markup style handler for
      +        Flex <a href="http://en.wikipedia.org/wiki/MXML">MXML files</a>.  See
      +        <a
      +        href="http://code.google.com/p/google-code-prettify/issues/detail?id=37"
      +        >issue 37</a>.
      +      <li>Added <tt>.m</tt> extension to the C style handler so that Objective
      +        C source files properly highlight.  See
      +        <a
      +        href="http://code.google.com/p/google-code-prettify/issues/detail?id=58"
      +       >issue 58</a>.
      +      <li>Changed HTML lexer to use the same embedded source mechanism as the
      +        wiki language handler, and changed to use the registered
      +        CSS handler for STYLE element content.
      +    </ul>
      +    <h2>21 May 2009</h2>
      +    <ul>
      +      <li>Rewrote to improve performance on large files.
      +        See <a href="http://mikesamuel.blogspot.com/2009/05/efficient-parsing-in-javascript.html">benchmarks</a>.</li>
      +      <li>Fixed bugs with highlighting of Haskell line comments, Lisp
      +        number literals, Lua strings, C preprocessor directives,
      +        newlines in Wiki code on Windows, and newlines in IE6.</li>
      +    </ul>
      +    <h2>14 August 2009</h2>
      +    <ul>
      +      <li>Fixed prettifying of <code>&lt;code&gt;</code> blocks with embedded newlines.
      +    </ul>
      +    <h2>3 October 2009</h2>
      +    <ul>
      +      <li>Fixed prettifying of XML/HTML tags that contain uppercase letters.
      +    </ul>
      +    <h2>19 July 2010</h2>
      +    <ul>
      +      <li>Added support for line numbers.  Bug
      +        <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=22"
      +         >22</a></li>
      +      <li>Added YAML support.  Bug
      +        <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=123"
      +         >123</a></li>
      +      <li>Added VHDL support courtesy Le Poussin.</li>
      +      <li>IE performance improvements.  Bug
      +        <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=102"
      +         >102</a> courtesy jacobly.</li>
      +      <li>A variety of markup formatting fixes courtesy smain and thezbyg.</li>
      +      <li>Fixed copy and paste in IE[678].
      +      <li>Changed output to use <code>&amp;#160;</code> instead of
      +        <code>&amp;nbsp;</code> so that the output works when embedded in XML.
      +        Bug
      +        <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=108"
      +         >108</a>.</li>
      +    </ul>
      +  </body>
      +</html>
      diff --git a/themes/default/assets/vendor/prettify/COPYING b/themes/default/assets/vendor/prettify/COPYING
      new file mode 100644
      index 00000000..d6456956
      --- /dev/null
      +++ b/themes/default/assets/vendor/prettify/COPYING
      @@ -0,0 +1,202 @@
      +
      +                                 Apache License
      +                           Version 2.0, January 2004
      +                        http://www.apache.org/licenses/
      +
      +   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
      +
      +   1. Definitions.
      +
      +      "License" shall mean the terms and conditions for use, reproduction,
      +      and distribution as defined by Sections 1 through 9 of this document.
      +
      +      "Licensor" shall mean the copyright owner or entity authorized by
      +      the copyright owner that is granting the License.
      +
      +      "Legal Entity" shall mean the union of the acting entity and all
      +      other entities that control, are controlled by, or are under common
      +      control with that entity. For the purposes of this definition,
      +      "control" means (i) the power, direct or indirect, to cause the
      +      direction or management of such entity, whether by contract or
      +      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      +      outstanding shares, or (iii) beneficial ownership of such entity.
      +
      +      "You" (or "Your") shall mean an individual or Legal Entity
      +      exercising permissions granted by this License.
      +
      +      "Source" form shall mean the preferred form for making modifications,
      +      including but not limited to software source code, documentation
      +      source, and configuration files.
      +
      +      "Object" form shall mean any form resulting from mechanical
      +      transformation or translation of a Source form, including but
      +      not limited to compiled object code, generated documentation,
      +      and conversions to other media types.
      +
      +      "Work" shall mean the work of authorship, whether in Source or
      +      Object form, made available under the License, as indicated by a
      +      copyright notice that is included in or attached to the work
      +      (an example is provided in the Appendix below).
      +
      +      "Derivative Works" shall mean any work, whether in Source or Object
      +      form, that is based on (or derived from) the Work and for which the
      +      editorial revisions, annotations, elaborations, or other modifications
      +      represent, as a whole, an original work of authorship. For the purposes
      +      of this License, Derivative Works shall not include works that remain
      +      separable from, or merely link (or bind by name) to the interfaces of,
      +      the Work and Derivative Works thereof.
      +
      +      "Contribution" shall mean any work of authorship, including
      +      the original version of the Work and any modifications or additions
      +      to that Work or Derivative Works thereof, that is intentionally
      +      submitted to Licensor for inclusion in the Work by the copyright owner
      +      or by an individual or Legal Entity authorized to submit on behalf of
      +      the copyright owner. For the purposes of this definition, "submitted"
      +      means any form of electronic, verbal, or written communication sent
      +      to the Licensor or its representatives, including but not limited to
      +      communication on electronic mailing lists, source code control systems,
      +      and issue tracking systems that are managed by, or on behalf of, the
      +      Licensor for the purpose of discussing and improving the Work, but
      +      excluding communication that is conspicuously marked or otherwise
      +      designated in writing by the copyright owner as "Not a Contribution."
      +
      +      "Contributor" shall mean Licensor and any individual or Legal Entity
      +      on behalf of whom a Contribution has been received by Licensor and
      +      subsequently incorporated within the Work.
      +
      +   2. Grant of Copyright License. Subject to the terms and conditions of
      +      this License, each Contributor hereby grants to You a perpetual,
      +      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      +      copyright license to reproduce, prepare Derivative Works of,
      +      publicly display, publicly perform, sublicense, and distribute the
      +      Work and such Derivative Works in Source or Object form.
      +
      +   3. Grant of Patent License. Subject to the terms and conditions of
      +      this License, each Contributor hereby grants to You a perpetual,
      +      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      +      (except as stated in this section) patent license to make, have made,
      +      use, offer to sell, sell, import, and otherwise transfer the Work,
      +      where such license applies only to those patent claims licensable
      +      by such Contributor that are necessarily infringed by their
      +      Contribution(s) alone or by combination of their Contribution(s)
      +      with the Work to which such Contribution(s) was submitted. If You
      +      institute patent litigation against any entity (including a
      +      cross-claim or counterclaim in a lawsuit) alleging that the Work
      +      or a Contribution incorporated within the Work constitutes direct
      +      or contributory patent infringement, then any patent licenses
      +      granted to You under this License for that Work shall terminate
      +      as of the date such litigation is filed.
      +
      +   4. Redistribution. You may reproduce and distribute copies of the
      +      Work or Derivative Works thereof in any medium, with or without
      +      modifications, and in Source or Object form, provided that You
      +      meet the following conditions:
      +
      +      (a) You must give any other recipients of the Work or
      +          Derivative Works a copy of this License; and
      +
      +      (b) You must cause any modified files to carry prominent notices
      +          stating that You changed the files; and
      +
      +      (c) You must retain, in the Source form of any Derivative Works
      +          that You distribute, all copyright, patent, trademark, and
      +          attribution notices from the Source form of the Work,
      +          excluding those notices that do not pertain to any part of
      +          the Derivative Works; and
      +
      +      (d) If the Work includes a "NOTICE" text file as part of its
      +          distribution, then any Derivative Works that You distribute must
      +          include a readable copy of the attribution notices contained
      +          within such NOTICE file, excluding those notices that do not
      +          pertain to any part of the Derivative Works, in at least one
      +          of the following places: within a NOTICE text file distributed
      +          as part of the Derivative Works; within the Source form or
      +          documentation, if provided along with the Derivative Works; or,
      +          within a display generated by the Derivative Works, if and
      +          wherever such third-party notices normally appear. The contents
      +          of the NOTICE file are for informational purposes only and
      +          do not modify the License. You may add Your own attribution
      +          notices within Derivative Works that You distribute, alongside
      +          or as an addendum to the NOTICE text from the Work, provided
      +          that such additional attribution notices cannot be construed
      +          as modifying the License.
      +
      +      You may add Your own copyright statement to Your modifications and
      +      may provide additional or different license terms and conditions
      +      for use, reproduction, or distribution of Your modifications, or
      +      for any such Derivative Works as a whole, provided Your use,
      +      reproduction, and distribution of the Work otherwise complies with
      +      the conditions stated in this License.
      +
      +   5. Submission of Contributions. Unless You explicitly state otherwise,
      +      any Contribution intentionally submitted for inclusion in the Work
      +      by You to the Licensor shall be under the terms and conditions of
      +      this License, without any additional terms or conditions.
      +      Notwithstanding the above, nothing herein shall supersede or modify
      +      the terms of any separate license agreement you may have executed
      +      with Licensor regarding such Contributions.
      +
      +   6. Trademarks. This License does not grant permission to use the trade
      +      names, trademarks, service marks, or product names of the Licensor,
      +      except as required for reasonable and customary use in describing the
      +      origin of the Work and reproducing the content of the NOTICE file.
      +
      +   7. Disclaimer of Warranty. Unless required by applicable law or
      +      agreed to in writing, Licensor provides the Work (and each
      +      Contributor provides its Contributions) on an "AS IS" BASIS,
      +      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      +      implied, including, without limitation, any warranties or conditions
      +      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      +      PARTICULAR PURPOSE. You are solely responsible for determining the
      +      appropriateness of using or redistributing the Work and assume any
      +      risks associated with Your exercise of permissions under this License.
      +
      +   8. Limitation of Liability. In no event and under no legal theory,
      +      whether in tort (including negligence), contract, or otherwise,
      +      unless required by applicable law (such as deliberate and grossly
      +      negligent acts) or agreed to in writing, shall any Contributor be
      +      liable to You for damages, including any direct, indirect, special,
      +      incidental, or consequential damages of any character arising as a
      +      result of this License or out of the use or inability to use the
      +      Work (including but not limited to damages for loss of goodwill,
      +      work stoppage, computer failure or malfunction, or any and all
      +      other commercial damages or losses), even if such Contributor
      +      has been advised of the possibility of such damages.
      +
      +   9. Accepting Warranty or Additional Liability. While redistributing
      +      the Work or Derivative Works thereof, You may choose to offer,
      +      and charge a fee for, acceptance of support, warranty, indemnity,
      +      or other liability obligations and/or rights consistent with this
      +      License. However, in accepting such obligations, You may act only
      +      on Your own behalf and on Your sole responsibility, not on behalf
      +      of any other Contributor, and only if You agree to indemnify,
      +      defend, and hold each Contributor harmless for any liability
      +      incurred by, or claims asserted against, such Contributor by reason
      +      of your accepting any such warranty or additional liability.
      +
      +   END OF TERMS AND CONDITIONS
      +
      +   APPENDIX: How to apply the Apache License to your work.
      +
      +      To apply the Apache License to your work, attach the following
      +      boilerplate notice, with the fields enclosed by brackets "[]"
      +      replaced with your own identifying information. (Don't include
      +      the brackets!)  The text should be enclosed in the appropriate
      +      comment syntax for the file format. We also recommend that a
      +      file or class name and description of purpose be included on the
      +      same "printed page" as the copyright notice for easier
      +      identification within third-party archives.
      +
      +   Copyright [yyyy] [name of copyright owner]
      +
      +   Licensed under the Apache License, Version 2.0 (the "License");
      +   you may not use this file except in compliance with the License.
      +   You may obtain a copy of the License at
      +
      +       http://www.apache.org/licenses/LICENSE-2.0
      +
      +   Unless required by applicable law or agreed to in writing, software
      +   distributed under the License is distributed on an "AS IS" BASIS,
      +   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      +   See the License for the specific language governing permissions and
      +   limitations under the License.
      diff --git a/themes/default/assets/vendor/prettify/README.html b/themes/default/assets/vendor/prettify/README.html
      new file mode 100644
      index 00000000..c6fe1a32
      --- /dev/null
      +++ b/themes/default/assets/vendor/prettify/README.html
      @@ -0,0 +1,203 @@
      +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      +
      +<html>
      +  <head>
      +    <title>Javascript code prettifier</title>
      +
      +    <link href="src/prettify.css" type="text/css" rel="stylesheet" />
      +
      +    <script src="src/prettify.js" type="text/javascript"></script>
      +
      +    <style type="text/css">
      +      body { margin-left: .5in }
      +      h1, h2, h3, h4, .footer { margin-left: -.4in; }
      +    </style>
      +  </head>
      +
      +  <body onload="prettyPrint()" bgcolor="white">
      +    <small style="float: right">Languages : <a href="README-zh-Hans.html">CH</a></small>
      +    <h1>Javascript code prettifier</h1>
      +
      +    <h2>Setup</h2>
      +    <ol>
      +      <li><a href="http://code.google.com/p/google-code-prettify/downloads/list">Download</a> a distribution
      +      <li>Include the script and stylesheets in your document
      +        (you will need to make sure the css and js file are on your server, and
      +         adjust the paths in the <tt>script</tt> and <tt>link</tt> tag)
      +        <pre class="prettyprint">
      +&lt;link href="prettify.css" type="text/css" rel="stylesheet" />
      +&lt;script type="text/javascript" src="prettify.js">&lt;/script></pre>
      +      <li>Add <code class="prettyprint lang-html">onload="prettyPrint()"</code> to your
      +      document's body tag.
      +      <li>Modify the stylesheet to get the coloring you prefer</li>
      +    </ol>
      +
      +    <h2>Usage</h2>
      +    <p>Put code snippets in
      +    <tt>&lt;pre class="prettyprint"&gt;...&lt;/pre&gt;</tt>
      +    or <tt>&lt;code class="prettyprint"&gt;...&lt;/code&gt;</tt>
      +    and it will automatically be pretty printed.
      +
      +    <table summary="code examples">
      +      <tr>
      +        <th>The original
      +        <th>Prettier
      +      <tr>
      +        <td><pre style="border: 1px solid #888;padding: 2px"
      +             ><a name="voila1"></a>class Voila {
      +public:
      +  // Voila
      +  static const string VOILA = "Voila";
      +
      +  // will not interfere with embedded <a href="#voila1">tags</a>.
      +}</pre>
      +
      +        <td><pre class="prettyprint"><a name="voila2"></a>class Voila {
      +public:
      +  // Voila
      +  static const string VOILA = "Voila";
      +
      +  // will not interfere with embedded <a href="#voila2">tags</a>.
      +}</pre>
      +    </table>
      +
      +    <h2>FAQ</h2>
      +    <h3 id="langs">Which languages does it work for?</h3>
      +    <p>The comments in <tt>prettify.js</tt> are authoritative but the lexer
      +    should work on a number of languages including C and friends,
      +    Java, Python, Bash, SQL, HTML, XML, CSS, Javascript, and Makefiles.
      +    It works passably on Ruby, PHP, VB, and Awk and a decent subset of Perl
      +    and Ruby, but, because of commenting conventions, doesn't work on
      +    Smalltalk, or CAML-like languages.</p>
      +
      +    <p>LISPy languages are supported via an extension:
      +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-lisp.js"
      +     ><code>lang-lisp.js</code></a>.</p>
      +    <p>And similarly for
      +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-css.js"
      +     ><code>CSS</code></a>,
      +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-hs.js"
      +     ><code>Haskell</code></a>,
      +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-lua.js"
      +     ><code>Lua</code></a>,
      +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-ml.js"
      +     ><code>OCAML, SML, F#</code></a>,
      +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-vb.js"
      +     ><code>Visual Basic</code></a>,
      +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-sql.js"
      +     ><code>SQL</code></a>,
      +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-proto.js"
      +     ><code>Protocol Buffers</code></a>, and
      +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-wiki.js"
      +     ><code>WikiText</code></a>..
      +
      +    <p>If you'd like to add an extension for your favorite language, please
      +    look at <tt>src/lang-lisp.js</tt> and file an
      +    <a href="http://code.google.com/p/google-code-prettify/issues/list"
      +     >issue</a> including your language extension, and a testcase.</p>
      +
      +    <h3>How do I specify which language my code is in?</h3>
      +    <p>You don't need to specify the language since <code>prettyprint()</code>
      +    will guess.  You can specify a language by specifying the language extension
      +    along with the <code>prettyprint</code> class like so:</p>
      +    <pre class="prettyprint lang-html"
      +>&lt;pre class=&quot;prettyprint <b>lang-html</b>&quot;&gt;
      +  The lang-* class specifies the language file extensions.
      +  File extensions supported by default include
      +    "bsh", "c", "cc", "cpp", "cs", "csh", "cyc", "cv", "htm", "html",
      +    "java", "js", "m", "mxml", "perl", "pl", "pm", "py", "rb", "sh",
      +    "xhtml", "xml", "xsl".
      +&lt;/pre&gt;</pre>
      +
      +    <h3>It doesn't work on <tt>&lt;obfuscated code sample&gt;</tt>?</h3>
      +    <p>Yes.  Prettifying obfuscated code is like putting lipstick on a pig
      +    &mdash; i.e. outside the scope of this tool.</p>
      +
      +    <h3>Which browsers does it work with?</h3>
      +    <p>It's been tested with IE 6, Firefox 1.5 &amp; 2, and Safari 2.0.4.
      +    Look at <a href="tests/prettify_test.html">the test page</a> to see if it
      +    works in your browser.</p>
      +
      +    <h3>What's changed?</h3>
      +    <p>See the <a href="CHANGES.html">change log</a></p>
      +
      +    <h3>Why doesn't Prettyprinting of strings work on WordPress?</h3>
      +    <p>Apparently wordpress does "smart quoting" which changes close quotes.
      +    This causes end quotes to not match up with open quotes.
      +    <p>This breaks prettifying as well as copying and pasting of code samples.
      +    See
      +    <a href="http://wordpress.org/support/topic/125038"
      +    >WordPress's help center</a> for info on how to stop smart quoting of code
      +    snippets.</p>
      +
      +    <h3 id="linenums">How do I put line numbers in my code?</h3>
      +    <p>You can use the <code>linenums</code> class to turn on line
      +    numbering.  If your code doesn't start at line number 1, you can
      +    add a colon and a line number to the end of that class as in
      +    <code>linenums:52</code>.
      +
      +    <p>For example
      +<pre class="prettyprint">&lt;pre class="prettyprint linenums:<b>4</b>"
      +&gt;// This is line 4.
      +foo();
      +bar();
      +baz();
      +boo();
      +far();
      +faz();
      +&lt;pre&gt;</pre>
      +    produces
      +<pre class="prettyprint linenums:4"
      +>// This is line 4.
      +foo();
      +bar();
      +baz();
      +boo();
      +far();
      +faz();
      +</pre>
      +
      +    <h3>How do I prevent a portion of markup from being marked as code?</h3>
      +    <p>You can use the <code>nocode</code> class to identify a span of markup
      +    that is not code.
      +<pre class="prettyprint">&lt;pre class=prettyprint&gt;
      +int x = foo();  /* This is a comment  &lt;span class="nocode"&gt;This is not code&lt;/span&gt;
      +  Continuation of comment */
      +int y = bar();
      +&lt;/pre&gt;</pre>
      +produces
      +<pre class="prettyprint">
      +int x = foo();  /* This is a comment  <span class="nocode">This is not code</span>
      +  Continuation of comment */
      +int y = bar();
      +</pre>
      +
      +    <p>For a more complete example see the issue22
      +    <a href="tests/prettify_test.html#issue22">testcase</a>.</p>
      +
      +    <h3>I get an error message "a is not a function" or "opt_whenDone is not a function"</h3>
      +    <p>If you are calling <code>prettyPrint</code> via an event handler, wrap it in a function.
      +    Instead of doing
      +    <blockquote>
      +      <code class="prettyprint lang-js"
      +       >addEventListener('load', prettyPrint, false);</code>
      +    </blockquote>
      +    wrap it in a closure like
      +    <blockquote>
      +      <code class="prettyprint lang-js"
      +       >addEventListener('load', function (event) { prettyPrint() }, false);</code>
      +    </blockquote>
      +    so that the browser does not pass an event object to <code>prettyPrint</code> which
      +    will confuse it.
      +
      +    <br><br><br>
      +
      +    <div class="footer">
      +<!-- Created: Tue Oct  3 17:51:56 PDT 2006 -->
      +<!-- hhmts start -->
      +Last modified: Wed Jul 19 13:56:00 PST 2010
      +<!-- hhmts end -->
      +    </div>
      +  </body>
      +</html>
      diff --git a/themes/default/assets/vendor/prettify/prettify-min.css b/themes/default/assets/vendor/prettify/prettify-min.css
      new file mode 100644
      index 00000000..d44b3a22
      --- /dev/null
      +++ b/themes/default/assets/vendor/prettify/prettify-min.css
      @@ -0,0 +1 @@
      +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
      \ No newline at end of file
      diff --git a/themes/default/assets/vendor/prettify/prettify-min.js b/themes/default/assets/vendor/prettify/prettify-min.js
      new file mode 100644
      index 00000000..4845d05d
      --- /dev/null
      +++ b/themes/default/assets/vendor/prettify/prettify-min.js
      @@ -0,0 +1 @@
      +window.PR_SHOULD_USE_CONTINUATION=true;var prettyPrintOne;var prettyPrint;(function(){var O=window;var j=["break,continue,do,else,for,if,return,while"];var v=[j,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var q=[v,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var m=[q,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var y=[q,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var T=[y,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"];var s="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes";var x=[q,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var t="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var J=[j,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var g=[j,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var I=[j,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var B=[m,T,x,t+J,g,I];var f=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/;var D="str";var A="kwd";var k="com";var Q="typ";var H="lit";var M="pun";var G="pln";var n="tag";var F="dec";var K="src";var R="atn";var o="atv";var P="nocode";var N="(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function l(ab){var af=0;var U=false;var ae=false;for(var X=0,W=ab.length;X<W;++X){var ag=ab[X];if(ag.ignoreCase){ae=true}else{if(/[a-z]/i.test(ag.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){U=true;ae=false;break}}}var aa={b:8,t:9,n:10,v:11,f:12,r:13};function ad(aj){var ai=aj.charCodeAt(0);if(ai!==92){return ai}var ah=aj.charAt(1);ai=aa[ah];if(ai){return ai}else{if("0"<=ah&&ah<="7"){return parseInt(aj.substring(1),8)}else{if(ah==="u"||ah==="x"){return parseInt(aj.substring(2),16)}else{return aj.charCodeAt(1)}}}}function V(ah){if(ah<32){return(ah<16?"\\x0":"\\x")+ah.toString(16)}var ai=String.fromCharCode(ah);return(ai==="\\"||ai==="-"||ai==="]"||ai==="^")?"\\"+ai:ai}function Z(an){var ar=an.substring(1,an.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ah=[];var ap=ar[0]==="^";var ao=["["];if(ap){ao.push("^")}for(var at=ap?1:0,al=ar.length;at<al;++at){var aj=ar[at];if(/\\[bdsw]/i.test(aj)){ao.push(aj)}else{var ai=ad(aj);var am;if(at+2<al&&"-"===ar[at+1]){am=ad(ar[at+2]);at+=2}else{am=ai}ah.push([ai,am]);if(!(am<65||ai>122)){if(!(am<65||ai>90)){ah.push([Math.max(65,ai)|32,Math.min(am,90)|32])}if(!(am<97||ai>122)){ah.push([Math.max(97,ai)&~32,Math.min(am,122)&~32])}}}}ah.sort(function(aw,av){return(aw[0]-av[0])||(av[1]-aw[1])});var ak=[];var aq=[];for(var at=0;at<ah.length;++at){var au=ah[at];if(au[0]<=aq[1]+1){aq[1]=Math.max(aq[1],au[1])}else{ak.push(aq=au)}}for(var at=0;at<ak.length;++at){var au=ak[at];ao.push(V(au[0]));if(au[1]>au[0]){if(au[1]+1>au[0]){ao.push("-")}ao.push(V(au[1]))}}ao.push("]");return ao.join("")}function Y(an){var al=an.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var aj=al.length;var ap=[];for(var am=0,ao=0;am<aj;++am){var ai=al[am];if(ai==="("){++ao}else{if("\\"===ai.charAt(0)){var ah=+ai.substring(1);if(ah){if(ah<=ao){ap[ah]=-1}else{al[am]=V(ah)}}}}}for(var am=1;am<ap.length;++am){if(-1===ap[am]){ap[am]=++af}}for(var am=0,ao=0;am<aj;++am){var ai=al[am];if(ai==="("){++ao;if(!ap[ao]){al[am]="(?:"}}else{if("\\"===ai.charAt(0)){var ah=+ai.substring(1);if(ah&&ah<=ao){al[am]="\\"+ap[ah]}}}}for(var am=0;am<aj;++am){if("^"===al[am]&&"^"!==al[am+1]){al[am]=""}}if(an.ignoreCase&&U){for(var am=0;am<aj;++am){var ai=al[am];var ak=ai.charAt(0);if(ai.length>=2&&ak==="["){al[am]=Z(ai)}else{if(ak!=="\\"){al[am]=ai.replace(/[a-zA-Z]/g,function(aq){var ar=aq.charCodeAt(0);return"["+String.fromCharCode(ar&~32,ar|32)+"]"})}}}}return al.join("")}var ac=[];for(var X=0,W=ab.length;X<W;++X){var ag=ab[X];if(ag.global||ag.multiline){throw new Error(""+ag)}ac.push("(?:"+Y(ag)+")")}return new RegExp(ac.join("|"),ae?"gi":"g")}function b(aa,Y){var W=/(?:^|\s)nocode(?:\s|$)/;var ab=[];var Z=0;var X=[];var V=0;function U(ac){switch(ac.nodeType){case 1:if(W.test(ac.className)){return}for(var af=ac.firstChild;af;af=af.nextSibling){U(af)}var ae=ac.nodeName.toLowerCase();if("br"===ae||"li"===ae){ab[V]="\n";X[V<<1]=Z++;X[(V++<<1)|1]=ac}break;case 3:case 4:var ad=ac.nodeValue;if(ad.length){if(!Y){ad=ad.replace(/[ \t\r\n]+/g," ")}else{ad=ad.replace(/\r\n?/g,"\n")}ab[V]=ad;X[V<<1]=Z;Z+=ad.length;X[(V++<<1)|1]=ac}break}}U(aa);return{sourceCode:ab.join("").replace(/\n$/,""),spans:X}}function C(U,W,Y,V){if(!W){return}var X={sourceCode:W,basePos:U};Y(X);V.push.apply(V,X.decorations)}var w=/\S/;function p(U){var X=undefined;for(var W=U.firstChild;W;W=W.nextSibling){var V=W.nodeType;X=(V===1)?(X?U:W):(V===3)?(w.test(W.nodeValue)?U:X):X}return X===U?undefined:X}function h(W,V){var U={};var X;(function(){var af=W.concat(V);var aj=[];var ai={};for(var ad=0,ab=af.length;ad<ab;++ad){var aa=af[ad];var ae=aa[3];if(ae){for(var ag=ae.length;--ag>=0;){U[ae.charAt(ag)]=aa}}var ah=aa[1];var ac=""+ah;if(!ai.hasOwnProperty(ac)){aj.push(ah);ai[ac]=null}}aj.push(/[\0-\uffff]/);X=l(aj)})();var Z=V.length;var Y=function(aj){var ab=aj.sourceCode,aa=aj.basePos;var af=[aa,G];var ah=0;var ap=ab.match(X)||[];var al={};for(var ag=0,at=ap.length;ag<at;++ag){var ai=ap[ag];var ar=al[ai];var ak=void 0;var ao;if(typeof ar==="string"){ao=false}else{var ac=U[ai.charAt(0)];if(ac){ak=ai.match(ac[1]);ar=ac[0]}else{for(var aq=0;aq<Z;++aq){ac=V[aq];ak=ai.match(ac[1]);if(ak){ar=ac[0];break}}if(!ak){ar=G}}ao=ar.length>=5&&"lang-"===ar.substring(0,5);if(ao&&!(ak&&typeof ak[1]==="string")){ao=false;ar=K}if(!ao){al[ai]=ar}}var ad=ah;ah+=ai.length;if(!ao){af.push(aa+ad,ar)}else{var an=ak[1];var am=ai.indexOf(an);var ae=am+an.length;if(ak[2]){ae=ai.length-ak[2].length;am=ae-an.length}var au=ar.substring(5);C(aa+ad,ai.substring(0,am),Y,af);C(aa+ad+am,an,r(au,an),af);C(aa+ad+ae,ai.substring(ae),Y,af)}}aj.decorations=af};return Y}function i(V){var Y=[],U=[];if(V.tripleQuotedStrings){Y.push([D,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(V.multiLineStrings){Y.push([D,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{Y.push([D,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(V.verbatimStrings){U.push([D,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var ab=V.hashComments;if(ab){if(V.cStyleComments){if(ab>1){Y.push([k,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{Y.push([k,/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}U.push([D,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,null])}else{Y.push([k,/^#[^\r\n]*/,null,"#"])}}if(V.cStyleComments){U.push([k,/^\/\/[^\r\n]*/,null]);U.push([k,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(V.regexLiterals){var aa=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");U.push(["lang-regex",new RegExp("^"+N+"("+aa+")")])}var X=V.types;if(X){U.push([Q,X])}var W=(""+V.keywords).replace(/^ | $/g,"");if(W.length){U.push([A,new RegExp("^(?:"+W.replace(/[\s,]+/g,"|")+")\\b"),null])}Y.push([G,/^\s+/,null," \r\n\t\xA0"]);var Z=/^.[^\s\w\.$@\'\"\`\/\\]*/;U.push([H,/^@[a-z_$][a-z_$@0-9]*/i,null],[Q,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[G,/^[a-z_$][a-z_$@0-9]*/i,null],[H,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[G,/^\\[\s\S]?/,null],[M,Z,null]);return h(Y,U)}var L=i({keywords:B,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function S(W,ah,aa){var V=/(?:^|\s)nocode(?:\s|$)/;var ac=/\r\n?|\n/;var ad=W.ownerDocument;var ag=ad.createElement("li");while(W.firstChild){ag.appendChild(W.firstChild)}var X=[ag];function af(am){switch(am.nodeType){case 1:if(V.test(am.className)){break}if("br"===am.nodeName){ae(am);if(am.parentNode){am.parentNode.removeChild(am)}}else{for(var ao=am.firstChild;ao;ao=ao.nextSibling){af(ao)}}break;case 3:case 4:if(aa){var an=am.nodeValue;var ak=an.match(ac);if(ak){var aj=an.substring(0,ak.index);am.nodeValue=aj;var ai=an.substring(ak.index+ak[0].length);if(ai){var al=am.parentNode;al.insertBefore(ad.createTextNode(ai),am.nextSibling)}ae(am);if(!aj){am.parentNode.removeChild(am)}}}break}}function ae(al){while(!al.nextSibling){al=al.parentNode;if(!al){return}}function aj(am,at){var ar=at?am.cloneNode(false):am;var ap=am.parentNode;if(ap){var aq=aj(ap,1);var ao=am.nextSibling;aq.appendChild(ar);for(var an=ao;an;an=ao){ao=an.nextSibling;aq.appendChild(an)}}return ar}var ai=aj(al.nextSibling,0);for(var ak;(ak=ai.parentNode)&&ak.nodeType===1;){ai=ak}X.push(ai)}for(var Z=0;Z<X.length;++Z){af(X[Z])}if(ah===(ah|0)){X[0].setAttribute("value",ah)}var ab=ad.createElement("ol");ab.className="linenums";var Y=Math.max(0,((ah-1))|0)||0;for(var Z=0,U=X.length;Z<U;++Z){ag=X[Z];ag.className="L"+((Z+Y)%10);if(!ag.firstChild){ag.appendChild(ad.createTextNode("\xA0"))}ab.appendChild(ag)}W.appendChild(ab)}function E(af){var X=/\bMSIE\s(\d+)/.exec(navigator.userAgent);X=X&&+X[1]<=8;var ao=/\n/g;var an=af.sourceCode;var ap=an.length;var Y=0;var ad=af.spans;var V=ad.length;var aj=0;var aa=af.decorations;var ab=aa.length;var ac=0;aa[ab]=ap;var av,at;for(at=av=0;at<ab;){if(aa[at]!==aa[at+2]){aa[av++]=aa[at++];aa[av++]=aa[at++]}else{at+=2}}ab=av;for(at=av=0;at<ab;){var aw=aa[at];var ae=aa[at+1];var Z=at+2;while(Z+2<=ab&&aa[Z+1]===ae){Z+=2}aa[av++]=aw;aa[av++]=ae;at=Z}ab=aa.length=av;var au=af.sourceNode;var ak;if(au){ak=au.style.display;au.style.display="none"}try{var ah=null;while(aj<V){var ai=ad[aj];var U=ad[aj+2]||ap;var ar=aa[ac+2]||ap;var Z=Math.min(U,ar);var am=ad[aj+1];var W;if(am.nodeType!==1&&(W=an.substring(Y,Z))){if(X){W=W.replace(ao,"\r")}am.nodeValue=W;var al=am.ownerDocument;var aq=al.createElement("span");aq.className=aa[ac+1];var ag=am.parentNode;ag.replaceChild(aq,am);aq.appendChild(am);if(Y<U){ad[aj+1]=am=al.createTextNode(an.substring(Z,U));ag.insertBefore(am,aq.nextSibling)}}Y=Z;if(Y>=U){aj+=2}if(Y>=ar){ac+=2}}}finally{if(au){au.style.display=ak}}}var u={};function d(W,X){for(var U=X.length;--U>=0;){var V=X[U];if(!u.hasOwnProperty(V)){u[V]=W}else{if(O.console){console.warn("cannot override language handler %s",V)}}}}function r(V,U){if(!(V&&u.hasOwnProperty(V))){V=/^\s*</.test(U)?"default-markup":"default-code"}return u[V]}d(L,["default-code"]);d(h([],[[G,/^[^<?]+/],[F,/^<!\w[^>]*(?:>|$)/],[k,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[M,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);d(h([[G,/^[\s]+/,null," \t\r\n"],[o,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[n,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[R,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[M,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);d(h([],[[o,/^[\s\S]+/]]),["uq.val"]);d(i({keywords:m,hashComments:true,cStyleComments:true,types:f}),["c","cc","cpp","cxx","cyc","m"]);d(i({keywords:"null,true,false"}),["json"]);d(i({keywords:T,hashComments:true,cStyleComments:true,verbatimStrings:true,types:f}),["cs"]);d(i({keywords:y,cStyleComments:true}),["java"]);d(i({keywords:I,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);d(i({keywords:J,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);d(i({keywords:t,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);d(i({keywords:g,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);d(i({keywords:x,cStyleComments:true,regexLiterals:true}),["js"]);d(i({keywords:s,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);d(h([],[[D,/^[\s\S]+/]]),["regex"]);function e(X){var W=X.langExtension;try{var U=b(X.sourceNode,X.pre);var V=U.sourceCode;X.sourceCode=V;X.spans=U.spans;X.basePos=0;r(W,V)(X);E(X)}catch(Y){if(O.console){console.log(Y&&Y.stack?Y.stack:Y)}}}function z(Y,X,W){var U=document.createElement("pre");U.innerHTML=Y;if(W){S(U,W,true)}var V={langExtension:X,numberLines:W,sourceNode:U,pre:1};e(V);return U.innerHTML}function c(aj){function ab(al){return document.getElementsByTagName(al)}var ah=[ab("pre"),ab("code"),ab("xmp")];var V=[];for(var ae=0;ae<ah.length;++ae){for(var ac=0,Y=ah[ae].length;ac<Y;++ac){V.push(ah[ae][ac])}}ah=null;var Z=Date;if(!Z.now){Z={now:function(){return +(new Date)}}}var aa=0;var U;var af=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ak=/\bprettyprint\b/;var W=/\bprettyprinted\b/;var ag=/pre|xmp/i;var ai=/^code$/i;var ad=/^(?:pre|code|xmp)$/i;function X(){var ar=(O.PR_SHOULD_USE_CONTINUATION?Z.now()+250:Infinity);for(;aa<V.length&&Z.now()<ar;aa++){var at=V[aa];var au=at.className;if(ak.test(au)&&!W.test(au)){var aw=false;for(var ao=at.parentNode;ao;ao=ao.parentNode){var ax=ao.tagName;if(ad.test(ax)&&ao.className&&ak.test(ao.className)){aw=true;break}}if(!aw){at.className+=" prettyprinted";var aq=au.match(af);var am;if(!aq&&(am=p(at))&&ai.test(am.tagName)){aq=am.className.match(af)}if(aq){aq=aq[1]}var ap;if(ag.test(at.tagName)){ap=1}else{var an=at.currentStyle;var al=(an?an.whiteSpace:(document.defaultView&&document.defaultView.getComputedStyle)?document.defaultView.getComputedStyle(at,null).getPropertyValue("white-space"):0);ap=al&&"pre"===al.substring(0,3)}var av=at.className.match(/\blinenums\b(?::(\d+))?/);av=av?av[1]&&av[1].length?+av[1]:true:false;if(av){S(at,av,ap)}U={langExtension:aq,sourceNode:at,numberLines:av,pre:ap};e(U)}}}if(aa<V.length){setTimeout(X,250)}else{if(aj){aj()}}}X()}var a=O.PR={createSimpleLexer:h,registerLangHandler:d,sourceDecorator:i,PR_ATTRIB_NAME:R,PR_ATTRIB_VALUE:o,PR_COMMENT:k,PR_DECLARATION:F,PR_KEYWORD:A,PR_LITERAL:H,PR_NOCODE:P,PR_PLAIN:G,PR_PUNCTUATION:M,PR_SOURCE:K,PR_STRING:D,PR_TAG:n,PR_TYPE:Q,prettyPrintOne:O.prettyPrintOne=z,prettyPrint:O.prettyPrint=c};if(typeof define==="function"&&define.amd){define("google-code-prettify",[],function(){return a})}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);
      \ No newline at end of file
      diff --git a/themes/default/layouts/main.handlebars b/themes/default/layouts/main.handlebars
      new file mode 100644
      index 00000000..25c9e379
      --- /dev/null
      +++ b/themes/default/layouts/main.handlebars
      @@ -0,0 +1,55 @@
      +<!DOCTYPE html>
      +<html lang="en">
      +<head>
      +    <meta charset="utf-8">
      +    <title>{{htmlTitle}}</title>
      +    <link rel="stylesheet" href="{{yuiGridsUrl}}">
      +    <link rel="stylesheet" href="{{projectAssets}}/vendor/prettify/prettify-min.css">
      +    <link rel="stylesheet" href="{{projectAssets}}/css/main.css" id="site_styles">
      +    <link rel="icon" href="{{projectAssets}}/favicon.ico">
      +    <script src="{{yuiSeedUrl}}"></script>
      +</head>
      +<body class="yui3-skin-sam">
      +
      +<div id="doc">
      +    <div id="hd" class="yui3-g header">
      +        <div class="yui3-u-3-4">
      +            {{#if projectLogo}}
      +                <h1><img src="{{projectLogo}}" title="{{projectName}}"></h1>
      +            {{else}}
      +                <h1><img src="{{projectAssets}}/css/logo.png" title="{{projectName}}" width="117" height="52"></h1>
      +            {{/if}}
      +        </div>
      +        <div class="yui3-u-1-4 version">
      +            <em>API Docs for: {{projectVersion}}</em>
      +        </div>
      +    </div>
      +    <div id="bd" class="yui3-g">
      +
      +        <div class="yui3-u-1-4">
      +            <div id="docs-sidebar" class="sidebar apidocs">
      +                {{>sidebar}}
      +            </div>
      +        </div>
      +        <div class="yui3-u-3-4">
      +            {{>options}}
      +            <div class="apidocs">
      +                <div id="docs-main">
      +                    <div class="content">
      +{{>layout_content}}
      +                    </div>
      +                </div>
      +            </div>
      +        </div>
      +    </div>
      +</div>
      +<script src="{{projectAssets}}/vendor/prettify/prettify-min.js"></script>
      +<script>prettyPrint();</script>
      +<script src="{{projectAssets}}/js/yui-prettify.js"></script>
      +<script src="{{projectAssets}}/../api.js"></script>
      +<script src="{{projectAssets}}/js/api-filter.js"></script>
      +<script src="{{projectAssets}}/js/api-list.js"></script>
      +<script src="{{projectAssets}}/js/api-search.js"></script>
      +<script src="{{projectAssets}}/js/apidocs.js"></script>
      +</body>
      +</html>
      diff --git a/themes/default/layouts/xhr.handlebars b/themes/default/layouts/xhr.handlebars
      new file mode 100644
      index 00000000..c66f7d32
      --- /dev/null
      +++ b/themes/default/layouts/xhr.handlebars
      @@ -0,0 +1,7 @@
      +<div id="docs-main">
      +    <div class="content">
      +{{>layout_content}}
      +    </div>
      +</div>
      +
      +<div id="xhr-title" class="hidden">{{title}}</div>
      diff --git a/themes/default/partials/attributes.handlebars b/themes/default/partials/attributes.handlebars
      new file mode 100644
      index 00000000..4a29484f
      --- /dev/null
      +++ b/themes/default/partials/attributes.handlebars
      @@ -0,0 +1,10 @@
      +<div id="attribute{{name}}" class="property item{{#if deprecated}} deprecated{{/if}}">
      +    <h3 class="name" id="{{name}}"><code>{{name}}</code></h3>
      +    {{#if deprecated}}
      +        <span class="flag deprecated"{{#if deprecationMessage}} title="{{deprecationMessage}}"{{/if}}>deprecated</span>
      +    {{/if}}
      +
      +    <div class="description">
      +        {{{description}}}
      +    </div>
      +</div>
      diff --git a/themes/default/partials/attrs.handlebars b/themes/default/partials/attrs.handlebars
      new file mode 100644
      index 00000000..a957ce01
      --- /dev/null
      +++ b/themes/default/partials/attrs.handlebars
      @@ -0,0 +1,141 @@
      +<div id="attr_{{name}}" class="attr item{{#if access}} {{access}}{{/if}}{{#if deprecated}} deprecated{{/if}}{{#if extended_from}} inherited{{/if}}">
      +    <a name="config_{{name}}"></a> {{! For backwards compatibility }}
      +    <h3 class="name"><code>{{name}}</code></h3>
      +    <span class="type">{{#crossLink type}}{{/crossLink}}</span>
      +
      +    {{#if deprecated}}
      +        <span class="flag deprecated"{{#if deprecationMessage}} title="{{deprecationMessage}}"{{/if}}>deprecated</span>
      +    {{/if}}
      +
      +    {{#if access}}
      +        <span class="flag {{access}}">{{access}}</span>
      +    {{/if}}
      +
      +    {{#if final}}
      +        <span class="flag final">final</span>
      +    {{/if}}
      +
      +    {{#if static}}
      +        <span class="flag static">static</span>
      +    {{/if}}
      +
      +    {{#if optional}}
      +        <span class="flag optional">optional</span>
      +    {{/if}}
      +
      +    {{#if required}}
      +        <span class="flag required">required</span>
      +    {{/if}}
      +
      +    {{#if readonly}}
      +        <span class="flag readonly">readonly</span>
      +    {{/if}}
      +
      +    <div class="meta">
      +        {{#if overwritten_from}}
      +            <p>Inherited from
      +            <a href="{{crossLinkRaw overwritten_from/class}}#attr_{{overwritten_from/name}}">
      +                {{overwritten_from/class}}
      +            </a>
      +            {{#if foundAt}}
      +            but overwritten in
      +            {{/if}}
      +        {{else}}
      +            {{#if extended_from}}
      +                <p>Inherited from
      +                <a href="{{crossLinkRaw extended_from}}#attr_{{name}}">{{extended_from}}</a>:
      +            {{else}}
      +                {{#providedBy}}
      +                    <p>Provided by the <a href="../modules/{{.}}.html">{{.}}</a> module.</p>
      +                {{/providedBy}}
      +                <p>
      +                {{#if foundAt}}
      +                Defined in
      +                {{/if}}
      +            {{/if}}
      +        {{/if}}
      +        {{#if foundAt}}
      +        <a href="{{foundAt}}">`{{{file}}}:{{{line}}}`</a>
      +        {{/if}}
      +        </p>
      +
      +        {{#if deprecationMessage}}
      +            <p>Deprecated: {{deprecationMessage}}</p>
      +        {{/if}}
      +
      +        {{#if since}}
      +            <p>Available since {{since}}</p>
      +        {{/if}}
      +    </div>
      +
      +    <div class="description">
      +        {{{attrDescription}}}
      +    </div>
      +
      +    {{#if default}}
      +        <p><strong>Default:</strong> {{default}}</p>
      +    {{/if}}
      +
      +    {{#if emit}}
      +        <div class="emits box">
      +            <h4>Fires event <code>{{name}}Change</code></h4>
      +
      +            <p>
      +            Fires when the value for the configuration attribute `{{{name}}}` is
      +            changed. You can listen for the event using the `on` method if you
      +            wish to be notified before the attribute's value has changed, or
      +            using the `after` method if you wish to be notified after the
      +            attribute's value has changed.
      +            </p>
      +
      +            <div class="params">
      +                <h4>Parameters:</h4>
      +
      +                <ul class="params-list">
      +                    <li class="param">
      +                        <code class="param-name">e</code>
      +                        <span class="type">{{#crossLink "EventFacade"}}{{/crossLink}}</span>
      +
      +                        <div class="param-description">
      +                            An Event Facade object with the following
      +                            attribute-specific properties added:
      +                        </div>
      +
      +                        <ul class="params-list">
      +                            <li class="param">
      +                                <code class="param-name">prevVal</code>
      +                                <span class="type">Any</span>
      +                                <div class="param-description">The value of the attribute, prior to it being set.</div>
      +                            </li>
      +                            <li class="param">
      +                                <code class="param-name">newVal</code>
      +                                <span class="type">Any</span>
      +                                <div class="param-description">The value the attribute is to be set to.</div>
      +                            </li>
      +                            <li class="param">
      +                                <code class="param-name">attrName</code>
      +                                <span class="type">{{#crossLink "String"}}{{/crossLink}}</span>
      +                                <div class="param-description">The name of the attribute being set.</div>
      +                            </li>
      +                            <li class="param">
      +                                <code class="param-name">subAttrName</code>
      +                                <span class="type">{{#crossLink "String"}}{{/crossLink}}</span>
      +                                <div class="param-description">If setting a property within the attribute's value, the name of the sub-attribute property being set.</div>
      +                            </li>
      +                        </ul>
      +                    </li>
      +                </ul>
      +            </div>
      +        </div>
      +    {{/if}}
      +
      +    {{#example}}
      +        <div class="example">
      +            <h4>Example:</h4>
      +
      +            <div class="example-content">
      +                {{{.}}}
      +            </div>
      +        </div>
      +    {{/example}}
      +</div>
      diff --git a/themes/default/partials/classes.handlebars b/themes/default/partials/classes.handlebars
      new file mode 100644
      index 00000000..a0abcc7a
      --- /dev/null
      +++ b/themes/default/partials/classes.handlebars
      @@ -0,0 +1,203 @@
      +<h1>{{name}} Class</h1>
      +<div class="box meta">
      +    {{#if uses}}
      +        <div class="uses">
      +            Uses
      +            <ul class="inline commas">
      +                {{#uses}}
      +                    <li><a href="{{.}}.html">{{.}}</a></li>
      +                {{/uses}}
      +            </ul>
      +        </div>
      +    {{/if}}
      +
      +    {{#if extends}}
      +        <div class="extends">
      +            Extends {{#crossLink extends}}{{/crossLink}}
      +        </div>
      +    {{/if}}
      +
      +    {{#if foundAt}}
      +        <div class="foundat">
      +            Defined in: <a href="{{foundAt}}">`{{{file}}}:{{{line}}}`</a>
      +        </div>
      +    {{/if}}
      +
      +    {{#if module}}
      +        {{#if submodule}}
      +            Module: {{#crossLinkModule submodule}}{{/crossLinkModule}}<br>
      +            Parent Module: {{#crossLinkModule module}}{{/crossLinkModule}}
      +        {{else}}
      +            Module: {{#crossLinkModule module}}{{/crossLinkModule}}
      +        {{/if}}
      +    {{/if}}
      +
      +    {{#if since}}
      +        <p>Available since {{since}}</p>
      +    {{/if}}
      +</div>
      +
      +{{#if deprecated}}
      +    <div class="box deprecated">
      +        <p>
      +        {{#if deprecationMessage}}
      +            <strong>Deprecated:</strong> {{deprecationMessage}}
      +        {{else}}
      +            This class is deprecated.
      +        {{/if}}
      +        </p>
      +    </div>
      +{{/if}}
      +
      +<div class="box intro">
      +    {{{classDescription}}}
      +</div>
      +
      +{{#is_constructor}}
      +    <div class="constructor">
      +        <h2>Constructor</h2>
      +{{>method}}
      +    </div>
      +{{/is_constructor}}
      +
      +<div id="classdocs" class="tabview">
      +    <ul class="api-class-tabs">
      +        <li class="api-class-tab index"><a href="#index">Index</a></li>
      +
      +        {{#if methods}}
      +            <li class="api-class-tab methods"><a href="#methods">Methods</a></li>
      +        {{/if}}
      +        {{#if properties}}
      +            <li class="api-class-tab properties"><a href="#properties">Properties</a></li>
      +        {{/if}}
      +        {{#if attrs}}
      +            <li class="api-class-tab attrs"><a href="#attrs">Attributes</a></li>
      +        {{/if}}
      +        {{#if events}}
      +            <li class="api-class-tab events"><a href="#events">Events</a></li>
      +        {{/if}}
      +    </ul>
      +
      +    <div>
      +        <div id="index" class="api-class-tabpanel index">
      +            <h2 class="off-left">Item Index</h2>
      +
      +            {{#if methods}}
      +                <div class="index-section methods">
      +                    <h3>Methods</h3>
      +
      +                    <ul class="index-list methods{{#if extends}} extends{{/if}}">
      +                        {{#methods}}
      +                            <li class="index-item method{{#if access}} {{access}}{{/if}}{{#if deprecated}} deprecated{{/if}}{{#if overwritten_from}} inherited{{/if}}{{#if extended_from}} inherited{{/if}}">
      +                                <a href="#method_{{name}}">{{name}}</a>
      +
      +                                {{#if static}}
      +                                    <span class="flag static">static</span>
      +                                {{/if}}
      +                                {{#if deprecated}}
      +                                    <span class="flag deprecated">deprecated</span>
      +                                {{/if}}
      +                            </li>
      +                        {{/methods}}
      +                    </ul>
      +                </div>
      +            {{/if}}
      +
      +            {{#if properties}}
      +                <div class="index-section properties">
      +                    <h3>Properties</h3>
      +
      +                    <ul class="index-list properties{{#if extends}} extends{{/if}}">
      +                        {{#properties}}
      +                            <li class="index-item property{{#if access}} {{access}}{{/if}}{{#if deprecated}} deprecated{{/if}}{{#if overwritten_from}} inherited{{/if}}{{#if extended_from}} inherited{{/if}}">
      +                                <a href="#property_{{name}}">{{name}}</a>
      +
      +                                {{#if static}}
      +                                    <span class="flag static">static</span>
      +                                {{/if}}
      +                                {{#if deprecated}}
      +                                    <span class="flag deprecated">deprecated</span>
      +                                {{/if}}
      +                            </li>
      +                        {{/properties}}
      +                    </ul>
      +                </div>
      +            {{/if}}
      +
      +            {{#if attrs}}
      +                <div class="index-section attrs">
      +                    <h3>Attributes</h3>
      +
      +                    <ul class="index-list attrs{{#if extends}} extends{{/if}}">
      +                        {{#attrs}}
      +                            <li class="index-item attr{{#if access}} {{access}}{{/if}}{{#if deprecated}} deprecated{{/if}}{{#if overwritten_from}} inherited{{/if}}{{#if extended_from}} inherited{{/if}}">
      +                                <a href="#attr_{{name}}">{{name}}</a>
      +                            </li>
      +                        {{/attrs}}
      +                    </ul>
      +                </div>
      +            {{/if}}
      +
      +            {{#if events}}
      +                <div class="index-section events">
      +                    <h3>Events</h3>
      +
      +                    <ul class="index-list events{{#if extends}} extends{{/if}}">
      +                        {{#events}}
      +                            <li class="index-item event{{#if access}} {{access}}{{/if}}{{#if deprecated}} deprecated{{/if}}{{#if overwritten_from}} inherited{{/if}}{{#if extended_from}} inherited{{/if}}">
      +                                <a href="#event_{{name}}">{{name}}</a>
      +
      +                                {{#if static}}
      +                                    <span class="flag static">static</span>
      +                                {{/if}}
      +                                {{#if deprecated}}
      +                                    <span class="flag deprecated">deprecated</span>
      +                                {{/if}}
      +                            </li>
      +                        {{/events}}
      +                    </ul>
      +                </div>
      +            {{/if}}
      +        </div>
      +
      +        {{#if methods}}
      +            <div id="methods" class="api-class-tabpanel">
      +                <h2 class="off-left">Methods</h2>
      +
      +                {{#methods}}
      +{{>method}}
      +                {{/methods}}
      +            </div>
      +        {{/if}}
      +
      +        {{#if properties}}
      +            <div id="properties" class="api-class-tabpanel">
      +                <h2 class="off-left">Properties</h2>
      +
      +                {{#properties}}
      +{{>props}}
      +                {{/properties}}
      +            </div>
      +        {{/if}}
      +
      +        {{#if attrs}}
      +            <div id="attrs" class="api-class-tabpanel">
      +                <h2 class="off-left">Attributes</h2>
      +
      +                {{#attrs}}
      +                    {{>attrs}}
      +                {{/attrs}}
      +            </div>
      +        {{/if}}
      +
      +        {{#if events}}
      +            <div id="events" class="api-class-tabpanel">
      +                <h2 class="off-left">Events</h2>
      +
      +                {{#events}}
      +                    {{>events}}
      +                {{/events}}
      +            </div>
      +        {{/if}}
      +    </div>
      +</div>
      diff --git a/themes/default/partials/elements.handlebars b/themes/default/partials/elements.handlebars
      new file mode 100644
      index 00000000..ddc46fca
      --- /dev/null
      +++ b/themes/default/partials/elements.handlebars
      @@ -0,0 +1,80 @@
      +<h1>&lt;{{name}}&gt;</h1>
      +<div class="box meta">
      +    {{#if foundAt}}
      +        <div class="foundat">
      +            Defined in: <a href="{{foundAt}}">`{{{file}}}:{{{line}}}`</a>
      +        </div>
      +    {{/if}}
      +
      +    {{#if module}}
      +        {{#if submodule}}
      +            Module: {{#crossLinkModule submodule}}{{/crossLinkModule}}<br>
      +            Parent Module: {{#crossLinkModule module}}{{/crossLinkModule}}
      +        {{else}}
      +            Module: {{#crossLinkModule module}}{{/crossLinkModule}}
      +        {{/if}}
      +    {{/if}}
      +
      +    {{#if since}}
      +        <p>Available since {{since}}</p>
      +    {{/if}}
      +</div>
      +
      +{{#if deprecated}}
      +    <div class="box deprecated">
      +        <p>
      +        {{#if deprecationMessage}}
      +            <strong>Deprecated:</strong> {{deprecationMessage}}
      +        {{else}}
      +            This element is deprecated.
      +        {{/if}}
      +        </p>
      +    </div>
      +{{/if}}
      +
      +<div class="box intro">
      +    {{{elementDescription}}}
      +
      +    <ul class="definitions">
      +        {{#if parents}}
      +        <li>
      +            <dfn>Permitted parent elements: </dfn> {{parents}}
      +        </li>
      +        {{/if}}
      +
      +        {{#if content}}
      +        <li>
      +            <dfn>Permitted content: </dfn> {{content}}
      +        </li>
      +        {{/if}}
      +    </ul>
      +</div>
      +
      +{{#example}}
      +<div class="example">
      +    <h2>Example</h2>
      +
      +    <div class="example-content">
      +        {{{.}}}
      +    </div>
      +</div>
      +{{/example}}
      +
      +{{#if interface}}
      +<h2>Interface</h2>
      +<p>This element implements the {{#crossLink interface}}{{/crossLink}} class.</p>
      +{{/if}}
      +
      +<div class="index-section attrs">
      +    <h2>Attributes</h2>
      +
      +    {{#if attributes}}
      +    <div id="attributes">
      +        {{#attributes}}
      +            {{>attributes}}
      +        {{/attributes}}
      +    </div>
      +    {{else}}
      +    <p>This element has no defined attributes.</p>
      +    {{/if}}
      +</div>
      diff --git a/themes/default/partials/events.handlebars b/themes/default/partials/events.handlebars
      new file mode 100644
      index 00000000..cb7a6b5d
      --- /dev/null
      +++ b/themes/default/partials/events.handlebars
      @@ -0,0 +1,137 @@
      +<div id="event_{{name}}" class="events item{{#if access}} {{access}}{{/if}}{{#if deprecated}} deprecated{{/if}}{{#if extended_from}} inherited{{/if}}">
      +    <h3 class="name"><code>{{name}}</code></h3>
      +    <span class="type">{{#crossLink type}}{{/crossLink}}</span>
      +
      +    {{#if deprecated}}
      +        <span class="flag deprecated"{{#if deprecationMessage}} title="{{deprecationMessage}}"{{/if}}>deprecated</span>
      +    {{/if}}
      +
      +    {{#if access}}
      +        <span class="flag {{access}}">{{access}}</span>
      +    {{/if}}
      +
      +    {{#if final}}
      +        <span class="flag final">final</span>
      +    {{/if}}
      +
      +    {{#if static}}
      +        <span class="flag static">static</span>
      +    {{/if}}
      +
      +    <div class="meta">
      +        {{#if overwritten_from}}
      +            <p>Inherited from
      +            <a href="{{crossLinkRaw overwritten_from/class}}#event_{{overwritten_from/name}}">
      +                {{overwritten_from/class}}
      +            </a>
      +            {{#if foundAt}}
      +            but overwritten in
      +            {{/if}}
      +        {{else}}
      +            {{#if extended_from}}
      +                <p>Inherited from
      +                <a href="{{crossLinkRaw extended_from}}#event_{{name}}">{{extended_from}}</a>:
      +            {{else}}
      +                {{#providedBy}}
      +                    <p>Provided by the <a href="../modules/{{.}}.html">{{.}}</a> module.</p>
      +                {{/providedBy}}
      +                <p>
      +                {{#if foundAt}}
      +                Defined in
      +                {{/if}}
      +            {{/if}}
      +        {{/if}}
      +        {{#if foundAt}}
      +        <a href="{{foundAt}}">`{{{file}}}:{{{line}}}`</a>
      +        {{/if}}
      +        </p>
      +
      +        {{#if deprecationMessage}}
      +            <p>Deprecated: {{deprecationMessage}}</p>
      +        {{/if}}
      +
      +        {{#if since}}
      +            <p>Available since {{since}}</p>
      +        {{/if}}
      +    </div>
      +
      +    <div class="description">
      +        {{{eventDescription}}}
      +    </div>
      +
      +    {{#if params}}
      +        <div class="params">
      +            <h4>Event Payload:</h4>
      +
      +            <ul class="params-list">
      +            {{#params}}
      +                <li class="param">
      +                    {{#if optional}}
      +                        <code class="param-name optional">[{{name}}{{#if optdefault}}={{optdefault}}{{/if}}]</code>
      +                        <span class="type">{{#crossLink type}}{{/crossLink}}</span>
      +                        <span class="flag optional" title="This parameter is optional.">optional</span>
      +                    {{else}}
      +                        <code class="param-name">{{name}}</code>
      +                        <span class="type">{{#crossLink type}}{{/crossLink}}</span>
      +                    {{/if}}
      +
      +                    {{#if multiple}}
      +                        <span class="flag multiple" title="This parameter may occur one or more times.">Multiple</span>
      +                    {{/if}}
      +
      +                    <div class="param-description">
      +                        {{{description}}}
      +                    </div>
      +
      +                    {{#if props}}
      +                        <ul class="params-list">
      +                            {{#props}}
      +                            <li class="param">
      +                                {{#if optional}}
      +                                    <code class="param-name optional">[{{name}}{{#if optdefault}}={{optdefault}}{{/if}}]</code>
      +                                    <span class="type">{{#crossLink type}}{{/crossLink}}</span>
      +                                    <span class="flag optional" title="This parameter is optional.">optional</span>
      +                                {{else}}
      +                                    <code class="param-name">{{name}}</code>
      +                                    <span class="type">{{#crossLink type}}{{/crossLink}}</span>
      +                                {{/if}}
      +
      +                                <div class="param-description">
      +                                    {{{description}}}
      +                                </div>
      +
      +                                {{#if props}}
      +                                    <ul class="params-list">
      +                                        {{#props}}
      +                                        <li class="param">
      +                                            <code class="param-name">{{name}}</code>
      +                                            <span class="type">{{#crossLink type}}{{/crossLink}}</span>
      +
      +                                            <div class="param-description">
      +                                                {{{description}}}
      +                                            </div>
      +                                        </li>
      +                                        {{/props}}
      +                                    </ul>
      +                                {{/if}}
      +                            </li>
      +                            {{/props}}
      +                        </ul>
      +                    {{/if}}
      +                </li>
      +            {{/params}}
      +            </ul>
      +        </div>
      +    {{/if}}
      +
      +
      +    {{#example}}
      +        <div class="example">
      +            <h4>Example:</h4>
      +
      +            <div class="example-content">
      +                {{{.}}}
      +            </div>
      +        </div>
      +    {{/example}}
      +</div>
      diff --git a/themes/default/partials/files.handlebars b/themes/default/partials/files.handlebars
      new file mode 100644
      index 00000000..fccd4767
      --- /dev/null
      +++ b/themes/default/partials/files.handlebars
      @@ -0,0 +1,7 @@
      +<h1 class="file-heading">File: {{fileName}}</h1>
      +
      +<div class="file">
      +    <pre class="code prettyprint linenums">
      +{{fileData}}
      +    </pre>
      +</div>
      diff --git a/themes/default/partials/index.handlebars b/themes/default/partials/index.handlebars
      new file mode 100644
      index 00000000..29a0e85e
      --- /dev/null
      +++ b/themes/default/partials/index.handlebars
      @@ -0,0 +1,21 @@
      +    <div class="apidocs">
      +        <div id="docs-main" class="content">
      +            <p>
      +            Browse to a module or class using the sidebar to view its API documentation.
      +            </p>
      +
      +            <h2>Keyboard Shortcuts</h2>
      +
      +            <ul>
      +                <li><p>Press <kbd>s</kbd> to focus the API search box.</p></li>
      +
      +                <li><p>Use <kbd>Up</kbd> and <kbd>Down</kbd> to select classes, modules, and search results.</p></li>
      +
      +                <li class="mac-only"><p>With the API search box or sidebar focused, use <kbd><span class="cmd">&#x2318;</span>-Left</kbd> or <kbd><span class="cmd">&#x2318;</span>-Right</kbd> to switch sidebar tabs.</p></li>
      +
      +                <li class="pc-only"><p>With the API search box or sidebar focused, use <kbd>Ctrl+Left</kbd> and <kbd>Ctrl+Right</kbd> to switch sidebar tabs.</p></li>
      +            </ul>
      +        </div>
      +    </div>
      +
      +
      diff --git a/themes/default/partials/method.handlebars b/themes/default/partials/method.handlebars
      new file mode 100644
      index 00000000..664d79b1
      --- /dev/null
      +++ b/themes/default/partials/method.handlebars
      @@ -0,0 +1,212 @@
      +<div id="method_{{name}}" class="method item{{#if access}} {{access}}{{/if}}{{#if deprecated}} deprecated{{/if}}{{#if extended_from}} inherited{{/if}}">
      +    <h3 class="name"><code>{{name}}</code></h3>
      +
      +    {{#if params}}
      +        <div class="args">
      +            <span class="paren">(</span><ul class="args-list inline commas">
      +            {{#params}}
      +                <li class="arg">
      +                    {{#if optional}}
      +                        <code class="optional">[{{name}}{{#if optdefault}}={{optdefault}}{{/if}}]</code>
      +                    {{else}}
      +                        <code>{{name}}</code>
      +                    {{/if}}
      +                </li>
      +            {{/params}}
      +            </ul><span class="paren">)</span>
      +        </div>
      +    {{else}}
      +        <span class="paren">()</span>
      +    {{/if}}
      +
      +    {{#if return}}
      +        <span class="returns-inline">
      +            <span class="type">{{#crossLink returnType}}{{/crossLink}}</span>
      +        </span>
      +    {{/if}}
      +
      +    {{#if deprecated}}
      +        <span class="flag deprecated"{{#if deprecationMessage}} title="{{deprecationMessage}}"{{/if}}>deprecated</span>
      +    {{/if}}
      +
      +    {{#if access}}
      +        <span class="flag {{access}}">{{access}}</span>
      +    {{/if}}
      +
      +    {{#if final}}
      +        <span class="flag final">final</span>
      +    {{/if}}
      +
      +    {{#if static}}
      +        <span class="flag static">static</span>
      +    {{/if}}
      +
      +    {{#if chainable}}
      +        <span class="flag chainable">chainable</span>
      +    {{/if}}
      +
      +    {{#if async}}
      +        <span class="flag async">async</span>
      +    {{/if}}
      +
      +    <div class="meta">
      +        {{#if overwritten_from}}
      +            <p>Inherited from
      +            <a href="{{crossLinkRaw overwritten_from/class}}#method_{{overwritten_from/name}}">
      +                {{overwritten_from/class}}
      +            </a>
      +            {{#if foundAt}}
      +            but overwritten in
      +            {{/if}}
      +        {{else}}
      +            {{#if extended_from}}
      +                <p>Inherited from
      +                <a href="{{crossLinkRaw extended_from}}#method_{{name}}">{{extended_from}}</a>:
      +            {{else}}
      +                {{#providedBy}}
      +                    <p>Provided by the <a href="../modules/{{.}}.html">{{.}}</a> module.</p>
      +                {{/providedBy}}
      +                <p>
      +                {{#if foundAt}}
      +                Defined in
      +                {{/if}}
      +            {{/if}}
      +        {{/if}}
      +        {{#if foundAt}}
      +        <a href="{{foundAt}}">`{{{file}}}:{{{line}}}`</a>
      +        {{/if}}
      +        </p>
      +
      +
      +        {{#if deprecationMessage}}
      +            <p>Deprecated: {{deprecationMessage}}</p>
      +        {{/if}}
      +
      +        {{#if since}}
      +            <p>Available since {{since}}</p>
      +        {{/if}}
      +    </div>
      +
      +    <div class="description">
      +        {{{methodDescription}}}
      +    </div>
      +
      +    {{#if params}}
      +        <div class="params">
      +            <h4>Parameters:</h4>
      +
      +            <ul class="params-list">
      +            {{#params}}
      +                <li class="param">
      +                    {{#if optional}}
      +                        <code class="param-name optional">[{{name}}{{#if optdefault}}={{optdefault}}{{/if}}]</code>
      +                        <span class="type">{{#crossLink type}}{{/crossLink}}</span>
      +                        <span class="flag optional" title="This parameter is optional.">optional</span>
      +                    {{else}}
      +                        <code class="param-name">{{name}}</code>
      +                        <span class="type">{{#crossLink type}}{{/crossLink}}</span>
      +                    {{/if}}
      +
      +                    {{#if multiple}}
      +                        <span class="flag multiple" title="This argument may occur one or more times.">multiple</span>
      +                    {{/if}}
      +
      +                    <div class="param-description">
      +                        {{{description}}}
      +                    </div>
      +
      +                    {{#if props}}
      +                        <ul class="params-list">
      +                            {{#props}}
      +                            <li class="param">
      +                                {{#if optional}}
      +                                    <code class="param-name optional">[{{name}}{{#if optdefault}}={{optdefault}}{{/if}}]</code>
      +                                    <span class="type">{{#crossLink type}}{{/crossLink}}</span>
      +                                    <span class="flag optional" title="This parameter is optional.">optional</span>
      +                                {{else}}
      +                                    <code class="param-name">{{name}}</code>
      +                                    <span class="type">{{#crossLink type}}{{/crossLink}}</span>
      +                                {{/if}}
      +
      +                                <div class="param-description">
      +                                    {{{description}}}
      +                                </div>
      +
      +                                {{#if props}}
      +                                    <ul class="params-list">
      +                                        {{#props}}
      +                                        <li class="param">
      +                                            {{#if optional}}
      +                                                <code class="param-name optional">[{{name}}{{#if optdefault}}={{optdefault}}{{/if}}]</code>
      +                                                <span class="type">{{#crossLink type}}{{/crossLink}}</span>
      +                                                <span class="flag optional" title="This parameter is optional.">optional</span>
      +                                            {{else}}
      +                                                <code class="param-name">{{name}}</code>
      +                                                <span class="type">{{#crossLink type}}{{/crossLink}}</span>
      +                                            {{/if}}
      +
      +                                            <div class="param-description">
      +                                                {{{description}}}
      +                                            </div>
      +                                        </li>
      +                                        {{/props}}
      +                                    </ul>
      +                                {{/if}}
      +                            </li>
      +                            {{/props}}
      +                        </ul>
      +                    {{/if}}
      +                </li>
      +            {{/params}}
      +            </ul>
      +        </div>
      +    {{/if}}
      +
      +    {{#return}}
      +        <div class="returns">
      +            <h4>Returns:</h4>
      +
      +            <div class="returns-description">
      +                {{#if description}}
      +                    {{#if type}}
      +                        <span class="type">{{#crossLink type}}{{/crossLink}}</span>:
      +                    {{/if}}
      +                    {{{description}}}
      +                {{else}}
      +                    {{#if type}}
      +                        <span class="type">{{#crossLink type}}{{/crossLink}}</span>:
      +                    {{/if}}
      +                {{/if}}
      +            </div>
      +        </div>
      +    {{/return}}
      +
      +    {{#throws}}
      +        <div class="throws">
      +            <h4>Throws:</h4>
      +
      +            <div class="throws-description">
      +                {{#if description}}
      +                    {{#if type}}
      +                        <span class="type">{{#crossLink type}}{{/crossLink}}</span>:
      +                    {{/if}}
      +                    {{{description}}}
      +                {{else}}
      +                    {{#if type}}
      +                        <span class="type">{{#crossLink type}}{{/crossLink}}</span>:
      +                    {{/if}}
      +                {{/if}}
      +            </div>
      +        </div>
      +    {{/throws}}
      +
      +    {{#example}}
      +        <div class="example">
      +            <h4>Example:</h4>
      +
      +            <div class="example-content">
      +                {{{.}}}
      +            </div>
      +        </div>
      +    {{/example}}
      +</div>
      diff --git a/themes/default/partials/module.handlebars b/themes/default/partials/module.handlebars
      new file mode 100644
      index 00000000..81149507
      --- /dev/null
      +++ b/themes/default/partials/module.handlebars
      @@ -0,0 +1,108 @@
      +<h1>{{name}} Module</h1>
      +<div class="box clearfix meta">
      +    {{#extra}}
      +        {{#selleck}}
      +            <a class="button link-docs" href="/yui/docs/{{name}}">User Guide &amp; Examples</a>
      +        {{/selleck}}
      +    {{/extra}}
      +
      +    {{#if requires}}
      +        <div class="uses">
      +            Requires
      +            <ul class="inline commas">
      +                {{#requires}}
      +                    <li>{{#crossLinkModule .}}{{/crossLinkModule}}</li>
      +                {{/requires}}
      +            </ul>
      +        </div>
      +    {{/if}}
      +
      +    {{#if foundAt}}
      +        <div class="foundat">
      +            Defined in: <a href="{{foundAt}}">`{{{file}}}:{{{line}}}`</a>
      +        </div>
      +    {{/if}}
      +
      +    {{#if since}}
      +        <p>Available since {{since}}</p>
      +    {{/if}}
      +</div>
      +
      +{{#if deprecated}}
      +    <div class="box deprecated">
      +        <p>
      +        {{#if deprecationMessage}}
      +            <strong>Deprecated:</strong> {{deprecationMessage}}
      +        {{else}}
      +            This module is deprecated.
      +        {{/if}}
      +        </p>
      +    </div>
      +{{/if}}
      +
      +<div class="box intro">
      +    {{{moduleDescription}}}
      +</div>
      +
      +{{#example}}
      +    <div class="example">
      +        <h4>Example:</h4>
      +        <div class="example-content">
      +            {{{.}}}
      +        </div>
      +    </div>
      +{{/example}}
      +
      +<div class="yui3-g">
      +    <div class="yui3-u-1-{{#if moduleElements}}3{{else}}2{{/if}}">
      +        {{#if moduleClasses}}
      +            <p>This module provides the following classes:</p>
      +
      +            <ul class="module-classes">
      +            {{#moduleClasses}}
      +                <li class="module-class">
      +                    <a href="{{../projectRoot}}classes/{{name}}.html">
      +                        {{displayName}}
      +                    </a>
      +                </li>
      +            {{/moduleClasses}}
      +            </ul>
      +        {{/if}}
      +    </div>
      +
      +    {{#if moduleElements}}
      +    <div class="yui3-u-1-3">
      +        <p>This module provides the following elements:</p>
      +
      +        <ul class="module-elements">
      +        {{#moduleElements}}
      +            <li class="module-element">
      +                <a href="{{../projectRoot}}elements/{{name}}.html">
      +                    &lt;{{displayName}}&gt;
      +                </a>
      +            </li>
      +        {{/moduleElements}}
      +        </ul>
      +    </div>
      +    {{/if}}
      +
      +    <div class="yui3-u-1-{{#if moduleElements}}3{{else}}2{{/if}}">
      +        {{#if subModules}}
      +            <p>This module is a rollup of the following modules:</p>
      +
      +            <ul class="module-submodules">
      +            {{#subModules}}
      +                <li class="module-submodule">
      +                    <a href="{{../projectRoot}}modules/{{name}}.html">
      +                        {{displayName}}
      +                    </a>
      +
      +                    <div class="module-submodule-description">
      +                        {{{description}}}
      +                    </div>
      +                </li>
      +            {{/subModules}}
      +            </ul>
      +        {{/if}}
      +    </div>
      +</div>
      diff --git a/themes/default/partials/options.handlebars b/themes/default/partials/options.handlebars
      new file mode 100644
      index 00000000..2b26210a
      --- /dev/null
      +++ b/themes/default/partials/options.handlebars
      @@ -0,0 +1,23 @@
      +    <div id="api-options">
      +        Show:
      +        <label for="api-show-inherited">
      +            <input type="checkbox" id="api-show-inherited" checked>
      +            Inherited
      +        </label>
      +
      +        <label for="api-show-protected">
      +            <input type="checkbox" id="api-show-protected">
      +            Protected
      +        </label>
      +
      +        <label for="api-show-private">
      +            <input type="checkbox" id="api-show-private">
      +            Private
      +        </label>
      +        <label for="api-show-deprecated">
      +            <input type="checkbox" id="api-show-deprecated">
      +            Deprecated
      +        </label>
      +
      +    </div>
      +
      diff --git a/themes/default/partials/props.handlebars b/themes/default/partials/props.handlebars
      new file mode 100644
      index 00000000..696e7209
      --- /dev/null
      +++ b/themes/default/partials/props.handlebars
      @@ -0,0 +1,119 @@
      +<div id="property_{{name}}" class="property item{{#if access}} {{access}}{{/if}}{{#if deprecated}} deprecated{{/if}}{{#if extended_from}} inherited{{/if}}">
      +    <h3 class="name"><code>{{name}}</code></h3>
      +    <span class="type">{{#crossLink type}}{{/crossLink}}</span>
      +
      +    {{#if deprecated}}
      +        <span class="flag deprecated"{{#if deprecationMessage}} title="{{deprecationMessage}}"{{/if}}>deprecated</span>
      +    {{/if}}
      +
      +    {{#if access}}
      +        <span class="flag {{access}}">{{access}}</span>
      +    {{/if}}
      +
      +    {{#if final}}
      +        <span class="flag final">final</span>
      +    {{/if}}
      +
      +    {{#if static}}
      +        <span class="flag static">static</span>
      +    {{/if}}
      +
      +    <div class="meta">
      +        {{#if overwritten_from}}
      +            <p>Inherited from
      +            <a href="{{crossLinkRaw overwritten_from/class}}#property_{{overwritten_from/name}}">
      +                {{overwritten_from/class}}
      +            </a>
      +            {{#if foundAt}}
      +            but overwritten in
      +            {{/if}}
      +        {{else}}
      +            {{#if extended_from}}
      +                <p>Inherited from
      +                <a href="{{crossLinkRaw extended_from}}#property_{{name}}">{{extended_from}}</a>:
      +            {{else}}
      +                {{#providedBy}}
      +                    <p>Provided by the <a href="../modules/{{.}}.html">{{.}}</a> module.</p>
      +                {{/providedBy}}
      +                <p>
      +                {{#if foundAt}}
      +                Defined in
      +                {{/if}}
      +            {{/if}}
      +        {{/if}}
      +        {{#if foundAt}}
      +        <a href="{{foundAt}}">`{{{file}}}:{{{line}}}`</a>
      +        {{/if}}
      +        </p>
      +
      +        {{#if deprecationMessage}}
      +            <p>Deprecated: {{deprecationMessage}}</p>
      +        {{/if}}
      +
      +        {{#if since}}
      +            <p>Available since {{since}}</p>
      +        {{/if}}
      +    </div>
      +
      +    <div class="description">
      +        {{{propertyDescription}}}
      +    </div>
      +
      +    {{#if default}}
      +        <p><strong>Default:</strong> {{default}}</p>
      +    {{/if}}
      +
      +    {{#example}}
      +        <div class="example">
      +            <h4>Example:</h4>
      +
      +            <div class="example-content">
      +                {{{.}}}
      +            </div>
      +        </div>
      +    {{/example}}
      +
      +    {{#if subprops}}
      +        <h4>Sub-properties:</h4>
      +
      +        <ul class="params-list">
      +            {{#subprops}}
      +            <li class="param">
      +                {{#if optional}}
      +                    <code class="param-name optional">[{{name}}{{#if optdefault}}={{optdefault}}{{/if}}]</code>
      +                    <span class="type">{{#crossLink type}}{{/crossLink}}</span>
      +                    <span class="flag optional" title="This property is optional.">optional</span>
      +                {{else}}
      +                    <code class="param-name">{{name}}</code>
      +                    <span class="type">{{#crossLink type}}{{/crossLink}}</span>
      +                {{/if}}
      +
      +                <div class="param-description">
      +                    {{{description}}}
      +                </div>
      +
      +                {{#if subprops}}
      +                    <ul class="params-list">
      +                        {{#subprops}}
      +                        <li class="param">
      +                            {{#if optional}}
      +                                <code class="param-name optional">[{{name}}{{#if optdefault}}={{optdefault}}{{/if}}]</code>
      +                                <span class="type">{{#crossLink type}}{{/crossLink}}</span>
      +                                <span class="flag optional" title="This property is optional.">optional</span>
      +                            {{else}}
      +                                <code class="param-name">{{name}}</code>
      +                                <span class="type">{{#crossLink type}}{{/crossLink}}</span>
      +                            {{/if}}
      +
      +                            <div class="param-description">
      +                                {{{description}}}
      +                            </div>
      +                        </li>
      +                        {{/subprops}}
      +                    </ul>
      +                {{/if}}
      +            </li>
      +            {{/subprops}}
      +        </ul>
      +    {{/if}}
      +</div>
      diff --git a/themes/default/partials/sidebar.handlebars b/themes/default/partials/sidebar.handlebars
      new file mode 100644
      index 00000000..2b86b7ab
      --- /dev/null
      +++ b/themes/default/partials/sidebar.handlebars
      @@ -0,0 +1,38 @@
      +<div id="api-list">
      +    <h2 class="off-left">APIs</h2>
      +    <div id="api-tabview" class="tabview">
      +        <ul class="tabs">
      +            <li><a href="#api-classes">Classes</a></li>
      +            {{#if elements}}
      +            <li><a href="#api-elements">Elements</a></li>
      +            {{/if}}
      +            <li><a href="#api-modules">Modules</a></li>
      +        </ul>
      +
      +        <div id="api-tabview-filter">
      +            <input type="search" id="api-filter" placeholder="Type to filter APIs">
      +        </div>
      +
      +        <div id="api-tabview-panel">
      +            <ul id="api-classes" class="apis classes">
      +            {{#classes}}
      +                <li><a href="{{../projectRoot}}classes/{{name}}.html">{{displayName}}</a></li>
      +            {{/classes}}
      +            </ul>
      +
      +            {{#if elements}}
      +                <ul id="api-elements" class="apis elements">
      +                {{#elements}}
      +                    <li><a href="{{../projectRoot}}elements/{{name}}.html">{{displayName}}</a></li>
      +                {{/elements}}
      +                </ul>
      +            {{/if}}
      +
      +            <ul id="api-modules" class="apis modules">
      +            {{#allModules}}
      +                <li><a href="{{../projectRoot}}modules/{{name}}.html">{{displayName}}</a></li>
      +            {{/allModules}}
      +            </ul>
      +        </div>
      +    </div>
      +</div>
      diff --git a/themes/default/theme.json b/themes/default/theme.json
      new file mode 100644
      index 00000000..d540f15c
      --- /dev/null
      +++ b/themes/default/theme.json
      @@ -0,0 +1,4 @@
      +{
      +    "yuiGridsUrl": "http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css",
      +    "yuiSeedUrl": "http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"
      +}
      diff --git a/themes/simple/assets/css/external-small.png b/themes/simple/assets/css/external-small.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..759a1cdcb5b1697e5be290d98b830e279cd71f3c
      GIT binary patch
      literal 491
      zcmV<H0Tlj;P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN;
      zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzjY&j7RCwBA{Qv(y10{fofkHsB0W2_v
      zUBVFtR#sLp=H=xBVFzYr=KaWuf!;khr%J>Ds{zR1^XE?tfB*h@ASKHAa7wwn{MEbP
      z7_^nS7{V*>+A}bS;P%45fB%Ai|Neasi2rl3{=EO;!w318%8Ovl7jArHc=P5Brfr~D
      z0AYimtss2w$hlYlfd>7*aO3TNzw875LBK0xAD9Np|A(oEVYnB*eE9~V6wP%78SXuL
      z&#-X)Er#`zY#Ce<cQE|@_n*NrZu>)^8hM<t@c%yx7=Qlqo#E+=&kU8xDhyfmhZ%Ci
      zB^dtyV`g~#;=9AYe+-T|4Pa;I2jl<${xZmkvoM^x_?{uwM}|RLMTp_`2UZ3)Hogb%
      z@2x(7(}2e(%NV%1Med)x^p}B+U4TJPLyAFJUXtPFBQCJ`lT(!p@9(X`oen;~J|q6|
      z@wSPb3!@4d7=I%C`v334k56{?0OcisymvtS3)uihSYBXcWaI%-d^i%^A0P&W@^_&6
      hzgP_zx|s<ezyP)2!%xqD#*+X5002ovPDHLkV1nUx>>B_8
      
      literal 0
      HcmV?d00001
      
      diff --git a/themes/simple/assets/css/logo.png b/themes/simple/assets/css/logo.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..c82444af95895d38bea6fe96cc5354a7419f770c
      GIT binary patch
      literal 7143
      zcmV<D8yMt?P)<h;3K|Lk000e1NJLTq008O$003wR0{{R3$TFO-0007@P)t-s&e7N@
      zH-gsK-M+%iNMNBuSD%THvDVn#HAarCvc0>%$*Zuu-rwWBz{*f-v)|z5tg^kZw!u0~
      zlO{BO($v~UUZfl-b-TdHt+Ku{LW;Gz#LLdsP-?Qy(b!LEv9Y$nGD3^4w7)Dldf3_D
      zJWrO?*4r&RfK6$yJ583Wu)WyY-%Vz%($w19+~LmA*u}}wPinH(*xkX!%}!~sxV^_q
      zWvjTn#y?b@($(9~(%4OAuF%ri)79J4)!T%UyUx+rOJu8sl)L}{0J*)#+1%l+v%b5(
      z$-2JCDmjHHHiIZNf+{$LyTHk>w7$2y#k#-9Co*bXWspKke-IjLOI3=tyTog8ndax{
      zfrq4ae4-vPgC91BB`tFuHGU*4aTX$Tqo}$!K#ZHAwT+d%kCd(;EO`|ra<jO@Av=s%
      zT#X$ne;+M?9xZ_$DR&tseJVte79)5XEPp6Lj^g9yt+Kr*HG-?Kyx`&Gu(rV@HH5FU
      zzalSz-rwW0x5Br(#>vdo#>&#g$k5T#*)~UzNMNGG$Iw7gk2OPn(9+pCNQ5#&jW0in
      z)z{oaS)e;kmr-i6&Cu6AQku`v*g;mFMOvZC%+$-y)y>b=P-?Qy(bvn()y&V<(bL+~
      z*4sy9r%`FK%+A(LW2@KM-r3sV)YjZXRg-CRr^Cn3%FWfv&D2I&m@7Jl*Vx`kU!g)*
      zpG8@r)79HZUZyxolQBJb%gxj~ONT>OpDsFeCOe8YNs=^0kJ8lIJ4}d3U!g`>nmJ6B
      zM`)`mIfm5N++Jv*SYn<+U!=do%sozut+B(jxy0Gq;43z8mYcpTHhw)#iiC@_qo>0{
      zR-Zgfh)PtJ+S}l{zQ`jmeR_efQE9Tcy~o<z;k>}gP*|BOIfd8Q-zz$WhK2J20000(
      zbW%=J`1|?v^!csy@b>TT^5*d9<Ll_|_Tkjm#l~gK(;MZmebTFrYn(xUmwx5Ftj*vt
      zpMNE3N<o$zTX9voJWC7{C<OqevyM>!02s4LL_t(|UewoRZyZ+?2H-YQt9;6b2BfI5
      zRW-F7#Snw6*j}%_&L5kZMP>#wGc$yl%iO=x_fm#-f~K51vOhn1&pG$*7dH;Dx*ctu
      zKYVxP`->O9Iej`9425R?`{&EEXD?j%x~93K-QLyG(|hCi>R_n7j<(h-b?3iIr4otg
      z&6~?x+kg`3^XD5+pZ<DJ%4M_J!NI{|qpha7y{oGCbEHDqSzC90X(^qK%oAu7P#2^W
      zx&i3QjQ6j?WR_S_rBW^)k2l&b6Y%Fl1+%rOdSGa13DSji9_iNB_BM&sx3WT@K)-TI
      zlEE4;6bi}4`VM>5=RkFIHdV(40HxB%Yi*=KpN~p6f?M0SU+ze#$s)4?o6B))A(>1z
      z)^v3BoMft__EIbcs5a6liPVKi0|6%8@FC%uyMt2_sf^w#uqfv_TQj&Pk?Lr@lm}Fe
      zR5PWn-Q6`VU2#DkTK**`$<!*E*lhJXozC*N&Gw!XMa6j5<@0%Mq!AwJGV0;OA8Dq5
      z2BOg|S1|O<DG92SF$`=xskN5N=juDUs!j;C8+mG=kfzh?bV>oe>GgVrbS02TkUMAd
      zH!8)+uz@uO%dJT##qOXQFWbA1o$9DP1E;xn>Eca{jj2*!G?l>h>I(fWXJk0lU{!1B
      zja3uu4y~&-?LEgyZEFHkFU4KTB8`qs3n_~f9gR?f!B;t1)>|{hw>2@xE-voWx3?S<
      zwXKdr4T~4hXmo#{OV^0h=Z!F_YjeB+D6>+p@z#m!H?bNluzh_tWP9XP2NJc4G_gOY
      zlLpooXwuk8!ADuyY|R)3wqR);Jyj3wQBqZ?dGRJ9b2_Qdo2F8>lM1pTi;@J^@N_aS
      zr?RjDJL;^lcOMn?dTm}K)h}K^_0qul(gMkvJSIY84<toaD3&c@NO`bkE7SV5!BQ*g
      zYDddaP_MV1$y-fnVt$WH#YWmi+UufyL(g(>LaJzEl}!Vy3)XLHVp4Z(?Jb8*ZH<XY
      z_0ZRVrrqwnIkAz}NT&Nk<S{JTcN|h;RfLsG-_gW=y;Wet4INd7NOjcZO_7SbG~(7u
      zcadpe3DSjm9%^X$57|Sg{BZ1BHgTmUUKChZ!>5|B9TK&>Hg6GWDv@&cyZ82VbLvIn
      zqJ5WL+nX=59*;-ya4eVdlX?65zj6};J8QG|9s;$kT0qUuqjbMXIz2$7WG6*ws6S08
      z6R?tCwYg?!u)3$yyRE<q>ue+X_+Y8sO?jhqNi5!ZK;3SgG%z=y3pF_NY;|G+R$Z`)
      z@ro^44y?6xHr!lwkW|N|%2P@x_xnLLNQYuXs$Qux_Y}{BM_?6!wI0}#abPW)_|7cR
      zUcPo<)YghqnvT#&Rp~U7`qqe)>?HM~c{K&8LXKjT${CI|3~cFrn;6((oBcqjjwZ`U
      zQ#{f=?S1MUim~>Mya{!D)q_+O?i5Erp`?pxYKm9~t$x?}iM4EAPQ%1H+|b_h$<$UA
      ziqbwBSft{X5z_q_q<kkaY0&jph7+I0C;^$lM-G&z$w^$U_z)<VsCWU;IFtHe<-uBE
      zPoa-Lg^GP-Uc7q<j7;e*Ce>xS7yBK#Yuk5w^X@9Pk(#L3zWC^&ffh-TG(nA*;;fQM
      z(!jL*C}IRvYej`ozz(D8yFQ-ksJ4tW)o+r%!0JV&hW5pzf~uIO6iiYQDI`j)Y)<(~
      z0<{1l%2{@zfBhV~$ZE6?i9$-I6-BKW+K;0`YI&DNZdH)3EeR>!N&J}~ynQ#zg@UPC
      z`8t|HVMIxyw5XGJFQd|eR48%qVuF<v_Aqsh;2UY^`WR|wrMomjf5hC^NvC<HZb-GE
      zLP|o-YSW~{$<xFi{Nvb3Y8@1Fiefhnq_7Gqx00gHe^F2}=?M8oknD$2Yb_&9^h0X8
      zWzfB9`-+`}P;;7nq)@BG788qeHA}V;3QF3(v<MYW_2<nFj(7&cN{h5^STyewa#%Ik
      zKZx4fRPlL~0zpVknL=vVNeK1PYK0*caZVPClSLXQimxNyzDd2+xx)%lbT2X`6-MjM
      z(xRz885sfeXH-Lb?|V}nbyh!OqN#pE_l_Y`GN;D&U551bcurP(S7K0E!pDlNUPw!Y
      zIC_^+{eJ#LB31SiXqj6_!@z=y6CMfEn!O|Xm*vW>e>T{A-jCX8^$v_iF{Z{jh4jS`
      zPha=U4~Bw|SGiLv6&_>?lEj8}ir%Jt9~J$56LMb;g{?cBk-~mDs6g^5{hxBPe~Rk7
      z;&^`OOn-4EGky7~W5${2q?6hvX~t<ZM*BjI3mF&{(3LbInt+R0UUqPYaz)riSmoAI
      zENoXm$=%f@;ilb!sheyf4Ui3cjY8uUhr1R3m7eE3uY2!qY7aZ>O!&o5zUSrpoaYe}
      zH@l$4M{SdOB~2f-tt3G;l~N^?6%Y=IO^Q1%kGiAOPUW&f`d+c`z3>eqWj0@k+KpR6
      zjPb&OiyyAWNH>DdP11;NqM}n%k;19F#~(%s>PW;tH~26bRjZU0>4NT`yL)5GAjzvW
      z4c=Wk@8~9jP0(shprAZ7>!rQrQ8}qsQb~H1glozmsSs6;)QiniB6({&I$J(jAD4?l
      z2z0ygse{Lkp6>X15{lID9|{E8PZ&swtlT%GoqF=C8x;%5q_cde{dD^h5~8B`0aC+O
      zVKr?N!j?zfQBKnNOQcNyC9?Onht$=Rd>|^Do$<!E+uGV%zK)Or9R*D#>ty3Q-QC?C
      zi+X%G(sw7&(-T}ulW9tRq(Rbez6rky9G^Clx_01LPfx3_;BZnK!=jaHA*-z+?DMaD
      z3+k@YYce36=dJhZ=kF0x+Iv3+H;88*uTL6Uj`0&|wCQ(kZJjMAveVO0o*2{yPQ~<-
      z6g4>#&*t7b4XFRgLgKQ>vM^HcD?sftAb(G_18P^V!wc2ofn_Q~16V$Kyr{dpvy|rU
      z?EIIgDQ2%qdK*a<pM<2a<Mu5wQQ;FIsBM6XEtj9vhKaQ|Ici*>rn8E*he)Q=#`!l9
      z^_)Ph?A4T}RK%(k#jCqZq9UogN>L`EDFh|Gj-($lQiiIG)Gt=!tTF+WtBMYAY+Tux
      z8A8>OG*=Z+BSpv4Nr4JehM_*tkP=LiVUv!8V@4HJAa8%ci@M8Ir6?&*4j>iIK_$J8
      zq>9bwKIvlB66v>n)c0jkRgQ{h?{OEZ9*HIeDvZ*sWQ9m@RLeBO5|y@In>JqyO4P<O
      zWj{z8*23Yid-6Q>aw*e*gJYh9LdbcFn*P<@lW6)5&8$Ynp7%<cshTF1emDjp9AF95
      zbQ%cdF{VgWOP8o1DY_&Z{v?VjngS!2HH@^+?kz%nM&_>4c;{z71yY78NkP*=(6ns&
      zUOzX6h6tVRBvUm_4{73t5xy*r8jUP)RHT&07zh<rNnp!jjTiG*f^t<kE5xRqD(Wt#
      zkF-a4*Z=A4)zX>{U}d{({w4Y-tJ|NQCRT{{p-HCd<ams&Qs^=TJ`O`QLDdvRO{%OI
      zy45cdSVcvLMA{Jq2L)n@slvhuPuA*-{H`BTQNAYo<Z9{O``I-vs@LYv4CUjaVycWM
      znX1Vc1i_SN7n`HP@D!+G(*Pd~o1sou7)DX8T3DqOe3oiL&?4S2jct1b>YiuZRZ5ca
      zOHc3RTTm3$WAjne#Vkk)m~^x(FjaM`D2OS-DuJ3rL9zAH1=51WQEdekx-a%#?i&!(
      z!x`qPqOfAv{8E*ak^UJqg^-%!4*xcgN}r_Kd~grG)ifKPxEIrzs=Byk!ywkLl&T9{
      zO>qhrsE#R7*(|M~omU9!l~YFO**(HS5K<;7O~p&h_qyikAQUQu*XE;7^4*WcrZ9#v
      zbgpV#va-8kUaLl0LB-TXLDAB0m=aa08b(sgUJ+bX4vHVaNm!rX&5hw!F-xIJfplKh
      zshYim-(17=_1b(CwdaHm76AiW5LeX{c}pxViL5}KOq=H=Duxb%nufli8%|#dRGT$l
      z-gP1HTbVQ}Xb3(eUfK(&$XfK~a~7wJSJRJGQg=@p>K+&y5gP@l%(%f+HE7Z@e@lJ@
      zs<kj_a8#X8k{T5oL5@1*BoZNtx-X27LQVWqIX$dAp56_p$cl}Z{+%xtpHGqWE9gjr
      zS0$;}=Fjx37<{16Z5X1q5!46<1%;5PiKIX^P09#z>TDk<P@zBts%1%5<doSPE}6lC
      zl^@Nwa7kx|MDvv$2}y4g($Y2`P^*UaW#j5ViCT?JRov<Vr1bKdP&H}vQ&a+qq~^v3
      zv-FxsVA~d`3a4rYrI`3F3zcSYSbO?4v2gh@dzt<CvdCUeI)J1Dl9Zy#^hHq@b<|Qu
      zqLHea;E-}H#!+oOnP8|JCfnJ|aLS^plxo^?T1g6+0Pon_H$$xoRwR8i@2*oudf}Q&
      zRQc+Gi2Ar^)c{aDT}SB_EWuQ@DWHtWWGU2*jRo8Va?pgOjfw=8sGL)L98Zy|9SJbO
      zGg~{c14~xW=FyOvz3StY_pnesK8dC8OxM6vM9dRh;!fD8Do4#K20@@YrfzXm10mH=
      zP%RZzX01CUDC((ccETW+b}zVB-di3&s=Vy!y+}GoOnw=kgrc@SbRy9SQj-&WuW55t
      zxtI*JG-`rxjVut9gq@J6j>Aw33{}E9{1_wtfWWM^4O7R0KnH=SGPZtyR+6fkvh@9v
      zdmSo7^;P9{at51F?#`I1D-I9}W4nOgVU7v~dGiiIy}w~`Qb;&@bkTBewGz}}f!b9F
      z31=k3U8BICFq8Zq>$|U%zOyMcPl0sq^Kb7-k9(GKujl%wN7RzEmr>Ol4zql8W}+1e
      z`P(_Fm7NO!#898Z_hSjZAqzDg>cRgDDk_C@JkDOjE`*SH@4=r=;F;Bf3eLX_sqDVq
      zk$MqGtJYTD$mjEQy@g!gm3TG@UY(eO!Opg}%;jMNoB=olyg>sW1l6M*>_AkFRAg-s
      zfC8%_;(>^sfJzLJQ*qdjsEYvL9G0k#G(~DF(wq%FiK`6d()sz<%3M#qSUP*>2H!{2
      zayEZvf7kKfR_E)g>)<P2y}mD(IyXF#HjUaAkTtWa5hYC%zj2^wy^z0%3I!UfKSqJX
      zwiB(q?P%6qkf5Fj6`{&d@>QSAM#v?I>kZpBDybKBhllhtLOOWsc6m{ew5oNHh+3To
      zSO`Mg`=F4E)i;m~{s_y^gy5Hj;REdq)dI`cNKjjQdP6o12dzAax{SZ@A)W^n2(c#h
      z^hBI^v=P@EHeeN!dT-)>=$WVVA6Hxu-B<P`Bo(5rovg`2)G^pz8il4VK<#W<nH<R`
      zO%ofdVI_<Zii)V@(3zYIU`Zx4+fgDMs%<BtE;*VT)d3lk*=RgQHm$?up2TeDl6p~}
      zbIsFxkiGam{U7f1mHQ+l^>z6g*Yg<Fy?{zs*L&C3fAa=pa3{n{uBMR7rTY7B#-iD@
      z6NO5ps5m+f`$0Wmx}hnqPYWNeKSV?gtR9xAzFs35AC8TWP2)of<z1JTb?3KSI=VU%
      zXo{q_zCu#ZK1ueZ%GP_x$%W;*uIG+45Y$Y|N`G!&O-;>%*K79W`pzC~&oI<vBm$f5
      zzPqQ9btxHgY!Zot6?T9WMIDI@$EL>86m>ZU_j;pO%DpC*tgp&PwO-VhOVufm&b_bt
      zB(|_n(znXj^{yXEwVA<!u62yH=ImEg*36AFg;WZJP4zdQyww4u4Fq-Rd?5!h<_8Rj
      z_WP^3*ciNJ8XrkD9i*hkmp{OJ={U6z%flt#u#LE06aNfnX<5`?J?HVgBzy08dXgu7
      z*D4#U^MbW5FO#@%X0QcO8#+JqH#Igk9XW8fqX9KV)c#zKz@};`YoPUB{mI5NXHM47
      z9Sh=rc(lr1|Bo=#nEUyEi6s7k=K|f^fxn|n8Af_*kbru&`O@ZBb#=X6Ti4tSq#U+a
      zG^h1k(_>)8ByQ;5zrVZVXhSBG>COmLj8ydn07153aBc1F_Vxgx2P^qQaiMCg?|=S7
      ztnHhh;MvD7e)5r<l!@wHhsyL_3;Ju$o+YGpjI~;J;#|`JVa;@ASRm-pFDUAHs%oyk
      z`cx3=l}0OmWA?6I>35@+e>qKApW69^@0Pam$Do{)iR#^)F-Pd@>RMZCsyhp;AT0d2
      zI&pRG_lp^Tm9zlb{m|dRP&sSLUm4_#T;TipG4WI;UdvI-{Tmi!jc?oh#IMnId`~4U
      z64m{XkXP!v_nLuJ)fGJ=@5D8Qrlrn?7S7plwEO;vsUz>Owp3uOxev}PRs}h2Yakey
      zT}hq8=X=OXYxPlnTzO6GW&P3a|Lcw67F=yJ(mSI4N}Df5{Vy$N|Jqg+#&Q1v{b3+O
      zeEFeBDNN?uHf`rd>m|8U@7g$<u%=?l(ik(B(MT-UKw3kQvW>m@j{czj(qk1A6|@RE
      zBywpmBOOCaxQPFX&pCPS{oWi-2s7z(lRx0Y_xn8go|AJfiAtI-r7XAFDe74W8>R{0
      z-`V)>;%oC%TbHhHG<{KHRN?y}tav-Wd;1@PJb(V|n``x~_hC)oF!8&mUpjYosZNmc
      zW4`Ke*Z9;Oo*bPV2{lbzfT&1>5mBEf)Z${&W!AisHP6XuC17nkp1s}7wp!Wdc3gOl
      z6G0`;5O(vO#!j}i+iGt6tD7~!C#ShxQ<uK3+nc5fb}TH$QD0Ql=zXkdf);Oj%*RY3
      z`%2RFSheaBELgdsG0}27Res#I?RZpGPvLS2I^eWPJVJN`3RXh>$X_AMp7(X`KlXnQ
      zw2vs#btS4P=3^#h>XrnRPZiS%X@X-Sl_hJ&rV=44vqoUmmmZz9wn~z!3P~X>nzRq9
      zQQ46{6AAUNu@>`T-xs8PbIQNO3KKWNS_$I>6~q3eqq2$pkX2}~7*6!yNIZUZ5RUE;
      z6|jlk|1h$B$-g%jh*H4@tdJEZW@RNRu>zH4?ZZm6I7Q96qGQL84}N><VTfwldXV<b
      zWo8={*QJlDU=Sxm+G&HXKy?%=Ow0vXW`(dYF^?yl?-&I2fN3{BI+G;oT(Tlr(XZUF
      zNo3+~U8%&JLfsIK!=zwkNKIFRi4`bL?F@walyU3fXXGT=sl~;7g~|;J!%2^c(`_lN
      zLRH%krCs4LD}*)bsta5Dpfidwb_YbAFsxD$^QEY{+|v58TT$ggS41bIiKwtM)(>ey
      zO*cJ9md=WH)mbGcI`$w|FoU8#)+^@2zQs%-S>fV_4QN%nM%OxM*iNgaFK+vBuzH%X
      zqEEvfd>qqgP}C{9q}#{7gnF7$(Xaul!i0%2iM{eG=}xQ4IH6bp3)ZNvfMwRBhoI=-
      zsFMc!-oQ_)A}!|5kbh$g8>os%3=?A#&-k+?DeCV#z8$c_#JydNI8i%#Xt?)R4@X6%
      z>8r(jHIp(IVkcwF3KJtbMe=`=8`iT6uWl((J<A3w!bFeR1XfJlp&5AM0Yf6>1v!hF
      zDKug+2^#C}S5tIKQnh_=;gljhccbB0V1=&CtHXx6V(JbB6|h0f|Hd?v2z9PemaL(&
      zkk!?rQ`>Xm)iW=?T-s9hZF(G?h!wEivq^xJm3;)(9S$mBpL|G<`C(2f%35^G%qk1C
      z$ce$SZe}4>m|g$7)Y)-)tK}gQ_ZOCNk371U?}a!%aR8?tBBJJ$s5h5SmL;o#g|1zb
      zxS?3v3qO_Q+B_tkUNN(R)YpVP^5CAo?c?y+y?V@NQ8TmEvMR}{>8h=DoI(kkOKVvo
      z<>;h0tS+nQeD{w7boi*KsmZZ@TFmdDrt)QGWo5ytt#zzZ^WiR9z2PG|X~G&kd^g_r
      zv3IC2^61#U?&+(hQgyi;TV_@Q)nNl+N!1i}>HK^;z4b@aw|M`*4=dB|KlWcWXS32U
      z5C?I=Q(J@tp^bqOQ$)zA5JE(hN-FCIXuw0jn<7Y0UL-C>&<F75bNB|HMa)6zMMe5D
      z?v~VX{Wo}PwwovTF_~qCh3QOtS}IyyUJ^#dog}hSpG#2A0E_6P+{6hxy1RV5fBGEk
      z93%-Iu_pY)fE8yx+$?DuZB5`V=Az21bjZa?VOR!T{}lE(=7X1PIQ){)DM8mkVW+|l
      zH|*(-5Yc~mrBxq^`g)pjd6@jhy0XdnzbErjrgYeU3=4;rgbI0E^*1T1qAOr&Chld0
      zU5Bz(!ywXWbJUZlL{~<_L~+--rG^!-g0rL9ylTjCsA1_vJQ7vuI@GY+4RC6N>g1Tz
      zu*D^ozUx3(iMgfcXs!iN)vyqj8Wz1yUQTdq)v<kj_kmq-LfC@*kFJya{KfJ3CSGvt
      zc1P=d;2J0kh3!MwT-V<ZJ4xJgL)(wEUw!seP-<9|9nhk%Hykg3n0ljjea|AgG7e!2
      zx{hgu0&;8CX3Lv_=NJksOG$LfRW)5lGB%?bUTF6N+Y2qrHEOjA44YO=(=c4u5`cEl
      dE_aK*`wbys)<9*L9Wej^002ovPDHLkV1mbb3%&pV
      
      literal 0
      HcmV?d00001
      
      diff --git a/themes/simple/assets/css/main.css b/themes/simple/assets/css/main.css
      new file mode 100644
      index 00000000..94b3cbe3
      --- /dev/null
      +++ b/themes/simple/assets/css/main.css
      @@ -0,0 +1,429 @@
      +/*
      +Font sizes for all selectors other than the body are given in percentages,
      +with 100% equal to 13px. To calculate a font size percentage, multiply the
      +desired size in pixels by 7.6923076923.
      +
      +Here's a quick lookup table:
      +
      +10px - 76.923%
      +11px - 84.615%
      +12px - 92.308%
      +13px - 100%
      +14px - 107.692%
      +15px - 115.385%
      +16px - 123.077%
      +17px - 130.769%
      +18px - 138.462%
      +19px - 146.154%
      +20px - 153.846%
      +*/
      +
      +html {
      +    background: #fff;
      +    color: #333;
      +    overflow-y: scroll;
      +}
      +
      +body {
      +    font: 13px/1.4 'Lucida Grande', 'Lucida Sans Unicode', 'DejaVu Sans', 'Bitstream Vera Sans', 'Helvetica', 'Arial', sans-serif;
      +    margin: 0;
      +    padding: 0;
      +}
      +
      +/* -- Links ----------------------------------------------------------------- */
      +a {
      +    color: #356de4;
      +    text-decoration: none;
      +}
      +
      +a:hover { text-decoration: underline; }
      +
      +/* "Jump to Table of Contents" link is shown to assistive tools, but hidden from
      +   sight until it's focused. */
      +.jump {
      +    position: absolute;
      +    padding: 3px 6px;
      +    left: -99999px;
      +    top: 0;
      +}
      +
      +.jump:focus { left: 40%; }
      +
      +/* -- Paragraphs ------------------------------------------------------------ */
      +p { margin: 1.3em 0; }
      +dd p, td p { margin-bottom: 0; }
      +dd p:first-child, td p:first-child { margin-top: 0; }
      +
      +/* -- Headings -------------------------------------------------------------- */
      +h1, h2, h3, h4, h5, h6 {
      +    color: #D98527;/*was #f80*/
      +    font-family: 'Trebuchet MS', sans-serif;
      +    font-weight: bold;
      +    line-height: 1.1;
      +    margin: 1.1em 0 0.5em;
      +}
      +
      +h1 {
      +    font-size: 184.6%;
      +    color: #30418C;
      +    margin: 0.75em 0 0.5em;
      +}
      +
      +h2 {
      +    font-size: 153.846%;
      +    color: #E48A2B;
      +}
      +
      +h3 { font-size: 138.462%; }
      +
      +h4 {
      +    border-bottom: 1px solid #DBDFEA;
      +    color: #E48A2B;
      +    font-size: 115.385%;
      +    font-weight: normal;
      +    padding-bottom: 2px;
      +}
      +
      +h5, h6 { font-size: 107.692%; }
      +
      +/* -- Code and examples ----------------------------------------------------- */
      +code, kbd, pre, samp {
      +    font-family: Menlo, Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;
      +    font-size: 92.308%;
      +    line-height: 1.35;
      +}
      +
      +p code, p kbd, p samp, li code {
      +    background: #FCFBFA;
      +    border: 1px solid #EFEEED;
      +    padding: 0 3px;
      +}
      +
      +a code, a kbd, a samp,
      +pre code, pre kbd, pre samp,
      +table code, table kbd, table samp,
      +.intro code, .intro kbd, .intro samp,
      +.toc code, .toc kbd, .toc samp {
      +    background: none;
      +    border: none;
      +    padding: 0;
      +}
      +
      +pre.code, pre.terminal, pre.cmd {
      +    overflow-x: auto;
      +    *overflow-x: scroll;
      +    padding: 0.3em 0.6em;
      +}
      +
      +pre.code {
      +    background: #FCFBFA;
      +    border: 1px solid #EFEEED;
      +    border-left-width: 5px;
      +}
      +
      +pre.terminal, pre.cmd {
      +    background: #F0EFFC;
      +    border: 1px solid #D0CBFB;
      +    border-left: 5px solid #D0CBFB;
      +}
      +
      +/* Don't reduce the font size of <code>/<kbd>/<samp> elements inside <pre>
      +   blocks. */
      +pre code, pre kbd, pre samp { font-size: 100%; }
      +
      +/* Used to denote text that shouldn't be selectable, such as line numbers or
      +   shell prompts. Guess which browser this doesn't work in. */
      +.noselect {
      +    -moz-user-select: -moz-none;
      +    -khtml-user-select: none;
      +    -webkit-user-select: none;
      +    -o-user-select: none;
      +    user-select: none;
      +}
      +
      +/* -- Lists ----------------------------------------------------------------- */
      +dd { margin: 0.2em 0 0.7em 1em; }
      +dl { margin: 1em 0; }
      +dt { font-weight: bold; }
      +
      +/* -- Tables ---------------------------------------------------------------- */
      +caption, th { text-align: left; }
      +
      +table {
      +    border-collapse: collapse;
      +    width: 100%;
      +}
      +
      +td, th {
      +    border: 1px solid #fff;
      +    padding: 5px 12px;
      +    vertical-align: top;
      +}
      +
      +td { background: #E6E9F5; }
      +td dl { margin: 0; }
      +td dl dl { margin: 1em 0; }
      +td pre:first-child { margin-top: 0; }
      +
      +th {
      +    background: #D2D7E6;/*#97A0BF*/
      +    border-bottom: none;
      +    border-top: none;
      +    color: #000;/*#FFF1D5*/
      +    font-family: 'Trebuchet MS', sans-serif;
      +    font-weight: bold;
      +    line-height: 1.3;
      +    white-space: nowrap;
      +}
      +
      +
      +/* -- Layout and Content ---------------------------------------------------- */
      +#doc {
      +    margin: auto;
      +    min-width: 1024px;
      +}
      +
      +#main { width: 754px; }
      +#sidebar { width: 270px; margin: 0 15px; }
      +
      +.content { padding: 0 20px 0 25px; }
      +
      +/* -- Sidebar --------------------------------------------------------------- */
      +.sidebox {
      +    background: #F9F9FC;/*E6E9F5*/
      +    border: 1px solid #D4D8EB;
      +
      +    -moz-border-radius: 4px;
      +    -webkit-border-radius: 4px;
      +    border-radius: 4px;
      +    -moz-box-shadow: 0 0 6px rgba(0, 0, 0, 0.15);
      +    -webkit-box-shadow: 0 0 6px rgba(0, 0, 0, 0.15);
      +    box-shadow: 0 0 6px rgba(0, 0, 0, 0.15);
      +    font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', 'Helvetica', 'Arial', sans-serif;
      +    margin: 0 0 15px 0;
      +    padding-bottom: 1px;
      +}
      +
      +.sidebox h2 {
      +    background: #E5E6F1;
      +    -moz-border-radius: 4px 4px 0 0;
      +    -webkit-border-radius: 4px 4px 0 0;
      +    border-radius: 4px 4px 0 0;
      +    color: #5E6BA4;
      +    font-weight: bold;
      +    font-size: 107.692%;
      +    margin: 0;
      +    padding: 4px 7px 5px;
      +}
      +
      +.sidebox .bd {
      +    font-size: 84.615%;
      +    padding: 0 5px 0 8px;
      +}
      +
      +.sidebox li { list-style-type: disc; color:#D4D5E3; }
      +
      +.sidebox ol, .sidebox ul {
      +    margin-left: 0;
      +    padding-left: 16px;
      +}
      +
      +.sidebox ol ol, .sidebox ol ul,
      +.sidebox ul ol, .sidebox ul ul {
      +    margin: 0;
      +    padding-left: 16px;
      +}
      +
      +/* -- Table of Contents ----------------------------------------------------- */
      +
      +/* The #toc id refers to the single global table of contents, while the .toc
      +   class refers to generic TOC lists that could be used throughout the page. */
      +
      +.toc code, .toc kbd, .toc samp { font-size: 100%; }
      +.toc li { font-weight: bold; }
      +.toc li li { font-weight: normal; }
      +
      +/* -- Intro and Example Boxes ----------------------------------------------- */
      +.intro, .example { margin-bottom: 2em; }
      +
      +.example {
      +    -moz-border-radius: 4px;
      +    -webkit-border-radius: 4px;
      +    border-radius: 4px;
      +    -moz-box-shadow: 0 0 5px #bfbfbf;
      +    -webkit-box-shadow: 0 0 5px #bfbfbf;
      +    box-shadow: 0 0 5px #bfbfbf;
      +    padding: 1em;
      +}
      +
      +.intro {
      +    background: none repeat scroll 0 0 #F0F1F8; border: 1px solid #D4D8EB; padding: 0 1em;
      +}
      +
      +/* -- Other Styles ---------------------------------------------------------- */
      +
      +/* These are probably YUI-specific, and should be moved out of Selleck's default
      +   theme. */
      +
      +.button {
      +    border: 1px solid #dadada;
      +    -moz-border-radius: 3px;
      +    -webkit-border-radius: 3px;
      +    border-radius: 3px;
      +    color: #444;
      +    display: inline-block;
      +    font-family: Helvetica, Arial, sans-serif;
      +    font-size: 92.308%;
      +    font-weight: bold;
      +    padding: 4px 13px 3px;
      +    -moz-text-shadow: 1px 1px 0 #fff;
      +    -webkit-text-shadow: 1px 1px 0 #fff;
      +    text-shadow: 1px 1px 0 #fff;
      +    white-space: nowrap;
      +
      +    background: #EFEFEF; /* old browsers */
      +    background: -moz-linear-gradient(top, #f5f5f5 0%, #efefef 50%, #e5e5e5 51%, #dfdfdf 100%); /* firefox */
      +    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(50%,#efefef), color-stop(51%,#e5e5e5), color-stop(100%,#dfdfdf)); /* webkit */
      +    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#dfdfdf',GradientType=0 ); /* ie */
      +}
      +
      +.button:hover {
      +    border-color: #466899;
      +    color: #fff;
      +    text-decoration: none;
      +    -moz-text-shadow: 1px 1px 0 #222;
      +    -webkit-text-shadow: 1px 1px 0 #222;
      +    text-shadow: 1px 1px 0 #222;
      +
      +    background: #6396D8; /* old browsers */
      +    background: -moz-linear-gradient(top, #6396D8 0%, #5A83BC 50%, #547AB7 51%, #466899 100%); /* firefox */
      +    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#6396D8), color-stop(50%,#5A83BC), color-stop(51%,#547AB7), color-stop(100%,#466899)); /* webkit */
      +    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6396D8', endColorstr='#466899',GradientType=0 ); /* ie */
      +}
      +
      +.newwindow { text-align: center; }
      +
      +.header .version em {
      +    display: block;
      +    text-align: right;
      +}
      +
      +.yui3-skin-sam #classdocs .yui3-tabview-panel {
      +    background-color: transparent;
      +}
      +
      +.yui3-skin-sam #classdocs .yui3-tabview-panel {
      +    border: none;
      +}
      +
      +.yui3-skin-sam .yui3-tabview .yui3-tab,
      +.yui3-skin-sam .yui3-tabview .yui3-tab-selected,
      +.yui3-skin-sam .yui3-tabview .yui3-tab-hover {
      +    background: -moz-linear-gradient(center top , #F4F0EC 0%, #D6D2CE 100%) repeat scroll 0 0 transparent;
      +    border-bottom: 1px solid #DEDCD9;
      +    border-right: 1px solid #CDCBC8;
      +    border-left: 1px solid #CDCBC8;
      +    border-top: 1px solid #DADADA;
      +    color: #333333;
      +    text-decoration: none;
      +}
      +.yui3-skin-sam .yui3-tabview .yui3-tab-label,
      +.yui3-skin-sam .yui3-tabview .yui3-tab-selected .yui3-tab-label {
      +    border: none;
      +    background: none;
      +    font-size: 100%;
      +    color: #000;
      +}
      +
      +.yui3-skin-sam .yui3-tabview .yui3-tab-selected,
      +.yui3-skin-sam .yui3-tabview .yui3-tab-hover {
      +    background: none;
      +    background-color: #fff;
      +    border-bottom-color: #FFFFFF;
      +    border-top: 2px solid #8193C9;
      +    font-weight: bold;
      +    color: #000;
      +
      +}
      +
      +.yui3-skin-sam .yui3-tabview-list {
      +    border-color: #DFDFDF;
      +    border-width: 0 0 1px; 
      +}
      +
      +
      +a.external {
      +    background-image: url(external-small.png);
      +    background-repeat: no-repeat;
      +    background-position: 0 0;
      +    padding-left: 16px;
      +}
      +
      +#classdocs .item {
      +    border-bottom: 1px solid #466899;
      +    margin: 1em 0;
      +    padding: 1.5em;
      +}
      +
      +#classdocs .item .params p,
      +    #classdocs .item .returns p,{
      +    display: inline;
      +}
      +
      +#classdocs .item em code, #classdocs .item em.comment {
      +    color: green;
      +}
      +
      +#classdocs .item em.comment a {
      +    color: green;
      +    text-decoration: underline;
      +}
      +
      +#classdocs .foundat {
      +    font-size: 11px;
      +    font-style: normal;
      +}
      +
      +.attrs .emits {
      +    margin-left: 2em;
      +    padding: .5em;
      +    border-left: 1px dashed #ccc;
      +}
      +
      +abbr {
      +    border-bottom: 1px dashed #ccc;
      +    font-size: 80%;
      +    cursor: help;
      +}
      +
      +.prettyprint li.L0, 
      +.prettyprint li.L1, 
      +.prettyprint li.L2, 
      +.prettyprint li.L3, 
      +.prettyprint li.L5, 
      +.prettyprint li.L6, 
      +.prettyprint li.L7, 
      +.prettyprint li.L8 {
      +    list-style: decimal;
      +}
      +
      +ul li p {
      +    margin-top: 0;
      +}
      +
      +.method .name {
      +    font-size: 110%;
      +}
      +
      +#hd {
      +    background: -moz-linear-gradient(center top , #DCDBD9 0%, #F6F5F3 100%) repeat scroll 0 0 transparent;
      +    border-bottom: 1px solid #DFDFDF;
      +    padding: 0 15px 1px 20px;
      +    margin-bottom: 15px;
      +}
      +
      +#hd img {
      +    margin-right: 10px;
      +    vertical-align: middle;
      +}
      +
      diff --git a/themes/simple/assets/js/tabs.js b/themes/simple/assets/js/tabs.js
      new file mode 100644
      index 00000000..77ab37c7
      --- /dev/null
      +++ b/themes/simple/assets/js/tabs.js
      @@ -0,0 +1,38 @@
      +YUI({
      +    insertBefore: 'site_styles'
      +}).use('tabview', function(Y) {
      +    var classdocs = Y.one('#classdocs'),
      +        tabviewIndexTable = {};
      +    if (classdocs) {
      +        if (classdocs.all('li').size()) {
      +            var tabview = new Y.TabView({ srcNode: classdocs });
      +            tabview.render();
      +			classdocs.all('li a').each(function (item, index) {
      +				var hash = item.get(['hash']);
      +					type = hash.substring(1);
      +				if (!tabviewIndexTable[type]) {
      +					tabviewIndexTable[type] = index;
      +				}
      +			})
      +			Y.all('.sidebox.on-page').each(function (item, index) {
      +				var children = item.all('li a');
      +				children.each(function (cItem, cIndex) {
      +					return function () {
      +						var handleClick = function (e) {
      +							var node      = Y.one(this),
      +								hash      = node.get(['hash']),
      +								hashValue = hash.substring(1).split('_'),
      +								type      = hashValue.shift(),
      +								ogKey     = hashValue.join('_'); // in case the hash had other underscores
      +							if (tabviewIndexTable[type] > -1 && tabviewIndexTable[type] !== currentTab) {
      +								currentTab = tabviewIndexTable[type];
      +								tabview.selectChild(tabviewIndexTable[type]);
      +							}
      +						}
      +						Y.on('click', handleClick, cItem)
      +					}()
      +				})
      +			});
      +        }
      +    }
      +});
      diff --git a/themes/simple/assets/js/yui-prettify.js b/themes/simple/assets/js/yui-prettify.js
      new file mode 100644
      index 00000000..18de8649
      --- /dev/null
      +++ b/themes/simple/assets/js/yui-prettify.js
      @@ -0,0 +1,17 @@
      +YUI().use('node', function(Y) {
      +    var code = Y.all('.prettyprint.linenums');
      +    if (code.size()) {
      +        code.each(function(c) {
      +            var lis = c.all('ol li'),
      +                l = 1;
      +            lis.each(function(n) {
      +                n.prepend('<a name="LINENUM_' + l + '"></a>');
      +                l++;
      +            });
      +        });
      +        var h = location.hash;
      +        location.hash = '';
      +        h = h.replace('LINE_', 'LINENUM_');
      +        location.hash = h;
      +    }
      +});
      diff --git a/themes/simple/assets/vendor/prettify/CHANGES.html b/themes/simple/assets/vendor/prettify/CHANGES.html
      new file mode 100644
      index 00000000..b50b8414
      --- /dev/null
      +++ b/themes/simple/assets/vendor/prettify/CHANGES.html
      @@ -0,0 +1,130 @@
      +<html>
      +  <head>
      +    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      +    <title>Change Log</title>
      +  </head>
      +  <body bgcolor="white">
      +    <a style="float:right" href="README.html">README</a>
      +
      +    <h1>Known Issues</h1>
      +    <ul>
      +      <li>Perl formatting is really crappy.  Partly because the author is lazy and
      +      partly because Perl is
      +      <a href="http://www.perlmonks.org/?node_id=663393">hard</a> to parse.
      +      <li>On some browsers, <code>&lt;code&gt;</code> elements with newlines in the text
      +      which use CSS to specify <code>white-space:pre</code> will have the newlines
      +      improperly stripped if the element is not attached to the document at the time
      +      the stripping is done.  Also, on IE 6, all newlines will be stripped from
      +      <code>&lt;code&gt;</code> elements because of the way IE6 produces
      +      <code>innerHTML</code>.  Workaround: use <code>&lt;pre&gt;</code> for code with
      +      newlines.
      +    </ul>
      +
      +    <h1>Change Log</h1>
      +    <h2>29 March 2007</h2>
      +    <ul>
      +      <li>Added <a href="tests/prettify_test.html#PHP">tests</a> for PHP support
      +        to address 
      +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=3"
      +       >issue 3</a>.
      +      <li>Fixed
      +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=6"
      +       >bug</a>: <code>prettyPrintOne</code> was not halting.  This was not
      +        reachable through the normal entry point.
      +      <li>Fixed
      +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=4"
      +       >bug</a>: recursing into a script block or PHP tag that was not properly
      +        closed would not silently drop the content.
      +        (<a href="tests/prettify_test.html#issue4">test</a>)
      +      <li>Fixed
      +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=8"
      +       >bug</a>: was eating tabs
      +        (<a href="tests/prettify_test.html#issue8">test</a>)
      +      <li>Fixed entity handling so that the caveat
      +        <blockquote>
      +          <p>Caveats: please properly escape less-thans.  <tt>x&amp;lt;y</tt>
      +          instead of <tt>x&lt;y</tt>, and use <tt>&quot;</tt> instead of 
      +          <tt>&amp;quot;</tt> for string delimiters.</p>
      +        </blockquote>
      +        is no longer applicable.
      +      <li>Added noisefree's C#
      +      <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=4"
      +       >patch</a>
      +      <li>Added a <a href="http://google-code-prettify.googlecode.com/files/prettify-small.zip">distribution</a> that has comments and
      +        whitespace removed to reduce download size from 45.5kB to 12.8kB.
      +    </ul>
      +    <h2>4 Jul 2008</h2>
      +    <ul>
      +      <li>Added <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=17">language specific formatters</a> that are triggered by the presence
      +      of a <code>lang-&lt;language-file-extension&gt;</code></li>
      +      <li>Fixed <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=29">bug</a>: python handling of <code>'''string'''</code>
      +      <li>Fixed bug: <code>/</code> in regex <code>[charsets] should not end regex</code>
      +    </ul>
      +    <h2>5 Jul 2008</h2>
      +    <ul>
      +      <li>Defined language extensions for Lisp and Lua</code>
      +    </ul>
      +    <h2>14 Jul 2008</h2>
      +    <ul>
      +      <li>Language handlers for F#, OCAML, SQL</code>
      +      <li>Support for <code>nocode</code> spans to allow embedding of line
      +      numbers and code annotations which should not be styled or otherwise
      +      affect the tokenization of prettified code.
      +      See the issue 22
      +      <a href="tests/prettify_test.html#issue22">testcase</a>.</code>
      +    </ul>
      +    <h2>6 Jan 2009</h2>
      +    <ul>
      +      <li>Language handlers for Visual Basic, Haskell, CSS, and WikiText</li>
      +      <li>Added <tt>.mxml</tt> extension to the markup style handler for
      +        Flex <a href="http://en.wikipedia.org/wiki/MXML">MXML files</a>.  See
      +        <a
      +        href="http://code.google.com/p/google-code-prettify/issues/detail?id=37"
      +        >issue 37</a>.
      +      <li>Added <tt>.m</tt> extension to the C style handler so that Objective
      +        C source files properly highlight.  See
      +        <a
      +        href="http://code.google.com/p/google-code-prettify/issues/detail?id=58"
      +       >issue 58</a>.
      +      <li>Changed HTML lexer to use the same embedded source mechanism as the
      +        wiki language handler, and changed to use the registered
      +        CSS handler for STYLE element content.
      +    </ul>
      +    <h2>21 May 2009</h2>
      +    <ul>
      +      <li>Rewrote to improve performance on large files.
      +        See <a href="http://mikesamuel.blogspot.com/2009/05/efficient-parsing-in-javascript.html">benchmarks</a>.</li>
      +      <li>Fixed bugs with highlighting of Haskell line comments, Lisp
      +        number literals, Lua strings, C preprocessor directives,
      +        newlines in Wiki code on Windows, and newlines in IE6.</li>
      +    </ul>
      +    <h2>14 August 2009</h2>
      +    <ul>
      +      <li>Fixed prettifying of <code>&lt;code&gt;</code> blocks with embedded newlines.
      +    </ul>
      +    <h2>3 October 2009</h2>
      +    <ul>
      +      <li>Fixed prettifying of XML/HTML tags that contain uppercase letters.
      +    </ul>
      +    <h2>19 July 2010</h2>
      +    <ul>
      +      <li>Added support for line numbers.  Bug
      +        <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=22"
      +         >22</a></li>
      +      <li>Added YAML support.  Bug
      +        <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=123"
      +         >123</a></li>
      +      <li>Added VHDL support courtesy Le Poussin.</li>
      +      <li>IE performance improvements.  Bug
      +        <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=102"
      +         >102</a> courtesy jacobly.</li>
      +      <li>A variety of markup formatting fixes courtesy smain and thezbyg.</li>
      +      <li>Fixed copy and paste in IE[678].
      +      <li>Changed output to use <code>&amp;#160;</code> instead of
      +        <code>&amp;nbsp;</code> so that the output works when embedded in XML.
      +        Bug
      +        <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=108"
      +         >108</a>.</li>
      +    </ul>
      +  </body>
      +</html>
      diff --git a/themes/simple/assets/vendor/prettify/COPYING b/themes/simple/assets/vendor/prettify/COPYING
      new file mode 100644
      index 00000000..d6456956
      --- /dev/null
      +++ b/themes/simple/assets/vendor/prettify/COPYING
      @@ -0,0 +1,202 @@
      +
      +                                 Apache License
      +                           Version 2.0, January 2004
      +                        http://www.apache.org/licenses/
      +
      +   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
      +
      +   1. Definitions.
      +
      +      "License" shall mean the terms and conditions for use, reproduction,
      +      and distribution as defined by Sections 1 through 9 of this document.
      +
      +      "Licensor" shall mean the copyright owner or entity authorized by
      +      the copyright owner that is granting the License.
      +
      +      "Legal Entity" shall mean the union of the acting entity and all
      +      other entities that control, are controlled by, or are under common
      +      control with that entity. For the purposes of this definition,
      +      "control" means (i) the power, direct or indirect, to cause the
      +      direction or management of such entity, whether by contract or
      +      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      +      outstanding shares, or (iii) beneficial ownership of such entity.
      +
      +      "You" (or "Your") shall mean an individual or Legal Entity
      +      exercising permissions granted by this License.
      +
      +      "Source" form shall mean the preferred form for making modifications,
      +      including but not limited to software source code, documentation
      +      source, and configuration files.
      +
      +      "Object" form shall mean any form resulting from mechanical
      +      transformation or translation of a Source form, including but
      +      not limited to compiled object code, generated documentation,
      +      and conversions to other media types.
      +
      +      "Work" shall mean the work of authorship, whether in Source or
      +      Object form, made available under the License, as indicated by a
      +      copyright notice that is included in or attached to the work
      +      (an example is provided in the Appendix below).
      +
      +      "Derivative Works" shall mean any work, whether in Source or Object
      +      form, that is based on (or derived from) the Work and for which the
      +      editorial revisions, annotations, elaborations, or other modifications
      +      represent, as a whole, an original work of authorship. For the purposes
      +      of this License, Derivative Works shall not include works that remain
      +      separable from, or merely link (or bind by name) to the interfaces of,
      +      the Work and Derivative Works thereof.
      +
      +      "Contribution" shall mean any work of authorship, including
      +      the original version of the Work and any modifications or additions
      +      to that Work or Derivative Works thereof, that is intentionally
      +      submitted to Licensor for inclusion in the Work by the copyright owner
      +      or by an individual or Legal Entity authorized to submit on behalf of
      +      the copyright owner. For the purposes of this definition, "submitted"
      +      means any form of electronic, verbal, or written communication sent
      +      to the Licensor or its representatives, including but not limited to
      +      communication on electronic mailing lists, source code control systems,
      +      and issue tracking systems that are managed by, or on behalf of, the
      +      Licensor for the purpose of discussing and improving the Work, but
      +      excluding communication that is conspicuously marked or otherwise
      +      designated in writing by the copyright owner as "Not a Contribution."
      +
      +      "Contributor" shall mean Licensor and any individual or Legal Entity
      +      on behalf of whom a Contribution has been received by Licensor and
      +      subsequently incorporated within the Work.
      +
      +   2. Grant of Copyright License. Subject to the terms and conditions of
      +      this License, each Contributor hereby grants to You a perpetual,
      +      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      +      copyright license to reproduce, prepare Derivative Works of,
      +      publicly display, publicly perform, sublicense, and distribute the
      +      Work and such Derivative Works in Source or Object form.
      +
      +   3. Grant of Patent License. Subject to the terms and conditions of
      +      this License, each Contributor hereby grants to You a perpetual,
      +      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      +      (except as stated in this section) patent license to make, have made,
      +      use, offer to sell, sell, import, and otherwise transfer the Work,
      +      where such license applies only to those patent claims licensable
      +      by such Contributor that are necessarily infringed by their
      +      Contribution(s) alone or by combination of their Contribution(s)
      +      with the Work to which such Contribution(s) was submitted. If You
      +      institute patent litigation against any entity (including a
      +      cross-claim or counterclaim in a lawsuit) alleging that the Work
      +      or a Contribution incorporated within the Work constitutes direct
      +      or contributory patent infringement, then any patent licenses
      +      granted to You under this License for that Work shall terminate
      +      as of the date such litigation is filed.
      +
      +   4. Redistribution. You may reproduce and distribute copies of the
      +      Work or Derivative Works thereof in any medium, with or without
      +      modifications, and in Source or Object form, provided that You
      +      meet the following conditions:
      +
      +      (a) You must give any other recipients of the Work or
      +          Derivative Works a copy of this License; and
      +
      +      (b) You must cause any modified files to carry prominent notices
      +          stating that You changed the files; and
      +
      +      (c) You must retain, in the Source form of any Derivative Works
      +          that You distribute, all copyright, patent, trademark, and
      +          attribution notices from the Source form of the Work,
      +          excluding those notices that do not pertain to any part of
      +          the Derivative Works; and
      +
      +      (d) If the Work includes a "NOTICE" text file as part of its
      +          distribution, then any Derivative Works that You distribute must
      +          include a readable copy of the attribution notices contained
      +          within such NOTICE file, excluding those notices that do not
      +          pertain to any part of the Derivative Works, in at least one
      +          of the following places: within a NOTICE text file distributed
      +          as part of the Derivative Works; within the Source form or
      +          documentation, if provided along with the Derivative Works; or,
      +          within a display generated by the Derivative Works, if and
      +          wherever such third-party notices normally appear. The contents
      +          of the NOTICE file are for informational purposes only and
      +          do not modify the License. You may add Your own attribution
      +          notices within Derivative Works that You distribute, alongside
      +          or as an addendum to the NOTICE text from the Work, provided
      +          that such additional attribution notices cannot be construed
      +          as modifying the License.
      +
      +      You may add Your own copyright statement to Your modifications and
      +      may provide additional or different license terms and conditions
      +      for use, reproduction, or distribution of Your modifications, or
      +      for any such Derivative Works as a whole, provided Your use,
      +      reproduction, and distribution of the Work otherwise complies with
      +      the conditions stated in this License.
      +
      +   5. Submission of Contributions. Unless You explicitly state otherwise,
      +      any Contribution intentionally submitted for inclusion in the Work
      +      by You to the Licensor shall be under the terms and conditions of
      +      this License, without any additional terms or conditions.
      +      Notwithstanding the above, nothing herein shall supersede or modify
      +      the terms of any separate license agreement you may have executed
      +      with Licensor regarding such Contributions.
      +
      +   6. Trademarks. This License does not grant permission to use the trade
      +      names, trademarks, service marks, or product names of the Licensor,
      +      except as required for reasonable and customary use in describing the
      +      origin of the Work and reproducing the content of the NOTICE file.
      +
      +   7. Disclaimer of Warranty. Unless required by applicable law or
      +      agreed to in writing, Licensor provides the Work (and each
      +      Contributor provides its Contributions) on an "AS IS" BASIS,
      +      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      +      implied, including, without limitation, any warranties or conditions
      +      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      +      PARTICULAR PURPOSE. You are solely responsible for determining the
      +      appropriateness of using or redistributing the Work and assume any
      +      risks associated with Your exercise of permissions under this License.
      +
      +   8. Limitation of Liability. In no event and under no legal theory,
      +      whether in tort (including negligence), contract, or otherwise,
      +      unless required by applicable law (such as deliberate and grossly
      +      negligent acts) or agreed to in writing, shall any Contributor be
      +      liable to You for damages, including any direct, indirect, special,
      +      incidental, or consequential damages of any character arising as a
      +      result of this License or out of the use or inability to use the
      +      Work (including but not limited to damages for loss of goodwill,
      +      work stoppage, computer failure or malfunction, or any and all
      +      other commercial damages or losses), even if such Contributor
      +      has been advised of the possibility of such damages.
      +
      +   9. Accepting Warranty or Additional Liability. While redistributing
      +      the Work or Derivative Works thereof, You may choose to offer,
      +      and charge a fee for, acceptance of support, warranty, indemnity,
      +      or other liability obligations and/or rights consistent with this
      +      License. However, in accepting such obligations, You may act only
      +      on Your own behalf and on Your sole responsibility, not on behalf
      +      of any other Contributor, and only if You agree to indemnify,
      +      defend, and hold each Contributor harmless for any liability
      +      incurred by, or claims asserted against, such Contributor by reason
      +      of your accepting any such warranty or additional liability.
      +
      +   END OF TERMS AND CONDITIONS
      +
      +   APPENDIX: How to apply the Apache License to your work.
      +
      +      To apply the Apache License to your work, attach the following
      +      boilerplate notice, with the fields enclosed by brackets "[]"
      +      replaced with your own identifying information. (Don't include
      +      the brackets!)  The text should be enclosed in the appropriate
      +      comment syntax for the file format. We also recommend that a
      +      file or class name and description of purpose be included on the
      +      same "printed page" as the copyright notice for easier
      +      identification within third-party archives.
      +
      +   Copyright [yyyy] [name of copyright owner]
      +
      +   Licensed under the Apache License, Version 2.0 (the "License");
      +   you may not use this file except in compliance with the License.
      +   You may obtain a copy of the License at
      +
      +       http://www.apache.org/licenses/LICENSE-2.0
      +
      +   Unless required by applicable law or agreed to in writing, software
      +   distributed under the License is distributed on an "AS IS" BASIS,
      +   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      +   See the License for the specific language governing permissions and
      +   limitations under the License.
      diff --git a/themes/simple/assets/vendor/prettify/README.html b/themes/simple/assets/vendor/prettify/README.html
      new file mode 100644
      index 00000000..c6fe1a32
      --- /dev/null
      +++ b/themes/simple/assets/vendor/prettify/README.html
      @@ -0,0 +1,203 @@
      +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      +
      +<html>
      +  <head>
      +    <title>Javascript code prettifier</title>
      +
      +    <link href="src/prettify.css" type="text/css" rel="stylesheet" />
      +
      +    <script src="src/prettify.js" type="text/javascript"></script>
      +
      +    <style type="text/css">
      +      body { margin-left: .5in }
      +      h1, h2, h3, h4, .footer { margin-left: -.4in; }
      +    </style>
      +  </head>
      +
      +  <body onload="prettyPrint()" bgcolor="white">
      +    <small style="float: right">Languages : <a href="README-zh-Hans.html">CH</a></small>
      +    <h1>Javascript code prettifier</h1>
      +
      +    <h2>Setup</h2>
      +    <ol>
      +      <li><a href="http://code.google.com/p/google-code-prettify/downloads/list">Download</a> a distribution
      +      <li>Include the script and stylesheets in your document
      +        (you will need to make sure the css and js file are on your server, and
      +         adjust the paths in the <tt>script</tt> and <tt>link</tt> tag)
      +        <pre class="prettyprint">
      +&lt;link href="prettify.css" type="text/css" rel="stylesheet" />
      +&lt;script type="text/javascript" src="prettify.js">&lt;/script></pre>
      +      <li>Add <code class="prettyprint lang-html">onload="prettyPrint()"</code> to your
      +      document's body tag.
      +      <li>Modify the stylesheet to get the coloring you prefer</li>
      +    </ol>
      +
      +    <h2>Usage</h2>
      +    <p>Put code snippets in
      +    <tt>&lt;pre class="prettyprint"&gt;...&lt;/pre&gt;</tt>
      +    or <tt>&lt;code class="prettyprint"&gt;...&lt;/code&gt;</tt>
      +    and it will automatically be pretty printed.
      +
      +    <table summary="code examples">
      +      <tr>
      +        <th>The original
      +        <th>Prettier
      +      <tr>
      +        <td><pre style="border: 1px solid #888;padding: 2px"
      +             ><a name="voila1"></a>class Voila {
      +public:
      +  // Voila
      +  static const string VOILA = "Voila";
      +
      +  // will not interfere with embedded <a href="#voila1">tags</a>.
      +}</pre>
      +
      +        <td><pre class="prettyprint"><a name="voila2"></a>class Voila {
      +public:
      +  // Voila
      +  static const string VOILA = "Voila";
      +
      +  // will not interfere with embedded <a href="#voila2">tags</a>.
      +}</pre>
      +    </table>
      +
      +    <h2>FAQ</h2>
      +    <h3 id="langs">Which languages does it work for?</h3>
      +    <p>The comments in <tt>prettify.js</tt> are authoritative but the lexer
      +    should work on a number of languages including C and friends,
      +    Java, Python, Bash, SQL, HTML, XML, CSS, Javascript, and Makefiles.
      +    It works passably on Ruby, PHP, VB, and Awk and a decent subset of Perl
      +    and Ruby, but, because of commenting conventions, doesn't work on
      +    Smalltalk, or CAML-like languages.</p>
      +
      +    <p>LISPy languages are supported via an extension:
      +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-lisp.js"
      +     ><code>lang-lisp.js</code></a>.</p>
      +    <p>And similarly for
      +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-css.js"
      +     ><code>CSS</code></a>,
      +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-hs.js"
      +     ><code>Haskell</code></a>,
      +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-lua.js"
      +     ><code>Lua</code></a>,
      +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-ml.js"
      +     ><code>OCAML, SML, F#</code></a>,
      +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-vb.js"
      +     ><code>Visual Basic</code></a>,
      +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-sql.js"
      +     ><code>SQL</code></a>,
      +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-proto.js"
      +     ><code>Protocol Buffers</code></a>, and
      +    <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-wiki.js"
      +     ><code>WikiText</code></a>..
      +
      +    <p>If you'd like to add an extension for your favorite language, please
      +    look at <tt>src/lang-lisp.js</tt> and file an
      +    <a href="http://code.google.com/p/google-code-prettify/issues/list"
      +     >issue</a> including your language extension, and a testcase.</p>
      +
      +    <h3>How do I specify which language my code is in?</h3>
      +    <p>You don't need to specify the language since <code>prettyprint()</code>
      +    will guess.  You can specify a language by specifying the language extension
      +    along with the <code>prettyprint</code> class like so:</p>
      +    <pre class="prettyprint lang-html"
      +>&lt;pre class=&quot;prettyprint <b>lang-html</b>&quot;&gt;
      +  The lang-* class specifies the language file extensions.
      +  File extensions supported by default include
      +    "bsh", "c", "cc", "cpp", "cs", "csh", "cyc", "cv", "htm", "html",
      +    "java", "js", "m", "mxml", "perl", "pl", "pm", "py", "rb", "sh",
      +    "xhtml", "xml", "xsl".
      +&lt;/pre&gt;</pre>
      +
      +    <h3>It doesn't work on <tt>&lt;obfuscated code sample&gt;</tt>?</h3>
      +    <p>Yes.  Prettifying obfuscated code is like putting lipstick on a pig
      +    &mdash; i.e. outside the scope of this tool.</p>
      +
      +    <h3>Which browsers does it work with?</h3>
      +    <p>It's been tested with IE 6, Firefox 1.5 &amp; 2, and Safari 2.0.4.
      +    Look at <a href="tests/prettify_test.html">the test page</a> to see if it
      +    works in your browser.</p>
      +
      +    <h3>What's changed?</h3>
      +    <p>See the <a href="CHANGES.html">change log</a></p>
      +
      +    <h3>Why doesn't Prettyprinting of strings work on WordPress?</h3>
      +    <p>Apparently wordpress does "smart quoting" which changes close quotes.
      +    This causes end quotes to not match up with open quotes.
      +    <p>This breaks prettifying as well as copying and pasting of code samples.
      +    See
      +    <a href="http://wordpress.org/support/topic/125038"
      +    >WordPress's help center</a> for info on how to stop smart quoting of code
      +    snippets.</p>
      +
      +    <h3 id="linenums">How do I put line numbers in my code?</h3>
      +    <p>You can use the <code>linenums</code> class to turn on line
      +    numbering.  If your code doesn't start at line number 1, you can
      +    add a colon and a line number to the end of that class as in
      +    <code>linenums:52</code>.
      +
      +    <p>For example
      +<pre class="prettyprint">&lt;pre class="prettyprint linenums:<b>4</b>"
      +&gt;// This is line 4.
      +foo();
      +bar();
      +baz();
      +boo();
      +far();
      +faz();
      +&lt;pre&gt;</pre>
      +    produces
      +<pre class="prettyprint linenums:4"
      +>// This is line 4.
      +foo();
      +bar();
      +baz();
      +boo();
      +far();
      +faz();
      +</pre>
      +
      +    <h3>How do I prevent a portion of markup from being marked as code?</h3>
      +    <p>You can use the <code>nocode</code> class to identify a span of markup
      +    that is not code.
      +<pre class="prettyprint">&lt;pre class=prettyprint&gt;
      +int x = foo();  /* This is a comment  &lt;span class="nocode"&gt;This is not code&lt;/span&gt;
      +  Continuation of comment */
      +int y = bar();
      +&lt;/pre&gt;</pre>
      +produces
      +<pre class="prettyprint">
      +int x = foo();  /* This is a comment  <span class="nocode">This is not code</span>
      +  Continuation of comment */
      +int y = bar();
      +</pre>
      +
      +    <p>For a more complete example see the issue22
      +    <a href="tests/prettify_test.html#issue22">testcase</a>.</p>
      +
      +    <h3>I get an error message "a is not a function" or "opt_whenDone is not a function"</h3>
      +    <p>If you are calling <code>prettyPrint</code> via an event handler, wrap it in a function.
      +    Instead of doing
      +    <blockquote>
      +      <code class="prettyprint lang-js"
      +       >addEventListener('load', prettyPrint, false);</code>
      +    </blockquote>
      +    wrap it in a closure like
      +    <blockquote>
      +      <code class="prettyprint lang-js"
      +       >addEventListener('load', function (event) { prettyPrint() }, false);</code>
      +    </blockquote>
      +    so that the browser does not pass an event object to <code>prettyPrint</code> which
      +    will confuse it.
      +
      +    <br><br><br>
      +
      +    <div class="footer">
      +<!-- Created: Tue Oct  3 17:51:56 PDT 2006 -->
      +<!-- hhmts start -->
      +Last modified: Wed Jul 19 13:56:00 PST 2010
      +<!-- hhmts end -->
      +    </div>
      +  </body>
      +</html>
      diff --git a/themes/simple/assets/vendor/prettify/prettify-min.css b/themes/simple/assets/vendor/prettify/prettify-min.css
      new file mode 100644
      index 00000000..d44b3a22
      --- /dev/null
      +++ b/themes/simple/assets/vendor/prettify/prettify-min.css
      @@ -0,0 +1 @@
      +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
      \ No newline at end of file
      diff --git a/themes/simple/assets/vendor/prettify/prettify-min.js b/themes/simple/assets/vendor/prettify/prettify-min.js
      new file mode 100644
      index 00000000..4845d05d
      --- /dev/null
      +++ b/themes/simple/assets/vendor/prettify/prettify-min.js
      @@ -0,0 +1 @@
      +window.PR_SHOULD_USE_CONTINUATION=true;var prettyPrintOne;var prettyPrint;(function(){var O=window;var j=["break,continue,do,else,for,if,return,while"];var v=[j,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var q=[v,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var m=[q,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var y=[q,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var T=[y,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"];var s="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes";var x=[q,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var t="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var J=[j,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var g=[j,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var I=[j,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var B=[m,T,x,t+J,g,I];var f=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/;var D="str";var A="kwd";var k="com";var Q="typ";var H="lit";var M="pun";var G="pln";var n="tag";var F="dec";var K="src";var R="atn";var o="atv";var P="nocode";var N="(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function l(ab){var af=0;var U=false;var ae=false;for(var X=0,W=ab.length;X<W;++X){var ag=ab[X];if(ag.ignoreCase){ae=true}else{if(/[a-z]/i.test(ag.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){U=true;ae=false;break}}}var aa={b:8,t:9,n:10,v:11,f:12,r:13};function ad(aj){var ai=aj.charCodeAt(0);if(ai!==92){return ai}var ah=aj.charAt(1);ai=aa[ah];if(ai){return ai}else{if("0"<=ah&&ah<="7"){return parseInt(aj.substring(1),8)}else{if(ah==="u"||ah==="x"){return parseInt(aj.substring(2),16)}else{return aj.charCodeAt(1)}}}}function V(ah){if(ah<32){return(ah<16?"\\x0":"\\x")+ah.toString(16)}var ai=String.fromCharCode(ah);return(ai==="\\"||ai==="-"||ai==="]"||ai==="^")?"\\"+ai:ai}function Z(an){var ar=an.substring(1,an.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ah=[];var ap=ar[0]==="^";var ao=["["];if(ap){ao.push("^")}for(var at=ap?1:0,al=ar.length;at<al;++at){var aj=ar[at];if(/\\[bdsw]/i.test(aj)){ao.push(aj)}else{var ai=ad(aj);var am;if(at+2<al&&"-"===ar[at+1]){am=ad(ar[at+2]);at+=2}else{am=ai}ah.push([ai,am]);if(!(am<65||ai>122)){if(!(am<65||ai>90)){ah.push([Math.max(65,ai)|32,Math.min(am,90)|32])}if(!(am<97||ai>122)){ah.push([Math.max(97,ai)&~32,Math.min(am,122)&~32])}}}}ah.sort(function(aw,av){return(aw[0]-av[0])||(av[1]-aw[1])});var ak=[];var aq=[];for(var at=0;at<ah.length;++at){var au=ah[at];if(au[0]<=aq[1]+1){aq[1]=Math.max(aq[1],au[1])}else{ak.push(aq=au)}}for(var at=0;at<ak.length;++at){var au=ak[at];ao.push(V(au[0]));if(au[1]>au[0]){if(au[1]+1>au[0]){ao.push("-")}ao.push(V(au[1]))}}ao.push("]");return ao.join("")}function Y(an){var al=an.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var aj=al.length;var ap=[];for(var am=0,ao=0;am<aj;++am){var ai=al[am];if(ai==="("){++ao}else{if("\\"===ai.charAt(0)){var ah=+ai.substring(1);if(ah){if(ah<=ao){ap[ah]=-1}else{al[am]=V(ah)}}}}}for(var am=1;am<ap.length;++am){if(-1===ap[am]){ap[am]=++af}}for(var am=0,ao=0;am<aj;++am){var ai=al[am];if(ai==="("){++ao;if(!ap[ao]){al[am]="(?:"}}else{if("\\"===ai.charAt(0)){var ah=+ai.substring(1);if(ah&&ah<=ao){al[am]="\\"+ap[ah]}}}}for(var am=0;am<aj;++am){if("^"===al[am]&&"^"!==al[am+1]){al[am]=""}}if(an.ignoreCase&&U){for(var am=0;am<aj;++am){var ai=al[am];var ak=ai.charAt(0);if(ai.length>=2&&ak==="["){al[am]=Z(ai)}else{if(ak!=="\\"){al[am]=ai.replace(/[a-zA-Z]/g,function(aq){var ar=aq.charCodeAt(0);return"["+String.fromCharCode(ar&~32,ar|32)+"]"})}}}}return al.join("")}var ac=[];for(var X=0,W=ab.length;X<W;++X){var ag=ab[X];if(ag.global||ag.multiline){throw new Error(""+ag)}ac.push("(?:"+Y(ag)+")")}return new RegExp(ac.join("|"),ae?"gi":"g")}function b(aa,Y){var W=/(?:^|\s)nocode(?:\s|$)/;var ab=[];var Z=0;var X=[];var V=0;function U(ac){switch(ac.nodeType){case 1:if(W.test(ac.className)){return}for(var af=ac.firstChild;af;af=af.nextSibling){U(af)}var ae=ac.nodeName.toLowerCase();if("br"===ae||"li"===ae){ab[V]="\n";X[V<<1]=Z++;X[(V++<<1)|1]=ac}break;case 3:case 4:var ad=ac.nodeValue;if(ad.length){if(!Y){ad=ad.replace(/[ \t\r\n]+/g," ")}else{ad=ad.replace(/\r\n?/g,"\n")}ab[V]=ad;X[V<<1]=Z;Z+=ad.length;X[(V++<<1)|1]=ac}break}}U(aa);return{sourceCode:ab.join("").replace(/\n$/,""),spans:X}}function C(U,W,Y,V){if(!W){return}var X={sourceCode:W,basePos:U};Y(X);V.push.apply(V,X.decorations)}var w=/\S/;function p(U){var X=undefined;for(var W=U.firstChild;W;W=W.nextSibling){var V=W.nodeType;X=(V===1)?(X?U:W):(V===3)?(w.test(W.nodeValue)?U:X):X}return X===U?undefined:X}function h(W,V){var U={};var X;(function(){var af=W.concat(V);var aj=[];var ai={};for(var ad=0,ab=af.length;ad<ab;++ad){var aa=af[ad];var ae=aa[3];if(ae){for(var ag=ae.length;--ag>=0;){U[ae.charAt(ag)]=aa}}var ah=aa[1];var ac=""+ah;if(!ai.hasOwnProperty(ac)){aj.push(ah);ai[ac]=null}}aj.push(/[\0-\uffff]/);X=l(aj)})();var Z=V.length;var Y=function(aj){var ab=aj.sourceCode,aa=aj.basePos;var af=[aa,G];var ah=0;var ap=ab.match(X)||[];var al={};for(var ag=0,at=ap.length;ag<at;++ag){var ai=ap[ag];var ar=al[ai];var ak=void 0;var ao;if(typeof ar==="string"){ao=false}else{var ac=U[ai.charAt(0)];if(ac){ak=ai.match(ac[1]);ar=ac[0]}else{for(var aq=0;aq<Z;++aq){ac=V[aq];ak=ai.match(ac[1]);if(ak){ar=ac[0];break}}if(!ak){ar=G}}ao=ar.length>=5&&"lang-"===ar.substring(0,5);if(ao&&!(ak&&typeof ak[1]==="string")){ao=false;ar=K}if(!ao){al[ai]=ar}}var ad=ah;ah+=ai.length;if(!ao){af.push(aa+ad,ar)}else{var an=ak[1];var am=ai.indexOf(an);var ae=am+an.length;if(ak[2]){ae=ai.length-ak[2].length;am=ae-an.length}var au=ar.substring(5);C(aa+ad,ai.substring(0,am),Y,af);C(aa+ad+am,an,r(au,an),af);C(aa+ad+ae,ai.substring(ae),Y,af)}}aj.decorations=af};return Y}function i(V){var Y=[],U=[];if(V.tripleQuotedStrings){Y.push([D,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(V.multiLineStrings){Y.push([D,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{Y.push([D,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(V.verbatimStrings){U.push([D,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var ab=V.hashComments;if(ab){if(V.cStyleComments){if(ab>1){Y.push([k,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{Y.push([k,/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}U.push([D,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,null])}else{Y.push([k,/^#[^\r\n]*/,null,"#"])}}if(V.cStyleComments){U.push([k,/^\/\/[^\r\n]*/,null]);U.push([k,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(V.regexLiterals){var aa=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");U.push(["lang-regex",new RegExp("^"+N+"("+aa+")")])}var X=V.types;if(X){U.push([Q,X])}var W=(""+V.keywords).replace(/^ | $/g,"");if(W.length){U.push([A,new RegExp("^(?:"+W.replace(/[\s,]+/g,"|")+")\\b"),null])}Y.push([G,/^\s+/,null," \r\n\t\xA0"]);var Z=/^.[^\s\w\.$@\'\"\`\/\\]*/;U.push([H,/^@[a-z_$][a-z_$@0-9]*/i,null],[Q,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[G,/^[a-z_$][a-z_$@0-9]*/i,null],[H,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[G,/^\\[\s\S]?/,null],[M,Z,null]);return h(Y,U)}var L=i({keywords:B,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function S(W,ah,aa){var V=/(?:^|\s)nocode(?:\s|$)/;var ac=/\r\n?|\n/;var ad=W.ownerDocument;var ag=ad.createElement("li");while(W.firstChild){ag.appendChild(W.firstChild)}var X=[ag];function af(am){switch(am.nodeType){case 1:if(V.test(am.className)){break}if("br"===am.nodeName){ae(am);if(am.parentNode){am.parentNode.removeChild(am)}}else{for(var ao=am.firstChild;ao;ao=ao.nextSibling){af(ao)}}break;case 3:case 4:if(aa){var an=am.nodeValue;var ak=an.match(ac);if(ak){var aj=an.substring(0,ak.index);am.nodeValue=aj;var ai=an.substring(ak.index+ak[0].length);if(ai){var al=am.parentNode;al.insertBefore(ad.createTextNode(ai),am.nextSibling)}ae(am);if(!aj){am.parentNode.removeChild(am)}}}break}}function ae(al){while(!al.nextSibling){al=al.parentNode;if(!al){return}}function aj(am,at){var ar=at?am.cloneNode(false):am;var ap=am.parentNode;if(ap){var aq=aj(ap,1);var ao=am.nextSibling;aq.appendChild(ar);for(var an=ao;an;an=ao){ao=an.nextSibling;aq.appendChild(an)}}return ar}var ai=aj(al.nextSibling,0);for(var ak;(ak=ai.parentNode)&&ak.nodeType===1;){ai=ak}X.push(ai)}for(var Z=0;Z<X.length;++Z){af(X[Z])}if(ah===(ah|0)){X[0].setAttribute("value",ah)}var ab=ad.createElement("ol");ab.className="linenums";var Y=Math.max(0,((ah-1))|0)||0;for(var Z=0,U=X.length;Z<U;++Z){ag=X[Z];ag.className="L"+((Z+Y)%10);if(!ag.firstChild){ag.appendChild(ad.createTextNode("\xA0"))}ab.appendChild(ag)}W.appendChild(ab)}function E(af){var X=/\bMSIE\s(\d+)/.exec(navigator.userAgent);X=X&&+X[1]<=8;var ao=/\n/g;var an=af.sourceCode;var ap=an.length;var Y=0;var ad=af.spans;var V=ad.length;var aj=0;var aa=af.decorations;var ab=aa.length;var ac=0;aa[ab]=ap;var av,at;for(at=av=0;at<ab;){if(aa[at]!==aa[at+2]){aa[av++]=aa[at++];aa[av++]=aa[at++]}else{at+=2}}ab=av;for(at=av=0;at<ab;){var aw=aa[at];var ae=aa[at+1];var Z=at+2;while(Z+2<=ab&&aa[Z+1]===ae){Z+=2}aa[av++]=aw;aa[av++]=ae;at=Z}ab=aa.length=av;var au=af.sourceNode;var ak;if(au){ak=au.style.display;au.style.display="none"}try{var ah=null;while(aj<V){var ai=ad[aj];var U=ad[aj+2]||ap;var ar=aa[ac+2]||ap;var Z=Math.min(U,ar);var am=ad[aj+1];var W;if(am.nodeType!==1&&(W=an.substring(Y,Z))){if(X){W=W.replace(ao,"\r")}am.nodeValue=W;var al=am.ownerDocument;var aq=al.createElement("span");aq.className=aa[ac+1];var ag=am.parentNode;ag.replaceChild(aq,am);aq.appendChild(am);if(Y<U){ad[aj+1]=am=al.createTextNode(an.substring(Z,U));ag.insertBefore(am,aq.nextSibling)}}Y=Z;if(Y>=U){aj+=2}if(Y>=ar){ac+=2}}}finally{if(au){au.style.display=ak}}}var u={};function d(W,X){for(var U=X.length;--U>=0;){var V=X[U];if(!u.hasOwnProperty(V)){u[V]=W}else{if(O.console){console.warn("cannot override language handler %s",V)}}}}function r(V,U){if(!(V&&u.hasOwnProperty(V))){V=/^\s*</.test(U)?"default-markup":"default-code"}return u[V]}d(L,["default-code"]);d(h([],[[G,/^[^<?]+/],[F,/^<!\w[^>]*(?:>|$)/],[k,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[M,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);d(h([[G,/^[\s]+/,null," \t\r\n"],[o,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[n,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[R,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[M,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);d(h([],[[o,/^[\s\S]+/]]),["uq.val"]);d(i({keywords:m,hashComments:true,cStyleComments:true,types:f}),["c","cc","cpp","cxx","cyc","m"]);d(i({keywords:"null,true,false"}),["json"]);d(i({keywords:T,hashComments:true,cStyleComments:true,verbatimStrings:true,types:f}),["cs"]);d(i({keywords:y,cStyleComments:true}),["java"]);d(i({keywords:I,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);d(i({keywords:J,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);d(i({keywords:t,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);d(i({keywords:g,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);d(i({keywords:x,cStyleComments:true,regexLiterals:true}),["js"]);d(i({keywords:s,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);d(h([],[[D,/^[\s\S]+/]]),["regex"]);function e(X){var W=X.langExtension;try{var U=b(X.sourceNode,X.pre);var V=U.sourceCode;X.sourceCode=V;X.spans=U.spans;X.basePos=0;r(W,V)(X);E(X)}catch(Y){if(O.console){console.log(Y&&Y.stack?Y.stack:Y)}}}function z(Y,X,W){var U=document.createElement("pre");U.innerHTML=Y;if(W){S(U,W,true)}var V={langExtension:X,numberLines:W,sourceNode:U,pre:1};e(V);return U.innerHTML}function c(aj){function ab(al){return document.getElementsByTagName(al)}var ah=[ab("pre"),ab("code"),ab("xmp")];var V=[];for(var ae=0;ae<ah.length;++ae){for(var ac=0,Y=ah[ae].length;ac<Y;++ac){V.push(ah[ae][ac])}}ah=null;var Z=Date;if(!Z.now){Z={now:function(){return +(new Date)}}}var aa=0;var U;var af=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ak=/\bprettyprint\b/;var W=/\bprettyprinted\b/;var ag=/pre|xmp/i;var ai=/^code$/i;var ad=/^(?:pre|code|xmp)$/i;function X(){var ar=(O.PR_SHOULD_USE_CONTINUATION?Z.now()+250:Infinity);for(;aa<V.length&&Z.now()<ar;aa++){var at=V[aa];var au=at.className;if(ak.test(au)&&!W.test(au)){var aw=false;for(var ao=at.parentNode;ao;ao=ao.parentNode){var ax=ao.tagName;if(ad.test(ax)&&ao.className&&ak.test(ao.className)){aw=true;break}}if(!aw){at.className+=" prettyprinted";var aq=au.match(af);var am;if(!aq&&(am=p(at))&&ai.test(am.tagName)){aq=am.className.match(af)}if(aq){aq=aq[1]}var ap;if(ag.test(at.tagName)){ap=1}else{var an=at.currentStyle;var al=(an?an.whiteSpace:(document.defaultView&&document.defaultView.getComputedStyle)?document.defaultView.getComputedStyle(at,null).getPropertyValue("white-space"):0);ap=al&&"pre"===al.substring(0,3)}var av=at.className.match(/\blinenums\b(?::(\d+))?/);av=av?av[1]&&av[1].length?+av[1]:true:false;if(av){S(at,av,ap)}U={langExtension:aq,sourceNode:at,numberLines:av,pre:ap};e(U)}}}if(aa<V.length){setTimeout(X,250)}else{if(aj){aj()}}}X()}var a=O.PR={createSimpleLexer:h,registerLangHandler:d,sourceDecorator:i,PR_ATTRIB_NAME:R,PR_ATTRIB_VALUE:o,PR_COMMENT:k,PR_DECLARATION:F,PR_KEYWORD:A,PR_LITERAL:H,PR_NOCODE:P,PR_PLAIN:G,PR_PUNCTUATION:M,PR_SOURCE:K,PR_STRING:D,PR_TAG:n,PR_TYPE:Q,prettyPrintOne:O.prettyPrintOne=z,prettyPrint:O.prettyPrint=c};if(typeof define==="function"&&define.amd){define("google-code-prettify",[],function(){return a})}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);
      \ No newline at end of file
      diff --git a/themes/simple/layouts/main.handlebars b/themes/simple/layouts/main.handlebars
      new file mode 100644
      index 00000000..4adbc4ae
      --- /dev/null
      +++ b/themes/simple/layouts/main.handlebars
      @@ -0,0 +1,38 @@
      +<!DOCTYPE html>
      +<html lang="en">
      +<head>
      +    <meta charset="utf-8">
      +    <title>{{htmlTitle}}</title>
      +    <link rel="stylesheet" href="{{yuiGridsUrl}}">
      +    <link rel="stylesheet" href="{{projectAssets}}/vendor/prettify/prettify-min.css">
      +    <link rel="stylesheet" href="{{projectAssets}}/css/main.css" id="site_styles">
      +    <script src="{{yuiSeedUrl}}"></script>
      +</head>
      +<body class="yui3-skin-sam">
      +
      +<div id="doc">
      +    <div id="hd" class="yui3-g header">
      +        <div class="yui3-u-3-4">
      +            <h1><a href="{{projectRoot}}index.html"><img src="{{projectAssets}}/css/logo.png" width="117" height="52">{{title}}</a></h1>
      +        </div>
      +        <div class="yui3-u-1-4 version">
      +            <em>API Docs for: {{projectVersion}}</em>
      +        </div>
      +    </div>
      +    <div class="yui3-g">
      +
      +        <div id="sidebar" class="yui3-u">
      +            {{>sidebar}}
      +        </div>
      +
      +        <div id="main" class="yui3-u">
      +            <div class="content">{{>layout_content}}</div>
      +        </div>
      +    </div>
      +</div>
      +<script src="{{projectAssets}}/vendor/prettify/prettify-min.js"></script>
      +<script>prettyPrint();</script>
      +<script src="{{projectAssets}}/js/yui-prettify.js"></script>
      +<script src="{{projectAssets}}/js/tabs.js"></script>
      +</body>
      +</html>
      diff --git a/themes/simple/partials/attributes.handlebars b/themes/simple/partials/attributes.handlebars
      new file mode 100644
      index 00000000..0a8e4756
      --- /dev/null
      +++ b/themes/simple/partials/attributes.handlebars
      @@ -0,0 +1,7 @@
      +<div id="attribute{{name}}" class="property item{{#if deprecated}} deprecated{{/if}}">
      +    <h3 class="name" id="{{name}}"><code>{{name}}</code></h3>
      +
      +    <div class="description">
      +        {{{description}}}
      +    </div>
      +</div>
      diff --git a/themes/simple/partials/attrs.handlebars b/themes/simple/partials/attrs.handlebars
      new file mode 100644
      index 00000000..65e4712a
      --- /dev/null
      +++ b/themes/simple/partials/attrs.handlebars
      @@ -0,0 +1,23 @@
      +<a name="attrs_{{name}}"></a>
      +<div class="attrs item">
      +    `{{name}}` {{#if type}}<strong>&lt;{{#crossLink type}}{{/crossLink}}&gt;</strong>{{/if}}
      +    {{#if extended_from}}<em>`/* Extended from {{extended_from}} */`</em>{{/if}}
      +    {{#if overwritten_from}}<em>`/* Overwritten from {{name}} */`</em>{{/if}}
      +    <br>
      +    <span class="foundat"><a href="{{foundAt}}">`{{file}}:{{line}}`</a></span>
      +    {{{attrDescription}}}
      +    {{#if emit}}
      +    <div class="emits">
      +        Fires: <strong>`{{name}}Change(e)`</strong>
      +        <p>Fires when the value for the configuration attribute `{{name}}` is changed. You can listen for the event using the `on` method if you wish to be notified before the attribute's value has changed, or using the `after` method if you wish to be notified after the attribute's value has changed.</p>
      +        <strong>Parameters:</strong><br>
      +        `e` <strong>&lt;EventFacade&gt;</strong> An Event Facade object with the following attribute specific properties added:
      +        <ul>
      +            <li>`prevVal` The value of the attribute, prior to it being set</li>
      +            <li>`newVal` The value the attribute is to be set to</li>
      +            <li>`attrName` The name of the attribute being set</li>
      +            <li>`subAttrName` If setting a property within the attribute's value, the name of the sub-attribute property being set</li>
      +        </ul>
      +    </div>
      +    {{/if}}
      +</div>
      diff --git a/themes/simple/partials/classes.handlebars b/themes/simple/partials/classes.handlebars
      new file mode 100644
      index 00000000..c61aab3c
      --- /dev/null
      +++ b/themes/simple/partials/classes.handlebars
      @@ -0,0 +1,73 @@
      +<h4>Class {{moduleName}}</h4>
      +{{#if uses}}
      +    Uses:
      +    {{#each uses}}
      +        <a href="{{this}}.html">{{this}}</a>
      +    {{/each}}
      +    <br>
      +{{/if}}
      +{{#if extension_for}}
      +    Extension For:
      +    {{#each extension_for}}
      +        <a href="{{this}}.html">{{this}}</a>
      +    {{/each}}
      +    <br>
      +{{/if}}
      +{{#if extends}}
      +    Extends: {{#crossLink extends}}{{/crossLink}}<br>
      +{{/if}}
      +<span class="foundat">Class defined in: <a href="{{foundAt}}">`{{file}}:{{line}}`</a></span>
      +<div class="intro">{{{classDescription}}}</div>
      +
      +{{#if is_constructor}}
      +    {{#is_constructor}}
      +{{>method}}
      +    {{/is_constructor}}
      +{{/if}}
      +
      +<div id="classdocs">
      +    <ul>
      +        {{#if methods}}
      +        <li><a href="#methods">Methods</a></li>
      +        {{/if}}
      +        {{#if properties}}
      +        <li><a href="#props">Properties</a></li>
      +        {{/if}}
      +        {{#if attrs}}
      +        <li><a href="#attrs">Attributes</a></li>
      +        {{/if}}
      +        {{#if events}}
      +        <li><a href="#events">Events</a></li>
      +        {{/if}}
      +    </ul>
      +    <div>
      +        {{#if methods}}
      +            <div id="methods">
      +            {{#methods}}
      +{{>method}}
      +            {{/methods}}
      +            </div>
      +        {{/if}}
      +        {{#if properties}}
      +            <div id="props">
      +            {{#properties}}
      +{{>props}}
      +            {{/properties}}
      +            </div>
      +        {{/if}}
      +        {{#if attrs}}
      +            <div id="attrs">
      +            {{#attrs}}
      +                {{>attrs}}
      +            {{/attrs}}
      +            </div>
      +        {{/if}}
      +        {{#if events}}
      +            <div id="events">
      +            {{#events}}
      +                {{>events}}
      +            {{/events}}
      +            </div>
      +        {{/if}}
      +    </div>
      +</div>
      diff --git a/themes/simple/partials/elements.handlebars b/themes/simple/partials/elements.handlebars
      new file mode 100644
      index 00000000..ebc35809
      --- /dev/null
      +++ b/themes/simple/partials/elements.handlebars
      @@ -0,0 +1,80 @@
      +<h1>&lt{{name}}&gt;</h1>
      +<div class="box meta">
      +    {{#if foundAt}}
      +        <div class="foundat">
      +            Defined in: <a href="{{foundAt}}">`{{{file}}}:{{{line}}}`</a>
      +        </div>
      +    {{/if}}
      +
      +    {{#if module}}
      +        {{#if submodule}}
      +            Module: {{#crossLinkModule submodule}}{{/crossLinkModule}}<br>
      +            Parent Module: {{#crossLinkModule module}}{{/crossLinkModule}}
      +        {{else}}
      +            Module: {{#crossLinkModule module}}{{/crossLinkModule}}
      +        {{/if}}
      +    {{/if}}
      +
      +    {{#if since}}
      +        <p>Available since {{since}}</p>
      +    {{/if}}
      +</div>
      +
      +{{#if deprecated}}
      +    <div class="box deprecated">
      +        <p>
      +        {{#if deprecationMessage}}
      +            <strong>Deprecated:</strong> {{deprecationMessage}}
      +        {{else}}
      +            This element is deprecated.
      +        {{/if}}
      +        </p>
      +    </div>
      +{{/if}}
      +
      +<div class="box intro">
      +    {{{elementDescription}}}
      +
      +    <ul class="definitions">
      +        {{#if parents}}
      +        <li>
      +            <dfn>Permitted parent elements: </dfn> {{parents}}
      +        </li>
      +        {{/if}}
      +
      +        {{#if content}}
      +        <li>
      +            <dfn>Permitted content: </dfn> {{content}}
      +        </li>
      +        {{/if}}
      +    </ul>
      +</div>
      +
      +{{#example}}
      +<div class="example">
      +    <h2>Example</h2>
      +
      +    <div class="example-content">
      +        {{{.}}}
      +    </div>
      +</div>
      +{{/example}}
      +
      +{{#if interface}}
      +<h2>Interface</h2>
      +<p>This element implements the {{#crossLink interface}}{{/crossLink}} class.</p>
      +{{/if}}
      +
      +<div class="index-section attrs">
      +    <h2>Attributes</h2>
      +
      +    {{#if attributes}}
      +    <div id="attributes">
      +        {{#attributes}}
      +            {{>attributes}}
      +        {{/attributes}}
      +    </div>
      +    {{else}}
      +    <p>This element has no defined attributes.</p>
      +    {{/if}}
      +</div>
      diff --git a/themes/simple/partials/events.handlebars b/themes/simple/partials/events.handlebars
      new file mode 100644
      index 00000000..38dd6524
      --- /dev/null
      +++ b/themes/simple/partials/events.handlebars
      @@ -0,0 +1,35 @@
      +<a name="events_{{name}}"></a>
      +<div class="events item">
      +    `{{name}}` {{#if type}}<strong>&lt;{{#crossLink type}}{{/crossLink}}&gt;</strong>{{/if}}
      +    {{#if extended_from}}<em>`/* Extended from {{extended_from}} */</em>`{{/if}}
      +    {{#if overwritten_from}}<em>`/* Overwritten from {{name}} */`</em>{{/if}}
      +    <br>
      +    <span class="foundat"><a href="{{foundAt}}">`{{file}}:{{line}}`</a></span>
      +    {{{eventDescription}}}
      +    {{#if params}}
      +    <strong>Extra event object properties:</strong>
      +    <ul>
      +    {{#params}}
      +        <li>
      +        {{#if optional}}
      +            `[{{name}}{{#if optdefault}}={{optdefault}}{{/if}}]` <strong>&lt;{{#crossLink type}}{{/crossLink}}&gt;</strong>
      +        {{else}}
      +            `{{name}}` <strong>&lt;{{#crossLink type}}{{/crossLink}}&gt;</strong>
      +        {{/if}}
      +        {{#if multiple}}
      +            <abbr title="Denotes that this argument can contain (n) number">(*..n)</abbr>
      +        {{/if}}
      +        {{{description}}}
      +            {{#if props}}
      +            <ul>
      +            {{#props}}
      +                <li>`{{name}}` <strong>&lt;{{#crossLink type}}{{/crossLink}}&gt;</strong> {{{description}}}
      +            {{/props}}
      +            </ul>
      +            {{/if}}
      +        </li>
      +    {{/params}}
      +    </ul>
      +    {{/if}}
      +</div>
      +
      diff --git a/themes/simple/partials/files.handlebars b/themes/simple/partials/files.handlebars
      new file mode 100644
      index 00000000..84a54403
      --- /dev/null
      +++ b/themes/simple/partials/files.handlebars
      @@ -0,0 +1,6 @@
      +<h4>{{fileName}}</h4>
      +
      +<pre class="code prettyprint linenums">
      +{{fileData}}
      +</pre>
      +
      diff --git a/themes/simple/partials/index.handlebars b/themes/simple/partials/index.handlebars
      new file mode 100644
      index 00000000..563d62a0
      --- /dev/null
      +++ b/themes/simple/partials/index.handlebars
      @@ -0,0 +1,2 @@
      +<h3>API Docs - Main Index</h3>
      +<p>Something smart and pretty should probably go here.</p>
      diff --git a/themes/simple/partials/method.handlebars b/themes/simple/partials/method.handlebars
      new file mode 100644
      index 00000000..6848dc43
      --- /dev/null
      +++ b/themes/simple/partials/method.handlebars
      @@ -0,0 +1,61 @@
      +<a name="methods_{{name}}"></a>
      +<div class="method item{{#if access}} {{access}}{{/if}}">
      +    {{#if final}}<code>final</code> {{/if}}{{#if returnType}}{{#crossLink returnType}}{{/crossLink}} {{/if}}<strong class="name">`{{name}}`</strong>( `{{paramsList}} ` ) {{#if access}}<em>`/* {{access}} method */`</em>{{/if}}
      +    <br>
      +    <span class="foundat">
      +    {{#if overwritten_from}}
      +        Defined in <a href="{{overwritten_from/class}}.html#method_{{overwritten_from/name}}">{{overwritten_from/class}}</a> but overwritten locally: 
      +    {{else}}
      +        {{#if extended_from}} Defined in <a href="{{extended_from}}.html#method_{{name}}">{{extended_from}}</a>: {{/if}}
      +    {{/if}}
      +        <a href="{{foundAt}}">`{{file}}:{{line}}`</a>
      +    </span><br>
      +    {{{methodDescription}}}
      +    {{#if params}}
      +    <strong>Parameters:</strong>
      +    <ul class="params">
      +    {{#params}}
      +        <li>
      +        {{#if optional}}
      +            `[{{name}}{{#if optdefault}}={{optdefault}}{{/if}}]` <strong>&lt;{{#crossLink type}}{{/crossLink}}&gt;</strong>
      +        {{else}}
      +            `{{name}}` <strong>&lt;{{#crossLink type}}{{/crossLink}}&gt;</strong>
      +        {{/if}}
      +        {{#if multiple}}
      +            <abbr title="Denotes that this argument can contain (n) number">(*..n)</abbr>
      +        {{/if}}
      +        {{{description}}}
      +            {{#if props}}
      +            <ul>
      +            {{#props}}
      +                <li>`{{name}}` <strong>&lt;{{#crossLink type}}{{/crossLink}}&gt;</strong> {{{description}}}
      +                {{#if props}}
      +                    <ul>
      +                        {{#props}}
      +                            <li>`{{name}}` <strong>&lt;{{#crossLink type}}{{/crossLink}}&gt;</strong> {{{description}}} </li>
      +                        {{/props}}
      +                    </ul>
      +                {{/if}}
      +                </li>
      +            {{/props}}
      +            </ul>
      +            {{/if}}
      +        </li>
      +    {{/params}}
      +    </ul>
      +    {{/if}}
      +    {{#if return}}
      +    {{#return}}
      +    <br><div class="returns"><strong>Returns:</strong> {{#if type}}&lt;{{#crossLink type}}{{/crossLink}}&gt; {{/if}}{{{description}}}</div>
      +    {{/return}}
      +    {{/if}}
      +    {{#if throws}}
      +    {{#throws}}
      +    <br><div class="throws"><strong>Throws:</strong> {{#if type}}&lt;{{#crossLink type}}{{/crossLink}}&gt; {{/if}}{{{description}}}</div>
      +    {{/throws}}
      +    {{/if}}
      +    {{#if example}}
      +        <h5>Example</h5>
      +        {{{example}}}
      +    {{/if}}
      +</div>
      diff --git a/themes/simple/partials/module.handlebars b/themes/simple/partials/module.handlebars
      new file mode 100644
      index 00000000..814269ec
      --- /dev/null
      +++ b/themes/simple/partials/module.handlebars
      @@ -0,0 +1,38 @@
      +
      +<h2>{{moduleName}}</h2>
      +<div class="intro">{{{moduleDescription}}}</div>
      +
      +<div class="yui3-g">
      +    <div class="yui3-u-1-2">
      +        {{#if moduleClasses}}
      +        <p>This module has the following classes:</p>
      +        <ul>
      +        {{#moduleClasses}}
      +            <li><a href="{{../projectRoot}}classes/{{name}}.html">{{displayName}}</a></li>
      +        {{/moduleClasses}}
      +        </ul>
      +        {{/if}}
      +    </div>
      +    <div class="yui3-u-1-2">
      +        {{#if moduleElements}}
      +        <p>This module has the following elements:</p>
      +        <ul>
      +        {{#moduleElements}}
      +            <li><a href="{{../projectRoot}}elements/{{name}}.html">{{displayName}}</a></li>
      +        {{/moduleElements}}
      +        </ul>
      +        {{/if}}
      +    </div>
      +    <div class="yui3-u-1-2">
      +        {{#if subModules}}
      +        <p>This module has the following submodules:</p>
      +        <ul>
      +        {{#subModules}}
      +            <li id="{{name}}"><a href="{{../projectRoot}}modules/{{name}}.html">{{displayName}}</a><p>{{{description}}}</p></li>
      +        {{/subModules}}
      +        </ul>
      +        {{/if}}
      +    </div>
      +</div>
      +<br><br>
      +<span class="foundat">Module description found: <a href="{{foundAt}}">`{{file}}:{{line}}`</a></span>
      diff --git a/themes/simple/partials/props.handlebars b/themes/simple/partials/props.handlebars
      new file mode 100644
      index 00000000..ad3e27cb
      --- /dev/null
      +++ b/themes/simple/partials/props.handlebars
      @@ -0,0 +1,10 @@
      +<a name="props_{{name}}"></a>
      +<div class="props item">
      +    `{{name}}` &lt;<strong>{{#crossLink type}}{{/crossLink}}</strong>&gt;{{#if final}} <em>(final)</em>{{/if}}{{#if static}} <em>(static)</em>{{/if}}<br>
      +    <span class="foundat"><a href="{{foundAt}}">`{{file}}:{{line}}`</a></span>
      +    {{{propertyDescription}}}
      +    {{#if example}}
      +        <h5>Example</h5>
      +        {{{example}}}
      +    {{/if}}
      +</div>
      diff --git a/themes/simple/partials/sidebar.handlebars b/themes/simple/partials/sidebar.handlebars
      new file mode 100644
      index 00000000..f07f7272
      --- /dev/null
      +++ b/themes/simple/partials/sidebar.handlebars
      @@ -0,0 +1,118 @@
      +<div id="modules" class="sidebox">
      +    <div class="hd">
      +        <h2 class="no-toc">Modules</h2>
      +    </div>
      +    <div class="bd">
      +        <ul>
      +            {{#modules}}
      +                <li><a href="{{../projectRoot}}modules/{{name}}.html">{{displayName}}</a>
      +                {{#if submodules}}
      +                    <ul>
      +                        {{#submodules}}
      +                            <li><a href="{{../../../projectRoot}}modules/{{../name}}.html#{{displayName}}">{{displayName}}</a></li>
      +                        {{/submodules}}
      +                    </ul>
      +                {{/if}}
      +                </li>
      +            {{/modules}}
      +        </ul>
      +    </div>
      +</div>
      +
      +<div id="classes" class="sidebox">
      +    <div class="hd">
      +        <h2 class="no-toc">Classes</h2>
      +    </div>
      +    <div class="bd">
      +        <ul>
      +            {{#classes}}
      +                <li><a href="{{../projectRoot}}classes/{{name}}.html">{{displayName}}</a></li>
      +            {{/classes}}
      +        </ul>
      +    </div>
      +</div>
      +
      +<div id="elements" class="sidebox">
      +    <div class="hd">
      +        <h2 class="no-toc">Elements</h2>
      +    </div>
      +    <div class="bd">
      +        <ul>
      +            {{#elements}}
      +                <li><a href="{{../projectRoot}}elements/{{name}}.html">{{displayName}}</a></li>
      +            {{/elements}}
      +        </ul>
      +    </div>
      +</div>
      +
      +{{#if methods}}
      +<div id="methods-on-page" class="sidebox on-page">
      +    <div class="hd">
      +        <h2 class="no-toc">Methods On Page</h2>
      +    </div>
      +    <div class="bd">
      +        <ul>
      +            {{#methods}}
      +                <li><a href="#methods_{{name}}">{{name}}</a></li>
      +            {{/methods}}
      +        </ul>
      +    </div>
      +</div>
      +{{/if}}
      +
      +{{#if events}}
      +<div id="events-on-page" class="sidebox on-page">
      +    <div class="hd">
      +        <h2 class="no-toc">Events On Page</h2>
      +    </div>
      +    <div class="bd">
      +        <ul>
      +            {{#events}}
      +                <li><a href="#events_{{name}}">{{name}}</a></li>
      +            {{/events}}
      +        </ul>
      +    </div>
      +</div>
      +{{/if}}
      +
      +{{#if props}}
      +<div id="props-on-page" class="sidebox">
      +    <div class="hd">
      +        <h2 class="no-toc">Props On Page</h2>
      +    </div>
      +    <div class="bd">
      +        <ul>
      +            {{#properties}}
      +                <li><a href="#props_{{name}}">{{name}}</a></li>
      +            {{/properties}}
      +        </ul>
      +    </div>
      +</div>
      +{{/if}}
      +
      +{{#if attributes}}
      +<div id="attrs-on-page" class="sidebox on-page">
      +    <div class="hd">
      +        <h2 class="no-toc">Attributes On Page</h2>
      +    </div>
      +    <div class="bd">
      +        <ul>
      +            {{#attributes}}
      +                <li><a href="#attrs_{{name}}">{{name}}</a></li>
      +            {{/attributes}}
      +        </ul>
      +    </div>
      +</div>
      +{{/if}}
      +
      +{{#if fileTree}}
      +<div id="fileTree" class="sidebox">
      +    <div class="hd">
      +        <h2 class="no-toc">Files</h2>
      +    </div>
      +    <div class="bd">
      +        {{#buildFileTree fileTree}}{{/buildFileTree}}
      +    </div>
      +</div>
      +{{/if}}
      +
      diff --git a/themes/simple/theme.json b/themes/simple/theme.json
      new file mode 100644
      index 00000000..3cf1d786
      --- /dev/null
      +++ b/themes/simple/theme.json
      @@ -0,0 +1,4 @@
      +{
      +    "yuiGridsUrl": "http://yui.yahooapis.com/3.8.0pr2/build/cssgrids/cssgrids-min.css",
      +    "yuiSeedUrl": "http://yui.yahooapis.com/combo?3.8.0pr2/build/yui/yui-min.js"
      +}
      
      From 18eee477491013c02a6bf1faef3d321a294de3fc Mon Sep 17 00:00:00 2001
      From: Bennett Amodio <bamo@mit.edu>
      Date: Sat, 11 Jun 2016 21:56:21 +0000
      Subject: [PATCH 2/6] bamo: Fixed bug concerning multiple throw statements.
      
      ---
       lib/docparser.js                          | 25 ++++++++++++++++++++++-
       themes/default/partials/method.handlebars | 25 ++++++++++++-----------
       themes/simple/partials/method.handlebars  | 11 +++++++---
       3 files changed, 45 insertions(+), 16 deletions(-)
      
      diff --git a/lib/docparser.js b/lib/docparser.js
      index 896553c3..f72f162f 100644
      --- a/lib/docparser.js
      +++ b/lib/docparser.js
      @@ -422,7 +422,30 @@ YUI.add('docparser', function (Y) {
                   },
       
                   // @throws {type} description
      -            'throws': 'return',
      +            'throws': function(tagname, value, target) {
      +                
      +                target[tagname] = target[tagname] || [];
      +                
      +                var desc = implodeString(trim(value)),
      +                    type,
      +                    match = REGEX_TYPE.exec(desc),
      +                    result = {};
      +                    
      +                if (match) {
      +                    type = fixType(trim(match[2]));
      +                    desc = trim(match[1] + match[3]);
      +                }
      +
      +                result = {
      +                    description: Y.unindent(explodeString(desc))
      +                };
      +
      +                if (type) {
      +                    result.type = type;
      +                }
      +                
      +                target[tagname].push(result);
      +            },
       
                   'injects': 'return',
       
      diff --git a/themes/default/partials/method.handlebars b/themes/default/partials/method.handlebars
      index 664d79b1..92f31120 100644
      --- a/themes/default/partials/method.handlebars
      +++ b/themes/default/partials/method.handlebars
      @@ -181,24 +181,25 @@
               </div>
           {{/return}}
       
      -    {{#throws}}
      +    {{#if throws}}
               <div class="throws">
                   <h4>Throws:</h4>
       
      -            <div class="throws-description">
      -                {{#if description}}
      -                    {{#if type}}
      -                        <span class="type">{{#crossLink type}}{{/crossLink}}</span>:
      -                    {{/if}}
      -                    {{{description}}}
      -                {{else}}
      +            <ul class="params-list">
      +            {{#throws}}
      +                <li class="param">
                           {{#if type}}
      -                        <span class="type">{{#crossLink type}}{{/crossLink}}</span>:
      +                        <span class="type">{{#crossLink type}}{{/crossLink}}</span>
                           {{/if}}
      -                {{/if}}
      -            </div>
      +
      +                    <div class="param-description">
      +                        {{{description}}}
      +                    </div>
      +                </li>
      +            {{/throws}}
      +            </ul>
               </div>
      -    {{/throws}}
      +    {{/if}}
       
           {{#example}}
               <div class="example">
      diff --git a/themes/simple/partials/method.handlebars b/themes/simple/partials/method.handlebars
      index 6848dc43..dbc7d452 100644
      --- a/themes/simple/partials/method.handlebars
      +++ b/themes/simple/partials/method.handlebars
      @@ -50,9 +50,14 @@
           {{/return}}
           {{/if}}
           {{#if throws}}
      -    {{#throws}}
      -    <br><div class="throws"><strong>Throws:</strong> {{#if type}}&lt;{{#crossLink type}}{{/crossLink}}&gt; {{/if}}{{{description}}}</div>
      -    {{/throws}}
      +        <br><strong>Throws:</strong>
      +        <ul class="throws">
      +        {{#throws}}
      +            <li>
      +                {{#if type}}&lt;{{#crossLink type}}{{/crossLink}}&gt; {{/if}}{{{description}}}
      +            </li>
      +        {{/throws}}
      +        </ul>
           {{/if}}
           {{#if example}}
               <h5>Example</h5>
      
      From c4ebf05393b90496d9343be5fa1212ffbe0806f0 Mon Sep 17 00:00:00 2001
      From: Bennett Amodio <bamo@mit.edu>
      Date: Sat, 11 Jun 2016 22:01:42 +0000
      Subject: [PATCH 3/6] Fixed the parser for the throws issue.
      
      ---
       lib/docparser.js | 4 ----
       1 file changed, 4 deletions(-)
      
      diff --git a/lib/docparser.js b/lib/docparser.js
      index a66f7a3f..f72f162f 100644
      --- a/lib/docparser.js
      +++ b/lib/docparser.js
      @@ -422,7 +422,6 @@ YUI.add('docparser', function (Y) {
                   },
       
                   // @throws {type} description
      -<<<<<<< HEAD
                   'throws': function(tagname, value, target) {
                       
                       target[tagname] = target[tagname] || [];
      @@ -447,9 +446,6 @@ YUI.add('docparser', function (Y) {
                       
                       target[tagname].push(result);
                   },
      -=======
      -            'throws': 'return',
      ->>>>>>> a5e78482a6930f1319a77bbfa76ff78e129f68a0
       
                   'injects': 'return',
       
      
      From 8e590b71cbec6f0e9355c3c1ebf403cc076c59c1 Mon Sep 17 00:00:00 2001
      From: Bennett Amodio <bamo@mit.edu>
      Date: Sat, 11 Jun 2016 22:04:22 +0000
      Subject: [PATCH 4/6] Merge bug fixed
      
      ---
       themes/default/partials/method.handlebars | 3 ++-
       1 file changed, 2 insertions(+), 1 deletion(-)
      
      diff --git a/themes/default/partials/method.handlebars b/themes/default/partials/method.handlebars
      index 7a71c27a..92f31120 100644
      --- a/themes/default/partials/method.handlebars
      +++ b/themes/default/partials/method.handlebars
      @@ -180,7 +180,7 @@
                   </div>
               </div>
           {{/return}}
      -    
      +
           {{#if throws}}
               <div class="throws">
                   <h4>Throws:</h4>
      @@ -200,6 +200,7 @@
                   </ul>
               </div>
           {{/if}}
      +
           {{#example}}
               <div class="example">
                   <h4>Example:</h4>
      
      From 403a5604cb5efe2c80a19d1464cef88712bbb313 Mon Sep 17 00:00:00 2001
      From: Bennett Amodio <bamo@mit.edu>
      Date: Sat, 11 Jun 2016 22:09:54 +0000
      Subject: [PATCH 5/6] IP issue fixed
      
      ---
       lib/server.js | 6 ------
       1 file changed, 6 deletions(-)
      
      diff --git a/lib/server.js b/lib/server.js
      index 380df270..87a03588 100644
      --- a/lib/server.js
      +++ b/lib/server.js
      @@ -193,15 +193,9 @@ YUI.add('server', function (Y) {
                   stat = Server.options.themedir || path.join(__dirname, '../', 'themes', 'default');
                   Server.app.use(express.static(stat));
                   Server.routes();
      -<<<<<<< HEAD
                   Server.app.listen(Server.options.port, Server.options.ip);
       
                   Y.log('Starting server: http://' + Server.options.ip + ':' + Server.options.port, 'info', 'server');
      -=======
      -            Server.app.listen(Server.options.port);
      -
      -            Y.log('Starting server: http:/' + '/127.0.0.1:' + Server.options.port, 'info', 'server');
      ->>>>>>> a5e78482a6930f1319a77bbfa76ff78e129f68a0
               },
               /**
                * Start the server with the supplied options.
      
      From 02911f2d5d31db69c410e3ce8ae404f34bbfd9eb Mon Sep 17 00:00:00 2001
      From: Bennett Amodio <bamo@mit.edu>
      Date: Sat, 11 Jun 2016 22:13:31 +0000
      Subject: [PATCH 6/6] More darn bugs
      
      ---
       lib/options.js | 10 ----------
       1 file changed, 10 deletions(-)
      
      diff --git a/lib/options.js b/lib/options.js
      index 5050f6b3..6a6f0eb2 100644
      --- a/lib/options.js
      +++ b/lib/options.js
      @@ -24,10 +24,7 @@ YUI.add('options', function (Y) {
           Y.Options = function (args) {
               var options = {
                   port: 3000,
      -<<<<<<< HEAD
                   ip: '127.0.0.1',
      -=======
      ->>>>>>> a5e78482a6930f1319a77bbfa76ff78e129f68a0
                   nocode: false
               };
       
      @@ -112,7 +109,6 @@ YUI.add('options', function (Y) {
                   case '--server':
                       options.server = true;
                       var a = args.shift();
      -<<<<<<< HEAD
                       var delim = a.indexOf(':');
                       if (delim >= 0) {
                           var socket = a.split(':');
      @@ -120,18 +116,12 @@ YUI.add('options', function (Y) {
                           options.port = socket[1];
                           break;
                       }
      -=======
      ->>>>>>> a5e78482a6930f1319a77bbfa76ff78e129f68a0
                       var p = parseInt(a, 10);
                       if (isNaN(p) || !p) {
                           if (a) {
                               args.unshift(a);
                           }
      -<<<<<<< HEAD
                           Y.log('Failed to extract socket, setting to the default 127.0.0.1:3000', 'warn', 'yuidoc');
      -=======
      -                    Y.log('Failed to extract port, setting to the default :3000', 'warn', 'yuidoc');
      ->>>>>>> a5e78482a6930f1319a77bbfa76ff78e129f68a0
                       } else {
                           options.port = p;
                       }