freifunk-bot

Modular parser for the hackerspace door status with handlers for multiple services
git clone git://archive.git.mtrnord.blog/MTRNord/freifunk-bot.git
Log | Files | Refs | README | LICENSE

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:
Aapidocs/api.js | 19+++++++++++++++++++
Aapidocs/assets/css/external-small.png | 0
Aapidocs/assets/css/logo.png | 0
Aapidocs/assets/css/main.css | 783+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aapidocs/assets/favicon.ico | 0
Aapidocs/assets/img/spinner.gif | 0
Aapidocs/assets/index.html | 10++++++++++
Aapidocs/assets/js/api-filter.js | 56++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aapidocs/assets/js/api-list.js | 255+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aapidocs/assets/js/api-search.js | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aapidocs/assets/js/apidocs.js | 376+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aapidocs/assets/js/yui-prettify.js | 17+++++++++++++++++
Aapidocs/assets/vendor/prettify/CHANGES.html | 130+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aapidocs/assets/vendor/prettify/COPYING | 202+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aapidocs/assets/vendor/prettify/README.html | 203+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aapidocs/assets/vendor/prettify/prettify-min.css | 2++
Aapidocs/assets/vendor/prettify/prettify-min.js | 2++
Aapidocs/classes/GetData.html | 261+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aapidocs/classes/index.html | 10++++++++++
Aapidocs/data.json | 104+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aapidocs/elements/index.html | 10++++++++++
Aapidocs/files/index.html | 10++++++++++
Aapidocs/files/main.js.html | 240+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aapidocs/index.html | 116+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aapidocs/modules/Main.html | 129+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aapidocs/modules/index.html | 10++++++++++
Mconfigs/commands.json | 90-------------------------------------------------------------------------------
Mconfigs/params.json | 16----------------
Mhandlers/irc.js | 236++++---------------------------------------------------------------------------
Mhandlers/pushbullet.js | 11-----------
Mhandlers/ssh_server.js | 57---------------------------------------------------------
Mmain.js | 148+++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------
Mpackage.json | 9+++++----
Ayuidoc.json | 12++++++++++++
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 = '&lt;' + name + '&gt;'; + } + + return name; + } + +}, { + // -- Attributes ----------------------------------------------------------- + ATTRS: { + resultHighlighter: { + value: 'phraseMatch' + }, + + // May be set to "classes", "elements" or "modules". + queryType: { + value: 'classes' + }, + + source: { + valueFn: function() { + var self = this; + return function(q) { + var data = Y.YUIDoc.meta[self.get('queryType')], + out = []; + Y.each(data, function(v) { + if (v.toLowerCase().indexOf(q.toLowerCase()) > -1) { + out.push(v); + } + }); + return out; + }; + } + } + } +}); + +}, '3.4.0', {requires: [ + 'autocomplete-base', 'autocomplete-highlighters', 'autocomplete-sources' +]}); diff --git a/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)) + ' &hellip;'; + } else { + desc = Y.Escape.html(desc); + } + + raw['class'] || (raw['class'] = ''); + raw.description = desc; + + // Use the highlighted result name. + raw.name = result.highlighted; + + return Lang.sub(this.RESULT_TEMPLATE, raw); + }, this); + }, + + _apiTextLocator: function (result) { + return result.displayName || result.name; + } +}, { + // -- Attributes ----------------------------------------------------------- + ATTRS: { + resultFormatter: { + valueFn: function () { + return this._apiResultFormatter; + } + }, + + resultFilters: { + valueFn: function () { + return this._apiResultFilter; + } + }, + + resultHighlighter: { + value: 'phraseMatch' + }, + + resultListLocator: { + value: 'data.results' + }, + + resultTextLocator: { + valueFn: function () { + return this._apiTextLocator; + } + }, + + source: { + value: '/api/v1/search?q={query}&count={maxResults}' + } + } +}); + +}, '3.4.0', {requires: [ + 'autocomplete-base', 'autocomplete-highlighters', 'autocomplete-sources', + 'escape' +]}); diff --git a/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>&lt;code&gt;</code> elements with newlines in the text + which use CSS to specify <code>white-space:pre</code> will have the newlines + improperly stripped if the element is not attached to the document at the time + the stripping is done. Also, on IE 6, all newlines will be stripped from + <code>&lt;code&gt;</code> elements because of the way IE6 produces + <code>innerHTML</code>. Workaround: use <code>&lt;pre&gt;</code> for code with + newlines. + </ul> + + <h1>Change Log</h1> + <h2>29 March 2007</h2> + <ul> + <li>Added <a href="tests/prettify_test.html#PHP">tests</a> for PHP support + to address + <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=3" + >issue 3</a>. + <li>Fixed + <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=6" + >bug</a>: <code>prettyPrintOne</code> was not halting. This was not + reachable through the normal entry point. + <li>Fixed + <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=4" + >bug</a>: recursing into a script block or PHP tag that was not properly + closed would not silently drop the content. + (<a href="tests/prettify_test.html#issue4">test</a>) + <li>Fixed + <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=8" + >bug</a>: was eating tabs + (<a href="tests/prettify_test.html#issue8">test</a>) + <li>Fixed entity handling so that the caveat + <blockquote> + <p>Caveats: please properly escape less-thans. <tt>x&amp;lt;y</tt> + instead of <tt>x&lt;y</tt>, and use <tt>&quot;</tt> instead of + <tt>&amp;quot;</tt> for string delimiters.</p> + </blockquote> + is no longer applicable. + <li>Added noisefree's C# + <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=4" + >patch</a> + <li>Added a <a href="http://google-code-prettify.googlecode.com/files/prettify-small.zip">distribution</a> that has comments and + whitespace removed to reduce download size from 45.5kB to 12.8kB. + </ul> + <h2>4 Jul 2008</h2> + <ul> + <li>Added <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=17">language specific formatters</a> that are triggered by the presence + of a <code>lang-&lt;language-file-extension&gt;</code></li> + <li>Fixed <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=29">bug</a>: python handling of <code>'''string'''</code> + <li>Fixed bug: <code>/</code> in regex <code>[charsets] should not end regex</code> + </ul> + <h2>5 Jul 2008</h2> + <ul> + <li>Defined language extensions for Lisp and Lua</code> + </ul> + <h2>14 Jul 2008</h2> + <ul> + <li>Language handlers for F#, OCAML, SQL</code> + <li>Support for <code>nocode</code> spans to allow embedding of line + numbers and code annotations which should not be styled or otherwise + affect the tokenization of prettified code. + See the issue 22 + <a href="tests/prettify_test.html#issue22">testcase</a>.</code> + </ul> + <h2>6 Jan 2009</h2> + <ul> + <li>Language handlers for Visual Basic, Haskell, CSS, and WikiText</li> + <li>Added <tt>.mxml</tt> extension to the markup style handler for + Flex <a href="http://en.wikipedia.org/wiki/MXML">MXML files</a>. See + <a + href="http://code.google.com/p/google-code-prettify/issues/detail?id=37" + >issue 37</a>. + <li>Added <tt>.m</tt> extension to the C style handler so that Objective + C source files properly highlight. See + <a + href="http://code.google.com/p/google-code-prettify/issues/detail?id=58" + >issue 58</a>. + <li>Changed HTML lexer to use the same embedded source mechanism as the + wiki language handler, and changed to use the registered + CSS handler for STYLE element content. + </ul> + <h2>21 May 2009</h2> + <ul> + <li>Rewrote to improve performance on large files. + See <a href="http://mikesamuel.blogspot.com/2009/05/efficient-parsing-in-javascript.html">benchmarks</a>.</li> + <li>Fixed bugs with highlighting of Haskell line comments, Lisp + number literals, Lua strings, C preprocessor directives, + newlines in Wiki code on Windows, and newlines in IE6.</li> + </ul> + <h2>14 August 2009</h2> + <ul> + <li>Fixed prettifying of <code>&lt;code&gt;</code> blocks with embedded newlines. + </ul> + <h2>3 October 2009</h2> + <ul> + <li>Fixed prettifying of XML/HTML tags that contain uppercase letters. + </ul> + <h2>19 July 2010</h2> + <ul> + <li>Added support for line numbers. Bug + <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=22" + >22</a></li> + <li>Added YAML support. Bug + <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=123" + >123</a></li> + <li>Added VHDL support courtesy Le Poussin.</li> + <li>IE performance improvements. Bug + <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=102" + >102</a> courtesy jacobly.</li> + <li>A variety of markup formatting fixes courtesy smain and thezbyg.</li> + <li>Fixed copy and paste in IE[678]. + <li>Changed output to use <code>&amp;#160;</code> instead of + <code>&amp;nbsp;</code> so that the output works when embedded in XML. + Bug + <a href="http://code.google.com/p/google-code-prettify/issues/detail?id=108" + >108</a>.</li> + </ul> + </body> +</html> diff --git a/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"> +&lt;link href="prettify.css" type="text/css" rel="stylesheet" /> +&lt;script type="text/javascript" src="prettify.js">&lt;/script></pre> + <li>Add <code class="prettyprint lang-html">onload="prettyPrint()"</code> to your + document's body tag. + <li>Modify the stylesheet to get the coloring you prefer</li> + </ol> + + <h2>Usage</h2> + <p>Put code snippets in + <tt>&lt;pre class="prettyprint"&gt;...&lt;/pre&gt;</tt> + or <tt>&lt;code class="prettyprint"&gt;...&lt;/code&gt;</tt> + and it will automatically be pretty printed. + + <table summary="code examples"> + <tr> + <th>The original + <th>Prettier + <tr> + <td><pre style="border: 1px solid #888;padding: 2px" + ><a name="voila1"></a>class Voila { +public: + // Voila + static const string VOILA = "Voila"; + + // will not interfere with embedded <a href="#voila1">tags</a>. +}</pre> + + <td><pre class="prettyprint"><a name="voila2"></a>class Voila { +public: + // Voila + static const string VOILA = "Voila"; + + // will not interfere with embedded <a href="#voila2">tags</a>. +}</pre> + </table> + + <h2>FAQ</h2> + <h3 id="langs">Which languages does it work for?</h3> + <p>The comments in <tt>prettify.js</tt> are authoritative but the lexer + should work on a number of languages including C and friends, + Java, Python, Bash, SQL, HTML, XML, CSS, Javascript, and Makefiles. + It works passably on Ruby, PHP, VB, and Awk and a decent subset of Perl + and Ruby, but, because of commenting conventions, doesn't work on + Smalltalk, or CAML-like languages.</p> + + <p>LISPy languages are supported via an extension: + <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-lisp.js" + ><code>lang-lisp.js</code></a>.</p> + <p>And similarly for + <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-css.js" + ><code>CSS</code></a>, + <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-hs.js" + ><code>Haskell</code></a>, + <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-lua.js" + ><code>Lua</code></a>, + <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-ml.js" + ><code>OCAML, SML, F#</code></a>, + <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-vb.js" + ><code>Visual Basic</code></a>, + <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-sql.js" + ><code>SQL</code></a>, + <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-proto.js" + ><code>Protocol Buffers</code></a>, and + <a href="http://code.google.com/p/google-code-prettify/source/browse/trunk/src/lang-wiki.js" + ><code>WikiText</code></a>.. + + <p>If you'd like to add an extension for your favorite language, please + look at <tt>src/lang-lisp.js</tt> and file an + <a href="http://code.google.com/p/google-code-prettify/issues/list" + >issue</a> including your language extension, and a testcase.</p> + + <h3>How do I specify which language my code is in?</h3> + <p>You don't need to specify the language since <code>prettyprint()</code> + will guess. You can specify a language by specifying the language extension + along with the <code>prettyprint</code> class like so:</p> + <pre class="prettyprint lang-html" +>&lt;pre class=&quot;prettyprint <b>lang-html</b>&quot;&gt; + The lang-* class specifies the language file extensions. + File extensions supported by default include + "bsh", "c", "cc", "cpp", "cs", "csh", "cyc", "cv", "htm", "html", + "java", "js", "m", "mxml", "perl", "pl", "pm", "py", "rb", "sh", + "xhtml", "xml", "xsl". +&lt;/pre&gt;</pre> + + <h3>It doesn't work on <tt>&lt;obfuscated code sample&gt;</tt>?</h3> + <p>Yes. Prettifying obfuscated code is like putting lipstick on a pig + &mdash; i.e. outside the scope of this tool.</p> + + <h3>Which browsers does it work with?</h3> + <p>It's been tested with IE 6, Firefox 1.5 &amp; 2, and Safari 2.0.4. + Look at <a href="tests/prettify_test.html">the test page</a> to see if it + works in your browser.</p> + + <h3>What's changed?</h3> + <p>See the <a href="CHANGES.html">change log</a></p> + + <h3>Why doesn't Prettyprinting of strings work on WordPress?</h3> + <p>Apparently wordpress does "smart quoting" which changes close quotes. + This causes end quotes to not match up with open quotes. + <p>This breaks prettifying as well as copying and pasting of code samples. + See + <a href="http://wordpress.org/support/topic/125038" + >WordPress's help center</a> for info on how to stop smart quoting of code + snippets.</p> + + <h3 id="linenums">How do I put line numbers in my code?</h3> + <p>You can use the <code>linenums</code> class to turn on line + numbering. If your code doesn't start at line number 1, you can + add a colon and a line number to the end of that class as in + <code>linenums:52</code>. + + <p>For example +<pre class="prettyprint">&lt;pre class="prettyprint linenums:<b>4</b>" +&gt;// This is line 4. +foo(); +bar(); +baz(); +boo(); +far(); +faz(); +&lt;pre&gt;</pre> + produces +<pre class="prettyprint linenums:4" +>// This is line 4. +foo(); +bar(); +baz(); +boo(); +far(); +faz(); +</pre> + + <h3>How do I prevent a portion of markup from being marked as code?</h3> + <p>You can use the <code>nocode</code> class to identify a span of markup + that is not code. +<pre class="prettyprint">&lt;pre class=prettyprint&gt; +int x = foo(); /* This is a comment &lt;span class="nocode"&gt;This is not code&lt;/span&gt; + Continuation of comment */ +int y = bar(); +&lt;/pre&gt;</pre> +produces +<pre class="prettyprint"> +int x = foo(); /* This is a comment <span class="nocode">This is not code</span> + Continuation of comment */ +int y = bar(); +</pre> + + <p>For a more complete example see the issue22 + <a href="tests/prettify_test.html#issue22">testcase</a>.</p> + + <h3>I get an error message "a is not a function" or "opt_whenDone is not a function"</h3> + <p>If you are calling <code>prettyPrint</code> via an event handler, wrap it in a function. + Instead of doing + <blockquote> + <code class="prettyprint lang-js" + >addEventListener('load', prettyPrint, false);</code> + </blockquote> + wrap it in a closure like + <blockquote> + <code class="prettyprint lang-js" + >addEventListener('load', function (event) { prettyPrint() }, false);</code> + </blockquote> + so that the browser does not pass an event object to <code>prettyPrint</code> which + will confuse it. + + <br><br><br> + + <div class="footer"> +<!-- Created: Tue Oct 3 17:51:56 PDT 2006 --> +<!-- hhmts start --> +Last modified: Wed Jul 19 13:56:00 PST 2010 +<!-- hhmts end --> + </div> + </body> +</html> diff --git a/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(&#x27;request&#x27;); +var git = require(&#x27;simple-git&#x27;); +var schedule = require(&#x27;node-schedule&#x27;); +var argv = require(&#x27;yargs&#x27;).argv; +var fs = require(&#x27;fs&#x27;); +var params_config = require(&quot;./configs/params.json&quot;); +var autoupdate = params_config[&quot;autoupdate&quot;]; + +//LOAD MODULES DOWN HERE +var pushbullet = require(&#x27;./handlers/pushbullet.js&#x27;); +var irc = require(&#x27;./handlers/irc.js&#x27;); + +//Constants +var SIGINT = &quot;SIGINT&quot;; +var door_status2 = &quot;1&quot;; + +//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(&#x27;http://www.nordlab-ev.de/doorstate/status.txt&#x27;, function (error, response, body) { + if (!error &amp;&amp; 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 -&gt; go on + if (!error &amp;&amp; response.statusCode == 200) { + if (door_status2 !== door_status){ + //Handle first run + if (door_status2 !== &quot;1&quot;) { + /** + * Save Old Door Status + * + * @property door_status2 + * @type String + */ + door_status2 = door_status; + //Translate var&#x27;s + if (door_status == &quot;geschlossen&quot;){ + door_status = &quot;closed&quot;; + }else{ + door_status = &quot;open&quot;; + } + + //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 &quot;[CTRL]+[C]&quot; +if (process.platform === &quot;win32&quot;) { + var rl = require(&quot;readline&quot;).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 &amp;&amp; autoupdate == 1) { + //Run update at 3am and 59min + var j = schedule.scheduleJob(&#x27;59 3 * * *&#x27;, function(){ + git.pull(&quot;origin&quot;, &quot;master&quot;, function(err, update) { + if(update &amp;&amp; update.summary.changes) { + console.log(&#x27;Start Update!&#x27;); + + console.log(&#x27;Daily restart!&#x27;); + irc.ircEndCustom(&#x27;Start update! Coming back in a few Seconds!&#x27;); + require(&#x27;child_process&#x27;).exec(&#x27;npm restart&#x27;); + } + }); + }); +} +if ((argv.noupdate) || (autoupdate == 0)) { + //Run restart at 3am and 59min if update is disabled on Start + var k = schedule.scheduleJob(&#x27;59 3 * * *&#x27;, function(){ + console.log(&#x27;Daily restart!&#x27;); + irc.ircEndCustom(&#x27;Daily restart! Coming back in a few Seconds!&#x27;); + require(&#x27;child_process&#x27;).exec(&#x27;npm restart&#x27;); + }); +} +//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">&#x2318;</span>-Left</kbd> or <kbd><span class="cmd">&#x2318;</span>-Right</kbd> to switch sidebar tabs.</p></li> + + <li class="pc-only"><p>With the API search box or sidebar focused, use <kbd>Ctrl+Left</kbd> and <kbd>Ctrl+Right</kbd> to switch sidebar tabs.</p></li> + </ul> + </div> + </div> + + + </div> + </div> + </div> + </div> + </div> +</div> +<script src="./assets/vendor/prettify/prettify-min.js"></script> +<script>prettyPrint();</script> +<script src="./assets/js/yui-prettify.js"></script> +<script src="./assets/../api.js"></script> +<script src="./assets/js/api-filter.js"></script> +<script src="./assets/js/api-list.js"></script> +<script src="./assets/js/api-search.js"></script> +<script src="./assets/js/apidocs.js"></script> +</body> +</html> diff --git a/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