Initial library add

This commit is contained in:
Matt Moore 2013-10-12 20:15:47 -04:00
parent a8a673334b
commit 4ac107b5bd
48 changed files with 27650 additions and 4 deletions

View File

@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2013 Canteen
Copyright (c) 2013 Matt Karl
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in

227
README.md
View File

@ -1,4 +1,225 @@
CanteenHTML5
============
#CanteenHTML5
Create dynamic, valid HTML5 markup with a simple an intuitive PHP API
Create dynamic, well-formatted HTML5 markup with a simple an intuitive PHP API. This is a fork/rewrite of the [Gagawa](https://code.google.com/p/gagawa/) project. CanteenHTML5 is a concise, flexible and easy to remember API which makes it possible to create simple markup (such as a link) or more complex structures (such a table, document or nested list). All tags and attribute names are validated against the current HTML5 specification.
##Requirements
This library requires a webserver running PHP 5.3+. Also, the root namespace for the library is `Canteen\HTML5`.
##Installation
Simply include the `html.php` file.
```php
include 'lib/html.php';
```
##Usage
###Basic
To create an HTML node, simply call global `html` method, passing in the tag name and then any attributes.
```php
echo html('img src=home.jpg');
echo html('img', 'src=home.jpg');
echo html('img', array('src'=>'home.jpg'));
```
All of these examples would output:
```html
<img src="home.jpg" />
```
###Adding Attributes
There are dfferent ways to add attributes for HTML container nodes such as `<p>`, `<div>`, or in the example below, `<nav>`.
1. Part of the tag
```php
echo html('nav title="Navigation" class=main', 'Welcome');
```
2. As an associative array
```php
echo html('nav', 'Welcome', array('title'=>'Navigation', 'class'=>'main'));
```
3. As a shorthand string
```php
echo html('nav', 'Welcome', 'title="Navigation" class=main');
```
4. As an property methods
```php
$nav = html('nav', 'Welcome');
$nav->class = 'main';
$nav->title = 'Navigation';
echo $nav;
```
All of these examples output the same markup:
```html
<nav title="Navigation" class="main">Welcome</nav>
```
###Adding Nested Elements
Any HTML5 container tags (such as `<p>`, `<span>`, or `<div>`) can have child elements. These elements can be strings or other HTML5 element objects.
```php
$label = html('span', 'Website!');
$link = html('a', $label);
$link->href = 'http://example.com';
echo $link;
```
Alternatively, use the `addChild` method for any container tag.
```php
$link = html('a');
$link->href = 'http://example.com';
$link->addChild(html('span', 'Website!'));
echo $link;
```
Or `appendTo` to target a container to be added to:
```php
$link = html('a');
$link->href = 'http://example.com';
html('span', 'Website!')->appendTo($link);
echo $link;
```
All examples would output:
```html
<a href="http://example.com"><span>Website!</span></a>
```
###CSS Selectors
Tag names can optionally have CSS-style class and id selectors:
```php
echo html('a#example'); //<a id="example"></a>
echo html('span.small'); //<span class="small"></span>
echo html('span.small.label'); //<span class="small label"></span>
echo html('span#example.small.label'); //<span id="example" class="small label"></span>
```
##API Documentation
####For self-closing elements (e.g. `<br>`, `<img>`)
```php
html($tag, $attributes=null);
```
+ `$tag` **{string}** The name of the valid HTML5 element which can contain CSS selectors or short-hand attribute string.
+ `$attributes` **{array | string}** (optional) Collection of element attributes
Returns a `Canteen\HTML5\Node` object.
####Node Methods
+ `setAttribute($name, $value)` Set an attribute by name and value.
+ `setAttributes($values)` Set an associative array of name/value pairs.
+ `setData($name, $value)` Set data-* fields on the HTML5 element.
+ `getData($name)` Get the data-* field on the HTML5 element.
+ `appendTo(NodeContainer $container)` Add the element to the end of a container element.
+ `prependTo(NodeContainer $container)` Add the element to the beginning of a container element.
####For container HTML elements (e.g. `<p>`, `<div>`)
```php
html($tag, $contents=null, $attributes=null);
```
+ `$tag` **{string}** The name of the valid HTML5 element which can contain CSS selectors or short-hand attribute string.
+ `$contents` **{string | Node | NodeContainer}** (optional) The string of the contents of the tag, or another element created by `html()`
+ `$attributes` **{array | string}** (optional) Collection of element attributes
Returns a `Canteen\HTML5\NodeContainer` object.
####NodeContainer Methods (extends `Node`)
+ `addChild($node)` Add a `Node` object to the bottom of the collection of nodes
+ `addChildAt($node, $index)` Add a `Node` object at a specific zero-based index
+ `removeChild($node)` Remove a particular node from the container
+ `removeChildAt($index)` Remove a node by zero-based index
+ `removeChildren()` Remove all children from the container
+ `getChildren()` Get the collection of all `Node` objects
+ `getChildAt($index)` Get a `Node` object at a specific index
###Additional Components
####Document
The `Document` object is used for creating a bare-bones HTML5 document.
```php
Canteen\HTML5\Document($title='', $charset='utf-8', $beautify=false);
```
+ `$title` **{string}** (optional) The title of the document
+ `$charset` **{string}** (optional) The HTML character set to use
+ `$beautify` **{boolean}** (optional) If the output should be an indented work of art.
Properties
+ `head` **{NodeContainer}** The document's `<head>` element
+ `body` **{NodeContainer}** The document's `<body>` element
+ `title` **{NodeContainer}** The document's `<title>` element
```php
use Canteen\HTML5\Document;
$doc = new Document('Untitled');
$doc->head->addChild(html('script src=main.js'));
$doc->body->addChild(html('div#frame'));
echo $doc;
```
####SimpleList
The `SimpleList` for conveniently creating `<ul>` and `<ol>` elements.
```php
Canteen\HTML5\SimpleList($elements, $attributes=null, $type="ul");
```
+ `$elements` **{array}** The collection of strings or other HTML elements
+ `$attributes` **{array | string}** (optional) Collection of element attributes
+ `$type` **{string}** (optional) A value of either "ul" or "ol"
####Table
The `Table` object is used for creating `<table>` elements.
```php
Canteen\HTML5\Table($data, $headers=null, $checkbox=null);
```
+ `$data` **{array}** The collection of associative-arrays with key/value pairs
+ `$headers` **{array}** (optional) The names of the header labels
+ `$checkbox` **{string}** (optional) The name of the key name in the data to replace with a checkbox, for instance "id"
```php
// Create a sample table with some rows of dummy data
$table = new Table(
array(
array('id'=>1, 'first'=>'James', 'last'=>'Smith'),
array('id'=>2, 'first'=>'Mary', 'last'=>'Denver'),
array('id'=>3, 'first'=>'Charlie', 'last'=>'Rose')
),
array('ID', 'First Name', 'Last Name')
);
```
##License##
Copyright (c) 2013 Matt Karl and [CloudKid, LLC](http://cloudkid.com)
Released under the MIT License.

10
build.properties Normal file
View File

@ -0,0 +1,10 @@
source.dir=src
docs=yuidoc
docs.config=docs.json
docs.outdir=docs
docs.name=Canteen HTML5 API
docs.description=Create dynamic, valid HTML5 markup with a simple an intuitive PHP API
docs.logo=
docs.themedir=../CanteenTheme
docs.helpers=${docs.themedir}/path.js
docs.version=1.0.0

32
build.xml Normal file
View File

@ -0,0 +1,32 @@
<?xml version="1.0"?>
<project name="CanteenHTML5" default="docs" basedir="./">
<property file="${os.name}.build.properties"/>
<property file="build.properties"/>
<target name="docs" description="Use YUIDoc to build the documentation for this library.">
<copy file="${docs.config}" tofile="temp.json" overwrite="true" />
<replaceregexp file="temp.json" match="\$\{docs\.description\}" replace="${docs.description}" flags="g" />
<replaceregexp file="temp.json" match="\$\{docs\.name\}" replace="${docs.name}" flags="g" />
<replaceregexp file="temp.json" match="\$\{docs\.version\}" replace="${docs.version}" flags="g" />
<replaceregexp file="temp.json" match="\$\{docs\.outdir\}" replace="${docs.outdir}" flags="g" />
<replaceregexp file="temp.json" match="\$\{docs\.logo\}" replace="${docs.logo}" flags="g" />
<replaceregexp file="temp.json" match="\$\{docs\.helpers\}" replace="${docs.helpers}" flags="g" />
<replaceregexp file="temp.json" match="\$\{docs\.themedir\}" replace="${docs.themedir}" flags="g" />
<exec executable="${docs}">
<arg line="${source.dir}" />
<arg line="--extension .php" />
<arg line="--no-code" />
<arg line="--quiet" />
<arg line="--config temp.json" />
</exec>
<delete file="temp.json" />
</target>
<target name="clean" description="Remove all the YUIDocs">
<delete includeemptydirs="true">
<fileset dir="${docs.outdir}" includes="**/*" />
</delete>
</target>
</project>

31
composer.json Normal file
View File

@ -0,0 +1,31 @@
{
"name": "Canteen/HTML5",
"description" : "Create dynamic, valid HTML5 markup with a simple an intuitive PHP API",
"version" : "1.0.0",
"type": "library",
"keywords": ["html5", "markup", "document", "html", "tags"],
"license": "MIT",
"homepage" : "http://github.com/Canteen/CanteenHTML5",
"time": "2013-10-12",
"authors": [
{
"name": "Matt Karl",
"email": "matt@mattkarl.com",
"homepage": "http://github.com/bigtimebuddy",
"role": "Developer"
}
],
"autoload": {
"psr-0": {
"Canteen\\HTML5" : "src/"
},
"files": ["src/Canteen/HTML5/html.php"]
},
"minimum-stability": "stable",
"repositories": [
{
"type": "vcs",
"url": "https://github.com/Canteen/CanteenHTML5"
}
]
}

14
docs.json Normal file
View File

@ -0,0 +1,14 @@
{
"name": "${docs.name}",
"description": "${docs.description}",
"version": "${version}",
"logo":"${docs.logo}",
"options" : {
"linkNatives": true,
"attributesEmit": true,
"selleck": true,
"helpers": ["${docs.helpers}"],
"themedir" : "${docs.themedir}",
"outdir" : "${docs.outdir}"
}
}

30
docs/api.js Normal file
View File

@ -0,0 +1,30 @@
YUI.add("yuidoc-meta", function(Y) {
Y.YUIDoc = { meta: {
"classes": [
"Attribute",
"Comment",
"Document",
"HTML5Error",
"Node",
"NodeContainer",
"SimpleList",
"Table",
"Text",
"html"
],
"modules": [
"Canteen_HTML5",
"global"
],
"allModules": [
{
"displayName": "Canteen\\HTML5",
"name": "Canteen_HTML5"
},
{
"displayName": "global",
"name": "global"
}
]
} };
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 B

BIN
docs/assets/css/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

849
docs/assets/css/main.css Normal file
View File

@ -0,0 +1,849 @@
/*
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: #e6e6e6;
color: #111111;
overflow-y: scroll;
}
body {
font: 13px/1.4 'Lucida Grande', 'Lucida Sans Unicode', 'DejaVu Sans', 'Bitstream Vera Sans', 'Helvetica', 'Arial', sans-serif;
margin: 0;
padding: 0;
}
/* -- Links ----------------------------------------------------------------- */
a {
color: #356de4;
text-decoration: none;
}
.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: #111111 !important;
/*was #f80*/
font-weight: 100;
line-height: 1.1;
margin: 1.1em 0 0.5em;
}
h1 {
font-size: 184.6%;
margin: 0;
}
h2 {
font-size: 153.846%;
margin: 0 !important;
padding: 1.5em 0 .5em 0;
/*border-bottom: 1px solid #c3c3c3 !important;*/
}
h3 {
font-size: 138.462%;
padding: 1.5em 0 .5em 0;
}
h4 {
border-bottom: 1px solid #DBDFEA;
color: #E48A2B;
font-size: 115.385%;
font-weight: normal;
padding: 1em 0 0 0;
}
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 {
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: 1em;
}
pre.code {
background: #fff;
border: 1px solid #c3c3c3;
border-left-width: 5px;
line-height: 150%;
}
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 2em;
}
#bd {
padding: 7px 0 30px;
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;
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;
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;
}
#hd h1 {
font-size: 100%;
text-transform: uppercase;
}
.header .version em {
display: block;
text-align: right;
line-height: 60px;
color: #779CC5;
}
#classdocs .item {
border-bottom: 0; /*1px solid #c3c3c3*/
margin: 0 !important;
padding: 2em;
border-top:1px solid #ddd;
}
/*#classdocs .item:nth-child(2n) {
background-color: #f3f3f3;
}*/
#classdocs h2 {
padding-top: 0 !important;
}
#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 {
padding: 0 15px 1px 20px;
background-color:#396EA0;
margin-bottom:20px;
}
#hd img {
margin-top:15px;
}
/* -- 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;
padding: 1em;
border: 1px solid #c3c3c3 !important;
}
/* -- 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: #999;
border-radius: 3px;
color: #fff;
font-size: 11px;
margin: 0 0.5em;
padding: 4px 6px;
position: relative;
top: -2px;
}
/* Class/module metadata such as "Uses", "Extends", "Defined in", etc. */
.apidocs .meta {
border: none;
border-top: 1px solid #c3c3c3;
color: #555;
font-size: 11px;
padding: 1em 0;
}
.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: #444444;
}
/* Module/Class intro description. */
.apidocs .intro {
background: none;
border: none;
padding: 0 !important;
}
/* Loading spinners. */
#bd.loading .apidocs,
#api-list.loading .yui3-tabview-panel {
background: #ffffff 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 h3 {
/*border-bottom: 1px solid #efefef;*/
color: #444444;
margin: 0 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: #444444;
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: 16px;
}
.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 /*0.6em;*/
}
#api-tabview-filter {
padding: 0 0 1em;
}
#api-filter {
width: 100%;
font-size: 16px;
border: 1px solid #bebebe;
padding: 5px;
border-radius: 5px;
border-top-width: 2px;
}
/* -- Content TabView ------------------------------------------------------- */
/* -- 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: 0.5em;
position: absolute;
right: 2em;
}
/*#api-options label { margin-right: 0.6em; }*/
/* -- API list -------------------------------------------------------------- */
#api-list {
margin-top: -2em;
*zoom: 1;
}
#api-modules {
/*border-bottom: 1px solid #c3c3c3;*/
}
.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: 0.4em;
text-decoration: none;
_border: none;
_display: inline;
color: #444444 !important;
overflow: hidden;
}
.apis a:hover,
.apis a:focus {
background: #444444;
color: white !important;
color: #444444;
outline: none;
}
.api-list-item a:hover,
.api-list-item a:focus {
font-weight: bold;
}
.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;
}
/* -- YUI Overrides -------------------------------------------------------------- */
.yui3-skin-sam .yui3-tab-selected .yui3-tab-label {
border: none !important;
}
.yui3-skin-sam .yui3-tab-selected {
margin-bottom:0 !important;
}
.yui3-skin-sam .yui3-tab-label {
padding: 1em !important;
border: none !important;
background: none !important;
background-color: #c3c3c3 !important;
}
.yui3-skin-sam .yui3-tab-label:hover {
background-color: #444444 !important;
color: white !important;
}
/* Important Library Specifics, find and replace
@color-CreateJS: #e7841d;
@color-EaselJS: #3399ff;
@color-TweenJS: #f12528;
@color-SoundJS: #8765d6;
@color-PreloadJS: #bb2ee5;
@color-Zoe: #00b224;
*/
.yui3-skin-sam .yui3-tab-selected .yui3-tab-label,
.yui3-skin-sam .yui3-tab-selected .yui3-tab-label:focus,
.yui3-skin-sam .yui3-tab-selected .yui3-tab-label:hover {
background: none !important;
border: none !important;
background-color: #2269AF !important;
}
.yui3-skin-sam .yui3-tabview-list {
/*border-bottom: 5px solid #3399ff !important;*/
border:0 !important;
}

BIN
docs/assets/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 B

BIN
docs/assets/img/spinner.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

10
docs/assets/index.html Normal file
View File

@ -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>

View File

@ -0,0 +1,52 @@
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;
}
});
return name;
}
}, {
// -- Attributes -----------------------------------------------------------
ATTRS: {
resultHighlighter: {
value: 'phraseMatch'
},
// May be set to "classes" 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'
]});

251
docs/assets/js/api-list.js Normal file
View File

@ -0,0 +1,251 @@
YUI.add('api-list', function (Y) {
var Lang = Y.Lang,
YArray = Y.Array,
APIList = Y.namespace('APIList'),
classesNode = Y.one('#api-classes'),
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() {
return filter.get('queryType') === 'classes' ? classesNode : modulesNode;
}
// -- Event Handlers -----------------------------------------------------------
function onFilterResults(e) {
var frag = Y.one(Y.config.doc.createDocumentFragment()),
resultNode = getFilterResultNode(),
typePlural = filter.get('queryType'),
typeSingular = typePlural === 'classes' ? 'class' : '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 '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'
]});

View File

@ -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'
]});

365
docs/assets/js/apidocs.js Normal file
View File

@ -0,0 +1,365 @@
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
},
// -- /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|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);
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 (!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 (!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);
});

17
docs/assets/js/yui-prettify.js vendored Normal file
View File

@ -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;
}
});

130
docs/assets/vendor/prettify/CHANGES.html vendored Normal file
View File

@ -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>

202
docs/assets/vendor/prettify/COPYING vendored Normal file
View File

@ -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.

203
docs/assets/vendor/prettify/README.html vendored Normal file
View File

@ -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>

View File

@ -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}

File diff suppressed because one or more lines are too long

1050
docs/classes/Attribute.html Normal file

File diff suppressed because it is too large Load Diff

2917
docs/classes/Comment.html Normal file

File diff suppressed because it is too large Load Diff

3321
docs/classes/Document.html Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,963 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="http://yui.yahooapis.com/3.8.0/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="shortcut icon" type="image/png" href="../assets/favicon.png">
<script src="http://yui.yahooapis.com/3.10.1/build/yui/yui-min.js"></script>
<title>Canteen HTML5 API v${version} API Documentation : HTML5Error</title>
</head>
<body class="yui3-skin-sam">
<div id="doc">
<div id="hd" class="yui3-g header">
<div class="yui3-u-3-4">
<h1><a href=""><img src="../assets/css/logo.png" title="Canteen HTML5 API"></a></h1>
</div>
<div class="yui3-u-1-4 version">
<em>API Documentation for: ${version}</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">
<div id="api-tabview-filter">
<input type="search" id="api-filter" placeholder="Type to filter APIs">
</div>
<ul class="tabs">
<li><a href="#api-classes">Classes</a></li>
<li><a href="#api-modules">Namespaces</a></li>
</ul>
<div id="api-tabview-panel">
<ul id="api-classes" class="apis classes">
<li><a href="../classes/Attribute.html">Attribute</a></li>
<li><a href="../classes/Comment.html">Comment</a></li>
<li><a href="../classes/Document.html">Document</a></li>
<li><a href="../classes/html.html">html</a></li>
<li><a href="../classes/HTML5Error.html">HTML5Error</a></li>
<li><a href="../classes/Node.html">Node</a></li>
<li><a href="../classes/NodeContainer.html">NodeContainer</a></li>
<li><a href="../classes/SimpleList.html">SimpleList</a></li>
<li><a href="../classes/Table.html">Table</a></li>
<li><a href="../classes/Text.html">Text</a></li>
</ul>
<ul id="api-modules" class="apis modules">
<li><a href="../modules/Canteen_HTML5.html">Canteen\HTML5</a></li>
<li><a href="../modules/global.html">global</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>HTML5Error Class</h1>
<div class="box meta">
<div class="extends">
Extends Exception
</div>
Namespace: <a href="../modules/Canteen\HTML5.html">Canteen\HTML5</a>
</div>
<div class="box intro">
<p>Exceptions with using the HTML5 API.</p>
<pre class="code prettyprint"><code>try
{
html(&#39;invalid&#39;, &#39;something&#39;);
}
catch(Canteen\HTML5\HTML5Error $e)
{
$e-&gt;getMessage();
}</code></pre>
</div>
<div class="constructor">
<h2>Constructor</h2>
<div id="method_HTML5Error" class="method item">
<h3 class="name"><code>HTML5Error</code></h3>
<div class="args">
<span class="paren">(</span><ul class="args-list inline commas">
<li class="arg">
<code>code</code>
</li>
<li class="arg">
<code class="optional">[data=&#x27;&#x27;]</code>
</li>
</ul><span class="paren">)</span>
</div>
<div class="meta">
<p>
</p>
</div>
<div class="description">
</div>
<div class="params">
<h4>Parameters:</h4>
<ul class="params-list">
<li class="param">
<code class="param-name">code</code>
<span class="type">Int</span>
<div class="param-description">
<p>The code of the error</p>
</div>
</li>
<li class="param">
<code class="param-name optional">[data=&#x27;&#x27;]</code>
<span class="type"><a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
<span class="flag optional" title="This parameter is optional.">optional</span>
<div class="param-description">
<p>Additional data to associate with this error</p>
</div>
</li>
</ul>
</div>
</div>
</div>
<div id="classdocs" class="tabview">
<ul class="api-class-tabs">
<li class="api-class-tab index"><a href="#index">Index</a></li>
<li class="api-class-tab 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 extends">
<li class="index-item property">
<a href="#property_EMPTY_ATTRIBUTE_NAME">EMPTY_ATTRIBUTE_NAME</a>
<span class="flag static">static</span>
</li>
<li class="index-item property">
<a href="#property_EMPTY_ATTRIBUTE_VALUE">EMPTY_ATTRIBUTE_VALUE</a>
<span class="flag static">static</span>
</li>
<li class="index-item property">
<a href="#property_EMPTY_CHILD">EMPTY_CHILD</a>
<span class="flag static">static</span>
</li>
<li class="index-item property">
<a href="#property_EMPTY_NODE_TAG">EMPTY_NODE_TAG</a>
<span class="flag static">static</span>
</li>
<li class="index-item property">
<a href="#property_EMPTY_PARENT">EMPTY_PARENT</a>
<span class="flag static">static</span>
</li>
<li class="index-item property">
<a href="#property_INVALID_GETTER">INVALID_GETTER</a>
<span class="flag static">static</span>
</li>
<li class="index-item property">
<a href="#property_INVALID_NODE">INVALID_NODE</a>
<span class="flag static">static</span>
</li>
<li class="index-item property">
<a href="#property_INVALID_SETTER">INVALID_SETTER</a>
<span class="flag static">static</span>
</li>
<li class="index-item property">
<a href="#property_INVALID_TAG">INVALID_TAG</a>
<span class="flag static">static</span>
</li>
<li class="index-item property private">
<a href="#property_messages">messages</a>
<span class="flag static">static</span>
</li>
<li class="index-item property">
<a href="#property_OUT_OF_BOUNDS">OUT_OF_BOUNDS</a>
<span class="flag static">static</span>
</li>
<li class="index-item property">
<a href="#property_UNKNOWN">UNKNOWN</a>
<span class="flag static">static</span>
</li>
</ul>
</div>
</div>
<div id="properties" class="api-class-tabpanel">
<h2 class="off-left">Properties</h2>
<div id="property_EMPTY_ATTRIBUTE_NAME" class="property item">
<h3 class="name"><code>EMPTY_ATTRIBUTE_NAME</code></h3>
<span class="type">Int</span>
<span class="flag final">final</span>
<span class="flag static">static</span>
<div class="meta">
<p>
</p>
</div>
<div class="description">
<p>The database connection failed</p>
</div>
</div>
<div id="property_EMPTY_ATTRIBUTE_VALUE" class="property item">
<h3 class="name"><code>EMPTY_ATTRIBUTE_VALUE</code></h3>
<span class="type">Int</span>
<span class="flag final">final</span>
<span class="flag static">static</span>
<div class="meta">
<p>
</p>
</div>
<div class="description">
<p>The alias for a database is invalid</p>
</div>
</div>
<div id="property_EMPTY_CHILD" class="property item">
<h3 class="name"><code>EMPTY_CHILD</code></h3>
<span class="type">Int</span>
<span class="flag final">final</span>
<span class="flag static">static</span>
<div class="meta">
<p>
</p>
</div>
<div class="description">
<p>The child node is empty</p>
</div>
</div>
<div id="property_EMPTY_NODE_TAG" class="property item">
<h3 class="name"><code>EMPTY_NODE_TAG</code></h3>
<span class="type">Int</span>
<span class="flag final">final</span>
<span class="flag static">static</span>
<div class="meta">
<p>
</p>
</div>
<div class="description">
<p>When trying to create a node, the name is empty</p>
</div>
</div>
<div id="property_EMPTY_PARENT" class="property item">
<h3 class="name"><code>EMPTY_PARENT</code></h3>
<span class="type">Int</span>
<span class="flag final">final</span>
<span class="flag static">static</span>
<div class="meta">
<p>
</p>
</div>
<div class="description">
<p>The parent cannot be empty</p>
</div>
</div>
<div id="property_INVALID_GETTER" class="property item">
<h3 class="name"><code>INVALID_GETTER</code></h3>
<span class="type">Int</span>
<span class="flag final">final</span>
<span class="flag static">static</span>
<div class="meta">
<p>
</p>
</div>
<div class="description">
<p>The mysql where trying to execute was a problem</p>
</div>
</div>
<div id="property_INVALID_NODE" class="property item">
<h3 class="name"><code>INVALID_NODE</code></h3>
<span class="type">Int</span>
<span class="flag final">final</span>
<span class="flag static">static</span>
<div class="meta">
<p>
</p>
</div>
<div class="description">
<p>The node is not of instance type Node</p>
</div>
</div>
<div id="property_INVALID_SETTER" class="property item">
<h3 class="name"><code>INVALID_SETTER</code></h3>
<span class="type">Int</span>
<span class="flag final">final</span>
<span class="flag static">static</span>
<div class="meta">
<p>
</p>
</div>
<div class="description">
<p>The database name we&#39;re trying to switch to is invalid</p>
</div>
</div>
<div id="property_INVALID_TAG" class="property item">
<h3 class="name"><code>INVALID_TAG</code></h3>
<span class="type">Int</span>
<span class="flag final">final</span>
<span class="flag static">static</span>
<div class="meta">
<p>
</p>
</div>
<div class="description">
<p>The html tag name is invalid</p>
</div>
</div>
<div id="property_messages" class="property item private">
<h3 class="name"><code>messages</code></h3>
<span class="type">Dictionary</span>
<span class="flag private">private</span>
<span class="flag static">static</span>
<div class="meta">
<p>
</p>
</div>
<div class="description">
<p>Look-up for error messages</p>
</div>
</div>
<div id="property_OUT_OF_BOUNDS" class="property item">
<h3 class="name"><code>OUT_OF_BOUNDS</code></h3>
<span class="type">Int</span>
<span class="flag final">final</span>
<span class="flag static">static</span>
<div class="meta">
<p>
</p>
</div>
<div class="description">
<p>THe addChildAt is out of bounds</p>
</div>
</div>
<div id="property_UNKNOWN" class="property item">
<h3 class="name"><code>UNKNOWN</code></h3>
<span class="type"><a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
<span class="flag final">final</span>
<span class="flag static">static</span>
<div class="meta">
<p>
</p>
</div>
<div class="description">
<p>The label for an error that is unknown or unfound in messages</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>

2069
docs/classes/Node.html Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

2974
docs/classes/SimpleList.html Normal file

File diff suppressed because it is too large Load Diff

2973
docs/classes/Table.html Normal file

File diff suppressed because it is too large Load Diff

1956
docs/classes/Text.html Normal file

File diff suppressed because it is too large Load Diff

339
docs/classes/html.html Normal file
View File

@ -0,0 +1,339 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="http://yui.yahooapis.com/3.8.0/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="shortcut icon" type="image/png" href="../assets/favicon.png">
<script src="http://yui.yahooapis.com/3.10.1/build/yui/yui-min.js"></script>
<title>Canteen HTML5 API v${version} API Documentation : html</title>
</head>
<body class="yui3-skin-sam">
<div id="doc">
<div id="hd" class="yui3-g header">
<div class="yui3-u-3-4">
<h1><a href=""><img src="../assets/css/logo.png" title="Canteen HTML5 API"></a></h1>
</div>
<div class="yui3-u-1-4 version">
<em>API Documentation for: ${version}</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">
<div id="api-tabview-filter">
<input type="search" id="api-filter" placeholder="Type to filter APIs">
</div>
<ul class="tabs">
<li><a href="#api-classes">Classes</a></li>
<li><a href="#api-modules">Namespaces</a></li>
</ul>
<div id="api-tabview-panel">
<ul id="api-classes" class="apis classes">
<li><a href="../classes/Attribute.html">Attribute</a></li>
<li><a href="../classes/Comment.html">Comment</a></li>
<li><a href="../classes/Document.html">Document</a></li>
<li><a href="../classes/html.html">html</a></li>
<li><a href="../classes/HTML5Error.html">HTML5Error</a></li>
<li><a href="../classes/Node.html">Node</a></li>
<li><a href="../classes/NodeContainer.html">NodeContainer</a></li>
<li><a href="../classes/SimpleList.html">SimpleList</a></li>
<li><a href="../classes/Table.html">Table</a></li>
<li><a href="../classes/Text.html">Text</a></li>
</ul>
<ul id="api-modules" class="apis modules">
<li><a href="../modules/Canteen_HTML5.html">Canteen\HTML5</a></li>
<li><a href="../modules/global.html">global</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>html Class</h1>
<div class="box meta">
Namespace: <a href="../modules/global.html">global</a>
</div>
<div class="box intro">
<p>This is the global function is the main entry for interacting with the HTML5 for PHP library.
using <code>html()</code> global function you can create HTML5 quickly and easily. For more
examples and instruction on how to use this library, please refer to the the
<a href="https://github.com/bigtimebuddy/CanteenHTML5">GitHub project</a>.
To install the library simply include <code>html.php</code>, this takes care of any autoloading that&#39;s needed
for the rest of the library.</p>
<pre class="code prettyprint"><code>echo html(&#39;img src=home.jpg&#39;);
echo html(&#39;img&#39;, &#39;src=home.jpg&#39;);
echo html(&#39;a&#39;, array(&#39;href&#39;=&gt;&#39;about.html&#39;));</code></pre>
</div>
<div class="constructor">
<h2>Constructor</h2>
<div id="method_html" class="method item">
<h3 class="name"><code>html</code></h3>
<div class="args">
<span class="paren">(</span><ul class="args-list inline commas">
<li class="arg">
<code>tag</code>
</li>
<li class="arg">
<code class="optional">[childrenOrAttributes=null]</code>
</li>
<li class="arg">
<code class="optional">[attributes=null]</code>
</li>
</ul><span class="paren">)</span>
</div>
<span class="returns-inline">
<span class="type"><a href="../classes/Node.html" class="crosslink">Node</a></span>
</span>
<div class="meta">
<p>
</p>
</div>
<div class="description">
</div>
<div class="params">
<h4>Parameters:</h4>
<ul class="params-list">
<li class="param">
<code class="param-name">tag</code>
<span class="type"><a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
<div class="param-description">
<p>The name of the tag as a string for example &#39;tr&#39;, &#39;table&#39;, can be followed
by CSS selector, e.g. &#39;a#backButton&#39; or &#39;a.button&#39;</p>
</div>
</li>
<li class="param">
<code class="param-name optional">[childrenOrAttributes=null]</code>
<span class="type">Dictionary | <a href="../classes/Node.html" class="crosslink">Node</a> | <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a> | <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array" class="crosslink external" target="_blank">Array</a></span>
<span class="flag optional" title="This parameter is optional.">optional</span>
<div class="param-description">
<p>If the tag is a NodeContainer, this can be an array
of attributes, another html node or some text. If the tag is a single node, this can
be an array or chain of attributes</p>
</div>
</li>
<li class="param">
<code class="param-name optional">[attributes=null]</code>
<span class="type">Dictionary | <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String" class="crosslink external" target="_blank">String</a></span>
<span class="flag optional" title="This parameter is optional.">optional</span>
<div class="param-description">
<p>The attributes list for container tags (e.g., &#39;class:selected&#39;)</p>
</div>
</li>
</ul>
</div>
<div class="returns">
<h4>Returns:</h4>
<div class="returns-description">
<span class="type"><a href="../classes/Node.html" class="crosslink">Node</a></span>:
<p>Return the html node</p>
</div>
</div>
</div>
</div>
<div id="classdocs" class="tabview">
<ul class="api-class-tabs">
<li class="api-class-tab index"><a href="#index">Index</a></li>
</ul>
<div>
<div id="index" class="api-class-tabpanel index">
<h2 class="off-left">Item Index</h2>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="../assets/vendor/prettify/prettify-min.js"></script>
<script>prettyPrint();</script>
<script src="../assets/js/yui-prettify.js"></script>
<script src="../assets/../api.js"></script>
<script src="../assets/js/api-filter.js"></script>
<script src="../assets/js/api-list.js"></script>
<script src="../assets/js/api-search.js"></script>
<script src="../assets/js/apidocs.js"></script>
</body>
</html>

1531
docs/data.json Normal file

File diff suppressed because it is too large Load Diff

138
docs/index.html Normal file
View File

@ -0,0 +1,138 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="http://yui.yahooapis.com/3.8.0/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="shortcut icon" type="image/png" href="./assets/favicon.png">
<script src="http://yui.yahooapis.com/3.10.1/build/yui/yui-min.js"></script>
<title>Canteen HTML5 API v${version} API Documentation : </title>
</head>
<body class="yui3-skin-sam">
<div id="doc">
<div id="hd" class="yui3-g header">
<div class="yui3-u-3-4">
<h1><a href=""><img src="./assets/css/logo.png" title="Canteen HTML5 API"></a></h1>
</div>
<div class="yui3-u-1-4 version">
<em>API Documentation for: ${version}</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">
<div id="api-tabview-filter">
<input type="search" id="api-filter" placeholder="Type to filter APIs">
</div>
<ul class="tabs">
<li><a href="#api-classes">Classes</a></li>
<li><a href="#api-modules">Namespaces</a></li>
</ul>
<div id="api-tabview-panel">
<ul id="api-classes" class="apis classes">
<li><a href="./classes/Attribute.html">Attribute</a></li>
<li><a href="./classes/Comment.html">Comment</a></li>
<li><a href="./classes/Document.html">Document</a></li>
<li><a href="./classes/html.html">html</a></li>
<li><a href="./classes/HTML5Error.html">HTML5Error</a></li>
<li><a href="./classes/Node.html">Node</a></li>
<li><a href="./classes/NodeContainer.html">NodeContainer</a></li>
<li><a href="./classes/SimpleList.html">SimpleList</a></li>
<li><a href="./classes/Table.html">Table</a></li>
<li><a href="./classes/Text.html">Text</a></li>
</ul>
<ul id="api-modules" class="apis modules">
<li><a href="./modules/Canteen_HTML5.html">Canteen\HTML5</a></li>
<li><a href="./modules/global.html">global</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">
<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>

View File

@ -0,0 +1,207 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="http://yui.yahooapis.com/3.8.0/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="shortcut icon" type="image/png" href="../assets/favicon.png">
<script src="http://yui.yahooapis.com/3.10.1/build/yui/yui-min.js"></script>
<title>Canteen HTML5 API v${version} API Documentation : Canteen_HTML5</title>
</head>
<body class="yui3-skin-sam">
<div id="doc">
<div id="hd" class="yui3-g header">
<div class="yui3-u-3-4">
<h1><a href=""><img src="../assets/css/logo.png" title="Canteen HTML5 API"></a></h1>
</div>
<div class="yui3-u-1-4 version">
<em>API Documentation for: ${version}</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">
<div id="api-tabview-filter">
<input type="search" id="api-filter" placeholder="Type to filter APIs">
</div>
<ul class="tabs">
<li><a href="#api-classes">Classes</a></li>
<li><a href="#api-modules">Namespaces</a></li>
</ul>
<div id="api-tabview-panel">
<ul id="api-classes" class="apis classes">
<li><a href="../classes/Attribute.html">Attribute</a></li>
<li><a href="../classes/Comment.html">Comment</a></li>
<li><a href="../classes/Document.html">Document</a></li>
<li><a href="../classes/html.html">html</a></li>
<li><a href="../classes/HTML5Error.html">HTML5Error</a></li>
<li><a href="../classes/Node.html">Node</a></li>
<li><a href="../classes/NodeContainer.html">NodeContainer</a></li>
<li><a href="../classes/SimpleList.html">SimpleList</a></li>
<li><a href="../classes/Table.html">Table</a></li>
<li><a href="../classes/Text.html">Text</a></li>
</ul>
<ul id="api-modules" class="apis modules">
<li><a href="../modules/Canteen_HTML5.html">Canteen\HTML5</a></li>
<li><a href="../modules/global.html">global</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>Canteen_HTML5 Namespace</h1>
<div class="box clearfix meta">
</div>
<div class="box intro">
</div>
<div class="yui3-g">
<div class="yui3-u-1-2">
<p>This namespace provides the following classes:</p>
<ul class="module-classes">
<li class="module-class">
<a href="../classes/Attribute.html">
Attribute
</a>
</li>
<li class="module-class">
<a href="../classes/Comment.html">
Comment
</a>
</li>
<li class="module-class">
<a href="../classes/Document.html">
Document
</a>
</li>
<li class="module-class">
<a href="../classes/HTML5Error.html">
HTML5Error
</a>
</li>
<li class="module-class">
<a href="../classes/Node.html">
Node
</a>
</li>
<li class="module-class">
<a href="../classes/NodeContainer.html">
NodeContainer
</a>
</li>
<li class="module-class">
<a href="../classes/SimpleList.html">
SimpleList
</a>
</li>
<li class="module-class">
<a href="../classes/Table.html">
Table
</a>
</li>
<li class="module-class">
<a href="../classes/Text.html">
Text
</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>

159
docs/modules/global.html Normal file
View File

@ -0,0 +1,159 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="http://yui.yahooapis.com/3.8.0/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="shortcut icon" type="image/png" href="../assets/favicon.png">
<script src="http://yui.yahooapis.com/3.10.1/build/yui/yui-min.js"></script>
<title>Canteen HTML5 API v${version} API Documentation : global</title>
</head>
<body class="yui3-skin-sam">
<div id="doc">
<div id="hd" class="yui3-g header">
<div class="yui3-u-3-4">
<h1><a href=""><img src="../assets/css/logo.png" title="Canteen HTML5 API"></a></h1>
</div>
<div class="yui3-u-1-4 version">
<em>API Documentation for: ${version}</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">
<div id="api-tabview-filter">
<input type="search" id="api-filter" placeholder="Type to filter APIs">
</div>
<ul class="tabs">
<li><a href="#api-classes">Classes</a></li>
<li><a href="#api-modules">Namespaces</a></li>
</ul>
<div id="api-tabview-panel">
<ul id="api-classes" class="apis classes">
<li><a href="../classes/Attribute.html">Attribute</a></li>
<li><a href="../classes/Comment.html">Comment</a></li>
<li><a href="../classes/Document.html">Document</a></li>
<li><a href="../classes/html.html">html</a></li>
<li><a href="../classes/HTML5Error.html">HTML5Error</a></li>
<li><a href="../classes/Node.html">Node</a></li>
<li><a href="../classes/NodeContainer.html">NodeContainer</a></li>
<li><a href="../classes/SimpleList.html">SimpleList</a></li>
<li><a href="../classes/Table.html">Table</a></li>
<li><a href="../classes/Text.html">Text</a></li>
</ul>
<ul id="api-modules" class="apis modules">
<li><a href="../modules/Canteen_HTML5.html">Canteen\HTML5</a></li>
<li><a href="../modules/global.html">global</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>global Namespace</h1>
<div class="box clearfix meta">
</div>
<div class="box intro">
</div>
<div class="yui3-g">
<div class="yui3-u-1-2">
<p>This namespace provides the following classes:</p>
<ul class="module-classes">
<li class="module-class">
<a href="../classes/html.html">
html
</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>

52
examples/document.php Normal file
View File

@ -0,0 +1,52 @@
<?php
include '../lib/html.php';
use Canteen\HTML5\Document;
use Canteen\HTML5\SimpleList;
use Canteen\HTML5\Table;
// Create a new document
$doc = new Document('Test Document');
$doc->beautify = true;
// Add a link to the page
$link = html('a#google.external rel=external', 'Link', 'class="test something" target=blank rel=test');
$link->href = 'http://google.com';
$link->appendTo($doc->body);
// Create an unordered list for an array of items
// the array can be other html elements or text
$list = new SimpleList(
array(
html('b', 'first'),
'second',
'third',
array(
'sub-third',
'sub-forth'
)
)
);
$list->appendTo($doc->body);
// Create a sample table with some rows of dummy data
$table = new Table(
array(
array('id'=>1, 'first'=>'James', 'last'=>'Smith'),
array('id'=>2, 'first'=>'Mary', 'last'=>'Denver'),
array('id'=>3, 'first'=>'Charlie', 'last'=>'Rose')
),
array('ID', 'First Name', 'Last Name')
);
// We'll set some of the table properties
$table->style = 'border:1px solid black';
$table->border = 0;
$table->id = 'people';
$table->appendTo($doc->body);
// Output the result formatted nice with indents
echo $doc;
?>

View File

@ -0,0 +1,170 @@
<?php
/**
* @module Canteen\HTML5
*/
namespace Canteen\HTML5
{
/**
* An HTML attribute used on the Node, this is used internally.
* Do not initiate this class directly, use the `html()` function
* to create attributes on elements.
*
* echo html('a', 'Link', 'class=button href="about.html"');
*
* echo html('a', 'Link')
* ->setAttribute('class', 'button')
* ->setAttribute('href', 'about.html');
*
* @class Attribute
* @constructor
* @param {String} [name=null] The name of the attribute
* @param {String} [value=null] The value of the attribute
*/
class Attribute
{
/**
* The name of the attribute
* @property {String} _name
* @private
*/
private $_name;
/**
* The value of the attribute
* @property {String} _value
* @private
*/
private $_value;
public function __construct($name = null, $value = null)
{
$this->name = $name;
$this->value = $value;
}
/**
* Convert the attribute to an HTML tag attribute string
* @method __toString
* @return {String} String representation of attribute
*/
public function __toString()
{
return " " . $this->_name . "=\"" . $this->_value . "\"";
}
/**
* Get the name of this attribute
* @method getName
* @return {String} The attribute's name
*/
public function getName()
{
return $this->_name;
}
/**
* Set the name of this attribute, cannot be empty
* @method setName
* @param {String} [name=null] The name of the attribute
*/
public function setName($name = null)
{
if (is_null($name) || empty($name))
{
throw new HTML5Error(HTML5Error::EMPTY_ATTRIBUTE_NAME);
}
$this->_name = $name;
}
/**
* Get the value of this attribute
* @method getValue
* @protected
* @return {String} The value of attribute
*/
protected function getValue()
{
return $this->_value;
}
/**
* Set the value of this attribute, this cannot be empty
* @method setValue
* @protected
* @param {String} value The value to set
*/
protected function setValue($value)
{
$this->_value = $value;
}
/**
* Convert a string into an associative array
* @method shorthand
* @static
* @param {String} str The string, delineated by semicolons, and colons for attributes:values
* @return {Dictionary} The collection of attributes
*/
static public function shorthand($str)
{
$res = array();
// Match the name=value in the attributes string
preg_match_all('/([a-z]+[a-z\-]*)\=("[^\"]*"|\'[^\']*\'|[^\s\"\']*)/',$str, $arr);
foreach($arr[1] as $i=>$name)
{
$value = $arr[2][$i];
// Remove containing quotes if present
if (preg_match('/^[\'\"][^\n]*[\'\"]$/', $value))
{
$value = substr($value, 1, -1);
}
$res[$name] = $value;
}
return $res;
}
/**
* General purpose getter for getting attribute->name and attribute->value
* @public __get
* @param {String} name The name of the property to get
*/
public function __get($name)
{
if (method_exists($this , $method =('get' . ucfirst($name))))
return $this->$method();
else
throw new HTML5Error(HTML5Error::INVALID_GETTER, $name);
}
/**
* General purpose setter for setting attribute->name and attribute->value
* @public __set
* @param {String} name The name of the attribute
* @param {String} value The value of the attribute
*/
public function __set($name, $value)
{
if (method_exists($this , $method =('set' . ucfirst($name))))
return $this->$method($value);
else
throw new HTML5Error(HTML5Error::INVALID_SETTER, $name);
}
/**
* See if a property exists
* @method __isset
* @param {String} name The name of the property
*/
public function __isset($name)
{
return method_exists($this , 'get' . ucfirst($name))
|| method_exists($this , 'set' . ucfirst($name));
}
}
}
?>

View File

@ -0,0 +1,38 @@
<?php
/**
* @module Canteen\HTML5
*/
namespace Canteen\HTML5
{
/**
* Special node type representing an HTML5 inline comment.
* Do not initiate this class directly, use the `html('comment')` function:
*
* echo html('comment', 'Hidden HTML comment here');
*
* @class Comment
* @extends NodeContainer
* @constructor
* @param {String} text the plain text string
*/
class Comment extends NodeContainer
{
public function __construct($text)
{
parent::__construct($text);
}
/**
* Write to HTML
* @method __toString
* @return {String} The string representation of this HTML node
*/
public function __toString()
{
return '<!-- '.$this->_tag.' -->';
}
}
}
?>

View File

@ -0,0 +1,112 @@
<?php
/**
* @module Canteen\HTML5
*/
namespace Canteen\HTML5
{
/**
* Create an HTML document. Basic barebones structure.
* Located in the namespace __Canteen\HTML5__.
*
* $doc = new HTML5\Document('Untitled');
* $doc->head->addChild(html('script src=main.js'));
* $doc->body->addChild(html('div#frame'));
* echo $doc;
*
* @class Document
* @extends NodeContainer
* @constructor
* @param {String} [title=''] The title of the document
* @param {String} [charset='utf-8'] The character encoding set of this HTML document
* @param {Boolean} [beautify=false] If we should add whitespace to the output to make it look nice markup.
*/
class Document extends NodeContainer
{
/**
* The document type
* @property {NodeContainer} docType
*/
private $docType;
/**
* The head node
* @property {NodeContainer} head
*/
public $head;
/**
* The body node
* @property {NodeContainer} body
*/
public $body;
/**
* The title node
* @property {NodeContainer} title
*/
public $title;
/**
* Beautify the output
* @property {Boolean} beautify
*/
public $beautify = false;
/**
* Constructor for Docs
*/
public function __construct($title='', $charset='utf-8', $beautify=false)
{
parent::__construct('html', null, null, 'manifest');
$this->docType = html('doctype');
$this->head = html('head');
$this->body = html('body');
$this->title = html('title', $title);
$this->head->addChild(html('meta', 'charset='.$charset));
$this->head->addChild($this->title);
$this->addChild($this->head);
$this->addChild($this->body);
}
/**
* Write to HTML
* @method __toString
* @return {String} The string representation of this HTML node
*/
public function __toString()
{
$result = $this->docType . parent::__toString();
if ($this->beautify)
$result = self::beautify($result);
return $result;
}
/**
* Beautifies an HTML string into a human-readable and indented work of art.
* @method beautify
* @static
* @param {String} html The XML-compatible HTML as a string
* @return {String} The formatted string
*/
public static function beautify($html)
{
// Conver the HTML -> SimpleXML -> DOMDocument
$dom = dom_import_simplexml(new \SimpleXMLElement($html))->ownerDocument;
// Format the DOMDocument
$dom->formatOutput = true;
// Save the output as XML
$buffer = $dom->saveXML();
// Remove the first line which has the XML declaration
return substr($buffer, strpos($buffer, "\n")+1);
}
}
}
?>

View File

@ -0,0 +1,144 @@
<?php
/**
* @module Canteen\HTML5
*/
namespace Canteen\HTML5
{
/**
* Exceptions with using the HTML5 API.
*
* try
* {
* html('invalid', 'something');
* }
* catch(Canteen\HTML5\HTML5Error $e)
* {
* $e->getMessage();
* }
*
* @class HTML5Error
* @extends Exception
* @constructor
* @param {int} code The code of the error
* @param {String} [data=''] Additional data to associate with this error
*/
class HTML5Error extends \Exception
{
/**
* The database connection failed
* @property {int} EMPTY_ATTRIBUTE_NAME
* @static
* @final
*/
const EMPTY_ATTRIBUTE_NAME = 500;
/**
* The alias for a database is invalid
* @property {int} EMPTY_ATTRIBUTE_VALUE
* @static
* @final
*/
const EMPTY_ATTRIBUTE_VALUE = 501;
/**
* The database name we're trying to switch to is invalid
* @property {int} INVALID_SETTER
* @static
* @final
*/
const INVALID_SETTER = 502;
/**
* The mysql where trying to execute was a problem
* @property {int} INVALID_GETTER
* @static
* @final
*/
const INVALID_GETTER = 503;
/**
* The html tag name is invalid
* @property {int} INVALID_TAG
* @static
* @final
*/
const INVALID_TAG = 504;
/**
* When trying to create a node, the name is empty
* @property {int} EMPTY_NODE_TAG
* @static
* @final
*/
const EMPTY_NODE_TAG = 505;
/**
* The parent cannot be empty
* @property {int} EMPTY_PARENT
* @static
* @final
*/
const EMPTY_PARENT = 506;
/**
* THe addChildAt is out of bounds
* @property {int} OUT_OF_BOUNDS
* @static
* @final
*/
const OUT_OF_BOUNDS = 507;
/**
* The child node is empty
* @property {int} EMPTY_CHILD
* @static
* @final
*/
const EMPTY_CHILD = 508;
/**
* The node is not of instance type Node
* @property {int} INVALID_NODE
* @static
* @final
*/
const INVALID_NODE = 509;
/**
* Look-up for error messages
* @property {Dictionary} messages
* @private
* @static
*/
private static $messages = array(
self::EMPTY_ATTRIBUTE_NAME => 'Attribute names cannot be empty',
self::EMPTY_ATTRIBUTE_VALUE => 'Attribute values cannot be empty',
self::INVALID_SETTER => 'Cannot set the property because name is invalid',
self::INVALID_GETTER => 'Cannot get the property because name is invalid',
self::INVALID_TAG => 'Not a valid HTML5 tag name',
self::EMPTY_NODE_TAG => 'Node tag is empty',
self::EMPTY_PARENT => 'The parent cannot be empty',
self::OUT_OF_BOUNDS => 'The index is out of bounds',
self::EMPTY_CHILD => 'Cannot addChild an empty child node',
self::INVALID_NODE => 'Child node must be a valid tag'
);
/**
* The label for an error that is unknown or unfound in messages
* @property {String} UNKNOWN
* @static
* @final
*/
const UNKNOWN = 'Unknown error';
public function __construct($code, $data='')
{
$message = (isset(self::$messages[$code]) ? self::$messages[$code]: self::UNKNOWN)
. ($data ? ' : ' . $data : $data);
parent::__construct($message, $code);
}
}
}
?>

346
src/Canteen/HTML5/Node.php Normal file
View File

@ -0,0 +1,346 @@
<?php
/**
* @module Canteen\HTML5
*/
namespace Canteen\HTML5
{
/**
* A generic html tag with any children or closing tag. (e.g., img, br, hr).
* Do not initiate this class directly, use the `html()` function:
*
* echo html('br');
*
* @class Node
* @constructor
* @param {String} [tag=null] The name of the tag
* @param {Array|String} [attributes=null] The collection of tag attributes
* @param {String} [validAttrs=null] The list of non-global valid attributes for the tag, comma separated
*/
class Node
{
/**
* The string name of the tag
* @property {String} _tag
* @protected
*/
protected $_tag;
/**
* The collection of Attributes objects
* @property {Array} _attributes
* @protected
*/
protected $_attributes;
/**
* The parent node, if any
* @property {NodeContainer} _parent
* @protected
*/
protected $_parent;
/**
* The collection of valid attributes names for given tag
* @property {Array} _validAttrs
* @protected
*/
protected $_validAttrs;
/**
* The default valid attributes
* @property {String} GLOBAL_ATTRS
* @final
* @static
*/
const GLOBAL_ATTRS = 'accesskey,class,contenteditable,contextmenu,dir,draggable,dropzone,hidden,id,lang,spellcheck,style,tabindex,title,translate';
public function __construct($tag = null, $attributes = null, $validAttrs = null)
{
if ($this->isEmpty($tag))
{
throw new HTML5Error(HTML5Error::EMPTY_NODE_TAG);
}
$this->_parent = null;
$this->_tag = $tag;
$this->_attributes = array();
$validAttrs = is_string($validAttrs) ? explode(',', $validAttrs) : $validAttrs;
$this->_validAttrs = explode(',', self::GLOBAL_ATTRS);
if ($validAttrs !== null)
{
$this->_validAttrs = array_merge($this->_validAttrs, $validAttrs);
}
if ($attributes !== null)
{
if (is_string($attributes))
{
$attributes = Attribute::shorthand($attributes);
}
if (is_array($attributes))
{
$this->setAttributes($attributes);
}
}
}
/**
* Returns the parent node of this node, if
* a parent exists. If no parent exists,
* this function returns null.
* @method getParent
* @private
* @return {NodeContainer} The parent node object
*/
private function getParent()
{
return $this->_parent;
}
/**
* Sets the parent of this Node. Note that this
* function is protected and can only be called by
* classes that extend Node. The parent cannot
* be null; this function will throw an Exception
* if the parent node is empty.
* @method setParent
* @protected
* @param {NodeContainer} [parent=null] The parent container node
*/
protected function setParent(NodeContainer $parent = null)
{
if ($this->isEmpty($parent))
{
throw new HTML5Error(HTML5Error::EMPTY_PARENT);
}
$this->_parent = $parent;
}
/**
* Given a name and value pair, sets an attribute on this Node.
* The name and value cannot be empty; if so, this function
* will throw an Exception. Note if the attribute already exists
* and the caller wants to set an attribute of the same name,
* this function will not create a new Attribute, but rather
* update the value of the existing named attribute.
*
* @method setAttribute
* @param {String} [name=null] The name of the attribute to add
* @param {String} [value=null] The value of the attribute
* @param {Node} The instance of this node
*/
public function setAttribute($name = null, $value = null)
{
if ($this->isEmpty($name))
{
throw new HTML5Error(HTML5Error::EMPTY_ATTRIBUTE_NAME);
}
foreach($this->_attributes as $i=>$attribute)
{
if ($attribute->name === $name)
{
if (!$this->isEmpty($value))
$attribute->value = $value;
else
unset($this->_attributes[$i]);
return $this;
}
}
$this->_attributes[] = new Attribute($name, $value);
return $this;
}
/**
* Fetch and attribute by name from this Node. The attribute
* name cannot be null; if so, this function will throw an
* Exception.
* @method getAttribute
* @param {String} [name=null] The name of the attribute to fetch
* @return {String} The attribute's value, if any or null
*/
protected function getAttribute($name = null)
{
$returnAttr = null;
if ($this->isEmpty($name))
{
throw new HTML5Error(HTML5Error::EMPTY_ATTRIBUTE_NAME);
}
foreach($this->_attributes as $attribute)
{
if ($attribute->name === $name)
{
$returnAttr = $attribute->value;
break;
}
}
return $returnAttr;
}
/**
* Set the list of all attributes.
* @method setAttributes
* @param {Dictionary} values An attributes array(name=>value, name=>value)
* @return {Node} The instance of this Node
*/
public function setAttributes($values)
{
if (is_array($values))
{
foreach($values as $name=>$value)
{
$this->setAttribute($name, $value);
}
return $this;
}
}
/**
* Set the a data-* HTML5 Attribute
* @param {String} name The name of the data, for instance "id" is an attribute "data-id"
* @param {String} value The value of the attribute
* @return {Node} The instance of this Node
*/
public function setData($name, $value)
{
return $this->setAttribute('data-'.$name, $value);
}
/**
* Add this child to a node container at the end
* @method appendTo
* @param {NodeContainer} container The node container to add to
* @return {Node} The instance of this Node
*/
public function appendTo(NodeContainer $container)
{
$container->addChild($this);
return $this;
}
/**
* Add this child to the beginning of a node container
* @method prependTo
* @param {NodeContainer} container The node container to prepend to to
* @return {Node} The instance of this Node
*/
public function prependTo(NodeContainer $container)
{
$container->addChildAt($this, 0);
return $this;
}
/**
* Get the data-* HTML5 attribute value, if set
* @method getData
* @param {String} name The name of the data attribute
* @return {String} The value of the data
*/
public function getData($name)
{
return $this->getAttribute('data-'.$name);
}
/**
* Write to HTML
* @method __toString
* @return {String} The string representation of this HTML node
*/
public function __toString()
{
return $this->writeOpen();
}
/**
* Start the writing the tag
* @method writeOpen
* @protected
* @param {Boolean} [selfClose=true] If the tag is a self closing tag (e.g., br, img, hr)
* @return {String} The buffer of HTML
*/
protected function writeOpen($selfClose=true)
{
$buffer = '<';
$buffer .= $this->_tag;
foreach($this->_attributes as $attribute)
{
$buffer .= (string)$attribute;
}
$buffer .= ($selfClose ? ' />' : '>');
return $buffer;
}
/**
* General purpose getter to get attribute values
* @method __get
* @param {String} name The name of the property to set
*/
public function __get($name)
{
if (in_array($name, $this->_validAttrs) || strpos($name, 'data-') === 0)
{
return $this->getAttribute($name);
}
return parent::__get($name);
}
/**
* General purpose setter to set attribute values
* @method __set
* @param {String} name The name of the attribute
* @param {String} value The value of the attribute
*/
public function __set($name, $value)
{
if (in_array($name, $this->_validAttrs) || strpos($name, 'data-') === 0)
{
return $this->setAttribute($name, $value);
}
return parent::__set($name);
}
/**
* See if a property exists
* @method __isset
* @param {String} name The name of the attribute
*/
public function __isset($name)
{
return in_array($name, $this->_validAttrs) || parent::__isset($name);
}
/**
* Checks if a variable is really "empty". Code borrowed from PHP.net at
* http://us3.php.net/manual/en/function.empty.php#90767 because we were
* previously using empty() to see if a variable is empty or not. But
* empty() dosen't work for attributes that have a value of "0", so we need
* something more robust here.
* <ul>
* <li>an unset variable -> empty</li>
* <li>null -> empty</li>
* <li>0 -> NOT empty</li>
* <li>"0" -> NOT empty</li>
* <li>false -> empty</li>
* <li>true -> NOT empty</li>
* <li>'string value' -> NOT empty</li>
* <li>" "(white space) -> empty</li>
* <li>array()(empty array) -> empty</li>
* </ul>
* @method isEmpty
* @protected
* @param {mixed} var The variable to check for empty on
*/
protected function isEmpty($var)
{
return (!isset($var) || is_null($var) ||
(!is_object($var) && is_string($var) && trim($var) == '' && !is_bool($var)) ||
(is_bool($var) && $var === false) ||
(is_array($var) && empty($var)));
}
}
}
?>

View File

@ -0,0 +1,238 @@
<?php
/**
* @module Canteen\HTML5
*/
namespace Canteen\HTML5
{
/**
* Represents an HTML that that can contain other tags (e.g., br, p, div).
* Do not initiate this class directly, use the `html()` function:
*
* $div = html('div');
*
* @class NodeContainer
* @extends Node
* @constructor
* @param {String} [tag=null] The name of the tag element
* @param {Node|Array} [children=null] The collection of children or single child
* @param {String|Dictionary} [attributes=null] The tag attributes
* @param {String} [validAttrs=null] Valid attributes specific to the HTML5 element, comma separated
*/
class NodeContainer extends Node
{
/**
* The collection of children nodes
* @property {Array} _children
* @private
*/
private $_children;
public function __construct($tag = null, $children = null, $attributes = null, $validAttrs=null)
{
if ($this->isEmpty($tag))
{
throw new HTML5Error(HTML5Error::EMPTY_NODE_TAG);
}
parent::__construct($tag, $attributes, $validAttrs);
$this->_children = array();
if (!$this->isEmpty($children))
{
if (!is_array($children))
{
$children = array($children);
}
if (is_array($children))
{
foreach($children as $child)
{
$this->addChild($child);
}
}
}
}
/**
* Add's a child to this NodeContainer. The child to add cannot be null.
* @method addChild
* @param {Node|String|Number|Boolean} childNode The child Node to add
* @return {NodeContainer} The instance of this container
*/
public function addChild($childNode)
{
array_push($this->_children, $this->prepareChild($childNode));
return $this;
}
/**
* Add a child at a specific index
* @method addChildAt
* @param {Node|String|Number|Boolean} childNode The child Node to add
* @param {int} index The index to add child at, 0 is top
* @return {NodeContainer} The instance of this container
*/
public function addChildAt($childNode, $index)
{
if ($index < 0)
{
throw new HTML5Error(HTML5Error::OUT_OF_BOUNDS, $index);
}
$childNode = $this->prepareChild($childNode);
if ($index == 0)
{
array_unshift($this->_children, $childNode);
}
else if ($index > $len)
{
$this->addChild($childNode);
}
else
{
array_splice($this->_children, $index , 0, array($childNode));
}
return $this;
}
/**
* Before adding a child, we should do some checking for basic types
* and convert it into a more useable Node object.
* @method prepareChild
* @protected
* @param {Node|String|Number|Boolean} childNode The child node to add
* @return {Node} The child node
*/
protected function prepareChild($childNode)
{
if ($this->isEmpty($childNode))
{
throw new HTML5Error(HTML5Error::EMPTY_CHILD);
}
if (is_bool($childNode))
{
$childNode = new Text($childNode ? 'true' : 'false');
}
else if (is_string($childNode) || is_numeric($childNode))
{
$childNode = new Text($childNode);
}
if (!($childNode instanceof Node))
{
throw new HTML5Error(HTML5Error::INVALID_NODE);
}
$childNode->setParent($this);
return $childNode;
}
/**
* Removes the first instance of child from this.
* Once the first instance of the child
* is removed, this function will return. It returns
* true if a child was removed and false if no child
* was removed.
* @method removeChild
* @param {Node} [childNode=null] The node to remove
* @return {Boolean} If successfully removed
*/
public function removeChild(Node $childNode = null)
{
if ($this->isEmpty($childNode))
{
throw new HTML5Error(HTML5Error::EMPTY_CHILD);
}
for($i = 0; $i < count($this->_children); $i++)
{
$child = $this->_children[$i];
if ($child === $childNode)
{
unset($this->_children[$i]);
return true;
}
}
return false;
}
/**
* Remove a child as a specific index
* @method removeChildAt
* @param {int} index The index to remove child at
* @return {NodeContainer} The instance of the node container
*/
public function removeChildAt($index)
{
if ($index >= $this->_children || $index < 0)
{
throw new HTML5Error(HTML5Error::OUT_OF_BOUNDS, $index);
}
array_splice($this->_children, $index, 1);
return $this;
}
/**
* Removes all children attached to this Node container
* @method removeChildren
* @return {NodeContainer} The instance of the node container
*/
public function removeChildren()
{
unset($this->_children);
$this->_children = array();
return $this;
}
/**
* Returns an array of all children attached to this Node container.
* @method getChildren
* @return {Array} The collection of Node objects
*/
public function getChildren()
{
return $this->_children;
}
/**
* Gets a child of this Node container at given
* index. If no index is passed in, getChild()
* will return the child at index zero (0).
* @method getChildAt
* @param {int} [index=0] The index to fetch child Node at
* @return {Node} The child Node
*/
public function getChildAt($index = 0)
{
return $this->_children[$index];
}
/**
* Close the writing of this container as HTML
* @method writeClose
* @protected
* @return {String} The closing HTML tag element
*/
protected function writeClose()
{
return "</" . $this->_tag . ">";
}
/**
* Write to HTML
* @method __toString
* @return {String} The string representation of this HTML node
*/
public function __toString()
{
$buffer = $this->writeOpen(false);
foreach($this->_children as $child)
{
$buffer .= $child->__toString();
}
$buffer .= $this->writeClose();
return $buffer;
}
}
}
?>

View File

@ -0,0 +1,73 @@
<?php
/**
* @module Canteen\HTML5
*/
namespace Canteen\HTML5
{
/**
* Convenience class for creating an ordered or un-ordered list.
*
* $list = new Canteen\HTML5\SimpleList(
* array(
* html('b', 'first'),
* 'second',
* 'third',
* array(
* 'sub-third',
* 'sub-forth'
* )
* )
* );
*
* @class SimpleList
* @extends NodeContainer
* @constructor
* @param {Array} [elements=null] The array of child Nodes, Strings, etc.
* @param {String|Dictionary} [attributes=null] The optional attributes
* @param {String} [type='ul'] The type of list, either ul or ol
*/
class SimpleList extends NodeContainer
{
public function __construct($elements=null, $attributes=null, $type='ul')
{
parent::__construct($type, null, $attributes,
$type == 'ol' ? 'reversed,start,type' : null);
if ($elements != null)
{
assert(is_array($elements));
foreach($elements as $child)
{
$this->addChild($child);
}
}
}
/**
* Override for the prepareChild method on NodeContainer which
* wraps each elements in a list item
* @method prepareChild
* @protected
* @param {Node|String|Number|Boolean|Array} childNode The child node to add, an array will get converted into another list elements.
* @return {Node} The child node
*/
protected function prepareChild($childNode)
{
// Recursively create new lists for each array
if (is_array($childNode))
{
$list = new SimpleList($childNode, null, $this->_tag);
return $this->prepareChild($list);
}
else
{
$childNode = parent::prepareChild($childNode);
return html('li', $childNode);
}
}
}
}
?>

View File

@ -0,0 +1,86 @@
<?php
/**
* @module Canteen\HTML5
*/
namespace Canteen\HTML5
{
/**
* Convenience class for building a Table. Useful for display
* rows of data from a database or another collection
* of associative arrays.
*
* $table = new Canteen\HTML5\Table(
* array(
* array('id'=>1, 'first'=>'James', 'last'=>'Smith'),
* array('id'=>2, 'first'=>'Mary', 'last'=>'Denver'),
* array('id'=>3, 'first'=>'Charlie', 'last'=>'Rose')
* ),
* array('ID', 'First Name', 'Last Name')
* );
*
* @class Table
* @extends NodeContainer
* @constructor
* @param {Array} data The collection of Dictionary objects
* @param {Array} [headers=null] An optional collection of header labels for each value
* @param {String} [checkbox=null] If we should add a checkbox to each row, this is the name
* of the attribute to use as a value. For instance `array('id'=>2)` is
* `<input type="checkbox" name="id[]" value="2">`
*/
class Table extends NodeContainer
{
public function __construct($data, $headers=null, $checkbox=null)
{
parent::__construct('table', null, null, 'border');
if ($headers != null && is_array($headers))
{
$head = html('thead');
$this->addChild($head);
$row = html('tr');
if ($checkbox != null)
{
$row->addChild(html('th', html('span', $checkbox)));
}
foreach($headers as $header)
{
$row->addChild(html('th', $header));
}
$head->addChild($row);
}
$body = html('tbody');
foreach($data as $d)
{
$row = html('tr');
if ($checkbox != null)
{
$td = html('td',
html(
'input',
'type=checkbox name='.$checkbox.'[] value='.$d[$checkbox]
),
'class='.$checkbox
);
$row->addChild($td);
}
foreach($d as $name=>$value)
{
if ($name == $checkbox) continue;
$td = html('td', $value, 'class='.$name);
$row->addChild($td);
}
$body->addChild($row);
}
$this->addChild($body);
}
}
}
?>

View File

@ -0,0 +1,39 @@
<?php
/**
* @module Canteen\HTML5
*/
namespace Canteen\HTML5
{
/**
* Special Node representing plain text. Do not initiate this
* class directly, it is created whenever a text is passed into
* a container tag:
*
* echo html('p', 'Some Text Here');
*
* @class Text
* @extends Node
* @constructor
* @param {String} text the plain text string
*/
class Text extends Node
{
public function __construct($text)
{
parent::__construct($text);
}
/**
* Write to HTML
* @method __toString
* @return {String} The string representation of this HTML node
*/
public function __toString()
{
return $this->_tag;
}
}
}
?>

237
src/Canteen/HTML5/html.php Normal file
View File

@ -0,0 +1,237 @@
<?php
/**
* @module global
*/
/**
* Auto load the assets in this library
*/
spl_autoload_register(function($name)
{
// Ignore class names not in the HTML5 namespace
if (!preg_match('/^HTML5\\\/', $name)) return;
// Remove the HTML5 namespace
$name = preg_replace('/^HTML5\\\/', '', $name);
// Convert the rest to directories
$name = str_replace("\\", '/', $name);
// Include the class relative to here
include __DIR__.'/'.$name.'.php';
});
use Canteen\HTML5\NodeContainer;
use Canteen\HTML5\Node;
use Canteen\HTML5\Comment;
use Canteen\HTML5\HTML5Error;
use Canteen\HTML5\Text;
use Canteen\HTML5\Attribute;
/**
* This is the global function is the main entry for interacting with the HTML5 for PHP library.
* using `html()` global function you can create HTML5 quickly and easily. For more
* examples and instruction on how to use this library, please refer to the the
* <a href="https://github.com/Canteen/CanteenHTML5">GitHub project</a>.
* To install the library simply include `html.php`, this takes care of any autoloading that's needed
* for the rest of the library.
*
* echo html('img src=home.jpg');
* echo html('img', 'src=home.jpg');
* echo html('a', array('href'=>'about.html'));
*
*
*
* @class html
* @constructor
* @param {String} tag The name of the tag as a string for example 'tr', 'table', can be followed
* by CSS selector, e.g. 'a#backButton' or 'a.button'
* @param {Dictionary|Node|String|Array} [childrenOrAttributes=null] If the tag is a NodeContainer, this can be an array
* of attributes, another html node or some text. If the tag is a single node, this can
* be an array or chain of attributes
* @param {Dictionary|String} [attributes=null] The attributes list for container tags (e.g., 'class:selected')
* @return {Node} Return the html node
*/
function html($tag, $childrenOrAttributes=null, $attributes=null)
{
// Get the tag ID from the tag string
// for instance 'a.button rel=external', a.button is the tagId, the rest are the attributes
$endPos = strpos(trim($tag), ' ');
// The tag attributes
$tagAttributes = array();
// If the tag also has some attributes
if ($endPos !== false)
{
$tagOriginal = $tag;
$tag = substr($tag, 0, $endPos);
$tagAttributes = Attribute::shorthand(substr($tagOriginal, $endPos + 1));
}
// Match the tag name without the CSS selectors
preg_match('/^([a-z1-6]{1,10})(.*)/', $tag, $tagParts);
// Valid class ane id names must begin with a -, _, or a-z letter
preg_match_all('/(\.|\#)\-?[\_a-zA-Z]+[\_a-zA-Z0-9\-]*/', $tagParts[2], $selectors);
$s = false; // if the html is a single tag like <br>
$tag = strtolower($tagParts[1]); // the name of the tag
$a = ''; // Valid extra attributes for tags
switch($tag)
{
case 'a': $a = 'href,hreflang,media,rel,target,type'; break;
case 'abbr': break;
case 'address': break;
case 'area': $s = true; $a = 'alt,coords,href,hreflang,media,rel,shape,target,type'; break;
case 'article': break;
case 'aside': break;
case 'audio': $a = 'autoplay,controls,loop,muted,preload,src'; break;
case 'b': break;
case 'base': $s = true; $a = 'href,target'; break;
case 'bdo': break;
case 'blockquote': $a = 'cite'; break;
case 'body': break;
case 'br': $s = true; break;
case 'button': $a = 'autofocus,disabled,form,formaction,formenctype,formmethod,formnovalidate,formtarget,name,type,value'; break;
case 'canvas': $a = 'height,width'; break;
case 'caption': break;
case 'cite': break;
case 'code': break;
case 'col': $s = true; break;
case 'colgroup': $a = 'span'; break;
case 'command': $s = true; $a = 'checked,disabled,icon,label,radiogroup,type'; break;
case 'comment': return new Comment($childrenOrAttributes);
case 'doctype': return '<!DOCTYPE html>';
case 'datalist': break;
case 'dd': break;
case 'del': $a = 'cite,datetime'; break;
case 'dfn': break;
case 'div': break;
case 'dl': break;
case 'dt': break;
case 'em': break;
case 'embed': $s = true; $a = 'height,src,type,width'; break;
case 'fieldset': $a = 'disabled,form_id,text'; break;
case 'figcaption': break;
case 'figure': break;
case 'footer': break;
case 'form': $a = 'accept,accept-charset,action,autocomplete,enctype,method,name,novalidate,target'; break;
case 'h1': break;
case 'h2': break;
case 'h3': break;
case 'h4': break;
case 'h5': break;
case 'h6': break;
case 'head': break;
case 'header': break;
case 'hgroup': break;
case 'hr': $s = true; break;
case 'html': $a = 'manifest'; break;
case 'img': $s = true; $a = 'alt,crossorigin,height,src,usemap,width'; break;
case 'i': break;
case 'input': $s = true; $a = 'accept,alt,autocomplete,autofocus,checked,disabled,form,formaction,formenctype,formmethod,formnovalidate,formtarget,height,list,max,maxlength,min,multiple,name,pattern,placeholder,readonly,required,size,src,step,type,value,width'; break;
case 'keygen': $s = true; $a = 'autofocus,challenge,disabled,form,keytype,name'; break;
case 'label': $a = 'for,form'; break;
case 'legend': break;
case 'li': break;
case 'link': $s = true; $a = 'href,hreflang,media,rel,sizes,type'; break;
case 'map': $a = 'name'; break;
case 'mark': break;
case 'menu': break;
case 'meta': $s = true; $a = 'charset,content,http-equiv,name'; break;
case 'meter': $a = 'form,heigh,low,max,min,optimum,value'; break;
case 'nav': break;
case 'noscript': break;
case 'object': $a = 'data,form,height,name,type,usemap,width'; break;
case 'ol': $a = 'reversed,start,type'; break;
case 'optgroup': $a = 'disabled,label'; break;
case 'option': $a = 'disabled,label,selected,value'; break;
case 'output': $a = 'for,form,name'; break;
case 'p': break;
case 'param': $s = true; $a = 'name,value'; break;
case 'pre': break;
case 'progress': $a = 'max,value'; break;
case 'q': $a = 'cite'; break;
case 'rp': break;
case 'rt': break;
case 'ruby': break;
case 's': break;
case 'sample': break;
case 'script': $a = 'async,charset,defer,src,type'; break;
case 'section': break;
case 'select': $a = 'autofocus,disabled,form,multiple,name,required,size'; break;
case 'small': break;
case 'source': $s = true; $a = 'media,src,type'; break;
case 'span': break;
case 'strong': break;
case 'style': $a = 'media,scoped,type'; break;
case 'sub': break;
case 'table': $a = 'border'; break;
case 'tbody': break;
case 'td': $a = 'colspan,headers,scope'; break;
case 'text': return new Text($childrenOrAttributes);
case 'textarea': $a = 'autofocus,cols,disabled,form,maxlength,name,placeholder,readonly,required,row,wrap'; break;
case 'tfoot': break;
case 'th': $a = 'colspan,headers,rowspan,scope'; break;
case 'thead': break;
case 'time': $a = 'datetime'; break;
case 'title': break;
case 'tr': break;
case 'track': $s = true; $a = 'default,kind,label,src,srclang'; break;
case 'u': break;
case 'ul': break;
case 'var': break;
case 'video': $a = 'autoplay,controls,height,loop,muted,poster,preload,src,width'; break;
case 'wbr': $s = true; break;
default:
throw new HTML5Error(HTML5Error::INVALID_TAG, $tag);
break;
}
// Create the attributes collection, either string or array
$attributes = $s ? $childrenOrAttributes : $attributes;
// If there are attributes and they are in a string format
// convert to an attributes array
if ($attributes !== null && is_string($attributes))
{
$attributes = Attribute::shorthand($attributes);
}
// Combine the attributes and the tags
if (is_array($attributes))
{
$attributes = array_merge($tagAttributes, $attributes);
}
// Or just add any tag attributes
else if (count($tagAttributes))
{
$attributes = $tagAttributes;
}
// Create the node or container
$node = ($s) ?
new Node($tag, $attributes, $a) :
new NodeContainer($tag, $childrenOrAttributes, $attributes, $a);
// Take the selectors convert them into id or class
foreach($selectors[0] as $selector)
{
switch($selector[0])
{
case '#' :
$node->id = substr($selector, 1);
break;
case '.' :
if ($node->class) $node->class .= ' ';
$node->class .= substr($selector, 1);
break;
}
}
return $node;
}
?>