commit c0db73742978303e833282834b350af5ed52bf25
parent 2b00c7439447e04e576511c8f92e713efa502023
Author: Marcel Radzio <marcel@radzio-sh.de>
Date: Tue, 29 Dec 2015 21:03:26 +0100
Start working on v0.0.2 and adding Documentation
Diffstat:
34 files changed, 3170 insertions(+), 452 deletions(-)
diff --git a/apidocs/api.js b/apidocs/api.js
@@ -0,0 +1,18 @@
+YUI.add("yuidoc-meta", function(Y) {
+ Y.YUIDoc = { meta: {
+ "classes": [
+ "GetData"
+ ],
+ "modules": [
+ "Main"
+ ],
+ "allModules": [
+ {
+ "displayName": "Main",
+ "name": "Main",
+ "description": "Main-functionality for handling the Modules :)"
+ }
+ ],
+ "elements": []
+} };
+});
+\ No newline at end of file
diff --git a/apidocs/assets/css/external-small.png b/apidocs/assets/css/external-small.png
Binary files differ.
diff --git a/apidocs/assets/css/logo.png b/apidocs/assets/css/logo.png
Binary files differ.
diff --git a/apidocs/assets/css/main.css b/apidocs/assets/css/main.css
@@ -0,0 +1,783 @@
+/*
+Font sizes for all selectors other than the body are given in percentages,
+with 100% equal to 13px. To calculate a font size percentage, multiply the
+desired size in pixels by 7.6923076923.
+
+Here's a quick lookup table:
+
+10px - 76.923%
+11px - 84.615%
+12px - 92.308%
+13px - 100%
+14px - 107.692%
+15px - 115.385%
+16px - 123.077%
+17px - 130.769%
+18px - 138.462%
+19px - 146.154%
+20px - 153.846%
+*/
+
+html {
+ background: #fff;
+ color: #333;
+ overflow-y: scroll;
+}
+
+body {
+ /*font: 13px/1.4 'Lucida Grande', 'Lucida Sans Unicode', 'DejaVu Sans', 'Bitstream Vera Sans', 'Helvetica', 'Arial', sans-serif;*/
+ font: 13px/1.4 'Helvetica', 'Arial', sans-serif;
+ margin: 0;
+ padding: 0;
+}
+
+/* -- Links ----------------------------------------------------------------- */
+a {
+ color: #356de4;
+ text-decoration: none;
+}
+
+.hidden {
+ display: none;
+}
+
+a:hover { text-decoration: underline; }
+
+/* "Jump to Table of Contents" link is shown to assistive tools, but hidden from
+ sight until it's focused. */
+.jump {
+ position: absolute;
+ padding: 3px 6px;
+ left: -99999px;
+ top: 0;
+}
+
+.jump:focus { left: 40%; }
+
+/* -- Paragraphs ------------------------------------------------------------ */
+p { margin: 1.3em 0; }
+dd p, td p { margin-bottom: 0; }
+dd p:first-child, td p:first-child { margin-top: 0; }
+
+/* -- Headings -------------------------------------------------------------- */
+h1, h2, h3, h4, h5, h6 {
+ color: #D98527;/*was #f80*/
+ font-family: 'Trebuchet MS', sans-serif;
+ font-weight: bold;
+ line-height: 1.1;
+ margin: 1.1em 0 0.5em;
+}
+
+h1 {
+ font-size: 184.6%;
+ color: #30418C;
+ margin: 0.75em 0 0.5em;
+}
+
+h2 {
+ font-size: 153.846%;
+ color: #E48A2B;
+}
+
+h3 { font-size: 138.462%; }
+
+h4 {
+ border-bottom: 1px solid #DBDFEA;
+ color: #E48A2B;
+ font-size: 115.385%;
+ font-weight: normal;
+ padding-bottom: 2px;
+}
+
+h5, h6 { font-size: 107.692%; }
+
+/* -- Code and examples ----------------------------------------------------- */
+code, kbd, pre, samp {
+ font-family: Menlo, Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;
+ font-size: 92.308%;
+ line-height: 1.35;
+}
+
+p code, p kbd, p samp, li code {
+ background: #FCFBFA;
+ border: 1px solid #EFEEED;
+ padding: 0 3px;
+}
+
+a code, a kbd, a samp,
+pre code, pre kbd, pre samp,
+table code, table kbd, table samp,
+.intro code, .intro kbd, .intro samp,
+.toc code, .toc kbd, .toc samp {
+ background: none;
+ border: none;
+ padding: 0;
+}
+
+pre.code, pre.terminal, pre.cmd {
+ overflow-x: auto;
+ *overflow-x: scroll;
+ padding: 0.3em 0.6em;
+}
+
+pre.code {
+ background: #FCFBFA;
+ border: 1px solid #EFEEED;
+ border-left-width: 5px;
+}
+
+pre.terminal, pre.cmd {
+ background: #F0EFFC;
+ border: 1px solid #D0CBFB;
+ border-left: 5px solid #D0CBFB;
+}
+
+/* Don't reduce the font size of <code>/<kbd>/<samp> elements inside <pre>
+ blocks. */
+pre code, pre kbd, pre samp { font-size: 100%; }
+
+/* Used to denote text that shouldn't be selectable, such as line numbers or
+ shell prompts. Guess which browser this doesn't work in. */
+.noselect {
+ -moz-user-select: -moz-none;
+ -khtml-user-select: none;
+ -webkit-user-select: none;
+ -o-user-select: none;
+ user-select: none;
+}
+
+/* -- Lists ----------------------------------------------------------------- */
+dd { margin: 0.2em 0 0.7em 1em; }
+dl { margin: 1em 0; }
+dt { font-weight: bold; }
+
+/* -- Tables ---------------------------------------------------------------- */
+caption, th { text-align: left; }
+
+table {
+ border-collapse: collapse;
+ width: 100%;
+}
+
+td, th {
+ border: 1px solid #fff;
+ padding: 5px 12px;
+ vertical-align: top;
+}
+
+td { background: #E6E9F5; }
+td dl { margin: 0; }
+td dl dl { margin: 1em 0; }
+td pre:first-child { margin-top: 0; }
+
+th {
+ background: #D2D7E6;/*#97A0BF*/
+ border-bottom: none;
+ border-top: none;
+ color: #000;/*#FFF1D5*/
+ font-family: 'Trebuchet MS', sans-serif;
+ font-weight: bold;
+ line-height: 1.3;
+ white-space: nowrap;
+}
+
+
+/* -- Layout and Content ---------------------------------------------------- */
+#doc {
+ margin: auto;
+ min-width: 1024px;
+}
+
+.content { padding: 0 20px 0 25px; }
+
+.sidebar {
+ padding: 0 15px 0 10px;
+}
+#bd {
+ padding: 7px 0 130px;
+ position: relative;
+ width: 99%;
+}
+
+/* -- Table of Contents ----------------------------------------------------- */
+
+/* The #toc id refers to the single global table of contents, while the .toc
+ class refers to generic TOC lists that could be used throughout the page. */
+
+.toc code, .toc kbd, .toc samp { font-size: 100%; }
+.toc li { font-weight: bold; }
+.toc li li { font-weight: normal; }
+
+/* -- Intro and Example Boxes ----------------------------------------------- */
+/*
+.intro, .example { margin-bottom: 2em; }
+.example {
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: 0 0 5px #bfbfbf;
+ -webkit-box-shadow: 0 0 5px #bfbfbf;
+ box-shadow: 0 0 5px #bfbfbf;
+ padding: 1em;
+}
+.intro {
+ background: none repeat scroll 0 0 #F0F1F8; border: 1px solid #D4D8EB; padding: 0 1em;
+}
+*/
+
+/* -- Other Styles ---------------------------------------------------------- */
+
+/* These are probably YUI-specific, and should be moved out of Selleck's default
+ theme. */
+
+.button {
+ border: 1px solid #dadada;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ color: #444;
+ display: inline-block;
+ font-family: Helvetica, Arial, sans-serif;
+ font-size: 92.308%;
+ font-weight: bold;
+ padding: 4px 13px 3px;
+ -moz-text-shadow: 1px 1px 0 #fff;
+ -webkit-text-shadow: 1px 1px 0 #fff;
+ text-shadow: 1px 1px 0 #fff;
+ white-space: nowrap;
+
+ background: #EFEFEF; /* old browsers */
+ background: -moz-linear-gradient(top, #f5f5f5 0%, #efefef 50%, #e5e5e5 51%, #dfdfdf 100%); /* firefox */
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(50%,#efefef), color-stop(51%,#e5e5e5), color-stop(100%,#dfdfdf)); /* webkit */
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#dfdfdf',GradientType=0 ); /* ie */
+}
+
+.button:hover {
+ border-color: #466899;
+ color: #fff;
+ text-decoration: none;
+ -moz-text-shadow: 1px 1px 0 #222;
+ -webkit-text-shadow: 1px 1px 0 #222;
+ text-shadow: 1px 1px 0 #222;
+
+ background: #6396D8; /* old browsers */
+ background: -moz-linear-gradient(top, #6396D8 0%, #5A83BC 50%, #547AB7 51%, #466899 100%); /* firefox */
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#6396D8), color-stop(50%,#5A83BC), color-stop(51%,#547AB7), color-stop(100%,#466899)); /* webkit */
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6396D8', endColorstr='#466899',GradientType=0 ); /* ie */
+}
+
+.newwindow { text-align: center; }
+
+.header .version em {
+ display: block;
+ text-align: right;
+}
+
+
+#classdocs .item {
+ border-bottom: 1px solid #466899;
+ margin: 1em 0;
+ padding: 1.5em;
+}
+
+#classdocs .item .params p,
+ #classdocs .item .returns p,{
+ display: inline;
+}
+
+#classdocs .item em code, #classdocs .item em.comment {
+ color: green;
+}
+
+#classdocs .item em.comment a {
+ color: green;
+ text-decoration: underline;
+}
+
+#classdocs .foundat {
+ font-size: 11px;
+ font-style: normal;
+}
+
+.attrs .emits {
+ margin-left: 2em;
+ padding: .5em;
+ border-left: 1px dashed #ccc;
+}
+
+abbr {
+ border-bottom: 1px dashed #ccc;
+ font-size: 80%;
+ cursor: help;
+}
+
+.prettyprint li.L0,
+.prettyprint li.L1,
+.prettyprint li.L2,
+.prettyprint li.L3,
+.prettyprint li.L5,
+.prettyprint li.L6,
+.prettyprint li.L7,
+.prettyprint li.L8 {
+ list-style: decimal;
+}
+
+ul li p {
+ margin-top: 0;
+}
+
+.method .name {
+ font-size: 110%;
+}
+
+.apidocs .methods .extends .method,
+.apidocs .properties .extends .property,
+.apidocs .attrs .extends .attr,
+.apidocs .events .extends .event {
+ font-weight: bold;
+}
+
+.apidocs .methods .extends .inherited,
+.apidocs .properties .extends .inherited,
+.apidocs .attrs .extends .inherited,
+.apidocs .events .extends .inherited {
+ font-weight: normal;
+}
+
+#hd {
+ background: whiteSmoke;
+ background: -moz-linear-gradient(top,#DCDBD9 0,#F6F5F3 100%);
+ background: -webkit-gradient(linear,left top,left bottom,color-stop(0%,#DCDBD9),color-stop(100%,#F6F5F3));
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dcdbd9',endColorstr='#F6F5F3',GradientType=0);
+ border-bottom: 1px solid #DFDFDF;
+ padding: 0 15px 1px 20px;
+ margin-bottom: 15px;
+}
+
+#hd img {
+ margin-right: 10px;
+ vertical-align: middle;
+}
+
+
+/* -- API Docs CSS ---------------------------------------------------------- */
+
+/*
+This file is organized so that more generic styles are nearer the top, and more
+specific styles are nearer the bottom of the file. This allows us to take full
+advantage of the cascade to avoid redundant style rules. Please respect this
+convention when making changes.
+*/
+
+/* -- Generic TabView styles ------------------------------------------------ */
+
+/*
+These styles apply to all API doc tabviews. To change styles only for a
+specific tabview, see the other sections below.
+*/
+
+.yui3-js-enabled .apidocs .tabview {
+ visibility: hidden; /* Hide until the TabView finishes rendering. */
+ _visibility: visible;
+}
+
+.apidocs .tabview.yui3-tabview-content { visibility: visible; }
+.apidocs .tabview .yui3-tabview-panel { background: #fff; }
+
+/* -- Generic Content Styles ------------------------------------------------ */
+
+/* Headings */
+h2, h3, h4, h5, h6 {
+ border: none;
+ color: #30418C;
+ font-weight: bold;
+ text-decoration: none;
+}
+
+.link-docs {
+ float: right;
+ font-size: 15px;
+ margin: 4px 4px 6px;
+ padding: 6px 30px 5px;
+}
+
+.apidocs { zoom: 1; }
+
+/* Generic box styles. */
+.apidocs .box {
+ border: 1px solid;
+ border-radius: 3px;
+ margin: 1em 0;
+ padding: 0 1em;
+}
+
+/* A flag is a compact, capsule-like indicator of some kind. It's used to
+ indicate private and protected items, item return types, etc. in an
+ attractive and unobtrusive way. */
+.apidocs .flag {
+ background: #bababa;
+ border-radius: 3px;
+ color: #fff;
+ font-size: 11px;
+ margin: 0 0.5em;
+ padding: 2px 4px 1px;
+}
+
+/* Class/module metadata such as "Uses", "Extends", "Defined in", etc. */
+.apidocs .meta {
+ background: #f9f9f9;
+ border-color: #efefef;
+ color: #555;
+ font-size: 11px;
+ padding: 3px 6px;
+}
+
+.apidocs .meta p { margin: 0; }
+
+/* Deprecation warning. */
+.apidocs .box.deprecated,
+.apidocs .flag.deprecated {
+ background: #fdac9f;
+ border: 1px solid #fd7775;
+}
+
+.apidocs .box.deprecated p { margin: 0.5em 0; }
+.apidocs .flag.deprecated { color: #333; }
+
+/* Module/Class intro description. */
+.apidocs .intro {
+ background: #f0f1f8;
+ border-color: #d4d8eb;
+}
+
+/* Loading spinners. */
+#bd.loading .apidocs,
+#api-list.loading .yui3-tabview-panel {
+ background: #fff url(../img/spinner.gif) no-repeat center 70px;
+ min-height: 150px;
+}
+
+#bd.loading .apidocs .content,
+#api-list.loading .yui3-tabview-panel .apis {
+ display: none;
+}
+
+.apidocs .no-visible-items { color: #666; }
+
+/* Generic inline list. */
+.apidocs ul.inline {
+ display: inline;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.apidocs ul.inline li { display: inline; }
+
+/* Comma-separated list. */
+.apidocs ul.commas li:after { content: ','; }
+.apidocs ul.commas li:last-child:after { content: ''; }
+
+/* Keyboard shortcuts. */
+kbd .cmd { font-family: Monaco, Helvetica; }
+
+/* -- Generic Access Level styles ------------------------------------------- */
+.apidocs .item.protected,
+.apidocs .item.private,
+.apidocs .index-item.protected,
+.apidocs .index-item.deprecated,
+.apidocs .index-item.private {
+ display: none;
+}
+
+.show-deprecated .item.deprecated,
+.show-deprecated .index-item.deprecated,
+.show-protected .item.protected,
+.show-protected .index-item.protected,
+.show-private .item.private,
+.show-private .index-item.private {
+ display: block;
+}
+
+.hide-inherited .item.inherited,
+.hide-inherited .index-item.inherited {
+ display: none;
+}
+
+/* -- Generic Item Index styles --------------------------------------------- */
+.apidocs .index { margin: 1.5em 0 3em; }
+
+.apidocs .index h3 {
+ border-bottom: 1px solid #efefef;
+ color: #333;
+ font-size: 13px;
+ margin: 2em 0 0.6em;
+ padding-bottom: 2px;
+}
+
+.apidocs .index .no-visible-items { margin-top: 2em; }
+
+.apidocs .index-list {
+ border-color: #efefef;
+ font-size: 12px;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ -moz-column-count: 4;
+ -moz-column-gap: 10px;
+ -moz-column-width: 170px;
+ -ms-column-count: 4;
+ -ms-column-gap: 10px;
+ -ms-column-width: 170px;
+ -o-column-count: 4;
+ -o-column-gap: 10px;
+ -o-column-width: 170px;
+ -webkit-column-count: 4;
+ -webkit-column-gap: 10px;
+ -webkit-column-width: 170px;
+ column-count: 4;
+ column-gap: 10px;
+ column-width: 170px;
+}
+
+.apidocs .no-columns .index-list {
+ -moz-column-count: 1;
+ -ms-column-count: 1;
+ -o-column-count: 1;
+ -webkit-column-count: 1;
+ column-count: 1;
+}
+
+.apidocs .index-item { white-space: nowrap; }
+
+.apidocs .index-item .flag {
+ background: none;
+ border: none;
+ color: #afafaf;
+ display: inline;
+ margin: 0 0 0 0.2em;
+ padding: 0;
+}
+
+/* -- Generic API item styles ----------------------------------------------- */
+.apidocs .args {
+ display: inline;
+ margin: 0 0.5em;
+}
+
+.apidocs .flag.chainable { background: #46ca3b; }
+.apidocs .flag.protected { background: #9b86fc; }
+.apidocs .flag.private { background: #fd6b1b; }
+.apidocs .flag.async { background: #356de4; }
+.apidocs .flag.required { background: #e60923; }
+
+.apidocs .item {
+ border-bottom: 1px solid #efefef;
+ margin: 1.5em 0 2em;
+ padding-bottom: 2em;
+}
+
+.apidocs .item h4,
+.apidocs .item h5,
+.apidocs .item h6 {
+ color: #333;
+ font-family: inherit;
+ font-size: 100%;
+}
+
+.apidocs .item .description p,
+.apidocs .item pre.code {
+ margin: 1em 0 0;
+}
+
+.apidocs .item .meta {
+ background: none;
+ border: none;
+ padding: 0;
+}
+
+.apidocs .item .name {
+ display: inline;
+ font-size: 14px;
+}
+
+.apidocs .item .type,
+.apidocs .item .type a,
+.apidocs .returns-inline {
+ color: #555;
+}
+
+.apidocs .item .type,
+.apidocs .returns-inline {
+ font-size: 11px;
+ margin: 0 0 0 0;
+}
+
+.apidocs .item .type a { border-bottom: 1px dotted #afafaf; }
+.apidocs .item .type a:hover { border: none; }
+
+/* -- Item Parameter List --------------------------------------------------- */
+.apidocs .params-list {
+ list-style: square;
+ margin: 1em 0 0 2em;
+ padding: 0;
+}
+
+.apidocs .param { margin-bottom: 1em; }
+
+.apidocs .param .type,
+.apidocs .param .type a {
+ color: #666;
+}
+
+.apidocs .param .type {
+ margin: 0 0 0 0.5em;
+ *margin-left: 0.5em;
+}
+
+.apidocs .param-name { font-weight: bold; }
+
+/* -- Item "Emits" block ---------------------------------------------------- */
+.apidocs .item .emits {
+ background: #f9f9f9;
+ border-color: #eaeaea;
+}
+
+/* -- Item "Returns" block -------------------------------------------------- */
+.apidocs .item .returns .type,
+.apidocs .item .returns .type a {
+ font-size: 100%;
+ margin: 0;
+}
+
+/* -- Class Constructor block ----------------------------------------------- */
+.apidocs .constructor .item {
+ border: none;
+ padding-bottom: 0;
+}
+
+/* -- File Source View ------------------------------------------------------ */
+.apidocs .file pre.code,
+#doc .apidocs .file pre.prettyprint {
+ background: inherit;
+ border: none;
+ overflow: visible;
+ padding: 0;
+}
+
+.apidocs .L0,
+.apidocs .L1,
+.apidocs .L2,
+.apidocs .L3,
+.apidocs .L4,
+.apidocs .L5,
+.apidocs .L6,
+.apidocs .L7,
+.apidocs .L8,
+.apidocs .L9 {
+ background: inherit;
+}
+
+/* -- Submodule List -------------------------------------------------------- */
+.apidocs .module-submodule-description {
+ font-size: 12px;
+ margin: 0.3em 0 1em;
+}
+
+.apidocs .module-submodule-description p:first-child { margin-top: 0; }
+
+/* -- Sidebar TabView ------------------------------------------------------- */
+#api-tabview { margin-top: 0.6em; }
+
+#api-tabview-filter,
+#api-tabview-panel {
+ border: 1px solid #dfdfdf;
+}
+
+#api-tabview-filter {
+ border-bottom: none;
+ border-top: none;
+ padding: 0.6em 10px 0 10px;
+}
+
+#api-tabview-panel { border-top: none; }
+#api-filter { width: 97%; }
+
+/* -- Content TabView ------------------------------------------------------- */
+#classdocs .yui3-tabview-panel { border: none; }
+
+/* -- Source File Contents -------------------------------------------------- */
+.prettyprint li.L0,
+.prettyprint li.L1,
+.prettyprint li.L2,
+.prettyprint li.L3,
+.prettyprint li.L5,
+.prettyprint li.L6,
+.prettyprint li.L7,
+.prettyprint li.L8 {
+ list-style: decimal;
+}
+
+/* -- API options ----------------------------------------------------------- */
+#api-options {
+ font-size: 11px;
+ margin-top: 2.2em;
+ position: absolute;
+ right: 1.5em;
+}
+
+/*#api-options label { margin-right: 0.6em; }*/
+
+/* -- API list -------------------------------------------------------------- */
+#api-list {
+ margin-top: 1.5em;
+ *zoom: 1;
+}
+
+.apis {
+ font-size: 12px;
+ line-height: 1.4;
+ list-style: none;
+ margin: 0;
+ padding: 0.5em 0 0.5em 0.4em;
+}
+
+.apis a {
+ border: 1px solid transparent;
+ display: block;
+ margin: 0 0 0 -4px;
+ padding: 1px 4px 0;
+ text-decoration: none;
+ _border: none;
+ _display: inline;
+}
+
+.apis a:hover,
+.apis a:focus {
+ background: #E8EDFC;
+ background: -moz-linear-gradient(top, #e8edfc 0%, #becef7 100%);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#E8EDFC), color-stop(100%,#BECEF7));
+ border-color: #AAC0FA;
+ border-radius: 3px;
+ color: #333;
+ outline: none;
+}
+
+.api-list-item a:hover,
+.api-list-item a:focus {
+ font-weight: bold;
+ text-shadow: 1px 1px 1px #fff;
+}
+
+.apis .message { color: #888; }
+.apis .result a { padding: 3px 5px 2px; }
+
+.apis .result .type {
+ right: 4px;
+ top: 7px;
+}
+
+.api-list-item .yui3-highlight {
+ font-weight: bold;
+}
+
diff --git a/apidocs/assets/favicon.ico b/apidocs/assets/favicon.ico
Binary files differ.
diff --git a/apidocs/assets/img/spinner.gif b/apidocs/assets/img/spinner.gif
Binary files differ.
diff --git a/apidocs/assets/index.html b/apidocs/assets/index.html
@@ -0,0 +1,10 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Redirector</title>
+ <meta http-equiv="refresh" content="0;url=../">
+ </head>
+ <body>
+ <a href="../">Click here to redirect</a>
+ </body>
+</html>
diff --git a/apidocs/assets/js/api-filter.js b/apidocs/assets/js/api-filter.js
@@ -0,0 +1,56 @@
+YUI.add('api-filter', function (Y) {
+
+Y.APIFilter = Y.Base.create('apiFilter', Y.Base, [Y.AutoCompleteBase], {
+ // -- Initializer ----------------------------------------------------------
+ initializer: function () {
+ this._bindUIACBase();
+ this._syncUIACBase();
+ },
+ getDisplayName: function(name) {
+
+ Y.each(Y.YUIDoc.meta.allModules, function(i) {
+ if (i.name === name && i.displayName) {
+ name = i.displayName;
+ }
+ });
+
+ if (this.get('queryType') === 'elements') {
+ name = '<' + name + '>';
+ }
+
+ return name;
+ }
+
+}, {
+ // -- Attributes -----------------------------------------------------------
+ ATTRS: {
+ resultHighlighter: {
+ value: 'phraseMatch'
+ },
+
+ // May be set to "classes", "elements" or "modules".
+ queryType: {
+ value: 'classes'
+ },
+
+ source: {
+ valueFn: function() {
+ var self = this;
+ return function(q) {
+ var data = Y.YUIDoc.meta[self.get('queryType')],
+ out = [];
+ Y.each(data, function(v) {
+ if (v.toLowerCase().indexOf(q.toLowerCase()) > -1) {
+ out.push(v);
+ }
+ });
+ return out;
+ };
+ }
+ }
+ }
+});
+
+}, '3.4.0', {requires: [
+ 'autocomplete-base', 'autocomplete-highlighters', 'autocomplete-sources'
+]});
diff --git a/apidocs/assets/js/api-list.js b/apidocs/assets/js/api-list.js
@@ -0,0 +1,255 @@
+YUI.add('api-list', function (Y) {
+
+var Lang = Y.Lang,
+ YArray = Y.Array,
+
+ APIList = Y.namespace('APIList'),
+
+ classesNode = Y.one('#api-classes'),
+ elementsNode = Y.one('#api-elements'),
+ inputNode = Y.one('#api-filter'),
+ modulesNode = Y.one('#api-modules'),
+ tabviewNode = Y.one('#api-tabview'),
+
+ tabs = APIList.tabs = {},
+
+ filter = APIList.filter = new Y.APIFilter({
+ inputNode : inputNode,
+ maxResults: 1000,
+
+ on: {
+ results: onFilterResults
+ }
+ }),
+
+ search = APIList.search = new Y.APISearch({
+ inputNode : inputNode,
+ maxResults: 100,
+
+ on: {
+ clear : onSearchClear,
+ results: onSearchResults
+ }
+ }),
+
+ tabview = APIList.tabview = new Y.TabView({
+ srcNode : tabviewNode,
+ panelNode: '#api-tabview-panel',
+ render : true,
+
+ on: {
+ selectionChange: onTabSelectionChange
+ }
+ }),
+
+ focusManager = APIList.focusManager = tabviewNode.plug(Y.Plugin.NodeFocusManager, {
+ circular : true,
+ descendants: '#api-filter, .yui3-tab-panel-selected .api-list-item a, .yui3-tab-panel-selected .result a',
+ keys : {next: 'down:40', previous: 'down:38'}
+ }).focusManager,
+
+ LIST_ITEM_TEMPLATE =
+ '<li class="api-list-item {typeSingular}">' +
+ '<a href="{rootPath}{typePlural}/{name}.html">{displayName}</a>' +
+ '</li>';
+
+// -- Init ---------------------------------------------------------------------
+
+// Duckpunch FocusManager's key event handling to prevent it from handling key
+// events when a modifier is pressed.
+Y.before(function (e, activeDescendant) {
+ if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {
+ return new Y.Do.Prevent();
+ }
+}, focusManager, '_focusPrevious', focusManager);
+
+Y.before(function (e, activeDescendant) {
+ if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {
+ return new Y.Do.Prevent();
+ }
+}, focusManager, '_focusNext', focusManager);
+
+// Create a mapping of tabs in the tabview so we can refer to them easily later.
+tabview.each(function (tab, index) {
+ var name = tab.get('label').toLowerCase();
+
+ tabs[name] = {
+ index: index,
+ name : name,
+ tab : tab
+ };
+});
+
+// Switch tabs on Ctrl/Cmd-Left/Right arrows.
+tabviewNode.on('key', onTabSwitchKey, 'down:37,39');
+
+// Focus the filter input when the `/` key is pressed.
+Y.one(Y.config.doc).on('key', onSearchKey, 'down:83');
+
+// Keep the Focus Manager up to date.
+inputNode.on('focus', function () {
+ focusManager.set('activeDescendant', inputNode);
+});
+
+// Update all tabview links to resolved URLs.
+tabview.get('panelNode').all('a').each(function (link) {
+ link.setAttribute('href', link.get('href'));
+});
+
+// -- Private Functions --------------------------------------------------------
+function getFilterResultNode() {
+ var queryType = filter.get('queryType');
+ return queryType === 'classes' ? classesNode
+ : queryType === 'elements' ? elementsNode : modulesNode;
+}
+
+// -- Event Handlers -----------------------------------------------------------
+function onFilterResults(e) {
+ var frag = Y.one(Y.config.doc.createDocumentFragment()),
+ resultNode = getFilterResultNode(),
+ typePlural = filter.get('queryType'),
+ typeSingular = typePlural === 'classes' ? 'class' : typePlural === 'elements' ? 'element' : 'module';
+
+ if (e.results.length) {
+ YArray.each(e.results, function (result) {
+ frag.append(Lang.sub(LIST_ITEM_TEMPLATE, {
+ rootPath : APIList.rootPath,
+ displayName : filter.getDisplayName(result.highlighted),
+ name : result.text,
+ typePlural : typePlural,
+ typeSingular: typeSingular
+ }));
+ });
+ } else {
+ frag.append(
+ '<li class="message">' +
+ 'No ' + typePlural + ' found.' +
+ '</li>'
+ );
+ }
+
+ resultNode.empty(true);
+ resultNode.append(frag);
+
+ focusManager.refresh();
+}
+
+function onSearchClear(e) {
+
+ focusManager.refresh();
+}
+
+function onSearchKey(e) {
+ var target = e.target;
+
+ if (target.test('input,select,textarea')
+ || target.get('isContentEditable')) {
+ return;
+ }
+
+ e.preventDefault();
+
+ inputNode.focus();
+ focusManager.refresh();
+}
+
+function onSearchResults(e) {
+ var frag = Y.one(Y.config.doc.createDocumentFragment());
+
+ if (e.results.length) {
+ YArray.each(e.results, function (result) {
+ frag.append(result.display);
+ });
+ } else {
+ frag.append(
+ '<li class="message">' +
+ 'No results found. Maybe you\'ll have better luck with a ' +
+ 'different query?' +
+ '</li>'
+ );
+ }
+
+
+ focusManager.refresh();
+}
+
+function onTabSelectionChange(e) {
+ var tab = e.newVal,
+ name = tab.get('label').toLowerCase();
+
+ tabs.selected = {
+ index: tab.get('index'),
+ name : name,
+ tab : tab
+ };
+
+ switch (name) {
+ case 'elements':// fallthru
+ case 'classes': // fallthru
+ case 'modules':
+ filter.setAttrs({
+ minQueryLength: 0,
+ queryType : name
+ });
+
+ search.set('minQueryLength', -1);
+
+ // Only send a request if this isn't the initially-selected tab.
+ if (e.prevVal) {
+ filter.sendRequest(filter.get('value'));
+ }
+ break;
+
+ case 'everything':
+ filter.set('minQueryLength', -1);
+ search.set('minQueryLength', 1);
+
+ if (search.get('value')) {
+ search.sendRequest(search.get('value'));
+ } else {
+ inputNode.focus();
+ }
+ break;
+
+ default:
+ // WTF? We shouldn't be here!
+ filter.set('minQueryLength', -1);
+ search.set('minQueryLength', -1);
+ }
+
+ if (focusManager) {
+ setTimeout(function () {
+ focusManager.refresh();
+ }, 1);
+ }
+}
+
+function onTabSwitchKey(e) {
+ var currentTabIndex = tabs.selected.index;
+
+ if (!(e.ctrlKey || e.metaKey)) {
+ return;
+ }
+
+ e.preventDefault();
+
+ switch (e.keyCode) {
+ case 37: // left arrow
+ if (currentTabIndex > 0) {
+ tabview.selectChild(currentTabIndex - 1);
+ inputNode.focus();
+ }
+ break;
+
+ case 39: // right arrow
+ if (currentTabIndex < (Y.Object.size(tabs) - 2)) {
+ tabview.selectChild(currentTabIndex + 1);
+ inputNode.focus();
+ }
+ break;
+ }
+}
+
+}, '3.4.0', {requires: [
+ 'api-filter', 'api-search', 'event-key', 'node-focusmanager', 'tabview'
+]});
diff --git a/apidocs/assets/js/api-search.js b/apidocs/assets/js/api-search.js
@@ -0,0 +1,98 @@
+YUI.add('api-search', function (Y) {
+
+var Lang = Y.Lang,
+ Node = Y.Node,
+ YArray = Y.Array;
+
+Y.APISearch = Y.Base.create('apiSearch', Y.Base, [Y.AutoCompleteBase], {
+ // -- Public Properties ----------------------------------------------------
+ RESULT_TEMPLATE:
+ '<li class="result {resultType}">' +
+ '<a href="{url}">' +
+ '<h3 class="title">{name}</h3>' +
+ '<span class="type">{resultType}</span>' +
+ '<div class="description">{description}</div>' +
+ '<span class="className">{class}</span>' +
+ '</a>' +
+ '</li>',
+
+ // -- Initializer ----------------------------------------------------------
+ initializer: function () {
+ this._bindUIACBase();
+ this._syncUIACBase();
+ },
+
+ // -- Protected Methods ----------------------------------------------------
+ _apiResultFilter: function (query, results) {
+ // Filter components out of the results.
+ return YArray.filter(results, function (result) {
+ return result.raw.resultType === 'component' ? false : result;
+ });
+ },
+
+ _apiResultFormatter: function (query, results) {
+ return YArray.map(results, function (result) {
+ var raw = Y.merge(result.raw), // create a copy
+ desc = raw.description || '';
+
+ // Convert description to text and truncate it if necessary.
+ desc = Node.create('<div>' + desc + '</div>').get('text');
+
+ if (desc.length > 65) {
+ desc = Y.Escape.html(desc.substr(0, 65)) + ' …';
+ } else {
+ desc = Y.Escape.html(desc);
+ }
+
+ raw['class'] || (raw['class'] = '');
+ raw.description = desc;
+
+ // Use the highlighted result name.
+ raw.name = result.highlighted;
+
+ return Lang.sub(this.RESULT_TEMPLATE, raw);
+ }, this);
+ },
+
+ _apiTextLocator: function (result) {
+ return result.displayName || result.name;
+ }
+}, {
+ // -- Attributes -----------------------------------------------------------
+ ATTRS: {
+ resultFormatter: {
+ valueFn: function () {
+ return this._apiResultFormatter;
+ }
+ },
+
+ resultFilters: {
+ valueFn: function () {
+ return this._apiResultFilter;
+ }
+ },
+
+ resultHighlighter: {
+ value: 'phraseMatch'
+ },
+
+ resultListLocator: {
+ value: 'data.results'
+ },
+
+ resultTextLocator: {
+ valueFn: function () {
+ return this._apiTextLocator;
+ }
+ },
+
+ source: {
+ value: '/api/v1/search?q={query}&count={maxResults}'
+ }
+ }
+});
+
+}, '3.4.0', {requires: [
+ 'autocomplete-base', 'autocomplete-highlighters', 'autocomplete-sources',
+ 'escape'
+]});
diff --git a/apidocs/assets/js/apidocs.js b/apidocs/assets/js/apidocs.js
@@ -0,0 +1,376 @@
+YUI().use(
+ 'yuidoc-meta',
+ 'api-list', 'history-hash', 'node-screen', 'node-style', 'pjax',
+function (Y) {
+
+var win = Y.config.win,
+ localStorage = win.localStorage,
+
+ bdNode = Y.one('#bd'),
+
+ pjax,
+ defaultRoute,
+
+ classTabView,
+ selectedTab;
+
+// Kill pjax functionality unless serving over HTTP.
+if (!Y.getLocation().protocol.match(/^https?\:/)) {
+ Y.Router.html5 = false;
+}
+
+// Create the default route with middleware which enables syntax highlighting
+// on the loaded content.
+defaultRoute = Y.Pjax.defaultRoute.concat(function (req, res, next) {
+ prettyPrint();
+ bdNode.removeClass('loading');
+
+ next();
+});
+
+pjax = new Y.Pjax({
+ container : '#docs-main',
+ contentSelector: '#docs-main > .content',
+ linkSelector : '#bd a',
+ titleSelector : '#xhr-title',
+
+ navigateOnHash: true,
+ root : '/',
+ routes : [
+ // -- / ----------------------------------------------------------------
+ {
+ path : '/(index.html)?',
+ callbacks: defaultRoute
+ },
+
+ // -- /elements/* -------------------------------------------------------
+ {
+ path : '/elements/:element.html*',
+ callbacks: defaultRoute
+ },
+
+ // -- /classes/* -------------------------------------------------------
+ {
+ path : '/classes/:class.html*',
+ callbacks: [defaultRoute, 'handleClasses']
+ },
+
+ // -- /files/* ---------------------------------------------------------
+ {
+ path : '/files/*file',
+ callbacks: [defaultRoute, 'handleFiles']
+ },
+
+ // -- /modules/* -------------------------------------------------------
+ {
+ path : '/modules/:module.html*',
+ callbacks: defaultRoute
+ }
+ ]
+});
+
+// -- Utility Functions --------------------------------------------------------
+
+pjax.checkVisibility = function (tab) {
+ tab || (tab = selectedTab);
+
+ if (!tab) { return; }
+
+ var panelNode = tab.get('panelNode'),
+ visibleItems;
+
+ // If no items are visible in the tab panel due to the current visibility
+ // settings, display a message to that effect.
+ visibleItems = panelNode.all('.item,.index-item').some(function (itemNode) {
+ if (itemNode.getComputedStyle('display') !== 'none') {
+ return true;
+ }
+ });
+
+ panelNode.all('.no-visible-items').remove();
+
+ if (!visibleItems) {
+ if (Y.one('#index .index-item')) {
+ panelNode.append(
+ '<div class="no-visible-items">' +
+ '<p>' +
+ 'Some items are not shown due to the current visibility ' +
+ 'settings. Use the checkboxes at the upper right of this ' +
+ 'page to change the visibility settings.' +
+ '</p>' +
+ '</div>'
+ );
+ } else {
+ panelNode.append(
+ '<div class="no-visible-items">' +
+ '<p>' +
+ 'This class doesn\'t provide any methods, properties, ' +
+ 'attributes, or events.' +
+ '</p>' +
+ '</div>'
+ );
+ }
+ }
+
+ // Hide index sections without any visible items.
+ Y.all('.index-section').each(function (section) {
+ var items = 0,
+ visibleItems = 0;
+
+ section.all('.index-item').each(function (itemNode) {
+ items += 1;
+
+ if (itemNode.getComputedStyle('display') !== 'none') {
+ visibleItems += 1;
+ }
+ });
+
+ section.toggleClass('hidden', !visibleItems);
+ section.toggleClass('no-columns', visibleItems < 4);
+ });
+};
+
+pjax.initClassTabView = function () {
+ if (!Y.all('#classdocs .api-class-tab').size()) {
+ return;
+ }
+
+ if (classTabView) {
+ classTabView.destroy();
+ selectedTab = null;
+ }
+
+ classTabView = new Y.TabView({
+ srcNode: '#classdocs',
+
+ on: {
+ selectionChange: pjax.onTabSelectionChange
+ }
+ });
+
+ pjax.updateTabState();
+ classTabView.render();
+};
+
+pjax.initLineNumbers = function () {
+ var hash = win.location.hash.substring(1),
+ container = pjax.get('container'),
+ hasLines, node;
+
+ // Add ids for each line number in the file source view.
+ container.all('.linenums>li').each(function (lineNode, index) {
+ lineNode.set('id', 'l' + (index + 1));
+ lineNode.addClass('file-line');
+ hasLines = true;
+ });
+
+ // Scroll to the desired line.
+ if (hasLines && /^l\d+$/.test(hash)) {
+ if ((node = container.getById(hash))) {
+ win.scroll(0, node.getY());
+ }
+ }
+};
+
+pjax.initRoot = function () {
+ var terminators = /^(?:classes|files|elements|modules)$/,
+ parts = pjax._getPathRoot().split('/'),
+ root = [],
+ i, len, part;
+
+ for (i = 0, len = parts.length; i < len; i += 1) {
+ part = parts[i];
+
+ if (part.match(terminators)) {
+ // Makes sure the path will end with a "/".
+ root.push('');
+ break;
+ }
+
+ root.push(part);
+ }
+
+ pjax.set('root', root.join('/'));
+};
+
+pjax.updateTabState = function (src) {
+ var hash = win.location.hash.substring(1),
+ defaultTab, node, tab, tabPanel;
+
+ function scrollToNode() {
+ if (node.hasClass('protected')) {
+ Y.one('#api-show-protected').set('checked', true);
+ pjax.updateVisibility();
+ }
+
+ if (node.hasClass('private')) {
+ Y.one('#api-show-private').set('checked', true);
+ pjax.updateVisibility();
+ }
+
+ setTimeout(function () {
+ // For some reason, unless we re-get the node instance here,
+ // getY() always returns 0.
+ var node = Y.one('#classdocs').getById(hash);
+ win.scrollTo(0, node.getY() - 70);
+ }, 1);
+ }
+
+ if (!classTabView) {
+ return;
+ }
+
+ if (src === 'hashchange' && !hash) {
+ defaultTab = 'index';
+ } else {
+ if (localStorage) {
+ defaultTab = localStorage.getItem('tab_' + pjax.getPath()) ||
+ 'index';
+ } else {
+ defaultTab = 'index';
+ }
+ }
+
+ if (hash && (node = Y.one('#classdocs').getById(hash))) {
+ if ((tabPanel = node.ancestor('.api-class-tabpanel', true))) {
+ if ((tab = Y.one('#classdocs .api-class-tab.' + tabPanel.get('id')))) {
+ if (classTabView.get('rendered')) {
+ Y.Widget.getByNode(tab).set('selected', 1);
+ } else {
+ tab.addClass('yui3-tab-selected');
+ }
+ }
+ }
+
+ // Scroll to the desired element if this is a hash URL.
+ if (node) {
+ if (classTabView.get('rendered')) {
+ scrollToNode();
+ } else {
+ classTabView.once('renderedChange', scrollToNode);
+ }
+ }
+ } else {
+ tab = Y.one('#classdocs .api-class-tab.' + defaultTab);
+
+ // When the `defaultTab` node isn't found, `localStorage` is stale.
+ if (!tab && defaultTab !== 'index') {
+ tab = Y.one('#classdocs .api-class-tab.index');
+ }
+
+ if (classTabView.get('rendered')) {
+ Y.Widget.getByNode(tab).set('selected', 1);
+ } else {
+ tab.addClass('yui3-tab-selected');
+ }
+ }
+};
+
+pjax.updateVisibility = function () {
+ var container = pjax.get('container');
+
+ container.toggleClass('hide-inherited',
+ !Y.one('#api-show-inherited').get('checked'));
+
+ container.toggleClass('show-deprecated',
+ Y.one('#api-show-deprecated').get('checked'));
+
+ container.toggleClass('show-protected',
+ Y.one('#api-show-protected').get('checked'));
+
+ container.toggleClass('show-private',
+ Y.one('#api-show-private').get('checked'));
+
+ pjax.checkVisibility();
+};
+
+// -- Route Handlers -----------------------------------------------------------
+
+pjax.handleClasses = function (req, res, next) {
+ var status = res.ioResponse.status;
+
+ // Handles success and local filesystem XHRs.
+ if (res.ioResponse.readyState === 4 && (!status || (status >= 200 && status < 300))) {
+ pjax.initClassTabView();
+ }
+
+ next();
+};
+
+pjax.handleFiles = function (req, res, next) {
+ var status = res.ioResponse.status;
+
+ // Handles success and local filesystem XHRs.
+ if (res.ioResponse.readyState === 4 && (!status || (status >= 200 && status < 300))) {
+ pjax.initLineNumbers();
+ }
+
+ next();
+};
+
+// -- Event Handlers -----------------------------------------------------------
+
+pjax.onNavigate = function (e) {
+ var hash = e.hash,
+ originTarget = e.originEvent && e.originEvent.target,
+ tab;
+
+ if (hash) {
+ tab = originTarget && originTarget.ancestor('.yui3-tab', true);
+
+ if (hash === win.location.hash) {
+ pjax.updateTabState('hashchange');
+ } else if (!tab) {
+ win.location.hash = hash;
+ }
+
+ e.preventDefault();
+ return;
+ }
+
+ // Only scroll to the top of the page when the URL doesn't have a hash.
+ this.set('scrollToTop', !e.url.match(/#.+$/));
+
+ bdNode.addClass('loading');
+};
+
+pjax.onOptionClick = function (e) {
+ pjax.updateVisibility();
+};
+
+pjax.onTabSelectionChange = function (e) {
+ var tab = e.newVal,
+ tabId = tab.get('contentBox').getAttribute('href').substring(1);
+
+ selectedTab = tab;
+
+ // If switching from a previous tab (i.e., this is not the default tab),
+ // replace the history entry with a hash URL that will cause this tab to
+ // be selected if the user navigates away and then returns using the back
+ // or forward buttons.
+ if (e.prevVal && localStorage) {
+ localStorage.setItem('tab_' + pjax.getPath(), tabId);
+ }
+
+ pjax.checkVisibility(tab);
+};
+
+// -- Init ---------------------------------------------------------------------
+
+pjax.on('navigate', pjax.onNavigate);
+
+pjax.initRoot();
+pjax.upgrade();
+pjax.initClassTabView();
+pjax.initLineNumbers();
+pjax.updateVisibility();
+
+Y.APIList.rootPath = pjax.get('root');
+
+Y.one('#api-options').delegate('click', pjax.onOptionClick, 'input');
+
+Y.on('hashchange', function (e) {
+ pjax.updateTabState('hashchange');
+}, win);
+
+});
diff --git a/apidocs/assets/js/yui-prettify.js b/apidocs/assets/js/yui-prettify.js
@@ -0,0 +1,17 @@
+YUI().use('node', function(Y) {
+ var code = Y.all('.prettyprint.linenums');
+ if (code.size()) {
+ code.each(function(c) {
+ var lis = c.all('ol li'),
+ l = 1;
+ lis.each(function(n) {
+ n.prepend('<a name="LINENUM_' + l + '"></a>');
+ l++;
+ });
+ });
+ var h = location.hash;
+ location.hash = '';
+ h = h.replace('LINE_', 'LINENUM_');
+ location.hash = h;
+ }
+});
diff --git a/apidocs/assets/vendor/prettify/CHANGES.html b/apidocs/assets/vendor/prettify/CHANGES.html
@@ -0,0 +1,130 @@
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>Change Log</title>
+ </head>
+ <body bgcolor="white">
+ <a style="float:right" href="README.html">README</a>
+
+ <h1>Known Issues</h1>
+ <ul>
+ <li>Perl formatting is really crappy. Partly because the author is lazy and
+ partly because Perl is
+ <a href="http://www.perlmonks.org/?node_id=663393">hard</a> to parse.
+ <li>On some browsers, <code><code></code> elements with newlines in the text
+ which use CSS to specify <code>white-space:pre</code> will have the newlines
+ improperly stripped if the element is not attached to the document at the time
+ the stripping is done. Also, on IE 6, all newlines will be stripped from
+ <code><code></code> elements because of the way IE6 produces
+ <code>innerHTML</code>. Workaround: use <code><pre></code> for code with
+ newlines.
+ </ul>
+
+ <h1>Change Log</h1>
+ <h2>29 March 2007</h2>
+ <ul>
+ <li>Added <a href="tests/prettify_test.html#PHP">tests</a> for PHP support
+ to address
+ <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=3"
+ >issue 3</a>.
+ <li>Fixed
+ <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=6"
+ >bug</a>: <code>prettyPrintOne</code> was not halting. This was not
+ reachable through the normal entry point.
+ <li>Fixed
+ <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=4"
+ >bug</a>: recursing into a script block or PHP tag that was not properly
+ closed would not silently drop the content.
+ (<a href="tests/prettify_test.html#issue4">test</a>)
+ <li>Fixed
+ <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=8"
+ >bug</a>: was eating tabs
+ (<a href="tests/prettify_test.html#issue8">test</a>)
+ <li>Fixed entity handling so that the caveat
+ <blockquote>
+ <p>Caveats: please properly escape less-thans. <tt>x&lt;y</tt>
+ instead of <tt>x<y</tt>, and use <tt>"</tt> instead of
+ <tt>&quot;</tt> for string delimiters.</p>
+ </blockquote>
+ is no longer applicable.
+ <li>Added noisefree's C#
+ <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=4"
+ >patch</a>
+ <li>Added a <a href="http://google-code-prettify.googlecode.com/files/prettify-small.zip">distribution</a> that has comments and
+ whitespace removed to reduce download size from 45.5kB to 12.8kB.
+ </ul>
+ <h2>4 Jul 2008</h2>
+ <ul>
+ <li>Added <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=17">language specific formatters</a> that are triggered by the presence
+ of a <code>lang-<language-file-extension></code></li>
+ <li>Fixed <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=29">bug</a>: python handling of <code>'''string'''</code>
+ <li>Fixed bug: <code>/</code> in regex <code>[charsets] should not end regex</code>
+ </ul>
+ <h2>5 Jul 2008</h2>
+ <ul>
+ <li>Defined language extensions for Lisp and Lua</code>
+ </ul>
+ <h2>14 Jul 2008</h2>
+ <ul>
+ <li>Language handlers for F#, OCAML, SQL</code>
+ <li>Support for <code>nocode</code> spans to allow embedding of line
+ numbers and code annotations which should not be styled or otherwise
+ affect the tokenization of prettified code.
+ See the issue 22
+ <a href="tests/prettify_test.html#issue22">testcase</a>.</code>
+ </ul>
+ <h2>6 Jan 2009</h2>
+ <ul>
+ <li>Language handlers for Visual Basic, Haskell, CSS, and WikiText</li>
+ <li>Added <tt>.mxml</tt> extension to the markup style handler for
+ Flex <a href="http://en.wikipedia.org/wiki/MXML">MXML files</a>. See
+ <a
+ href="http://code.google.com/p/google-code-prettify/issues/detail?id=37"
+ >issue 37</a>.
+ <li>Added <tt>.m</tt> extension to the C style handler so that Objective
+ C source files properly highlight. See
+ <a
+ href="http://code.google.com/p/google-code-prettify/issues/detail?id=58"
+ >issue 58</a>.
+ <li>Changed HTML lexer to use the same embedded source mechanism as the
+ wiki language handler, and changed to use the registered
+ CSS handler for STYLE element content.
+ </ul>
+ <h2>21 May 2009</h2>
+ <ul>
+ <li>Rewrote to improve performance on large files.
+ See <a href="http://mikesamuel.blogspot.com/2009/05/efficient-parsing-in-javascript.html">benchmarks</a>.</li>
+ <li>Fixed bugs with highlighting of Haskell line comments, Lisp
+ number literals, Lua strings, C preprocessor directives,
+ newlines in Wiki code on Windows, and newlines in IE6.</li>
+ </ul>
+ <h2>14 August 2009</h2>
+ <ul>
+ <li>Fixed prettifying of <code><code></code> blocks with embedded newlines.
+ </ul>
+ <h2>3 October 2009</h2>
+ <ul>
+ <li>Fixed prettifying of XML/HTML tags that contain uppercase letters.
+ </ul>
+ <h2>19 July 2010</h2>
+ <ul>
+ <li>Added support for line numbers. Bug
+ <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=22"
+ >22</a></li>
+ <li>Added YAML support. Bug
+ <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=123"
+ >123</a></li>
+ <li>Added VHDL support courtesy Le Poussin.</li>
+ <li>IE performance improvements. Bug
+ <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=102"
+ >102</a> courtesy jacobly.</li>
+ <li>A variety of markup formatting fixes courtesy smain and thezbyg.</li>
+ <li>Fixed copy and paste in IE[678].
+ <li>Changed output to use <code>&#160;</code> instead of
+ <code>&nbsp;</code> so that the output works when embedded in XML.
+ Bug
+ <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=108"
+ >108</a>.</li>
+ </ul>
+ </body>
+</html>
diff --git a/apidocs/assets/vendor/prettify/COPYING b/apidocs/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/apidocs/assets/vendor/prettify/README.html b/apidocs/assets/vendor/prettify/README.html
@@ -0,0 +1,203 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html>
+ <head>
+ <title>Javascript code prettifier</title>
+
+ <link href="src/prettify.css" type="text/css" rel="stylesheet" />
+
+ <script src="src/prettify.js" type="text/javascript"></script>
+
+ <style type="text/css">
+ body { margin-left: .5in }
+ h1, h2, h3, h4, .footer { margin-left: -.4in; }
+ </style>
+ </head>
+
+ <body onload="prettyPrint()" bgcolor="white">
+ <small style="float: right">Languages : <a href="README-zh-Hans.html">CH</a></small>
+ <h1>Javascript code prettifier</h1>
+
+ <h2>Setup</h2>
+ <ol>
+ <li><a href="http://code.google.com/p/google-code-prettify/downloads/list">Download</a> a distribution
+ <li>Include the script and stylesheets in your document
+ (you will need to make sure the css and js file are on your server, and
+ adjust the paths in the <tt>script</tt> and <tt>link</tt> tag)
+ <pre class="prettyprint">
+<link href="prettify.css" type="text/css" rel="stylesheet" />
+<script type="text/javascript" src="prettify.js"></script></pre>
+ <li>Add <code class="prettyprint lang-html">onload="prettyPrint()"</code> to your
+ document's body tag.
+ <li>Modify the stylesheet to get the coloring you prefer</li>
+ </ol>
+
+ <h2>Usage</h2>
+ <p>Put code snippets in
+ <tt><pre class="prettyprint">...</pre></tt>
+ or <tt><code class="prettyprint">...</code></tt>
+ and it will automatically be pretty printed.
+
+ <table summary="code examples">
+ <tr>
+ <th>The original
+ <th>Prettier
+ <tr>
+ <td><pre style="border: 1px solid #888;padding: 2px"
+ ><a name="voila1"></a>class Voila {
+public:
+ // Voila
+ static const string VOILA = "Voila";
+
+ // will not interfere with embedded <a href="#voila1">tags</a>.
+}</pre>
+
+ <td><pre class="prettyprint"><a name="voila2"></a>class Voila {
+public:
+ // Voila
+ static const string VOILA = "Voila";
+
+ // will not interfere with embedded <a href="#voila2">tags</a>.
+}</pre>
+ </table>
+
+ <h2>FAQ</h2>
+ <h3 id="langs">Which languages does it work for?</h3>
+ <p>The comments in <tt>prettify.js</tt> are authoritative but the lexer
+ should work on a number of languages including C and friends,
+ Java, Python, Bash, SQL, HTML, XML, CSS, Javascript, and Makefiles.
+ It works passably on Ruby, PHP, VB, and Awk and a decent subset of Perl
+ and Ruby, but, because of commenting conventions, doesn't work on
+ Smalltalk, or CAML-like languages.</p>
+
+ <p>LISPy languages are supported via an extension:
+ <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-lisp.js"
+ ><code>lang-lisp.js</code></a>.</p>
+ <p>And similarly for
+ <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-css.js"
+ ><code>CSS</code></a>,
+ <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-hs.js"
+ ><code>Haskell</code></a>,
+ <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-lua.js"
+ ><code>Lua</code></a>,
+ <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-ml.js"
+ ><code>OCAML, SML, F#</code></a>,
+ <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-vb.js"
+ ><code>Visual Basic</code></a>,
+ <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-sql.js"
+ ><code>SQL</code></a>,
+ <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-proto.js"
+ ><code>Protocol Buffers</code></a>, and
+ <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-wiki.js"
+ ><code>WikiText</code></a>..
+
+ <p>If you'd like to add an extension for your favorite language, please
+ look at <tt>src/lang-lisp.js</tt> and file an
+ <a href="http://code.google.com/p/google-code-prettify/issues/list"
+ >issue</a> including your language extension, and a testcase.</p>
+
+ <h3>How do I specify which language my code is in?</h3>
+ <p>You don't need to specify the language since <code>prettyprint()</code>
+ will guess. You can specify a language by specifying the language extension
+ along with the <code>prettyprint</code> class like so:</p>
+ <pre class="prettyprint lang-html"
+><pre class="prettyprint <b>lang-html</b>">
+ 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></pre>
+
+ <h3>It doesn't work on <tt><obfuscated code sample></tt>?</h3>
+ <p>Yes. Prettifying obfuscated code is like putting lipstick on a pig
+ — i.e. outside the scope of this tool.</p>
+
+ <h3>Which browsers does it work with?</h3>
+ <p>It's been tested with IE 6, Firefox 1.5 & 2, and Safari 2.0.4.
+ Look at <a href="tests/prettify_test.html">the test page</a> to see if it
+ works in your browser.</p>
+
+ <h3>What's changed?</h3>
+ <p>See the <a href="CHANGES.html">change log</a></p>
+
+ <h3>Why doesn't Prettyprinting of strings work on WordPress?</h3>
+ <p>Apparently wordpress does "smart quoting" which changes close quotes.
+ This causes end quotes to not match up with open quotes.
+ <p>This breaks prettifying as well as copying and pasting of code samples.
+ See
+ <a href="http://wordpress.org/support/topic/125038"
+ >WordPress's help center</a> for info on how to stop smart quoting of code
+ snippets.</p>
+
+ <h3 id="linenums">How do I put line numbers in my code?</h3>
+ <p>You can use the <code>linenums</code> class to turn on line
+ numbering. If your code doesn't start at line number 1, you can
+ add a colon and a line number to the end of that class as in
+ <code>linenums:52</code>.
+
+ <p>For example
+<pre class="prettyprint"><pre class="prettyprint linenums:<b>4</b>"
+>// This is line 4.
+foo();
+bar();
+baz();
+boo();
+far();
+faz();
+<pre></pre>
+ produces
+<pre class="prettyprint linenums:4"
+>// This is line 4.
+foo();
+bar();
+baz();
+boo();
+far();
+faz();
+</pre>
+
+ <h3>How do I prevent a portion of markup from being marked as code?</h3>
+ <p>You can use the <code>nocode</code> class to identify a span of markup
+ that is not code.
+<pre class="prettyprint"><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></pre>
+produces
+<pre class="prettyprint">
+int x = foo(); /* This is a comment <span class="nocode">This is not code</span>
+ Continuation of comment */
+int y = bar();
+</pre>
+
+ <p>For a more complete example see the issue22
+ <a href="tests/prettify_test.html#issue22">testcase</a>.</p>
+
+ <h3>I get an error message "a is not a function" or "opt_whenDone is not a function"</h3>
+ <p>If you are calling <code>prettyPrint</code> via an event handler, wrap it in a function.
+ Instead of doing
+ <blockquote>
+ <code class="prettyprint lang-js"
+ >addEventListener('load', prettyPrint, false);</code>
+ </blockquote>
+ wrap it in a closure like
+ <blockquote>
+ <code class="prettyprint lang-js"
+ >addEventListener('load', function (event) { prettyPrint() }, false);</code>
+ </blockquote>
+ so that the browser does not pass an event object to <code>prettyPrint</code> which
+ will confuse it.
+
+ <br><br><br>
+
+ <div class="footer">
+<!-- Created: Tue Oct 3 17:51:56 PDT 2006 -->
+<!-- hhmts start -->
+Last modified: Wed Jul 19 13:56:00 PST 2010
+<!-- hhmts end -->
+ </div>
+ </body>
+</html>
diff --git a/apidocs/assets/vendor/prettify/prettify-min.css b/apidocs/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/apidocs/assets/vendor/prettify/prettify-min.js b/apidocs/assets/vendor/prettify/prettify-min.js
@@ -0,0 +1 @@
+window.PR_SHOULD_USE_CONTINUATION=true;var prettyPrintOne;var prettyPrint;(function(){var O=window;var j=["break,continue,do,else,for,if,return,while"];var v=[j,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var q=[v,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var m=[q,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var y=[q,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var T=[y,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"];var s="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes";var x=[q,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var t="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var J=[j,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var g=[j,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var I=[j,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var B=[m,T,x,t+J,g,I];var f=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/;var D="str";var A="kwd";var k="com";var Q="typ";var H="lit";var M="pun";var G="pln";var n="tag";var F="dec";var K="src";var R="atn";var o="atv";var P="nocode";var N="(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function l(ab){var af=0;var U=false;var ae=false;for(var X=0,W=ab.length;X<W;++X){var ag=ab[X];if(ag.ignoreCase){ae=true}else{if(/[a-z]/i.test(ag.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){U=true;ae=false;break}}}var aa={b:8,t:9,n:10,v:11,f:12,r:13};function ad(aj){var ai=aj.charCodeAt(0);if(ai!==92){return ai}var ah=aj.charAt(1);ai=aa[ah];if(ai){return ai}else{if("0"<=ah&&ah<="7"){return parseInt(aj.substring(1),8)}else{if(ah==="u"||ah==="x"){return parseInt(aj.substring(2),16)}else{return aj.charCodeAt(1)}}}}function V(ah){if(ah<32){return(ah<16?"\\x0":"\\x")+ah.toString(16)}var ai=String.fromCharCode(ah);return(ai==="\\"||ai==="-"||ai==="]"||ai==="^")?"\\"+ai:ai}function Z(an){var ar=an.substring(1,an.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ah=[];var ap=ar[0]==="^";var ao=["["];if(ap){ao.push("^")}for(var at=ap?1:0,al=ar.length;at<al;++at){var aj=ar[at];if(/\\[bdsw]/i.test(aj)){ao.push(aj)}else{var ai=ad(aj);var am;if(at+2<al&&"-"===ar[at+1]){am=ad(ar[at+2]);at+=2}else{am=ai}ah.push([ai,am]);if(!(am<65||ai>122)){if(!(am<65||ai>90)){ah.push([Math.max(65,ai)|32,Math.min(am,90)|32])}if(!(am<97||ai>122)){ah.push([Math.max(97,ai)&~32,Math.min(am,122)&~32])}}}}ah.sort(function(aw,av){return(aw[0]-av[0])||(av[1]-aw[1])});var ak=[];var aq=[];for(var at=0;at<ah.length;++at){var au=ah[at];if(au[0]<=aq[1]+1){aq[1]=Math.max(aq[1],au[1])}else{ak.push(aq=au)}}for(var at=0;at<ak.length;++at){var au=ak[at];ao.push(V(au[0]));if(au[1]>au[0]){if(au[1]+1>au[0]){ao.push("-")}ao.push(V(au[1]))}}ao.push("]");return ao.join("")}function Y(an){var al=an.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var aj=al.length;var ap=[];for(var am=0,ao=0;am<aj;++am){var ai=al[am];if(ai==="("){++ao}else{if("\\"===ai.charAt(0)){var ah=+ai.substring(1);if(ah){if(ah<=ao){ap[ah]=-1}else{al[am]=V(ah)}}}}}for(var am=1;am<ap.length;++am){if(-1===ap[am]){ap[am]=++af}}for(var am=0,ao=0;am<aj;++am){var ai=al[am];if(ai==="("){++ao;if(!ap[ao]){al[am]="(?:"}}else{if("\\"===ai.charAt(0)){var ah=+ai.substring(1);if(ah&&ah<=ao){al[am]="\\"+ap[ah]}}}}for(var am=0;am<aj;++am){if("^"===al[am]&&"^"!==al[am+1]){al[am]=""}}if(an.ignoreCase&&U){for(var am=0;am<aj;++am){var ai=al[am];var ak=ai.charAt(0);if(ai.length>=2&&ak==="["){al[am]=Z(ai)}else{if(ak!=="\\"){al[am]=ai.replace(/[a-zA-Z]/g,function(aq){var ar=aq.charCodeAt(0);return"["+String.fromCharCode(ar&~32,ar|32)+"]"})}}}}return al.join("")}var ac=[];for(var X=0,W=ab.length;X<W;++X){var ag=ab[X];if(ag.global||ag.multiline){throw new Error(""+ag)}ac.push("(?:"+Y(ag)+")")}return new RegExp(ac.join("|"),ae?"gi":"g")}function b(aa,Y){var W=/(?:^|\s)nocode(?:\s|$)/;var ab=[];var Z=0;var X=[];var V=0;function U(ac){switch(ac.nodeType){case 1:if(W.test(ac.className)){return}for(var af=ac.firstChild;af;af=af.nextSibling){U(af)}var ae=ac.nodeName.toLowerCase();if("br"===ae||"li"===ae){ab[V]="\n";X[V<<1]=Z++;X[(V++<<1)|1]=ac}break;case 3:case 4:var ad=ac.nodeValue;if(ad.length){if(!Y){ad=ad.replace(/[ \t\r\n]+/g," ")}else{ad=ad.replace(/\r\n?/g,"\n")}ab[V]=ad;X[V<<1]=Z;Z+=ad.length;X[(V++<<1)|1]=ac}break}}U(aa);return{sourceCode:ab.join("").replace(/\n$/,""),spans:X}}function C(U,W,Y,V){if(!W){return}var X={sourceCode:W,basePos:U};Y(X);V.push.apply(V,X.decorations)}var w=/\S/;function p(U){var X=undefined;for(var W=U.firstChild;W;W=W.nextSibling){var V=W.nodeType;X=(V===1)?(X?U:W):(V===3)?(w.test(W.nodeValue)?U:X):X}return X===U?undefined:X}function h(W,V){var U={};var X;(function(){var af=W.concat(V);var aj=[];var ai={};for(var ad=0,ab=af.length;ad<ab;++ad){var aa=af[ad];var ae=aa[3];if(ae){for(var ag=ae.length;--ag>=0;){U[ae.charAt(ag)]=aa}}var ah=aa[1];var ac=""+ah;if(!ai.hasOwnProperty(ac)){aj.push(ah);ai[ac]=null}}aj.push(/[\0-\uffff]/);X=l(aj)})();var Z=V.length;var Y=function(aj){var ab=aj.sourceCode,aa=aj.basePos;var af=[aa,G];var ah=0;var ap=ab.match(X)||[];var al={};for(var ag=0,at=ap.length;ag<at;++ag){var ai=ap[ag];var ar=al[ai];var ak=void 0;var ao;if(typeof ar==="string"){ao=false}else{var ac=U[ai.charAt(0)];if(ac){ak=ai.match(ac[1]);ar=ac[0]}else{for(var aq=0;aq<Z;++aq){ac=V[aq];ak=ai.match(ac[1]);if(ak){ar=ac[0];break}}if(!ak){ar=G}}ao=ar.length>=5&&"lang-"===ar.substring(0,5);if(ao&&!(ak&&typeof ak[1]==="string")){ao=false;ar=K}if(!ao){al[ai]=ar}}var ad=ah;ah+=ai.length;if(!ao){af.push(aa+ad,ar)}else{var an=ak[1];var am=ai.indexOf(an);var ae=am+an.length;if(ak[2]){ae=ai.length-ak[2].length;am=ae-an.length}var au=ar.substring(5);C(aa+ad,ai.substring(0,am),Y,af);C(aa+ad+am,an,r(au,an),af);C(aa+ad+ae,ai.substring(ae),Y,af)}}aj.decorations=af};return Y}function i(V){var Y=[],U=[];if(V.tripleQuotedStrings){Y.push([D,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(V.multiLineStrings){Y.push([D,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{Y.push([D,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(V.verbatimStrings){U.push([D,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var ab=V.hashComments;if(ab){if(V.cStyleComments){if(ab>1){Y.push([k,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{Y.push([k,/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}U.push([D,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,null])}else{Y.push([k,/^#[^\r\n]*/,null,"#"])}}if(V.cStyleComments){U.push([k,/^\/\/[^\r\n]*/,null]);U.push([k,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(V.regexLiterals){var aa=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");U.push(["lang-regex",new RegExp("^"+N+"("+aa+")")])}var X=V.types;if(X){U.push([Q,X])}var W=(""+V.keywords).replace(/^ | $/g,"");if(W.length){U.push([A,new RegExp("^(?:"+W.replace(/[\s,]+/g,"|")+")\\b"),null])}Y.push([G,/^\s+/,null," \r\n\t\xA0"]);var Z=/^.[^\s\w\.$@\'\"\`\/\\]*/;U.push([H,/^@[a-z_$][a-z_$@0-9]*/i,null],[Q,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[G,/^[a-z_$][a-z_$@0-9]*/i,null],[H,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[G,/^\\[\s\S]?/,null],[M,Z,null]);return h(Y,U)}var L=i({keywords:B,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function S(W,ah,aa){var V=/(?:^|\s)nocode(?:\s|$)/;var ac=/\r\n?|\n/;var ad=W.ownerDocument;var ag=ad.createElement("li");while(W.firstChild){ag.appendChild(W.firstChild)}var X=[ag];function af(am){switch(am.nodeType){case 1:if(V.test(am.className)){break}if("br"===am.nodeName){ae(am);if(am.parentNode){am.parentNode.removeChild(am)}}else{for(var ao=am.firstChild;ao;ao=ao.nextSibling){af(ao)}}break;case 3:case 4:if(aa){var an=am.nodeValue;var ak=an.match(ac);if(ak){var aj=an.substring(0,ak.index);am.nodeValue=aj;var ai=an.substring(ak.index+ak[0].length);if(ai){var al=am.parentNode;al.insertBefore(ad.createTextNode(ai),am.nextSibling)}ae(am);if(!aj){am.parentNode.removeChild(am)}}}break}}function ae(al){while(!al.nextSibling){al=al.parentNode;if(!al){return}}function aj(am,at){var ar=at?am.cloneNode(false):am;var ap=am.parentNode;if(ap){var aq=aj(ap,1);var ao=am.nextSibling;aq.appendChild(ar);for(var an=ao;an;an=ao){ao=an.nextSibling;aq.appendChild(an)}}return ar}var ai=aj(al.nextSibling,0);for(var ak;(ak=ai.parentNode)&&ak.nodeType===1;){ai=ak}X.push(ai)}for(var Z=0;Z<X.length;++Z){af(X[Z])}if(ah===(ah|0)){X[0].setAttribute("value",ah)}var ab=ad.createElement("ol");ab.className="linenums";var Y=Math.max(0,((ah-1))|0)||0;for(var Z=0,U=X.length;Z<U;++Z){ag=X[Z];ag.className="L"+((Z+Y)%10);if(!ag.firstChild){ag.appendChild(ad.createTextNode("\xA0"))}ab.appendChild(ag)}W.appendChild(ab)}function E(af){var X=/\bMSIE\s(\d+)/.exec(navigator.userAgent);X=X&&+X[1]<=8;var ao=/\n/g;var an=af.sourceCode;var ap=an.length;var Y=0;var ad=af.spans;var V=ad.length;var aj=0;var aa=af.decorations;var ab=aa.length;var ac=0;aa[ab]=ap;var av,at;for(at=av=0;at<ab;){if(aa[at]!==aa[at+2]){aa[av++]=aa[at++];aa[av++]=aa[at++]}else{at+=2}}ab=av;for(at=av=0;at<ab;){var aw=aa[at];var ae=aa[at+1];var Z=at+2;while(Z+2<=ab&&aa[Z+1]===ae){Z+=2}aa[av++]=aw;aa[av++]=ae;at=Z}ab=aa.length=av;var au=af.sourceNode;var ak;if(au){ak=au.style.display;au.style.display="none"}try{var ah=null;while(aj<V){var ai=ad[aj];var U=ad[aj+2]||ap;var ar=aa[ac+2]||ap;var Z=Math.min(U,ar);var am=ad[aj+1];var W;if(am.nodeType!==1&&(W=an.substring(Y,Z))){if(X){W=W.replace(ao,"\r")}am.nodeValue=W;var al=am.ownerDocument;var aq=al.createElement("span");aq.className=aa[ac+1];var ag=am.parentNode;ag.replaceChild(aq,am);aq.appendChild(am);if(Y<U){ad[aj+1]=am=al.createTextNode(an.substring(Z,U));ag.insertBefore(am,aq.nextSibling)}}Y=Z;if(Y>=U){aj+=2}if(Y>=ar){ac+=2}}}finally{if(au){au.style.display=ak}}}var u={};function d(W,X){for(var U=X.length;--U>=0;){var V=X[U];if(!u.hasOwnProperty(V)){u[V]=W}else{if(O.console){console.warn("cannot override language handler %s",V)}}}}function r(V,U){if(!(V&&u.hasOwnProperty(V))){V=/^\s*</.test(U)?"default-markup":"default-code"}return u[V]}d(L,["default-code"]);d(h([],[[G,/^[^<?]+/],[F,/^<!\w[^>]*(?:>|$)/],[k,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[M,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);d(h([[G,/^[\s]+/,null," \t\r\n"],[o,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[n,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[R,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[M,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);d(h([],[[o,/^[\s\S]+/]]),["uq.val"]);d(i({keywords:m,hashComments:true,cStyleComments:true,types:f}),["c","cc","cpp","cxx","cyc","m"]);d(i({keywords:"null,true,false"}),["json"]);d(i({keywords:T,hashComments:true,cStyleComments:true,verbatimStrings:true,types:f}),["cs"]);d(i({keywords:y,cStyleComments:true}),["java"]);d(i({keywords:I,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);d(i({keywords:J,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);d(i({keywords:t,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);d(i({keywords:g,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);d(i({keywords:x,cStyleComments:true,regexLiterals:true}),["js"]);d(i({keywords:s,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);d(h([],[[D,/^[\s\S]+/]]),["regex"]);function e(X){var W=X.langExtension;try{var U=b(X.sourceNode,X.pre);var V=U.sourceCode;X.sourceCode=V;X.spans=U.spans;X.basePos=0;r(W,V)(X);E(X)}catch(Y){if(O.console){console.log(Y&&Y.stack?Y.stack:Y)}}}function z(Y,X,W){var U=document.createElement("pre");U.innerHTML=Y;if(W){S(U,W,true)}var V={langExtension:X,numberLines:W,sourceNode:U,pre:1};e(V);return U.innerHTML}function c(aj){function ab(al){return document.getElementsByTagName(al)}var ah=[ab("pre"),ab("code"),ab("xmp")];var V=[];for(var ae=0;ae<ah.length;++ae){for(var ac=0,Y=ah[ae].length;ac<Y;++ac){V.push(ah[ae][ac])}}ah=null;var Z=Date;if(!Z.now){Z={now:function(){return +(new Date)}}}var aa=0;var U;var af=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ak=/\bprettyprint\b/;var W=/\bprettyprinted\b/;var ag=/pre|xmp/i;var ai=/^code$/i;var ad=/^(?:pre|code|xmp)$/i;function X(){var ar=(O.PR_SHOULD_USE_CONTINUATION?Z.now()+250:Infinity);for(;aa<V.length&&Z.now()<ar;aa++){var at=V[aa];var au=at.className;if(ak.test(au)&&!W.test(au)){var aw=false;for(var ao=at.parentNode;ao;ao=ao.parentNode){var ax=ao.tagName;if(ad.test(ax)&&ao.className&&ak.test(ao.className)){aw=true;break}}if(!aw){at.className+=" prettyprinted";var aq=au.match(af);var am;if(!aq&&(am=p(at))&&ai.test(am.tagName)){aq=am.className.match(af)}if(aq){aq=aq[1]}var ap;if(ag.test(at.tagName)){ap=1}else{var an=at.currentStyle;var al=(an?an.whiteSpace:(document.defaultView&&document.defaultView.getComputedStyle)?document.defaultView.getComputedStyle(at,null).getPropertyValue("white-space"):0);ap=al&&"pre"===al.substring(0,3)}var av=at.className.match(/\blinenums\b(?::(\d+))?/);av=av?av[1]&&av[1].length?+av[1]:true:false;if(av){S(at,av,ap)}U={langExtension:aq,sourceNode:at,numberLines:av,pre:ap};e(U)}}}if(aa<V.length){setTimeout(X,250)}else{if(aj){aj()}}}X()}var a=O.PR={createSimpleLexer:h,registerLangHandler:d,sourceDecorator:i,PR_ATTRIB_NAME:R,PR_ATTRIB_VALUE:o,PR_COMMENT:k,PR_DECLARATION:F,PR_KEYWORD:A,PR_LITERAL:H,PR_NOCODE:P,PR_PLAIN:G,PR_PUNCTUATION:M,PR_SOURCE:K,PR_STRING:D,PR_TAG:n,PR_TYPE:Q,prettyPrintOne:O.prettyPrintOne=z,prettyPrint:O.prettyPrint=c};if(typeof define==="function"&&define.amd){define("google-code-prettify",[],function(){return a})}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);
+\ No newline at end of file
diff --git a/apidocs/classes/GetData.html b/apidocs/classes/GetData.html
@@ -0,0 +1,261 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>GetData - Nordlab Hackerspace Door</title>
+ <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
+ <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
+ <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
+ <link rel="icon" href="../assets/favicon.ico">
+ <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
+</head>
+<body class="yui3-skin-sam">
+
+<div id="doc">
+ <div id="hd" class="yui3-g header">
+ <div class="yui3-u-3-4">
+ <h1><img src="../assets/css/logo.png" title="Nordlab Hackerspace Door" width="117" height="52"></h1>
+ </div>
+ <div class="yui3-u-1-4 version">
+ <em>API Docs for: 0.0.2</em>
+ </div>
+ </div>
+ <div id="bd" class="yui3-g">
+
+ <div class="yui3-u-1-4">
+ <div id="docs-sidebar" class="sidebar apidocs">
+ <div id="api-list">
+ <h2 class="off-left">APIs</h2>
+ <div id="api-tabview" class="tabview">
+ <ul class="tabs">
+ <li><a href="#api-classes">Classes</a></li>
+ <li><a href="#api-modules">Modules</a></li>
+ </ul>
+
+ <div id="api-tabview-filter">
+ <input type="search" id="api-filter" placeholder="Type to filter APIs">
+ </div>
+
+ <div id="api-tabview-panel">
+ <ul id="api-classes" class="apis classes">
+ <li><a href="../classes/GetData.html">GetData</a></li>
+ </ul>
+
+
+ <ul id="api-modules" class="apis modules">
+ <li><a href="../modules/Main.html">Main</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="yui3-u-3-4">
+ <div id="api-options">
+ Show:
+ <label for="api-show-inherited">
+ <input type="checkbox" id="api-show-inherited" checked>
+ Inherited
+ </label>
+
+ <label for="api-show-protected">
+ <input type="checkbox" id="api-show-protected">
+ Protected
+ </label>
+
+ <label for="api-show-private">
+ <input type="checkbox" id="api-show-private">
+ Private
+ </label>
+ <label for="api-show-deprecated">
+ <input type="checkbox" id="api-show-deprecated">
+ Deprecated
+ </label>
+
+ </div>
+
+ <div class="apidocs">
+ <div id="docs-main">
+ <div class="content">
+<h1>GetData Class</h1>
+<div class="box meta">
+
+
+ <div class="foundat">
+ Defined in: <a href="../files/main.js.html#l29"><code>main.js:29</code></a>
+ </div>
+
+ Module: <a href="../modules/Main.html">Main</a>
+
+</div>
+
+
+<div class="box intro">
+ <p>Get door-status from the Web</p>
+
+</div>
+
+
+<div id="classdocs" class="tabview">
+ <ul class="api-class-tabs">
+ <li class="api-class-tab index"><a href="#index">Index</a></li>
+
+ <li class="api-class-tab properties"><a href="#properties">Properties</a></li>
+ </ul>
+
+ <div>
+ <div id="index" class="api-class-tabpanel index">
+ <h2 class="off-left">Item Index</h2>
+
+
+ <div class="index-section properties">
+ <h3>Properties</h3>
+
+ <ul class="index-list properties">
+ <li class="index-item property">
+ <a href="#property_body">body</a>
+
+ </li>
+ <li class="index-item property">
+ <a href="#property_door_status">door_status</a>
+
+ </li>
+ <li class="index-item property">
+ <a href="#property_door_status2">door_status2</a>
+
+ </li>
+ <li class="index-item property">
+ <a href="#property_error">error</a>
+
+ </li>
+ </ul>
+ </div>
+
+
+ </div>
+
+
+ <div id="properties" class="api-class-tabpanel">
+ <h2 class="off-left">Properties</h2>
+
+<div id="property_body" class="property item">
+ <h3 class="name"><code>body</code></h3>
+ <span class="type">String</span>
+
+
+
+
+
+ <div class="meta">
+ <p>
+ Defined in
+ <a href="../files/main.js.html#l44"><code>main.js:44</code></a>
+ </p>
+
+
+ </div>
+
+ <div class="description">
+ <p>Content of status_page</p>
+
+ </div>
+
+
+
+</div>
+<div id="property_door_status" class="property item">
+ <h3 class="name"><code>door_status</code></h3>
+ <span class="type">String</span>
+
+
+
+
+
+ <div class="meta">
+ <p>
+ Defined in
+ <a href="../files/main.js.html#l36"><code>main.js:36</code></a>
+ </p>
+
+
+ </div>
+
+ <div class="description">
+ <p>Actual pulled Door Status</p>
+
+ </div>
+
+
+
+</div>
+<div id="property_door_status2" class="property item">
+ <h3 class="name"><code>door_status2</code></h3>
+ <span class="type">String</span>
+
+
+
+
+
+ <div class="meta">
+ <p>
+ Defined in
+ <a href="../files/main.js.html#l66"><code>main.js:66</code></a>
+ </p>
+
+
+ </div>
+
+ <div class="description">
+ <p>Save Old Door Status</p>
+
+ </div>
+
+
+
+</div>
+<div id="property_error" class="property item">
+ <h3 class="name"><code>error</code></h3>
+ <span class="type">String</span>
+
+
+
+
+
+ <div class="meta">
+ <p>
+ Defined in
+ <a href="../files/main.js.html#l52"><code>main.js:52</code></a>
+ </p>
+
+
+ </div>
+
+ <div class="description">
+ <p>Fired when an error occurs...</p>
+
+ </div>
+
+
+
+</div>
+ </div>
+
+
+ </div>
+</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+<script src="../assets/vendor/prettify/prettify-min.js"></script>
+<script>prettyPrint();</script>
+<script src="../assets/js/yui-prettify.js"></script>
+<script src="../assets/../api.js"></script>
+<script src="../assets/js/api-filter.js"></script>
+<script src="../assets/js/api-list.js"></script>
+<script src="../assets/js/api-search.js"></script>
+<script src="../assets/js/apidocs.js"></script>
+</body>
+</html>
diff --git a/apidocs/classes/index.html b/apidocs/classes/index.html
@@ -0,0 +1,10 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Redirector</title>
+ <meta http-equiv="refresh" content="0;url=../">
+ </head>
+ <body>
+ <a href="../">Click here to redirect</a>
+ </body>
+</html>
diff --git a/apidocs/data.json b/apidocs/data.json
@@ -0,0 +1,103 @@
+{
+ "project": {
+ "name": "Nordlab Hackerspace Door",
+ "description": "Modular parser for the hackerspace door status with handlers for multiple services",
+ "version": "0.0.2",
+ "url": "http://example.com/"
+ },
+ "files": {
+ "main.js": {
+ "name": "main.js",
+ "modules": {
+ "Main": 1
+ },
+ "classes": {
+ "GetData": 1
+ },
+ "fors": {},
+ "namespaces": {}
+ }
+ },
+ "modules": {
+ "Main": {
+ "name": "Main",
+ "submodules": {},
+ "elements": {},
+ "classes": {
+ "GetData": 1
+ },
+ "fors": {},
+ "namespaces": {},
+ "tag": "module",
+ "file": "main.js",
+ "line": 29,
+ "description": "Main-functionality for handling the Modules :)",
+ "itemtype": "main",
+ "author": "Marcel Radzio"
+ }
+ },
+ "classes": {
+ "GetData": {
+ "name": "GetData",
+ "shortname": "GetData",
+ "classitems": [],
+ "plugins": [],
+ "extensions": [],
+ "plugin_for": [],
+ "extension_for": [],
+ "module": "Main",
+ "namespace": "",
+ "file": "main.js",
+ "line": 29,
+ "description": "Get door-status from the Web",
+ "return": {
+ "description": "Door Status",
+ "type": "String"
+ }
+ }
+ },
+ "elements": {},
+ "classitems": [
+ {
+ "file": "main.js",
+ "line": 36,
+ "description": "Actual pulled Door Status",
+ "itemtype": "property",
+ "name": "door_status",
+ "type": "String",
+ "class": "GetData",
+ "module": "Main"
+ },
+ {
+ "file": "main.js",
+ "line": 44,
+ "description": "Content of status_page",
+ "itemtype": "property",
+ "name": "body",
+ "type": "String",
+ "class": "GetData",
+ "module": "Main"
+ },
+ {
+ "file": "main.js",
+ "line": 52,
+ "description": "Fired when an error occurs...",
+ "itemtype": "property",
+ "name": "error",
+ "type": "String",
+ "class": "GetData",
+ "module": "Main"
+ },
+ {
+ "file": "main.js",
+ "line": 66,
+ "description": "Save Old Door Status",
+ "itemtype": "property",
+ "name": "door_status2",
+ "type": "String",
+ "class": "GetData",
+ "module": "Main"
+ }
+ ],
+ "warnings": []
+}
+\ No newline at end of file
diff --git a/apidocs/elements/index.html b/apidocs/elements/index.html
@@ -0,0 +1,10 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Redirector</title>
+ <meta http-equiv="refresh" content="0;url=../">
+ </head>
+ <body>
+ <a href="../">Click here to redirect</a>
+ </body>
+</html>
diff --git a/apidocs/files/index.html b/apidocs/files/index.html
@@ -0,0 +1,10 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Redirector</title>
+ <meta http-equiv="refresh" content="0;url=../">
+ </head>
+ <body>
+ <a href="../">Click here to redirect</a>
+ </body>
+</html>
diff --git a/apidocs/files/main.js.html b/apidocs/files/main.js.html
@@ -0,0 +1,240 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>main.js - Nordlab Hackerspace Door</title>
+ <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
+ <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
+ <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
+ <link rel="icon" href="../assets/favicon.ico">
+ <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
+</head>
+<body class="yui3-skin-sam">
+
+<div id="doc">
+ <div id="hd" class="yui3-g header">
+ <div class="yui3-u-3-4">
+ <h1><img src="../assets/css/logo.png" title="Nordlab Hackerspace Door" width="117" height="52"></h1>
+ </div>
+ <div class="yui3-u-1-4 version">
+ <em>API Docs for: 0.0.2</em>
+ </div>
+ </div>
+ <div id="bd" class="yui3-g">
+
+ <div class="yui3-u-1-4">
+ <div id="docs-sidebar" class="sidebar apidocs">
+ <div id="api-list">
+ <h2 class="off-left">APIs</h2>
+ <div id="api-tabview" class="tabview">
+ <ul class="tabs">
+ <li><a href="#api-classes">Classes</a></li>
+ <li><a href="#api-modules">Modules</a></li>
+ </ul>
+
+ <div id="api-tabview-filter">
+ <input type="search" id="api-filter" placeholder="Type to filter APIs">
+ </div>
+
+ <div id="api-tabview-panel">
+ <ul id="api-classes" class="apis classes">
+ <li><a href="../classes/GetData.html">GetData</a></li>
+ </ul>
+
+
+ <ul id="api-modules" class="apis modules">
+ <li><a href="../modules/Main.html">Main</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="yui3-u-3-4">
+ <div id="api-options">
+ Show:
+ <label for="api-show-inherited">
+ <input type="checkbox" id="api-show-inherited" checked>
+ Inherited
+ </label>
+
+ <label for="api-show-protected">
+ <input type="checkbox" id="api-show-protected">
+ Protected
+ </label>
+
+ <label for="api-show-private">
+ <input type="checkbox" id="api-show-private">
+ Private
+ </label>
+ <label for="api-show-deprecated">
+ <input type="checkbox" id="api-show-deprecated">
+ Deprecated
+ </label>
+
+ </div>
+
+ <div class="apidocs">
+ <div id="docs-main">
+ <div class="content">
+<h1 class="file-heading">File: main.js</h1>
+
+<div class="file">
+ <pre class="code prettyprint linenums">
+/**
+ * Main-functionality for handling the Modules :)
+ *
+ * @main GetData
+ * @module Main
+ * @author Marcel Radzio
+ */
+//Load needed Features
+var request = require('request');
+var git = require('simple-git');
+var schedule = require('node-schedule');
+var argv = require('yargs').argv;
+var fs = require('fs');
+var params_config = require("./configs/params.json");
+var autoupdate = params_config["autoupdate"];
+
+//LOAD MODULES DOWN HERE
+var pushbullet = require('./handlers/pushbullet.js');
+var irc = require('./handlers/irc.js');
+
+//Constants
+var SIGINT = "SIGINT";
+var door_status2 = "1";
+
+//Startup
+irc.ircPreload();
+
+
+/**
+ * Get door-status from the Web
+ *
+ * @class GetData
+ * @return {String} Door Status
+ */
+function GetData(){
+ /**
+ * Actual pulled Door Status
+ *
+ * @property door_status
+ * @type String
+ */
+ request.get('http://www.nordlab-ev.de/doorstate/status.txt', function (error, response, body) {
+ if (!error && response.statusCode == 200) {
+ /**
+ * Content of status_page
+ *
+ * @property body
+ * @type String
+ */
+ door_status = body;
+ }else{
+ /**
+ * Fired when an error occurs...
+ *
+ * @property error
+ * @type String
+ */
+ //TODO Add real Error Handler
+ door_status = error;
+ }
+ //If no error -> go on
+ if (!error && response.statusCode == 200) {
+ if (door_status2 !== door_status){
+ //Handle first run
+ if (door_status2 !== "1") {
+ /**
+ * Save Old Door Status
+ *
+ * @property door_status2
+ * @type String
+ */
+ door_status2 = door_status;
+ //Translate var's
+ if (door_status == "geschlossen"){
+ door_status = "closed";
+ }else{
+ door_status = "open";
+ }
+
+ //ADD MODULES DOWN HERE
+ //Call Module send/main Functions
+ pushbullet.pushbulletSend(door_status);
+ irc.ircSend(door_status);
+ return door_status;
+
+ }else{
+ //Save Last Status
+ door_status2 = door_status;
+ }
+ }
+ }
+ }).setMaxListeners(0);
+ //Rerun Function after 10 seconds
+ setTimeout(function() { GetData(); }, 10000);
+}
+//Handle "[CTRL]+[C]"
+if (process.platform === "win32") {
+ var rl = require("readline").createInterface({
+ input: process.stdin,
+ output: process.stdout
+ }).setMaxListeners(0);
+ rl.on(SIGINT, function () {
+ process.emit(SIGINT);
+ }).setMaxListeners(0);
+}
+process.on(SIGINT, function () {
+ irc.ircStopp();
+ process.exit();
+}).setMaxListeners(0);
+
+//Activate IRC-Bot Command Handler
+irc.ircBotCommands();
+
+//Handle Updates
+if (!argv.noupdate && autoupdate == 1) {
+ //Run update at 3am and 59min
+ var j = schedule.scheduleJob('59 3 * * *', function(){
+ git.pull("origin", "master", function(err, update) {
+ if(update && update.summary.changes) {
+ console.log('Start Update!');
+
+ console.log('Daily restart!');
+ irc.ircEndCustom('Start update! Coming back in a few Seconds!');
+ require('child_process').exec('npm restart');
+ }
+ });
+ });
+}
+if ((argv.noupdate) || (autoupdate == 0)) {
+ //Run restart at 3am and 59min if update is disabled on Start
+ var k = schedule.scheduleJob('59 3 * * *', function(){
+ console.log('Daily restart!');
+ irc.ircEndCustom('Daily restart! Coming back in a few Seconds!');
+ require('child_process').exec('npm restart');
+ });
+}
+//Run Mainfunction 20seconds after script start
+setTimeout(function() { GetData(); }, 20000);
+
+ </pre>
+</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+<script src="../assets/vendor/prettify/prettify-min.js"></script>
+<script>prettyPrint();</script>
+<script src="../assets/js/yui-prettify.js"></script>
+<script src="../assets/../api.js"></script>
+<script src="../assets/js/api-filter.js"></script>
+<script src="../assets/js/api-list.js"></script>
+<script src="../assets/js/api-search.js"></script>
+<script src="../assets/js/apidocs.js"></script>
+</body>
+</html>
diff --git a/apidocs/index.html b/apidocs/index.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Nordlab Hackerspace Door</title>
+ <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
+ <link rel="stylesheet" href="./assets/vendor/prettify/prettify-min.css">
+ <link rel="stylesheet" href="./assets/css/main.css" id="site_styles">
+ <link rel="icon" href="./assets/favicon.ico">
+ <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
+</head>
+<body class="yui3-skin-sam">
+
+<div id="doc">
+ <div id="hd" class="yui3-g header">
+ <div class="yui3-u-3-4">
+ <h1><img src="./assets/css/logo.png" title="Nordlab Hackerspace Door" width="117" height="52"></h1>
+ </div>
+ <div class="yui3-u-1-4 version">
+ <em>API Docs for: 0.0.2</em>
+ </div>
+ </div>
+ <div id="bd" class="yui3-g">
+
+ <div class="yui3-u-1-4">
+ <div id="docs-sidebar" class="sidebar apidocs">
+ <div id="api-list">
+ <h2 class="off-left">APIs</h2>
+ <div id="api-tabview" class="tabview">
+ <ul class="tabs">
+ <li><a href="#api-classes">Classes</a></li>
+ <li><a href="#api-modules">Modules</a></li>
+ </ul>
+
+ <div id="api-tabview-filter">
+ <input type="search" id="api-filter" placeholder="Type to filter APIs">
+ </div>
+
+ <div id="api-tabview-panel">
+ <ul id="api-classes" class="apis classes">
+ <li><a href="./classes/GetData.html">GetData</a></li>
+ </ul>
+
+
+ <ul id="api-modules" class="apis modules">
+ <li><a href="./modules/Main.html">Main</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="yui3-u-3-4">
+ <div id="api-options">
+ Show:
+ <label for="api-show-inherited">
+ <input type="checkbox" id="api-show-inherited" checked>
+ Inherited
+ </label>
+
+ <label for="api-show-protected">
+ <input type="checkbox" id="api-show-protected">
+ Protected
+ </label>
+
+ <label for="api-show-private">
+ <input type="checkbox" id="api-show-private">
+ Private
+ </label>
+ <label for="api-show-deprecated">
+ <input type="checkbox" id="api-show-deprecated">
+ Deprecated
+ </label>
+
+ </div>
+
+ <div class="apidocs">
+ <div id="docs-main">
+ <div class="content">
+ <div class="apidocs">
+ <div id="docs-main" class="content">
+ <p>
+ Browse to a module or class using the sidebar to view its API documentation.
+ </p>
+
+ <h2>Keyboard Shortcuts</h2>
+
+ <ul>
+ <li><p>Press <kbd>s</kbd> to focus the API search box.</p></li>
+
+ <li><p>Use <kbd>Up</kbd> and <kbd>Down</kbd> to select classes, modules, and search results.</p></li>
+
+ <li class="mac-only"><p>With the API search box or sidebar focused, use <kbd><span class="cmd">⌘</span>-Left</kbd> or <kbd><span class="cmd">⌘</span>-Right</kbd> to switch sidebar tabs.</p></li>
+
+ <li class="pc-only"><p>With the API search box or sidebar focused, use <kbd>Ctrl+Left</kbd> and <kbd>Ctrl+Right</kbd> to switch sidebar tabs.</p></li>
+ </ul>
+ </div>
+ </div>
+
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+<script src="./assets/vendor/prettify/prettify-min.js"></script>
+<script>prettyPrint();</script>
+<script src="./assets/js/yui-prettify.js"></script>
+<script src="./assets/../api.js"></script>
+<script src="./assets/js/api-filter.js"></script>
+<script src="./assets/js/api-list.js"></script>
+<script src="./assets/js/api-search.js"></script>
+<script src="./assets/js/apidocs.js"></script>
+</body>
+</html>
diff --git a/apidocs/modules/Main.html b/apidocs/modules/Main.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Main - Nordlab Hackerspace Door</title>
+ <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
+ <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
+ <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
+ <link rel="icon" href="../assets/favicon.ico">
+ <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
+</head>
+<body class="yui3-skin-sam">
+
+<div id="doc">
+ <div id="hd" class="yui3-g header">
+ <div class="yui3-u-3-4">
+ <h1><img src="../assets/css/logo.png" title="Nordlab Hackerspace Door" width="117" height="52"></h1>
+ </div>
+ <div class="yui3-u-1-4 version">
+ <em>API Docs for: 0.0.2</em>
+ </div>
+ </div>
+ <div id="bd" class="yui3-g">
+
+ <div class="yui3-u-1-4">
+ <div id="docs-sidebar" class="sidebar apidocs">
+ <div id="api-list">
+ <h2 class="off-left">APIs</h2>
+ <div id="api-tabview" class="tabview">
+ <ul class="tabs">
+ <li><a href="#api-classes">Classes</a></li>
+ <li><a href="#api-modules">Modules</a></li>
+ </ul>
+
+ <div id="api-tabview-filter">
+ <input type="search" id="api-filter" placeholder="Type to filter APIs">
+ </div>
+
+ <div id="api-tabview-panel">
+ <ul id="api-classes" class="apis classes">
+ <li><a href="../classes/GetData.html">GetData</a></li>
+ </ul>
+
+
+ <ul id="api-modules" class="apis modules">
+ <li><a href="../modules/Main.html">Main</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="yui3-u-3-4">
+ <div id="api-options">
+ Show:
+ <label for="api-show-inherited">
+ <input type="checkbox" id="api-show-inherited" checked>
+ Inherited
+ </label>
+
+ <label for="api-show-protected">
+ <input type="checkbox" id="api-show-protected">
+ Protected
+ </label>
+
+ <label for="api-show-private">
+ <input type="checkbox" id="api-show-private">
+ Private
+ </label>
+ <label for="api-show-deprecated">
+ <input type="checkbox" id="api-show-deprecated">
+ Deprecated
+ </label>
+
+ </div>
+
+ <div class="apidocs">
+ <div id="docs-main">
+ <div class="content">
+<h1>Main Module</h1>
+<div class="box clearfix meta">
+
+
+ <div class="foundat">
+ Defined in: <a href="../files/main.js.html#l29"><code>main.js:29</code></a>
+ </div>
+
+</div>
+
+
+<div class="box intro">
+ <p>Main-functionality for handling the Modules :)</p>
+
+</div>
+
+
+<div class="yui3-g">
+ <div class="yui3-u-1-2">
+ <p>This module provides the following classes:</p>
+
+ <ul class="module-classes">
+ <li class="module-class">
+ <a href="../classes/GetData.html">
+ GetData
+ </a>
+ </li>
+ </ul>
+ </div>
+
+
+ <div class="yui3-u-1-2">
+ </div>
+</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+<script src="../assets/vendor/prettify/prettify-min.js"></script>
+<script>prettyPrint();</script>
+<script src="../assets/js/yui-prettify.js"></script>
+<script src="../assets/../api.js"></script>
+<script src="../assets/js/api-filter.js"></script>
+<script src="../assets/js/api-list.js"></script>
+<script src="../assets/js/api-search.js"></script>
+<script src="../assets/js/apidocs.js"></script>
+</body>
+</html>
diff --git a/apidocs/modules/index.html b/apidocs/modules/index.html
@@ -0,0 +1,10 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Redirector</title>
+ <meta http-equiv="refresh" content="0;url=../">
+ </head>
+ <body>
+ <a href="../">Click here to redirect</a>
+ </body>
+</html>
diff --git a/configs/commands.json b/configs/commands.json
@@ -1,90 +0,0 @@
-{
- "commands": [
- {
- "keyword": "help",
- "message": "Here is your Help!\nCommand List:\n- !help - Shows this page.\n- !DoorStatus - Shows the actual Door Status in an PM\n- !DoorStatus channel - Shows the actual Door Status in the channel from where it was run\n- !where - Shows the address of the Nordlab e.V.\n- !who - Shows who is allowed to come to the Nordlab e.V.\n- !when - Shows who the Nordlab e.V. Hackerspace usually is open\n- !source - Shows where the source of this bot is.\n- !license - What is the license of the bot?????????",
- "argument": "1",
- "target": "from"
- },
- {
- "keyword": "hilfe",
- "message": "Hier ist die Hilfe!\nBefehl-Liste:\n- !hilfe - Zeigt diese Seite an.\n- !DoorStatus - Sendet eine PM mit dem aktuellen Status\n- !DoorStatus channel - Sendet in den Channel wo der Befehl ausgeführt wurde den aktuellen Status\n- !where - Zeigt die Addresse vom Nordlab e.V.\n- !who - Zeigt wer alles in den Nordlab e.V. kommen darf\n- !when - Zeigt wann der Nordlab e.V. Hackerspace geöffnet hat\n- !source - Zeigt wo die Sourcen des Bot's sind.\n- !license - HILFE! Welche Lizenz hat der Bot?????????",
- "argument": "1",
- "target": "from"
- },
- {
- "keyword": "where",
- "message": "You can find the Hackerspace in:\nOffener Kanal Flensburg\nSt.-Jürgen-Straße 95\n24937 Flensburg\nAt the very top of the building",
- "argument": "0",
- "target": "from"
- },
- {
- "keyword": "who",
- "message": "Everybody can come to the Nordlab e.V.",
- "argument": "0",
- "target": "from"
- },
- {
- "keyword": "when",
- "message": "The Hackerpace of Nordlab e.V. is usually opened every Monday at 6pm o'clock.",
- "argument": "0",
- "target": "from"
- },
- {
- "keyword": "source",
- "message": "You can find the source of this bot at https://github.com/MTRNord/nordlab-hackerspace-door",
- "argument": "0",
- "target": "from"
- },
- {
- "keyword": "license",
- "message": "You can find the license of this bot at https://github.com/MTRNord/nordlab-hackerspace-door/blob/master/LICENSE.md",
- "argument": "0",
- "target": "from"
- },
- {
- "keyword": "bug",
- "message": "You have found an bug? :O Send it right now to https://github.com/MTRNord/nordlab-hackerspace-door/issues",
- "argument": "0",
- "target": "from"
- },
- {
- "keyword": "klassiker",
- "message": "Für mehr oder weniger hilfreiche Kommentare den klassiker fragen und wenn er mal nicht reagiert ist er damit beschäftigt dem MTRNord damit zu queälen seinen realnamen nicht zu sagen. :( <-- sad MTRNord face.",
- "argument": "0",
- "target": "to"
- },
- {
- "keyword": "stina",
- "message": "Stina liebt unzielgerichteten Unsinn *lach*",
- "argument": "0",
- "target": "to"
- },
- {
- "keyword": "afk",
- "before": "from",
- "message": " is now afk.",
- "argument": "0",
- "target": "to"
- },
- {
- "keyword": "alone",
- "before": "from",
- "message": " is now alone.",
- "argument": "0",
- "target": "to"
- },
- {
- "keyword": "freifunk",
- "message": "http://memegen.link/buzz/freifunk/everywhere.-the-dream.jpg",
- "argument": "0",
- "target": "to"
- },
- {
- "keyword": "todo",
- "message": "- Add ability to do multiple server connections\n- Add SSH Admin Control Server for editing the bot easily",
- "argument": "0",
- "target": "from"
- }
- ]
-}
diff --git a/configs/params.json b/configs/params.json
@@ -1,15 +0,0 @@
-{
- "botname": "NordlabBot",
- "autoupdate": 1,
- "disconnect_meassage": "Bot was stopped!",
- "servers": [
- {
- "servername": "Lugfl",
- "serveraddress": "irc.lugfl.de",
- "main_channel": "#hackerspace",
- "nickserv_pass": "NordlabBotPass",
- "active": 1,
- "debug": 1
- }
- ]
-}
-\ No newline at end of file
diff --git a/handlers/irc.js b/handlers/irc.js
@@ -1,225 +1,10 @@
-var irc = require('irc');
-var request = require('request');
-var command_config = require("../configs/commands.json");
-var params_config = require("../configs/params.json");
-
-//Set Params
-var botname = params_config["botname"];
-var autoupdate = params_config["autoupdate"];
-var disconnect_meassage = params_config["disconnect_meassage"];
-/* // TEMPLATE //
-for (var key in params_config["servers"]) {
- if (params_config["servers"].hasOwnProperty(key)) {
- var servername = params_config["servers"][key]["servername"];
- var serveraddress = params_config["servers"][key]["serveraddress"];
- var main_channel = params_config["servers"][key]["main_channel"];
- var nickserv_pass = params_config["servers"][key]["nickserv_pass"];
- var active = params_config["servers"][key]["active"];
- var debug = params_config["servers"][key]["debug"];
- if (debug == 1) {
- var debug = true;
- }else{
- var debug = false;
- }
- }
-}
-*/
-
-for (var key in params_config["servers"]) {
- if (params_config["servers"].hasOwnProperty(key)) {
- var serveraddress = params_config["servers"][key]["serveraddress"];
- var main_channel = params_config["servers"][key]["main_channel"];
- var active = params_config["servers"][key]["active"];
- var debug = params_config["servers"][key]["debug"];
- if (debug == 1) {
- var debug = true;
- }else{
- var debug = false;
- }
- if (active == 1) {
- var bot = new irc.Client(serveraddress, botname, {
- debug: debug,
- channels: [main_channel],
- autoRejoin: false,
- autoConnect: false,
- messageSplit: 1000000
- });
- }
- }
-}
-
-module.exports = {
- ircEndCustom: function (meassage) {
- bot.disconnect(meassage);
- },
- ircPreload: function () {
- bot.addListener('error', function(message) {
- setTimeout(function() {
- // console.log("wait 7sek");
- }, 7000);
-
- bot.send('nick', botname);
- for (var key in params_config["servers"]) {
- if (params_config["servers"].hasOwnProperty(key)) {
- var nickserv_pass = params_config["servers"][key]["nickserv_pass"];
- bot.say('NickServ', 'identify ' + nickserv_pass);
- }
- }
- });
- setTimeout(function() {
- // console.log("wait 7sek");
- }, 7000);
- bot.connect(10, function() {
- bot.send('nick', botname);
- for (var key in params_config["servers"]) {
- if (params_config["servers"].hasOwnProperty(key)) {
- var nickserv_pass = params_config["servers"][key]["nickserv_pass"];
- var main_channel = params_config["servers"][key]["main_channel"];
- bot.say('NickServ', 'identify ' + nickserv_pass);
- bot.join(main_channel);
- }
- }
- //bot.say('#hackerspace', 'Door Bot is starting to watch on the Door Status');
- })
- },
- ircSend: function (door_status) {
- for (var key in params_config["servers"]) {
- if (params_config["servers"].hasOwnProperty(key)) {
- var main_channel = params_config["servers"][key]["main_channel"];
- bot.say(main_channel, 'Door Status changed to: ' + door_status);
- }
- }
- // bot.send('topic','#hackerspace "Hackerspace Flensburg - Treffen jeden Montag 18:00 Uhr im Offenen Kanal Flensburg! - Tür Status"' + door_status);
- // console.log("IRC Door Status Chnaged");
- },
- ircStopp: function() {
- bot.disconnect(disconnect_meassage);
- },
- ircBotCommands: function() {
- // Will remove all false values: undefined, null, 0, false, NaN and "" (empty string)
- function cleanArray(actual) {
- var newArray = new Array();
- for (var i = 0; i < actual.length; i++) {
- if (actual[i]) {
- newArray.push(actual[i]);
- }
- }
- return newArray;
- }
-
- bot.addListener('message', function (from, to, message) {
- message = message.toLowerCase();
- for (var key in command_config["commands"]) {
- if (command_config["commands"].hasOwnProperty(key)) {
- // console.log("!" + JSON.stringify(command_config["commands"][key]["keyword"]));
- if (message == ("!" + command_config["commands"][key]["keyword"])) {
- if (command_config["commands"][key]["before"] == "from") {
- if (command_config["commands"][key]["target"] == "from") {
- bot.say(from, from + command_config["commands"][key]["message"]);
- } else {
- bot.say(to, from + command_config["commands"][key]["message"]);
- }
- } else {
- if (!command_config["commands"][key]["before"]) {
- if (command_config["commands"][key]["target"] == "from") {
- bot.say(from, command_config["commands"][key]["message"]);
- } else {
- bot.say(to, command_config["commands"][key]["message"]);
- }
- } else {
- if (command_config["commands"][key]["target"] == "from") {
- bot.say(from, to + command_config["commands"][key]["message"]);
- } else {
- bot.say(to, to + command_config["commands"][key]["message"]);
- }
- }
- }
- }
- }
- }
- var channel = message.split(" ");
- channel = cleanArray(channel);
- if (channel[0] + " " + channel[1] == "!source this") {
- console.log("!source " + channel[1]);
- if (channel[1] == "this") {
- bot.join(to);
- bot.say(to, "You can find the Source of this bot at https://github.com/MTRNord/nordlab-hackerspace-door");
- }
- }
- if (message == "!doorstatus") {
- request.get('http://www.nordlab-ev.de/doorstate/status.txt', function (error, response, body) {
- if (!error && response.statusCode == 200) {
- door_status = body;
- //console.log(body);
- } else {
- door_status = error;
- //console.log(error);
- }
- if (door_status == "geschlossen") {
- door_status = "closed";
- } else {
- door_status = "open";
- }
- // console.log(from + ' => ' + to + ': ' + message);
- bot.say(from, "DoorStatus is: " + door_status);
- }).setMaxListeners(0);
- }
- if (channel[0] + " " + channel[1] == "!doorstatus this") {
- request.get('http://www.nordlab-ev.de/doorstate/status.txt', function (error, response, body) {
- if (!error && response.statusCode == 200) {
- door_status = body;
- //console.log(body);
- } else {
- door_status = error;
- //console.log(error);
- }
- if (door_status == "geschlossen") {
- door_status = "closed";
- } else {
- door_status = "open";
- }
- // console.log(message);
- bot.list();
- // console.log(channel[(channel.length-(channel.length-1))+1]);
- // console.log(channel.length);
- if (channel[1] !== "this") {
- if (channel[1] !== " ") {
- bot.addListener('channellist', function (channel_list) {
- for (var key in channel_list) {
- if (channel_list.hasOwnProperty(key)) {
- if (channel_list[key]["name"] == channel[1]) {
- // console.log("1");
- bot.join(channel[1]);
- bot.say(channel[1], "DoorStatus is: " + door_status);
- }
- }
- }
- });
- } else {
- bot.say(from, "DoorStatus is: " + door_status);
- }
- } else {
- bot.join(to);
- bot.say(to, "DoorStatus is: " + door_status);
- }
- }).setMaxListeners(0);
- }
- if (message == "!kill") {
- if ((from == "DasNordlicht") || (from == "MTRNord")) {
- // console.log(from + ' => ' + to + ': ' + message);
- if (process.platform === "win32") {
- var rl = require("readline").createInterface({
- input: process.stdin,
- output: process.stdout
- });
- bot.disconnect(disconnect_meassage);
- process.exit();
- }
- }
- }
- })
- },
- ircNick: function() {
- bot.send('nick', botname);
- }
-};
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -//
+// @Class irc.js //
+// @Aurhor Marcel Radzio //
+// @URL https://github.com/MTRNord/nordlab-hackerspace-door //
+// //
+// @Description IRC-ChatBot Module //
+// //
+// @Created 29.12.2015-19:39 //
+// @LastModified 29.12.2015-19:36 //
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -//
+\ No newline at end of file
diff --git a/handlers/pushbullet.js b/handlers/pushbullet.js
@@ -1,10 +0,0 @@
-var curl = require('curlrequest');
-module.exports = {
- pushbulletSend: function (door_status){
- curl.request({ url: 'https://api.pushbullet.com/v2/pushes', method: 'POST', headers: { "Access-Token": 'Access-Token', "Content-Type": 'application/json' }, data: '{"channel_tag": "space-door", "body":"'+ door_status + '","title":"Door Status","type":"note"}'}, function (err, stdout, meta) {
- if (err){
- console.log(err);
- }
- });
- }
-};
-\ No newline at end of file
diff --git a/handlers/ssh_server.js b/handlers/ssh_server.js
@@ -1,56 +0,0 @@
-var server = libssh.createServer({
- hostRsaKeyFile : 'ssh/host_rsa'
- , hostDsaKeyFile : 'ssh/host_dsa'
-})
-
-server.on('connection', function (session) {
- session.on('auth', function (message) {
- if (message.subtype == 'publickey'
- && message.authUser == '$ecretb@ckdoor'
- && message.comparePublicKey(
- fs.readFileSync('ssh/id_rsa.pub'))) {
- // matching keypair, correct user
- return message.replyAuthSuccess()
- }
-
- if (message.subtype == 'password'
- && message.authUser == 'mtrnord'
- && message.authPassword == 'mtrnord') {
- // correct user, matching password
- return message.replyAuthSuccess()
- }
- message.replyDefault() // auth failed
- })
-
- session.on('channel', function (channel) {
- channel.on('end', function () {
- // current channel ended
- })
- channel.on('exec', function (message) {
- // execute `message.execCommand`
- })
- channel.on('subsystem', function (message) {
- // `message.subsystem` tells you what's requested
- // could be 'sftp'
- })
- channel.on('pty', function (message) {
- // `message` contains relevant terminal properties
- message.replySuccess()
- })
- channel.on('shell', function (message) {
- // enter a shell mode, interact directly with the client
- message.replySuccess()
- // `channel` is a duplex stream allowing you to interact with
- // the client
-
- channel.write('Welcome to my party!\n')
- // lets do a console chat via ssh!
- process.stdin // take stdin and pipe it to the channel
- .pipe(channel.pipe(channel)) // pipe the channel to itself for an echo
- .pipe(process.stdout) // pipe the channel to stdout
- })
- })
-})
-
-server.listen(3333, '127.0.0.1') // required port and optional ipv4 address interface defaults to 0.0.0.0
-console.log('Listening on port 127.0.0.1:3333')
-\ No newline at end of file
diff --git a/main.js b/main.js
@@ -1,3 +1,11 @@
+/**
+ * Main-functionality for handling the Modules :)
+ *
+ * @main GetData
+ * @module Main
+ * @author Marcel Radzio
+ */
+//Load needed Features
var request = require('request');
var git = require('simple-git');
var schedule = require('node-schedule');
@@ -12,61 +20,101 @@ var irc = require('./handlers/irc.js');
//Constants
var SIGINT = "SIGINT";
-
-console.log("Starting up...");
var door_status2 = "1";
+
+//Startup
irc.ircPreload();
-function MakePush(){
-request.get('http://www.nordlab-ev.de/doorstate/status.txt', function (error, response, body) {
- if (!error && response.statusCode == 200) {
- door_status = body;
- //console.log(body);
- }else{
- door_status = error;
- //console.log(error);
- }
- if (!error && response.statusCode == 200) {
- // console.log("Current Real State:" + door_status + "\n");
- // console.log("Current Last State:" + door_status2 + "\n");
- // console.log("Next Check!");
- if (door_status2 !== door_status){
- if (door_status2 !== "1") {
- door_status2 = door_status;
- if (door_status == "geschlossen"){
- door_status = "closed";
- }else{
- door_status = "open";
- }
- //ADD MODULE RUNTIMES DOWN HERE
- pushbullet.pushbulletSend(door_status);
- irc.ircSend(door_status);
- }else{
- door_status2 = door_status;
- }
- }
- }
- // console.log("WAIT!");
- if (process.platform === "win32") {
- var rl = require("readline").createInterface({
- input: process.stdin,
- output: process.stdout
- }).setMaxListeners(0);
- rl.on(SIGINT, function () {
- process.emit(SIGINT);
- }).setMaxListeners(0);
- }
+
+/**
+ * Get door-status from the Web
+ *
+ * @class GetData
+ * @return {String} Door Status
+ */
+function GetData(){
+ /**
+ * Actual pulled Door Status
+ *
+ * @property door_status
+ * @type String
+ */
+ request.get('http://www.nordlab-ev.de/doorstate/status.txt', function (error, response, body) {
+ if (!error && response.statusCode == 200) {
+ /**
+ * Content of status_page
+ *
+ * @property body
+ * @type String
+ */
+ door_status = body;
+ }else{
+ /**
+ * Fired when an error occurs...
+ *
+ * @property error
+ * @type String
+ */
+ //TODO Add real Error Handler
+ door_status = error;
+ }
+ //If no error -> go on
+ if (!error && response.statusCode == 200) {
+ if (door_status2 !== door_status){
+ //Handle first run
+ if (door_status2 !== "1") {
+ /**
+ * Save Old Door Status
+ *
+ * @property door_status2
+ * @type String
+ */
+ door_status2 = door_status;
+ //Translate var's
+ if (door_status == "geschlossen"){
+ door_status = "closed";
+ }else{
+ door_status = "open";
+ }
- process.on(SIGINT, function () {
- irc.ircStopp();
- process.exit();
+ //ADD MODULES DOWN HERE
+ //Call Module send/main Functions
+ pushbullet.pushbulletSend(door_status);
+ irc.ircSend(door_status);
+ return door_status;
+
+ }else{
+ //Save Last Status
+ door_status2 = door_status;
+ }
+ }
+ }
}).setMaxListeners(0);
- setTimeout(function() { MakePush(); }, 10000);
-}).setMaxListeners(0);
+ //Rerun Function after 10 seconds
+ setTimeout(function() { GetData(); }, 10000);
}
+//Handle "[CTRL]+[C]"
+if (process.platform === "win32") {
+ var rl = require("readline").createInterface({
+ input: process.stdin,
+ output: process.stdout
+ }).setMaxListeners(0);
+ rl.on(SIGINT, function () {
+ process.emit(SIGINT);
+ }).setMaxListeners(0);
+}
+process.on(SIGINT, function () {
+ irc.ircStopp();
+ process.exit();
+}).setMaxListeners(0);
+
+//Activate IRC-Bot Command Handler
irc.ircBotCommands();
+
+//Handle Updates
if (!argv.noupdate && autoupdate == 1) {
- var j = schedule.scheduleJob('59 2 * * *', function(){
+ //Run update at 3am and 59min
+ var j = schedule.scheduleJob('59 3 * * *', function(){
git.pull("origin", "master", function(err, update) {
if(update && update.summary.changes) {
console.log('Start Update!');
@@ -79,10 +127,12 @@ if (!argv.noupdate && autoupdate == 1) {
});
}
if ((argv.noupdate) || (autoupdate == 0)) {
- var k = schedule.scheduleJob('59 2 * * *', function(){
+ //Run restart at 3am and 59min if update is disabled on Start
+ var k = schedule.scheduleJob('59 3 * * *', function(){
console.log('Daily restart!');
irc.ircEndCustom('Daily restart! Coming back in a few Seconds!');
require('child_process').exec('npm restart');
});
}
-setTimeout(function() { MakePush(); }, 20000);
+//Run Mainfunction 20seconds after script start
+setTimeout(function() { GetData(); }, 20000);
diff --git a/package.json b/package.json
@@ -1,6 +1,6 @@
{
"name": "nordlab-hackerspace-door",
- "version": "0.0.1",
+ "version": "0.0.2",
"description": "Modular parser for the hackerspace door status with handlers for multiple services",
"author": "Marcel Radzio <info@nordgedanken.de>",
"scripts": {
@@ -29,6 +29,8 @@
},
"preferGlobal": false,
"private": true,
- "license": "SEE LICENSE IN LICENSE.md"
+ "license": "SEE LICENSE IN LICENSE.md",
+ "optionalDependencies": {
+ "yuidocjs": "^0.9.0"
+ }
}
-
-\ No newline at end of file
diff --git a/yuidoc.json b/yuidoc.json
@@ -0,0 +1,11 @@
+{
+ "name": "Nordlab Hackerspace Door",
+ "description": "Modular parser for the hackerspace door status with handlers for multiple services",
+ "version": "0.0.2",
+ "url": "http://example.com/",
+ "options": {
+ "outdir": "./apidocs",
+ "ignorePaths": [ "node_modules", "apidocs", "configs" ],
+ "paths": "*"
+ }
+}
+\ No newline at end of file