diff --git a/docs/args/partials/help.mustache b/docs/args/partials/help.mustache index 682e1474..db120834 100644 --- a/docs/args/partials/help.mustache +++ b/docs/args/partials/help.mustache @@ -1,7 +1,7 @@ YUI Doc generates API documentation from a modified JavaDoc syntax. -Current version (0.3.45) +Current version (0.3.47) Usage: yuidoc diff --git a/output/api/assets/css/main.css b/output/api/assets/css/main.css index d745d443..cdfe209e 100644 --- a/output/api/assets/css/main.css +++ b/output/api/assets/css/main.css @@ -98,7 +98,7 @@ code, kbd, pre, samp { line-height: 1.35; } -p code, p kbd, p samp { +p code, p kbd, p samp, li code { background: #FCFBFA; border: 1px solid #EFEEED; padding: 0 3px; diff --git a/output/api/classes/CLI.html b/output/api/classes/CLI.html index 04a22a98..d717588b 100644 --- a/output/api/classes/CLI.html +++ b/output/api/classes/CLI.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/api/classes/DocBuilder.html b/output/api/classes/DocBuilder.html index 2f22d118..46597f6d 100644 --- a/output/api/classes/DocBuilder.html +++ b/output/api/classes/DocBuilder.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/api/classes/DocParser.html b/output/api/classes/DocParser.html index 082ed66e..8db2dddc 100644 --- a/output/api/classes/DocParser.html +++ b/output/api/classes/DocParser.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/api/classes/DocView.html b/output/api/classes/DocView.html index 2a631b06..64fe9f46 100644 --- a/output/api/classes/DocView.html +++ b/output/api/classes/DocView.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/api/classes/Files.html b/output/api/classes/Files.html index 688fbb2f..57e00646 100644 --- a/output/api/classes/Files.html +++ b/output/api/classes/Files.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/api/classes/Help.html b/output/api/classes/Help.html index 2d43cc1d..aac08d44 100644 --- a/output/api/classes/Help.html +++ b/output/api/classes/Help.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/api/classes/Main.html b/output/api/classes/Main.html index cf5346df..0f07994b 100644 --- a/output/api/classes/Main.html +++ b/output/api/classes/Main.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/api/classes/Options.html b/output/api/classes/Options.html index 0586c9f1..37de411c 100644 --- a/output/api/classes/Options.html +++ b/output/api/classes/Options.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/api/classes/Server.html b/output/api/classes/Server.html index eb6cb8fb..b301abed 100644 --- a/output/api/classes/Server.html +++ b/output/api/classes/Server.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/api/classes/Utils.html b/output/api/classes/Utils.html index b29170ce..1e402011 100644 --- a/output/api/classes/Utils.html +++ b/output/api/classes/Utils.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/api/classes/YUIDoc.html b/output/api/classes/YUIDoc.html index deccd4cb..b281f2bd 100644 --- a/output/api/classes/YUIDoc.html +++ b/output/api/classes/YUIDoc.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
@@ -1020,7 +1020,7 @@

endtime

- lib/yuidoc.js:340 + lib/yuidoc.js:341

diff --git a/output/api/data.json b/output/api/data.json index 61fd4eba..9aeede68 100644 --- a/output/api/data.json +++ b/output/api/data.json @@ -3,7 +3,7 @@ "name": "yuidoc-root", "logo": "http://yuilibrary.com/img/yui-logo.png", "description": "YUIDoc, YUI's JavaScript Documentation engine.", - "version": "0.3.46" + "version": "0.3.47" }, "files": { "lib/builder.js": { @@ -2329,7 +2329,7 @@ }, { "file": "lib/yuidoc.js", - "line": 340, + "line": 341, "description": "Timestamp holder so we know when YUIDoc has finished the parse process.", "itemtype": "property", "name": "endtime", diff --git a/output/api/files/lib_builder.js.html b/output/api/files/lib_builder.js.html index 766d6d0b..478e12d9 100644 --- a/output/api/files/lib_builder.js.html +++ b/output/api/files/lib_builder.js.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
@@ -854,7 +854,7 @@

File: lib/builder.js

_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>'); + html = html.replace(/<pre><code/g, '<pre class="code prettyprint"><code'); return html; }, /** diff --git a/output/api/files/lib_cli.js.html b/output/api/files/lib_cli.js.html index 42de2c4b..b63d374c 100644 --- a/output/api/files/lib_cli.js.html +++ b/output/api/files/lib_cli.js.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
@@ -144,6 +144,9 @@

File: lib/cli.js

} else { var json = (new Y.YUIDoc(options)).run(); + if (json === null) { + return; + } options = Y.Project.mix(json, options); if (!options.parseOnly) { diff --git a/output/api/files/lib_docparser.js.html b/output/api/files/lib_docparser.js.html index 6649a05e..f5ba5680 100644 --- a/output/api/files/lib_docparser.js.html +++ b/output/api/files/lib_docparser.js.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/api/files/lib_docview.js.html b/output/api/files/lib_docview.js.html index dccf1c30..11e3d633 100644 --- a/output/api/files/lib_docview.js.html +++ b/output/api/files/lib_docview.js.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/api/files/lib_files.js.html b/output/api/files/lib_files.js.html index 46d62ad9..795bd6dc 100644 --- a/output/api/files/lib_files.js.html +++ b/output/api/files/lib_files.js.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/api/files/lib_help.js.html b/output/api/files/lib_help.js.html index 79bda737..25b6b42a 100644 --- a/output/api/files/lib_help.js.html +++ b/output/api/files/lib_help.js.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/api/files/lib_index.js.html b/output/api/files/lib_index.js.html index d5775003..d9f4b5bd 100644 --- a/output/api/files/lib_index.js.html +++ b/output/api/files/lib_index.js.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/api/files/lib_options.js.html b/output/api/files/lib_options.js.html index 379a0ce3..de679dec 100644 --- a/output/api/files/lib_options.js.html +++ b/output/api/files/lib_options.js.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/api/files/lib_server.js.html b/output/api/files/lib_server.js.html index 76076f02..58d63997 100644 --- a/output/api/files/lib_server.js.html +++ b/output/api/files/lib_server.js.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/api/files/lib_utils.js.html b/output/api/files/lib_utils.js.html index e908ae4d..62f07a59 100644 --- a/output/api/files/lib_utils.js.html +++ b/output/api/files/lib_utils.js.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/api/files/lib_yuidoc.js.html b/output/api/files/lib_yuidoc.js.html index 6e2b7aaa..09b705b9 100644 --- a/output/api/files/lib_yuidoc.js.html +++ b/output/api/files/lib_yuidoc.js.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
@@ -415,8 +415,8 @@

File: lib/yuidoc.js

count++; console.log('#' + count, item.message, item.line + '\n'); }); + process.exit(code); } - process.exit(code); }, /** * Process the config, walk the file tree and write out the JSON data. @@ -445,6 +445,7 @@

File: lib/yuidoc.js

if (this.options.lint) { this.lint(json.warnings); + return null; } /** diff --git a/output/api/index.html b/output/api/index.html index 1d3fe5a5..222fdac4 100644 --- a/output/api/index.html +++ b/output/api/index.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/api/modules/yuidoc.html b/output/api/modules/yuidoc.html index b490cc90..a59d349d 100644 --- a/output/api/modules/yuidoc.html +++ b/output/api/modules/yuidoc.html @@ -19,7 +19,7 @@

- API Docs for: 0.3.46 + API Docs for: 0.3.47
diff --git a/output/args/index.html b/output/args/index.html index 4743f8b3..9fed455b 100644 --- a/output/args/index.html +++ b/output/args/index.html @@ -45,7 +45,7 @@

Running YUIDoc on the Command Line

YUI Doc generates API documentation from a modified JavaDoc syntax.
 
-Current version (0.3.45)
+Current version (0.3.47)
 
 Usage: yuidoc <options> <input path>
 
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 @@
+
+  
+    
+    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

+
    +
  • Defined language extensions for Lisp and Lua +
+

14 Jul 2008

+
    +
  • Language handlers for F#, OCAML, SQL +
  • Support for nocode 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 + testcase. +
+

6 Jan 2009

+
    +
  • Language handlers for Visual Basic, Haskell, CSS, and WikiText
  • +
  • Added .mxml extension to the markup style handler for + Flex MXML files. See + issue 37. +
  • Added .m extension to the C style handler so that Objective + C source files properly highlight. See + issue 58. +
  • 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. +
+

21 May 2009

+
    +
  • Rewrote to improve performance on large files. + See benchmarks.
  • +
  • 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.
  • +
+

14 August 2009

+
    +
  • Fixed prettifying of <code> blocks with embedded newlines. +
+

3 October 2009

+
    +
  • Fixed prettifying of XML/HTML tags that contain uppercase letters. +
+

19 July 2010

+
    +
  • Added support for line numbers. Bug + 22
  • +
  • Added YAML support. Bug + 123
  • +
  • Added VHDL support courtesy Le Poussin.
  • +
  • IE performance improvements. Bug + 102 courtesy jacobly.
  • +
  • A variety of markup formatting fixes courtesy smain and thezbyg.
  • +
  • Fixed copy and paste in IE[678]. +
  • Changed output to use &#160; instead of + &nbsp; so that the output works when embedded in XML. + Bug + 108.
  • +
+

7 September 2010

+
    +
  • Added support for coffeescript courtesy Cezary Bartoszuk.
  • +
+

4 March 2011

+
    +
  • Added a themes + gallery to showcase contributed styles.
  • +
  • Added support for XQuery courtesy Patrick Wied, Nemerle + courtesy Zimin A.V., and Latex support courtesy Martin S.
  • +
+

29 March 2011

+
    +
  • Fixed IE newline issues, and copying/pasting of prettified + source code from IE. This required significant internal changes + but involves no API changes. + Caveat: prettyPrintOne injects the HTML + passed to it into a <pre> 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. +
+ + 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 @@ + + + + + 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/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
    index 0a9af755..e106b944 100644
    --- a/output/index.html
    +++ b/output/index.html
    @@ -149,7 +149,7 @@ <h2 class="no-toc">Table of Contents</h2>
     <a href="#welcome-to-yuidoc-0345">Welcome to YUIDoc 0.3.45!</a>
     </li>
     <li>
    -<a href="#install">Installation and Usage</a>
    +<a href="##install">Installation and Usage</a>
     </li>
     <li>
     <a href="#user-guides">User Guides</a>
    diff --git a/output/syntax/index.html b/output/syntax/index.html
    index e5c06ebc..80f71b92 100644
    --- a/output/syntax/index.html
    +++ b/output/syntax/index.html
    @@ -32,7 +32,8 @@ <h1><img src="http://yuilibrary.com/img/yui-logo.png">YUIDoc Syntax Reference</h
         <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>. 
    +    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>
     
    @@ -74,10 +75,10 @@ <h2 id="primary-tags">Primary Tags</h2>
         <td><code>module</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -Provides the base Widget class...
    -
    -@module widget
    -**&#x2F;</pre>
    + * Provides the base Widget class...
    + *
    + * @module widget
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -102,12 +103,12 @@ <h2 id="primary-tags">Primary Tags</h2>
         <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>
    + * Provides more features for the widget module...
    + *
    + * @module widget
    + * @submodule widget-foo
    + * @main widget
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -124,11 +125,11 @@ <h2 id="primary-tags">Primary Tags</h2>
         <td><code>class</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -A utility that brokers HTTP requests...
    -
    -@class IO 
    -@constructor
    -**&#x2F;
    + * A utility that brokers HTTP requests...
    + *
    + * @class IO
    + * @constructor
    + *&#x2F;
     function IO (config) {</pre>
     
         </td>
    @@ -166,11 +167,11 @@ <h2 id="primary-tags">Primary Tags</h2>
         <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;
    + * Returns this model&#x27;s attributes as...
    + *
    + * @method toJSON
    + * @return {Object} Copy of ...
    + *&#x2F;
     toJSON: function () {</pre>
     
         </td>
    @@ -202,11 +203,11 @@ <h2 id="primary-tags">Primary Tags</h2>
         <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;
    + * Fired when an error occurs...
    + *
    + * @event error
    + * @param {String} msg A description of...
    + *&#x2F;
     var EVT_ERROR = &#x27;error&#x27;,</pre>
     
         </td>
    @@ -237,12 +238,12 @@ <h2 id="primary-tags">Primary Tags</h2>
         <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;
    + * 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>
    @@ -268,14 +269,14 @@ <h2 id="primary-tags">Primary Tags</h2>
         <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;
    + * Indicates whether this Widget
    + * has been rendered...
    + *
    + * @attribute rendered
    + * @readOnly
    + * @default false
    + * @type boolean
    + *&#x2F;
     ATTRS[RENDERED] = {</pre>
     
         </td>
    @@ -321,9 +322,9 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <td><code>submodule</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -@module app
    -@submodule view
    -**&#x2F;</pre>
    + * @module app
    + * @submodule view
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -348,8 +349,8 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <td><code>namespace</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -@namespace Test.Mock
    -**&#x2F;</pre>
    + * @namespace Test.Mock
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -372,10 +373,10 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <td><code>extends</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -@class View
    -@constructor
    -@extends Base
    -**&#x2F;</pre>
    + * @class View
    + * @constructor
    + * @extends Base
    + *&#x2F;</pre>
     
        </td>
        <td>
    @@ -400,9 +401,9 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <td><code>config</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -@config docScrollX 
    -@type Number 
    -**&#x2F;</pre>
    + * @config docScrollX
    + * @type Number
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -416,9 +417,9 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <td><code>constructor</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -@class IO 
    -@constructor
    -**&#x2F;</pre>
    + * @class IO
    + * @constructor
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -437,11 +438,11 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <td><code>static</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -YUI user agent detection...
    -
    -@class UA
    -@static
    -**&#x2F;</pre>
    + * YUI user agent detection...
    + *
    + * @class UA
    + * @static
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -469,14 +470,14 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <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>
    + * Identifies state changes
    + * originating from...
    + *
    + * @property SRC_REPLACE
    + * @type String
    + * @static
    + * @final
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -494,14 +495,14 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <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>
    + * The current default button
    + * as configured through...
    + *
    + * @attribute defaultButton
    + * @type Node
    + * @default null
    + * @readOnly
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -529,22 +530,22 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <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 
    + * 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>, 
    @@ -568,14 +569,14 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <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>
    + * An optional attribute,
    + * not required for proper
    + * use.
    + *
    + * @attribute extras
    + * @type {Object} extra data
    + * @optional
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -599,15 +600,15 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <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>
    + * 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>
    @@ -632,21 +633,21 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <td><code>*param</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -@param {String} name An 
    -  Attribute name or 
    -  object property path.
    -**&#x2F;</pre>
    + * @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>
    + * @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>
    @@ -690,9 +691,9 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <td><code>return</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -@method generateClientId
    -@return {String} Unique clientId.
    -**&#x2F;</pre>
    + * @method generateClientId
    + * @return {String} Unique clientId.
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -714,21 +715,21 @@ <h2 id="secondary-tags">Secondary tags</h2>
     <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;...
    +<pre class="code prettyprint">&#x2F;**
    + * Some inner class &#x27;foo&#x27;...
    + *
    + * @class foo
    + * @for OuterClass
    + *&#x2F;</pre>
     
    -@method bar  
    -@for FarawayClass  
    -**&#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>
    @@ -766,12 +767,12 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <td><code>type</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -@type String
    -**&#x2F;</pre>
    + * @type String
    + *&#x2F;</pre>
     
     <pre class="code prettyprint">&#x2F;**
    -@type HTMLElement|Node|String 
    -**&#x2F;</pre>
    + * @type HTMLElement|Node|String
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -792,12 +793,12 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <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>
    + * Reference to the internal JSONP
    + * instance used to make the queries.
    + *
    + * @private
    + * @property _jsonp
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -817,12 +818,12 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <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>
    + * Removes the &#x60;container&#x60; from
    + * the DOM and ...
    + *
    + * @method _destroyContainer
    + * @protected
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -841,9 +842,9 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <td><code>requires</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -@module event-simulate
    -@requires event
    -**&#x2F;</pre>
    + * @module event-simulate
    + * @requires event
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -863,8 +864,8 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <td><code>default</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -@default false
    -**&#x2F;</pre>
    + * @default false
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -884,13 +885,13 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <td><code>*uses</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -@class Panel
    -@constructor
    -@extends Widget
    -@uses WidgetAutohide
    -@uses WidgetButtons
    + * @class Panel
    + * @constructor
    + * @extends Widget
    + * @uses WidgetAutohide
    + * @uses WidgetButtons
     ...
    -**&#x2F;</pre>
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -921,9 +922,9 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <td><code>*example</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -@example
    -    model.set(&#x27;foo&#x27;, &#x27;bar&#x27;);
    -**&#x2F;</pre>
    + * @example
    + *     model.set(&#x27;foo&#x27;, &#x27;bar&#x27;);
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -941,15 +942,14 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <td><code>chainable</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -Renders this view ...
    -
    -@method render
    -@chainable
    -**&#x2F;
    + * Renders this view ...
    + *
    + * @method render
    + * @chainable
    + *&#x2F;
     render: function () {
         return this;
    -},
    -**&#x2F;</pre>
    +},</pre>
     
         </td>
         <td>
    @@ -965,11 +965,11 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <td><code>deprecated</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -@property locale
    -@type String
    -@deprecated Use &#x60;config.lang&#x60; 
    -  instead.
    -**&#x2F;</pre>
    + * @property locale
    + * @type String
    + * @deprecated Use &#x60;config.lang&#x60;
    + * instead.
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -989,8 +989,8 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <td><code>since</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -@since 3.4.0
    -**&#x2F;</pre>
    + * @since 3.4.0
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -1008,8 +1008,8 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <td><code>async</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -@async
    -**&#x2F;</pre>
    + * @async
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -1021,8 +1021,8 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <td><code>beta</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -@beta
    -**&#x2F;</pre>
    + * @beta
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -1040,11 +1040,11 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <td><code>bubbles</code></td>
         <td>
     <pre class="code prettyprint">&#x2F;**
    -Handles the mouseup DOM event...
    -
    -@event drag:mouseup
    -@bubbles DDM
    -**&#x2F;</pre>
    + * Handles the mouseup DOM event...
    + *
    + * @event drag:mouseup
    + * @bubbles DDM
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -1062,9 +1062,9 @@ <h2 id="secondary-tags">Secondary tags</h2>
         <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>
    + * @class PjaxBase
    + * @extensionfor Router
    + *&#x2F;</pre>
     
         </td>
         <td>
    @@ -1121,6 +1121,40 @@ <h3 id="parsed-but-not-in-the-theme-yet">Parsed but not in the theme yet</h3>
     </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>
    @@ -1153,19 +1187,19 @@ <h3 id="markdown-and-code-highlighting">Markdown and Code Highlighting</h3>
     </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>
    + * 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>
    @@ -1202,14 +1236,14 @@ <h3 id="cross-referencing-modules-and-classes">Cross-referencing Modules and Cla
     </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>
    + *
    + * 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>
    @@ -1258,8 +1292,8 @@ <h3 id="using-custom-handlebars-block-helpers">Using custom Handlebars block hel
     </p>
     
     <pre class="code prettyprint">&#x2F;**
    -* This is also a test {{#davglass &quot;Foo&quot;}}{{&#x2F;davglass}}
    -*&#x2F;</pre>
    + * This is also a test {{#davglass &quot;Foo&quot;}}{{&#x2F;davglass}}
    + *&#x2F;</pre>
     
     
     This will output this in your documentation:
    @@ -1312,6 +1346,9 @@ <h2 class="no-toc">Table of Contents</h2>
     </ul>
     </li>
     <li>
    +<a href="#comment-styles">Comment Styles</a>
    +</li>
    +<li>
     <a href="#extra-formatting">Extra formatting</a>
     <ul class="toc">
     <li>